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

Python中如何获取GAM模型各变量的样条结点区间?

获取pygam中LinearGAM的样条区间划分

当使用pygam拟合设置n_splines=5、spline_order=1的线性GAM模型时,若想获取每个变量对应的样条分段区间,仅靠model.edge_knots只能拿到变量的首尾取值范围,无法获取具体的区间划分。可以通过以下方法解决:

核心方法:利用model.grid属性

model.grid会返回每个输入变量对应的完整样条结点网格,将相邻结点配对就能生成所有分段区间。

代码示例(基于你的mtcars数据集)

import statsmodels.api as sm
from pygam import LinearGAM

data = sm.datasets.get_rdataset('mtcars').data
Y = data['mpg']
X = data.drop("mpg",axis=1)

# 拟合模型
model = LinearGAM(spline_order=1, n_splines=5).fit(X, Y)

# 获取所有变量的结点网格
all_variable_knots = model.grid

# 定位cyl变量在X中的索引
cyl_col_index = X.columns.get_loc('cyl')
# 获取cyl对应的所有结点
cyl_knots = all_variable_knots[cyl_col_index]

# 生成区间列表(相邻结点配对)
cyl_spline_intervals = list(zip(cyl_knots[:-1], cyl_knots[1:]))

print("cyl变量的样条区间:", cyl_spline_intervals)
# 输出结果:[(4.0, 5.0), (5.0, 6.0), (6.0, 7.0), (7.0, 8.0)]

补充说明

  • 当spline_order=1(分段线性样条)时,每个变量的结点数等于n_splines,因此区间数量为n_splines - 1
  • 若使用更高阶样条(如spline_order>1),结点数会变为n_splines + spline_order - 1,但区间划分逻辑依然是取相邻结点配对

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:34:57