为何sklearn与statsmodels的Poisson GLM截距和系数不一致?
排查Sklearn与Statsmodels Poisson GLM结果差异的核心方向
以下是针对复杂数据集下两者结果不一致的常见排查点:
1. 特征预处理细节不对齐
- 特征缩放:Sklearn的
PoissonRegressor默认不做特征缩放,如果你在Sklearn侧用了StandardScaler/MinMaxScaler,必须同步给Statsmodels的特征做完全相同的缩放——特征尺度差异会直接导致系数量级偏差。 - 类别编码:如果用独热编码,注意Sklearn的
OneHotEncoder默认drop='first'(丢弃第一个类别避免多重共线性),而Statsmodels的C()函数默认保留所有类别。若两边编码逻辑不同,再加上截距项,会因共线性问题导致系数完全偏离。 - 缺失值处理:Sklearn模型默认会因缺失值报错,Statsmodels默认直接删含缺失值的样本。如果Sklearn侧用了
SimpleImputer填充但Statsmodels侧没同步,训练样本集合不一致,结果必然不同。
2. 模型参数的隐性差异
- 截距项设置:两边默认都带截距,但如果特征工程中手动加了常数项,必须同时关闭两边的自动截距(Sklearn设
fit_intercept=False,Statsmodels在公式里去掉+1),否则重复截距会导致系数异常。 - 权重传递:检查权重数组的维度、类型和样本对应关系——Sklearn的
sample_weight和Statsmodels的weights都是一维数组,但如果预处理时打乱了样本顺序,或权重与样本不匹配,拟合结果会直接跑偏。 - 优化器与收敛条件:Sklearn默认用L-BFGS,Statsmodels默认用IRLS迭代加权最小二乘,两者默认收敛阈值不同(Sklearn是
1e-4,Statsmodels是1e-8)。复杂数据集下收敛性差时,不同阈值会导致最终系数差异。可以手动设相同tol,或者让Sklearn用newton-choleskysolver对齐IRLS逻辑。
3. 目标变量处理不一致
- Poisson前提匹配:确认目标变量是非负整数——Statsmodels的Poisson GLM严格要求这一点,而Sklearn的
PoissonRegressor对非整数目标容忍度更高。如果目标变量在某一侧做了平滑、对数转换等操作,两边拟合逻辑本质不同,结果必然有差。 - 偏移项处理:如果用了偏移项(比如对数曝光量),Sklearn需要手动把偏移项加入特征矩阵,Statsmodels则通过
offset参数传入。处理方式不对会导致截距和系数出现系统性偏差。
4. 训练样本集合不一致
- 样本选择:检查两边的训练样本是否完全相同——比如
train_test_split的随机种子不一致,或者异常值过滤条件不同,都会导致拟合的样本集合不一样,系数自然不同。 - 索引对齐:用Pandas的话,确认两边样本索引完全一致,避免索引混乱导致样本与特征、权重不匹配。
内容的提问来源于stack exchange,提问作者Diadochokinetic
相关产品推荐
相关产品推荐

