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

如何理解statsmodels中GLMGam的输出并正确使用gam.predict?

Statsmodels GAM模型输出解读与predict维度错误解决

一、维度不匹配报错的原因与解决

错误根源

你的代码存在两个核心问题:

  1. 混用from_formula与手动指定smoother:from_formula会自动生成基于原始特征的线性特征矩阵(截距+weight+hp,共3维),但手动传入的BSplines为weight和hp各构建了5个自由度的样条,模型最终参数维度为1(截距)+5+5=11维。predict时传入原始3维特征,自然出现维度对齐失败。
  2. 未区分训练/测试集:训练时用了全量数据,不符合建模流程,且样条节点应基于训练集计算,不能用全量数据。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:15:36