当使用这两个 API 执行逻辑回归时,它们会给出不同的系数。即使是这个简单的例子,它在系数方面也不会产生相同的结果。我遵循关于同一主题的旧建议的建议,例如在 sklearn 中为参数 C 设置一个大值,因为它使惩罚几乎消失(或设置 penalty="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 也会给出不同的系数(因此比值比),并且对于真实数据(此处未显示),它几乎会“失控”......
我错过了什么吗?我怎样才能产生相似的系数,例如至少在逗号后的一两个数字?
翻阅古今
相关分类