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

Statsmodels的Poisson GLM拟合超1小时无返回,该如何解决?

泊松GLM运行无响应问题解决建议
  • 优先检查特征数据预处理情况
    • 确认所有连续数值特征(GDP_mult、distwces、DAI_mult)是否做了标准化/归一化,不同尺度的特征会大幅增加泊松回归迭代收敛的难度,建议用StandardScaler对连续数值特征做尺度调整
    • 检查训练集是否存在缺失值、无穷值,异常值会导致拟合迭代无法收敛,可先用df_train.isnull().sum()、np.isinf(df_train.select_dtypes(include=np.number)).sum()快速排查
    • 确认分类变量的处理是否正确:year、contig、comlang_off、colony均为分类属性,若原数据中未显式标记为类别型,需在公式中声明为分类变量,比如将expr改为BTI ~ GDP_mult + distwces + DAI_mult + C(year) + C(contig) + C(comlang_off) + C(colony),避免把离散分类值当作连续数值参与拟合
  • 调整Statsmodels拟合参数
    调用fit方法时指定更高效的求解器、调整迭代次数和收敛阈值,替换原有拟合代码为:
    poisson_training_results = sm.GLM(y_train, X_train, family=sm.families.Poisson()).fit(
        solver='lbfgs',  # 替换默认的IRLS求解器,收敛速度更快
        maxiter=1000,  # 明确最大迭代次数,避免无限迭代
        tol=1e-6  # 适当放宽收敛阈值,默认阈值过高也会拉长拟合时间
    )
    
  • 排查共线性问题
    计算自变量的方差膨胀因子VIF,若存在VIF>10的变量,说明存在严重共线性,会导致拟合迭代震荡无法收敛,可先删除高共线性变量后再尝试拟合
  • 替换更高效的实现方案
    3万条数据量不大,如果调整后仍无法收敛,可尝试使用scikit-learn的PoissonRegressor实现,计算效率远高于Statsmodels的GLM实现,示例代码如下:
    from sklearn.linear_model import PoissonRegressor
    from sklearn.preprocessing import StandardScaler
    from sklearn.pipeline import make_pipeline
    
    # 构建流水线自动处理特征缩放和拟合
    poisson_model = make_pipeline(StandardScaler(), PoissonRegressor(max_iter=1000))
    poisson_model.fit(X_train, y_train.values.ravel())
    
  • 检查因变量分布是否符合泊松假设
    若因变量BTI存在过多零值、或者方差远大于均值,说明不符合泊松分布假设,此时模型会陷入无意义的迭代,可根据分布情况替换为零膨胀泊松模型、负二项式模型更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:09:05