2017-10-19 151 views
1

感知器在給定密集格式的矩陣時,與給出稀疏格式的相同矩陣相比,給出了不同的結果。我認爲這可能是一個混亂的問題,所以我使用cross_validatesklearn.model_selection運行交叉驗證,但沒有運氣。SKLearn感知器在稀疏和密集時行爲不同

討論了一個類似的問題here。但是有一些理由。這裏有任何理由嗎?

僅供參考,我使用感知與參數是: penalty='l2', alpha=0.0001, fit_intercept=True, max_iter=10000, tol=1e-8, shuffle=True, verbose=0, eta0=1.0, n_jobs=1, random_state=0, class_weight=None, warm_start=False, n_iter=None

我使用sparse.csr_matrix爲密集到稀疏矩陣轉換爲接受的答案here

+1

請顯示一些可重複的例子。 – sascha

+0

@sascha,對不起。但是,你可以參考接受的答案的例子:) –

回答

1

這裏有一個理由。

Perceptronshares大部分的代碼與SGDClassifier

感知和SGDClassifier共享相同的底層實現。事實上,Perceptron()相當於SGDClassifier(loss =「perceptron」,eta0 = 1,learning_rate =「constant」,罰分=無)。

SGDClassifierbetter documented

注:稀疏實施產生較密的實現略有不同的結果由於縮水學習速率的攔截。

我們有更多的細節latter

在稀疏特徵向量的情況下,攔截與較小的學習率(乘以0.01)更新,考慮的事實,它的更新更經常。

注意,這個實施細則來自Leon Bottou

之偏壓學習率乘以0.01,因爲這往往提高了條件數。

爲了完整起見,在scikit-learn code

SPARSE_INTERCEPT_DECAY = 0.01 
# For sparse data intercept updates are scaled by this decay factor to avoid 
# intercept oscillation. 

獎金例如:

import numpy as np 
import scipy.sparse as sp 
from sklearn.linear_model import Perceptron 

np.random.seed(42) 
n_samples, n_features = 1000, 10 
X_dense = np.random.randn(n_samples, n_features) 
X_csr = sp.csr_matrix(X_dense) 
y = np.random.randint(2, size=n_samples) 

for X in [X_dense, X_csr]: 
    model = Perceptron(penalty='l2', alpha=0.0001, fit_intercept=True, 
         max_iter=10000, tol=1e-8, shuffle=True, verbose=0, 
         eta0=1.0, n_jobs=1, random_state=0, class_weight=None, 
         warm_start=False, n_iter=None) 
    model.fit(X, y) 
    print(model.coef_) 

您可以檢查係數是不同的。 將fit_intercept更改爲False使係數相等,但擬合可能會更差。

+0

因此,理想情況下,如果我將延遲更改爲1,它們應該執行相同的操作,但我可能會遇到如上所述的問題(截取振盪)。對?@TomDLT –

+0

對。但是如果你的數據不是稀疏的(即使對象是CSR矩陣),你也不會有問題。相反,如果您的數據非常稀疏但存儲在密集的對象中,則可能會面臨波動問題。 – TomDLT