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

时间:2018-05-19 19:37:09

标签: python scikit-learn logistic-regression statsmodels

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

Statsmodels:

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中的正确数字不匹配。我错过了什么?提前谢谢!

2 个答案:

答案 0 :(得分:2)

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

model = LogisticRegression(C=1e8)

根据documentationC是:

  

C:float,默认值:1.0

     

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

答案 1 :(得分:0)

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