不同版本的 sklearn 给出完全不同的训练结果

Posted

技术标签:

【中文标题】不同版本的 sklearn 给出完全不同的训练结果【英文标题】:Different versions of sklearn give quite different training results 【发布时间】:2015-06-25 14:44:36 【问题描述】:

我们将 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.1 中你没有 random_state = None,这是一个错字吗? 0.13 版本没有那个参数。在0.14.1我也试过设置random_state=0,结果和random_state=None一样。 我很惊讶这个问题没有被广泛讨论,因为它是如此明显。文档提到了这一点:底层 C 实现在拟合模型时使用随机数生成器来选择特征。因此,对于相同的输入数据,结果略有不同的情况并不少见。如果发生这种情况,请尝试使用较小的 tol 参数。我想它谈论的是同一版本中的不一致,但如果我使用相同的版本进行训练,我会得到相同的系数。 这可以解释为什么他们在 0.14.0 中引入了 random_state 参数,因为这让我在训练 RandomForest 分类器时发现了这一点,希望 sklearn 开发人员之一能够确认是这种情况,但我怀疑这是发生了什么 如果没有固定的随机状态,追踪正在发生的事情可能非常具有挑战性。如果连续运行 2 次,这两个版本中的任何一个都得到相同的结果吗? 【参考方案1】:

从 0.13 版开始changelog:

修复了 svm.LinearSVC 和 linear_model.LogisticRegression 中的 class_weight 支持 安德烈亚斯穆勒。 class_weight 的含义被错误地颠倒了 在早期版本中,较高的权重意味着给定类别的正面较少。

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

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

您可能想要更改新的LogisticRegression(...) 的参数并尝试进行一些调整。

【讨论】:

以上是关于不同版本的 sklearn 给出完全不同的训练结果的主要内容,如果未能解决你的问题,请参考以下文章

为啥 xgboost.cv 和 sklearn.cross_val_score 给出不同的结果?

为啥我的 k-means 收敛条件给出的结果与 sklearn 不同?

Scipy 和 Sklearn chi2 实现给出不同的结果

sklearn中的Kfold交叉验证每次都会给出不同的折叠

sklearn中调用集成学习算法

Sklearn 和 StatsModels 给出了非常不同的逻辑回归答案