You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

逻辑回归中scikit-learn与statsmodels的系数差异问题

为什么scikit-learn和statsmodels的逻辑回归系数不一致?

这是个很常见的问题!核心原因是两个库的逻辑回归默认参数设置差异很大,尤其是正则化和优化器的选择,我来帮你拆解并解决:

关键差异点

1. 正则化(L2惩罚)的默认状态

  • statsmodels的sm.Logit默认完全没有正则化,不对系数做任何压缩;
  • 而scikit-learn的LogisticRegression默认开启了L2正则化(参数penalty='l2',C=1.0)——这会大幅压缩系数的绝对值,直接导致和statsmodels的结果偏离。

2. 优化器与收敛逻辑

  • statsmodels默认使用牛顿-拉夫逊法(Newton-Raphson)进行优化;
  • scikit-learn默认根据数据集大小选择优化器(比如小数据集用liblinear),不同的优化算法收敛时的结果会有细微差异,再加上正则化的影响,系数自然不一样。

3. 类别变量编码的一致性

虽然你提到变量对应关系没问题,但要额外确认:statsmodels中生成的虚拟变量(比如e_2、e_3)的基准类别是否和scikit-learn中的一致——如果基准类别不同,对应变量的系数符号或绝对值也会出现偏差。

修正后的scikit-learn代码

要让scikit-learn的结果和statsmodels对齐,只需要修改参数,关闭正则化并选择匹配的优化器:

from sklearn.linear_model import LogisticRegression

# 对齐statsmodels的设置:关闭正则化,使用牛顿类优化器,确保迭代次数足够
model = LogisticRegression(
    penalty='none',  # 完全关闭正则化
    solver='newton-cg',  # 选择和statsmodels类似的牛顿法优化器
    fit_intercept=True,  # 自动添加截距(和statsmodels的const对应)
    max_iter=1000  # 增加迭代次数,确保模型充分收敛
)
results = model.fit(X, y)

print("系数:", results.coef_)
print("截距:", results.intercept_)

验证结果

修改后,scikit-learn输出的系数应该和statsmodels的结果几乎完全一致(可能存在极小的浮点差异,这是不同优化器实现细节导致的,不影响结论)。

内容的提问来源于stack exchange,提问作者lfo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:07:31