我试图理解为什么这两个库的逻辑回归的输出会给出不同的结果。
我使用从加州大学洛杉矶分校idre数据集教程,预测admit
基础上gre
,gpa
和rank
。rank
被视为分类变量,因此先将其rank_1
删除后转换为虚拟变量。还添加了一个拦截列。
df = pd.read_csv("https://stats.idre.ucla.edu/stat/data/binary.csv")
y, X = dmatrices('admit ~ gre + gpa + C(rank)', df, return_type = 'dataframe')
X.head()
> Intercept C(rank)[T.2] C(rank)[T.3] C(rank)[T.4] gre gpa
0 1 0 1 0 380 3.61
1 1 0 1 0 660 3.67
2 1 0 0 0 800 4.00
3 1 0 0 1 640 3.19
4 1 0 0 1 520 2.93
# Output from scikit-learn
model = LogisticRegression(fit_intercept = False)
mdl = model.fit(X, y)
model.coef_
> array([[-1.35417783, -0.71628751, -1.26038726, -1.49762706, 0.00169198,
0.13992661]])
# corresponding to predictors [Intercept, rank_2, rank_3, rank_4, gre, gpa]
# Output from statsmodels
logit = sm.Logit(y, X)
logit.fit().params
> Optimization terminated successfully.
Current function value: 0.573147
Iterations 6
Intercept -3.989979
C(rank)[T.2] -0.675443
C(rank)[T.3] -1.340204
C(rank)[T.4] -1.551464
gre 0.002264
gpa 0.804038
dtype: float64
的输出statsmodels
与idre网站上显示的输出相同,但是我不确定scikit-learn为什么会产生不同的系数集。它会最小化某些损失函数吗?是否有任何文件说明执行情况?
glmnet
R中包,但是无法获得相同的系数。与sklearn相比,glmnet的成本函数略有不同,但是即使我设置alpha=0
了glmnet
(意味着仅使用l2-penalty)并设置了set1/(N*lambda)=C
,我仍然不会得到相同的结果?