sklearn.linear_model.LogisticRegression在设置random_state后仍返回不同系数

7 投票
2 回答
3978 浏览
提问于 2025-04-18 11:08

我正在进行逻辑回归模型的训练,并且把随机状态设置为一个固定的值。

每次我进行“训练”时,得到的系数都不一样,比如:

classifier_instance.fit(train_examples_features, train_examples_labels)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, penalty='l2', random_state=1, tol=0.0001)

>>> classifier_instance.raw_coef_
array([[ 0.071101940040772596  ,  0.05143724979709707323,  0.071101940040772596  , -0.04089477198935181912, -0.0407380696457252528 ,  0.03622160087086594843,  0.01055345545606742319,
         0.01071861708285645406, -0.36248634699444892693, -0.06159019047096317423,  0.02370064668025737009,  0.02370064668025737009, -0.03159781822495803805,  0.11221150783553821006,
         0.02728295348681779309,  0.071101940040772596  ,  0.071101940040772596  ,  0.                    ,  0.10882033432637286396,  0.64630314505709030026,  0.09617956519989406816,
         0.0604133873444507169 ,  0.                    ,  0.04111685986987245051,  0.                    ,  0.                    ,  0.18312324521915510078,  0.071101940040772596  ,
         0.071101940040772596  ,  0.                    , -0.59561802045324663268, -0.61490898457874587635,  1.07812569991461248975,  0.071101940040772596  ]])

classifier_instance.fit(train_examples_features, train_examples_labels)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, penalty='l2', random_state=1, tol=0.0001)

>>> classifier_instance.raw_coef_
array([[ 0.07110193825129411394,  0.05143724970282205489,  0.07110193825129411394, -0.04089477178162870957, -0.04073806899140903354,  0.03622160048165772028,  0.010553455400928528  ,
         0.01071860364222424096, -0.36248635488413910588, -0.06159021545062405567,  0.02370064608376460866,  0.02370064608376460866, -0.03159783710841745225,  0.11221149816037970237,
         0.02728295411479400578,  0.07110193825129411394,  0.07110193825129411394,  0.                    ,  0.10882033461822394893,  0.64630314701686075729,  0.09617956493834901865,
         0.06041338563697066372,  0.                    ,  0.04111676713793514099,  0.                    ,  0.                    ,  0.18312324401049043243,  0.07110193825129411394,
         0.07110193825129411394,  0.                    , -0.59561803345113684127, -0.61490899867901249731,  1.07812569539027203191,  0.07110193825129411394]])

我使用的是0.14版本,文档中说明“底层的C实现使用随机数生成器来选择特征进行模型训练。因此,对于相同的输入数据,得到稍微不同的结果是很常见的。如果出现这种情况,可以尝试使用更小的tol参数。”

我以为设置随机状态可以确保没有随机性,但显然并不是这样。这是一个bug还是正常现象呢?

2 个回答

1

我也对这个问题感到困惑,不过最后发现除了传递 random_state 之外,还需要调用 numpy.random.seed() 来设置 numpy 内部随机数生成器的状态。

这是在 sklearn 0.13.1 版本中测试的。

3

这其实不是大家想要的结果,但这是一个众所周知的问题,修复起来非常困难。问题在于,LogisticRegression模型是用Liblinear这个工具训练的,而这个工具在设置随机种子时并不是特别可靠。当你明确设置了random_state,系统会尽力去设置Liblinear的随机种子,但有时候可能会失败。

撰写回答