2017-10-19 104 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