如何理解statsmodels中GLMGam的输出并正确使用gam.predict?
Statsmodels GAM模型输出解读与predict维度错误解决
一、维度不匹配报错的原因与解决
错误根源
你的代码存在两个核心问题:
- 混用
from_formula与手动指定smoother:from_formula会自动生成基于原始特征的线性特征矩阵(截距+weight+hp,共3维),但手动传入的BSplines为weight和hp各构建了5个自由度的样条,模型最终参数维度为1(截距)+5+5=11维。predict时传入原始3维特征,自然出现维度对齐失败。 - 未区分训练/测试集:训练时用了全量数据,不符合建模流程,且样条节点应基于训练集计算,不能用全量数据。
修正后的代码
from statsmodels.gam.tests.test_penalized import df_autos import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from statsmodels.gam.api import GLMGam, BSplines # 数据预处理 df_autos_new = df_autos[['city_mpg', 'weight','hp']].copy() X = df_autos_new.drop(columns='city_mpg') y = df_autos_new['city_mpg'] # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 基于训练集构建B样条:指定weight和hp为平滑变量,各5自由度、3次样条 bs = BSplines(X_train, df=[5, 5], degree=[3, 3], include_intercept=False) # 构建并训练GAM模型 gam = GLMGam(endog=y_train, exog=X_train, smoother=bs).fit() # 查看模型摘要 print(gam.summary()) # 正确预测:模型会自动用训练时的样条参数转换测试集 y_pred = gam.predict(X_test) print(f"预测结果维度:{y_pred.shape}")
二、GLMGam输出结果解读
1. 基础模型信息
- Dep. Variable:被预测的因变量(此处为
city_mpg) - No. Observations:训练样本数量
- Df Residuals:残差自由度 = 样本数 - 模型有效参数数
- Penalized Log-Likelihood:惩罚后的对数似然值,数值越大表示模型拟合效果越好
- AIC/BIC:模型选择指标,值越小说明模型在拟合度与复杂度之间的平衡越好
2. 平滑项(Smoother)结果
这部分是GAM的核心,对应每个非线性特征的拟合情况:
- df:预设的样条自由度
- edf:有效自由度(受惩罚项影响,通常小于预设df,值越接近df说明非线性效应越强)
- F/Chi2:检验统计量,用于判断该变量的非线性效应是否显著
- P值:若小于0.05,说明该变量的非线性关系对因变量有显著影响
3. 系数(Coefficients)表
每个样条基函数的系数,展示:
- coef:样条基的权重系数
- std err:系数的标准误,反映估计的稳定性
- z值/P值:检验系数是否显著不为0,P值<0.05说明该基函数对模型有贡献
内容的提问来源于stack exchange,提问作者Ada
相关产品推荐
相关产品推荐

