【发布时间】: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 次,这两个版本中的任何一个都得到相同的结果吗?
标签: python scikit-learn logistic-regression