广义加性模型
3. 广义加性模型 (Generalized Additive Model, GAM)
广义加性模型可以视为线性和非线性回归的折中,适合捕捉非线性但“接近线性”的趋势。它允许将回归结果视为线性和非线性成分的叠加。
在 GAM 中,可以将响应变量 y y y 表示为不同特征 x x x 的加性组合:
y = β 0 + f ( x ) + ϵ y = \beta_0 + f(x) + \epsilon y=β0+f(x)+ϵ
其中 f ( x ) f(x) f(x) 可以是一个平滑函数(例如 B样条函数),它在整体上保持趋势为“直线”,但允许局部轻微弯曲。
- 优点:能捕捉微弱的非线性趋势,同时保持模型解释性。
- 缺点:模型稍复杂,且构建和调参需要一些经验。
广义加性模型(Generalized Additive Model, GAM)是一种灵活的回归方法,用于捕捉数据的非线性关系。GAM 在每个特征上使用平滑函数,从而可以适应复杂的非线性数据。我们可以使用 pyGAM
库来实现 GAM 回归,并绘制数据散点、回归曲线以及置信区间。
以下是使用 GAM 的 Python 代码示例。请确保安装 pyGAM
库:
pip install pygam
代码示例
import numpy as np
import matplotlib.pyplot as plt
from pygam import LinearGAM, s
from sklearn.utils import resample# 生成带有非线性趋势的样本数据
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = np.sin(x) + 0.5 * x + np.random.normal(0, 0.3, x.shape)# 重新调整形状以适应 pyGAM 的输入格式
X = x[:, np.newaxis]# 使用 pyGAM 构建和拟合 GAM 模型
gam = LinearGAM(s(0)) # s(0) 表示对第一个特征使用平滑样条
gam.gridsearch(X, y)# 预测和计算置信区间
XX = np.linspace(0, 10, 100)
y_pred = gam.predict(XX)
confidence_interval = gam.prediction_intervals(XX, width=0.95) # 95% 置信区间# 绘制散点图、回归曲线和置信区间
plt.figure(figsize=(10, 6))
plt.scatter(x, y, color='gray', label='Data Points')
plt.plot(XX, y_pred, color='blue', label='GAM Regression')
plt.fill_between(XX, confidence_interval[:, 0], confidence_interval[:, 1], color='lightblue', alpha=0.5, label='95% Confidence Interval')
plt.xlabel('x')
plt.ylabel('y')
plt.title('GAM Regression with 95% Confidence Interval')
plt.legend()
plt.show()
代码说明
- 数据生成:创建带有非线性趋势的数据集 y = sin ( x ) + 0.5 × x + noise y = \sin(x) + 0.5 \times x + \text{noise} y=sin(x)+0.5×x+noise。
- 构建 GAM 模型:使用
pyGAM
库的LinearGAM
类构建 GAM 模型,并使用s(0)
表示对第一个特征使用平滑样条函数。 - 模型拟合与网格搜索:使用
gridsearch
方法来自动选择最佳平滑度参数。 - 预测和置信区间计算:使用
prediction_intervals
方法计算 95% 置信区间。 - 绘图:绘制数据点、GAM 回归曲线和置信区间。
输出图形
运行此代码后将生成以下内容:
- 灰色散点图:显示数据的原始分布。
- 蓝色 GAM 回归曲线:GAM 模型的拟合曲线,反映数据的非线性趋势。
- 淡蓝色的置信区间:展示 95% 置信区间,反映了模型对不同 x 值的置信范围。