基于sklearn的岭回归分析、岭迹图介绍

794 阅读4分钟

岭回归 (Ridge Regression) 是一种线性回归模型的改进方法,专门用于解决多重共线性问题以及提高模型的泛化能力。在传统的线性回归中,当特征之间存在较强的相关性时,模型的系数会变得不稳定,甚至可能导致过拟合。岭回归通过加入正则化项 (regularization term) 来约束回归系数的大小,从而有效缓解这些问题。

  • 其实就是引入少量偏差,让模型不会过于拟合数据,让模型预测的方差显著下降如下图,其中红色是训练的数据点,绿色是预测数据点。红色线是采用最小二乘法进行拟合的模型,蓝色则是岭回归(注:图片来自StatQuest)

image.png

一、岭回归的数学原理

岭回归的目标函数如下:

minβ  yXβ22+λβ22\underset{\beta}{\min} \ \ \|y - X\beta\|^2_2 + \lambda \|\beta\|^2_2

其中:

  • yXβ22=i=1n(yiy^i)2y - X\beta\|^2_2 = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2:普通最小二乘法 (OLS) 的损失函数,表示模型预测误差的平方和。
  • β22=j=1pβj2\beta\|^2_2 = \sum_{j=1}^{p} \beta_j^2:回归系数的 L2 范数平方,表示系数的大小。
  • λ\lambda:正则化超参数,用于控制正则化项的权重。

工作原理:通过加入 λβ22\lambda \|\beta\|^2_2​,岭回归在拟合数据的同时限制了回归系数的增长。较大的 λ 会使系数趋近于零,但不会完全变为零(不同于套索回归)。这一性质使岭回归特别适合处理高维数据和多重共线性问题。

二、岭回归的特点
  1. 解决多重共线性问题
    多重共线性会导致普通最小二乘回归的系数估计不稳定,而岭回归通过正则化约束有效减小了系数的波动性。
  2. 避免过拟合
    当模型复杂度过高时,正则化项可以防止模型对训练数据过度拟合,提高泛化能力。
  3. 不会进行特征选择
    与Lasso Regression 不同,岭回归不会将特征系数变为零,因此适合处理所有特征都较为重要的情况。
  4. 在数据量较小的时候,岭回归可以降低预测对训练数据的敏感度,减少方差
三、岭回归中的超参数调整

岭回归的核心超参数是 λ(在 sklearn 中为 alpha)。合理选择 λ的值对模型性能至关重要。λ越大,斜率就越小,常用的方法包括:

  1. 手动尝试不同的 λ
    使用循环测试不同的 λ\lambdaλ 值,并选择使验证集误差最小的值。

  2. 交叉验证
    使用 sklearn 提供的 RidgeCV 类,通过交叉验证自动寻找最佳的 λ。

    from sklearn.linear_model import RidgeCV # 自动选择最佳正则化强度 
    ridge_cv = RidgeCV(alphas=[0.1, 1.0, 10.0, 100.0], cv=5) 
    ridge_cv.fit(X_train, y_train) print("最佳 alpha 值:", ridge_cv.alpha_)
    
  3. 岭际图,用于观察不同正则化参数(α)取值下

四实战部分
1.导包
import pandas as pd
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.linear_model import Ridge#导入岭回归模型
from sklearn.preprocessing import StandardScaler#标准化
import warnings
warnings.filterwarnings('ignore')
  • 数据来源<<应用回归分析 R语言版>>题5.9
x1x2x5y
01018.41607.02239.11132.26
11258.91769.72619.41146.38
21359.41996.52976.11159.93
31545.62048.43309.11175.79
41761.62162.33637.91212.33
51960.82375.64020.51366.95
62295.52789.04694.51642.86
72541.63448.75773.02004.82
82763.93967.06542.02122.01
93204.34585.87451.22199.35
103831.05777.29360.12357.24
114228.06484.010556.52664.90
125017.06858.011365.22937.10
135288.68087.113145.93149.48
145800.010284.515952.13483.37
156882.114143.820182.14348.95
169457.219359.626796.05218.10
1711993.024718.333635.06242.20
1813844.229082.640003.97407.99
1914211.232412.143579.48651.14
2014599.633429.846405.99875.95

2、岭迹图(Ridge trace plot)

岭迹图(Ridge trace plot)是一种用于可视化岭回归模型的工具,用于观察不同正则化参数(α)取值下,模型系数的变化情况。在岭回归中,正则化参数控制了模型的复杂度,因此岭迹图可以帮助我们了解模型系数随着正则化参数的变化而如何变化。

X = data_.drop('y',axis = 1)
y = data_.y

alpha_lst = np.logspace(-1, 0.1, 100) 

coefs = []
for a in alpha_lst:
    ridge = Ridge(alpha=a)
    ridge.fit(X,y)
    coefs.append(ridge.coef_)
    
plt.figure(figsize= (12,8))
plt.plot(alpha_lst,coefs)
plt.xlabel('Alpha')
plt.ylabel('Coefficients')
plt.legend(['x1','x2','x5'])
plt.grid(True)
plt.show()

image.png 3. 通过观察 岭际线 发现 alpha取1的时候,系数稳定,进行结果可视化

python
复制代码
from sklearn.linear_model import RidgeCV

# 自动选择最佳正则化强度
ridge_cv = RidgeCV(alphas=[0.1, 1.0, 10.0, 100.0], cv=5)
ridge_cv.fit(X_train, y_train)

print("最佳 alpha 值:", ridge_cv.alpha_)
plt.style.use('default')
plt.figure(figsize=(10,6))
plt.grid(alpha = 0.3,linestyle = '--',color = 'black')
plt.plot(y,marker = 'o',linestyle = '-',label = '真实值',color = '#ACD6EC')
plt.plot(ridge.predict(X),marker = 'o',linestyle = '-',label = '拟合值',color = '#F5A889')
plt.legend()
plt.show()

image.png

  1. 系数查看
#取alpha= 1
ridge = Ridge(alpha= 1)
ridge.fit(X,y)
ridge.coef_,ridge.intercept_

函数: y^=0.61116302×x1+0.35303748×x2+0.63669417×x5+874.5861613019069\hat{y} = -0.61116302 \times x_1 + -0.35303748 \times x_2 +0.63669417 \times x_5 + 874.5861613019069

Reference

StatQuest