不同版本的 sklearn 给出了截然不同的训练结果

Different versions of sklearn give quite different training results

我们将 sklearn 从旧的 0.13-git 升级到 0.14.1,发现逻辑回归分类器的性能发生了很大变化。用相同的数据训练的两个分类器具有不同的系数,因此往往会给出不同的分类结果。

作为实验,我使用了 5 个数据点(高维)来训练 LR 分类器,结果是:

0.13-git:

clf.fit(data_test.data, y)
LogisticRegression(C=10, class_weight='auto', dual=False, fit_intercept=True,
intercept_scaling=1, penalty='l2', tol=0.0001)
np.sort(clf.coef_)
array([[-0.12442518, -0.11137502, -0.11137502, ..., 0.05428562,
0.07329358, 0.08178794]])

0.14.1:

clf1.fit(data_test.data, y)
LogisticRegression(C=10, class_weight='auto', dual=False, fit_intercept=True,
intercept_scaling=1, penalty='l2', random_state=None, tol=0.0001)
np.sort(clf1.coef_)
array([[-0.11702073, -0.10505662, -0.10505662, ..., 0.05630517,
0.07651478, 0.08534311]])

可以说差别还是挺大的,在10^(-2)的范围内。显然我这里使用的数据并不理想,因为特征的维度远远大于条目的数量。然而,实践中也经常出现这种情况。 它与特征选择有关吗?我怎样才能使结果和以前一样?我明白新的结果不一定比以前差,但现在的重点是让它们尽可能一致。 谢谢

从 0.13 版开始 changelog:

Fixed class_weight support in svm.LinearSVC and linear_model.LogisticRegression by Andreas Müller. The meaning of class_weight was reversed as erroneously higher weight meant less positives of a given class in earlier releases.

但是,更新的描述是针对版本 0.13,而不是更高版本。您提到您使用的是 0.13-git 版本,也许您使用的是 0.13 版的预发布版本,其中的功能未被编辑:这样,更新可能对您的问题有意义。

通过查看您的系数,它们在新版本中较低,这与更新的描述说明权重最初已降低有点道理。

您可能想要更改新 LogisticRegression(...) 的参数并尝试稍微调整一下。