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),避免把离散分类值当作连续数值参与拟合
- 确认所有连续数值特征(GDP_mult、distwces、DAI_mult)是否做了标准化/归一化,不同尺度的特征会大幅增加泊松回归迭代收敛的难度,建议用
- 调整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
相关产品推荐
相关产品推荐

