SKLearn Perceptron对于稀疏和密集的行为表现不同

时间:2017-10-19 17:00:39

标签: python scikit-learn sparse-matrix perceptron

Perceptron,当以密集格式给出矩阵时,与以稀疏格式给出相同矩阵相比,给出不同的结果。我认为这可能是一个混乱的问题,所以我使用来自cross_validate的{​​{1}}运行交叉验证,但没有运气。

讨论了类似的问题here。但是有一些理由给出了。这里有什么理由吗?

仅供参考,我使用Perceptron的参数是: sklearn.model_selection

我使用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将密集矩阵转换为稀疏矩阵作为接受的答案here

1 个答案:

答案 0 :(得分:1)

这里有一个理由。

Perceptron shares大部分代码都带有SGDClassifier

  

Perceptron和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会使系数相等,但拟合可能会更差。