语言: 中文 最后更新: 2026-05-28 页面定位: 模型文档 切换: English
语言切换:English
GAM 使用惩罚 B 样条拟合广义可加模型,通过广义交叉验证(GCV)自动选择平滑参数。模型为:
其中每个
底层 B 样条基工具请参见 样条基函数。
statgpu.semiparametric.GAM
GAM 拟合惩罚最小二乘模型:
其中
惩罚目标的一阶条件给出如下系统:
通过 Cholesky 分解求解。
GCV 选择 lambda(当 lam=None 时):
其中有效自由度为:
通过对数间隔网格搜索最小化 GCV 来选择 lambda。
edf_:拟合模型的有效自由度。gcv_score_:GCV 得分(lambda 自动选择时可用)。lam_:最终拟合使用的平滑参数。- 不产生系数层面的标准误或 p 值;GAM 是平滑器,而非参数推断工具。
| 参数 | 默认值 | 说明 |
|---|---|---|
n_splines |
20 |
每个特征的样条基函数数量 |
degree |
3 |
样条次数 |
lam |
None |
平滑参数;若为 None 则通过 GCV 自动选择 |
penalty_order |
2 |
差分惩罚矩阵的阶数 |
device |
"auto" |
cpu / cuda / auto |
from statgpu.semiparametric import GAM
import numpy as np
X = np.random.randn(500, 3)
y = np.sin(X[:, 0] * 3) + 0.1 * np.random.randn(500)
# GAM(CPU)
gam = GAM(n_splines=20, device='cpu')
gam.fit(X, y)
print(f"有效自由度: {gam.edf_:.1f}, GCV: {gam.gcv_score_:.6f}")
y_pred = gam.predict(X)
# GAM(GPU)
gam_gpu = GAM(n_splines=20, device='cuda')
gam_gpu.fit(X, y)
y_pred_gpu = gam_gpu.predict(X)- 当
lam=None(默认)时,GAM 在对数间隔网格(1e-10 到 1e10,100 个点)上使用 GCV 选择平滑参数。这是近似路径;网格较粗糙,可能在狭窄谷底遗漏最优 lambda。 - 当手动指定
lam时,对该单一值计算精确的惩罚最小二乘解。这是精确路径。 - 若需在默认网格之外进行精细调整,可传入自定义
lam值,该值可通过更窄的搜索或领域知识获得。
GAM 拟合属性:
| 属性 | 类型 | 说明 |
|---|---|---|
coef_ |
array,形状 (1 + sum(n_basis_j),) |
拼接的样条系数(含截距) |
intercept_ |
float | 截距项 |
edf_ |
float | 有效自由度 |
gcv_score_ |
float | 所选 lambda 下的 GCV 得分 |
lam_ |
float | 使用的平滑参数 |
knots_ |
list of arrays | 各特征的节点位置 |
n_features_ |
int | 输入特征数 |
方法:fit(X, y)、predict(X)、summary()。
节点数量如何选择? n_splines=20 是一个合理的默认值。更多节点提供更大灵活性,但会增加有效自由度并有过拟合风险。
惩罚阶数如何选择? penalty_order=2(二阶差分)是光滑函数的标准选择。若需要分段线性拟合,使用 penalty_order=1。
GPU 加速效果如何? GAM 求解受 Cholesky 分解主导,对于大基维度可从 GPU 加速中获益。
- GAM 预测在标准测试数据集上与 pyGAM 进行了验证。
- Hastie, T., & Tibshirani, R. (1990). Generalized Additive Models. Chapman & Hall.
- Wood, S. N. (2017). Generalized Additive Models: An Introduction with R (2nd ed.). Chapman & Hall/CRC.