【发布时间】:2020-09-12 07:09:14
【问题描述】:
当使用这两个 API 执行逻辑回归时,它们会给出不同的系数。 即使使用这个简单的示例,它也不会在系数方面产生相同的结果。我遵循旧建议中关于同一主题的建议,例如在 sklearn 中为参数 C 设置一个较大的值,因为它使惩罚几乎消失(或设置惩罚 =“none”)。
import pandas as pd
import numpy as np
import sklearn as sk
from sklearn.linear_model import LogisticRegression
import statsmodels.api as sm
n = 200
x = np.random.randint(0, 2, size=n)
y = (x > (0.5 + np.random.normal(0, 0.5, n))).astype(int)
display(pd.crosstab( y, x ))
max_iter = 100
#### Statsmodels
res_sm = sm.Logit(y, x).fit(method="ncg", maxiter=max_iter)
print(res_sm.params)
#### Scikit-Learn
res_sk = LogisticRegression( solver='newton-cg', multi_class='multinomial', max_iter=max_iter, fit_intercept=True, C=1e8 )
res_sk.fit( x.reshape(n, 1), y )
print(res_sk.coef_)
例如,我只是运行上面的代码并得到 1.72276655 的 statsmodels 和 1.86324749 的 sklearn。当多次运行时,它总是给出不同的系数(有时比其他的更接近,但无论如何)。
因此,即使使用那个玩具示例,这两个 API 也给出了不同的系数(所以优势比),而对于真实数据(此处未显示),它几乎会“失控”...
我错过了什么吗?我怎样才能产生相似的系数,例如在逗号后至少有一两个数字?
【问题讨论】:
-
貌似有类似的问题:SO-statmodel-sklearn
标签: python machine-learning scikit-learn logistic-regression statsmodels