Scikit learn 具有l1的logistic的SGD分类器结果和statsmodels结果的差异

Scikit learn 具有l1的logistic的SGD分类器结果和statsmodels结果的差异,scikit-learn,statsmodels,Scikit Learn,Statsmodels,为了检查我的工作,我一直在比较scikit learn的SGDClassizer logistic实现与statsmodels logistic的输出。一旦我加上一些l1和分类变量,我会得到非常不同的结果。这是不同解决方案技术的结果,还是我没有使用正确的参数 在我自己的数据集上差异更大,但使用mtcars时仍然相当大: df = sm.datasets.get_rdataset("mtcars", "datasets").data y, X = patsy.dmatrices('am~st

为了检查我的工作,我一直在比较scikit learn的SGDClassizer logistic实现与statsmodels logistic的输出。一旦我加上一些l1和分类变量,我会得到非常不同的结果。这是不同解决方案技术的结果,还是我没有使用正确的参数

在我自己的数据集上差异更大,但使用mtcars时仍然相当大:

 df = sm.datasets.get_rdataset("mtcars", "datasets").data

 y, X = patsy.dmatrices('am~standardize(wt) + standardize(disp) + C(cyl) - 1', df)

 logit = sm.Logit(y, X).fit_regularized(alpha=.0035)

 clf = SGDClassifier(alpha=.0035, penalty='l1', loss='log', l1_ratio=1,
                n_iter=1000, fit_intercept=False)
 clf.fit(X, y)
给出:

sklearn: [-3.79663192 -1.16145654  0.95744308 -5.90284803 -0.67666106]
statsmodels: [-7.28440744 -2.53098894  3.33574042 -7.50604097 -3.15087396]

我一直在处理一些类似的问题。我认为简单的答案可能是,SGD在只有少数样本的情况下效果不太好,但在更大数据的情况下表现更好。我很想听听sklearn开发者的意见。例如,使用LogisticRegression进行比较

clf2 = LogisticRegression(penalty='l1', C=1/.0035, fit_intercept=False)
clf2.fit(X, y)
给出了非常类似于l1惩罚逻辑

array([[-7.27275526, -2.52638167,  3.32801895, -7.50119041, -3.14198402]])

您可以尝试更改惩罚权重alpha。它可能没有相同的标准化,我怀疑它们是否以相同的方式定义或缩放,可能与样本大小有关。但我从未检查过。根据用户333700的建议,我尝试了不同的阿尔法。如果您将SGDClassizer alpha降低到.0001:
[-7.06883118-2.51192083.45516038-7.50767567-3.06782151]
。据我所知,损失函数和惩罚应该是相同的。FWIW,如果您使用原始alpha查看分类器的性能,预测结果是相同的,尽管系数不同。scikit-learn的SGD适合未规范化的截距,而
LogisticRegression
规范化其截距(虽然不是您的Really等人的新解算器,但在下一版本中将是可选的)。在
n_iter=1000
时,SGD应在大多数数据集上收敛。那么,我们是否曾就不同的结果达成共识?SGD似乎已经收敛,至少在每次运行的结果相同,并且在500到1000次迭代之间保持不变的意义上是如此。