【问题标题】:Difference in SGD classifier results and statsmodels results for logistic with l1L1 的逻辑 SGD 分类器结果和 statsmodels 结果的差异
【发布时间】:2014-12-02 11:27:36
【问题描述】:

作为对我工作的检查,我一直在比较 scikit learn 的 SGDClassifier 逻辑实现的输出与 statsmodels 逻辑。一旦我将一些 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]

【问题讨论】:

  • 您可以尝试更改惩罚权重 alpha。它可能没有与之相关的相同标准化,我怀疑它们是否以相同的方式定义或缩放,可能与样本量有关。但我从未检查过。

标签: scikit-learn statsmodels


【解决方案1】:

我一直在解决一些类似的问题。我认为简短的回答可能是 SGD 仅在少数样本上效果不佳,但在更大的数据下(更多)性能。我有兴趣听取 sklearn 开发人员的意见。例如,使用 LogisticRegression 进行比较

clf2 = LogisticRegression(penalty='l1', C=1/.0035, fit_intercept=False)
clf2.fit(X, y)

给出的结果与 l1 惩罚 Logit 非常相似。

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

【讨论】:

  • 根据 user333700 的建议,我尝试了不同的 alpha。如果您将 SGDClassifier alpha 降低到 0.0001,它们会变得非常相似:[-7.06883118 -2.51192083 3.45516038 -7.50767567 -3.06782151]
  • 有趣。据我所知,损失函数和惩罚应该是一样的。 FWIW,如果您使用原始 alpha 查看分类器的性能,尽管系数不同,但预测是相同的。
  • scikit-learn 的 SGD 适合非正则化截距,而 LogisticRegression 正则化它的截距(尽管您的新求解器没有真正等。这将在下一个版本中是可选的)。在n_iter=1000,SGD 应该收敛于大多数数据集。
  • 那么我们有没有就不同的结果达成共识? SGD 似乎已经收敛,至少在每次运行的结果相同并且在 500 到 1000 次迭代之间保持不变的意义上。
猜你喜欢
  • 2021-12-26
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 2014-01-30
  • 2019-08-14
  • 2021-04-04
  • 2016-02-05
  • 2017-06-28
相关资源
最近更新 更多