不同系数:scikit-learn vs statsmodels(逻辑回归)

问题描述 投票:1回答:2

运行逻辑回归时,我使用statsmodels得到的系数是正确的(用一些课程材料验证它们)。但是,我无法使用sklearn得到相同的系数。我试过预处理数据无济于事。这是我的代码:

状态模型:

import statsmodels.api as sm

X_const = sm.add_constant(X)
model = sm.Logit(y, X_const)
results = model.fit()
print(results.summary())

相关产出是:

                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const      -0.2382      3.983     -0.060      0.952      -8.045       7.569
a           2.0349      0.837      2.430      0.015       0.393       3.676
b           0.8077      0.823      0.981      0.327      -0.806       2.421
c           1.4572      0.768      1.897      0.058      -0.049       2.963
d          -0.0522      0.063     -0.828      0.407      -0.176       0.071
e_2         0.9157      1.082      0.846      0.397      -1.205       3.037
e_3         2.0080      1.052      1.909      0.056      -0.054       4.070

Scikit-learn(无预处理)

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
results = model.fit(X, y)
print(results.coef_)
print(results.intercept_)

给出的系数是:

array([[ 1.29779008,  0.56524976,  0.97268593, -0.03762884,  0.33646097,
     0.98020901]])

并且给出的截距/常数是:

array([ 0.0949539])

如您所见,无论哪个系数对应于哪个变量,sklearn给出的数字与statsmodels中的正确数字不匹配。我错过了什么?提前致谢!

python scikit-learn logistic-regression statsmodels
2个回答
3
投票

感谢reddit上的kind soul,这已经解决了。为了获得相同的系数,必须否定regularisation默认情况下应用于逻辑回归的sklearn

model = LogisticRegression(C=1e8)

根据Cdocumentation的位置是:

C:float,默认值:1.0

正规化强度的逆;必须是积极的浮动。与支持向量机一样,较小的值指定更强的正则化。


0
投票

我不熟悉statsmodel,但可能是这个库的.fit()方法使用与sklearn相比不同的默认参数?要验证这一点,您可以尝试为每个.fit()调用显式设置相同的相应参数,并查看是否仍然得到不同的结果。


推荐问答