在机器学习中,线性回归能够用特征的线性组合去刻画目标变量的变化规律,因此它常常是回归问题的入门模型。
但是,当特征之间存在较强相关性,或者特征数量增多、模型变得更复杂时,普通线性回归往往会出现一个典型问题:模型虽然能够拟合训练数据,但学到的系数可能不稳定,甚至对新数据的泛化能力变差。
例如,在房价预测中,房屋面积、卧室数量、客厅数量、建筑面积等特征往往彼此相关;在这种情况下,普通最小二乘回归虽然仍能给出一组参数,但这些参数可能对数据扰动非常敏感,导致模型不够稳健。
岭回归(Ridge Regression)正是为缓解这一问题而提出的重要方法。它在普通线性回归的误差目标之外,引入一个对参数大小进行约束的惩罚项,使模型在拟合数据的同时,尽量避免系数过大。这样做的结果通常是:模型更稳定,对共线性更不敏感,也更容易获得更好的泛化能力。
一、岭回归的基本思想
岭回归的核心思想是:在线性回归的基础上,为模型参数增加一个“不要太大”的约束,从而让模型在拟合训练数据时不过分依赖某些特征。
普通线性回归的目标,是让预测值尽量接近真实值;
而岭回归则进一步要求:既要让预测误差尽量小,也要让系数整体不要过大。
这意味着,岭回归不再单纯追求“把训练数据拟合得尽可能好”,而是在“拟合能力”和“模型复杂度”之间做平衡。
从直观上看,如果一个模型为了贴合训练数据而学出了非常大的系数,那么它往往意味着模型对数据中的微小波动也很敏感。岭回归通过惩罚大系数,迫使模型选择一组更平滑、更稳健的参数。
因此,岭回归可以看作是:
• 保留线性回归的基本形式
• 在参数学习阶段加入正则化约束
• 以牺牲部分训练拟合程度为代价,换取更好的稳定性与泛化能力
图 1 岭回归的基本思想:同时考虑拟合误差与参数约束
二、岭回归的数学表达
1、普通线性回归的模型形式
无论是一元还是多元情形,岭回归都沿用了线性回归的预测形式。
一元线性回归可写为:
多元线性回归可写为:
其中:
• x 或 x₁, x₂, …, xₙ 表示输入特征
• ŷ 表示模型预测值
• w 或 w₁, w₂, …, wₙ 表示系数
• b 表示截距
也就是说,岭回归与普通线性回归在“模型形式”上并没有区别,区别在于“如何学习参数”。
2、普通线性回归的优化目标
普通线性回归通常通过最小化残差平方和来学习参数:
或者写成均方误差形式:
这里:
• yᵢ 是第 i 个样本的真实值
• ŷᵢ 是第 i 个样本的预测值
• n 是样本数
普通线性回归只关心“预测误差有多大”。
3、岭回归的优化目标
岭回归在残差平方和之外,又加入了一个对参数平方和的惩罚项。常见形式为:
其中:
• 第一部分是拟合误差
• 第二部分是正则化项
• p 表示特征数
• α 表示正则化强度参数
也可以写成更紧凑的形式:
这里的:
表示参数向量的平方和,也常称为 L2 正则化项。
4、α 的作用
α 是岭回归中最关键的超参数之一。它控制“拟合误差”和“参数约束”之间的权衡。
• 当 α = 0 时,岭回归就退化为普通线性回归
• 当 α 较小时,惩罚较弱,模型更接近普通线性回归
• 当 α 较大时,惩罚更强,系数会被压缩得更明显
因此,α 并不是越大越好,也不是越小越好,而是需要在拟合能力与泛化能力之间找到较合适的平衡点。
三、岭回归为什么有效
1、普通线性回归的问题
普通线性回归在很多情况下表现良好,但当数据出现以下情况时,往往容易出现问题:
• 特征之间高度相关
• 特征数量较多
• 数据中存在噪声
• 训练样本有限
在这些情况下,普通最小二乘法可能会得到一组幅度很大的系数。这些系数虽然能较好拟合训练集,却可能对新样本表现不佳。
2、参数收缩的意义
岭回归的关键作用,就是把系数“往零附近拉回去”,这种现象常称为参数收缩(shrinkage)。
需要注意的是,岭回归通常不会把系数直接压缩到 0,而是让它们变小、变平滑。这样做有两个重要效果:
• 降低模型对单个特征的过度依赖
• 提高模型对数据扰动的稳定性
3、与共线性的关系
当多个特征高度相关时,模型会面临“到底该把权重分配给谁”的不稳定问题。
普通线性回归在这种情况下常会得到数值很大、方向相反的系数;而岭回归则会通过正则化,把这种不稳定性压制下来。
因此,岭回归尤其适合:
• 特征之间存在多重共线性
• 希望保留全部特征
• 更看重预测稳定性而非纯粹的训练拟合
图 2 岭回归缓解参数不稳定的基本逻辑
四、模型参数的解释
岭回归仍然保留了线性模型的基本可解释性,但与普通线性回归相比,它的参数解释需要多一层“正则化背景”的理解。
1、系数的含义
岭回归中每个系数仍然表示对应特征对预测结果的线性影响方向与影响强度。
• 系数为正,表示特征增大时,预测值倾向于增大
• 系数为负,表示特征增大时,预测值倾向于减小
• 系数绝对值越大,通常表示影响更强
但需要注意的是:这些系数不是单纯由数据拟合得到的,它们还受到正则化项的压缩影响。
2、系数为什么会变小
在岭回归中,系数变小并不意味着特征“没有用了”,而意味着模型在主动减少对该特征的过度依赖。
因此,岭回归系数的解读应理解为:
• 这是在“拟合数据 + 控制复杂度”共同约束下得到的参数
• 它更强调稳健性,而不是单纯追求训练集上的最优拟合
3、截距的含义
截距 b 的含义与普通线性回归类似,仍表示在所有输入特征取零时模型的基础输出。
在 Scikit-learn 中,Ridge 训练后同样可以通过:
• coef_ 查看系数
• intercept_ 查看截距
五、Python 实现:一元岭回归示例
下面先用一个简洁的一元回归示例,演示岭回归的基本实现方式。为了保持与线性回归文章一致的风格,这里仍然使用 make_regression 生成数据,并展示训练、预测与可视化流程。
import numpy as npimport matplotlib.pyplot as plt from sklearn.datasets import make_regressionfrom sklearn.linear_model import Ridgefrom sklearn.model_selection import train_test_split # 根据操作系统选择中文字体(二选一,取消注释对应行)plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"] # Windows# plt.rcParams["font.sans-serif"] = ["Songti SC"] # macOSplt.rcParams["axes.unicode_minus"] = False # 解决负号显示为方块的问题 # ========== 1. 生成一元回归数据 ==========# make_regression: 生成一个用于回归任务的随机数据集# 参数说明:# n_samples=120 - 样本数量(生成120个数据点)# n_features=1 - 特征数量(1个特征,即一元回归)# noise=20 - 添加的高斯噪声的标准差(数值越大,数据越分散)# random_state=42 - 随机种子,保证每次运行生成相同的数据(方便复现结果)X, y = make_regression( n_samples=120, n_features=1, noise=20, random_state=42) # ========== 2. 划分训练集和测试集 ==========# train_test_split: 将数据集随机划分为训练集和测试集# 参数说明:# X, y - 特征矩阵和目标向量# test_size=0.2 - 测试集所占比例(20% 的数据用于测试,80% 用于训练)# random_state=42 - 随机种子,保证每次划分方式一致# 返回值:# X_train, X_test - 训练集特征、测试集特征# y_train, y_test - 训练集目标、测试集目标X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42) # ========== 3. 创建并训练岭回归模型 ==========# Ridge: 岭回归(L2正则化线性回归),通过惩罚系数大小防止过拟合# 参数说明:# alpha=1.0 - 正则化强度(必须为正浮点数)# alpha 越大,惩罚越强,系数越趋近于0,模型越简单# alpha 越小,越接近普通线性回归(可能过拟合)# 其他常用参数:# fit_intercept=True - 是否计算截距(默认True)# copy_X=True - 是否复制特征矩阵(默认True)# max_iter=None - 最大迭代次数(None表示使用默认值)# tol=0.0001 - 收敛精度阈值# solver='auto' - 求解器(auto/ svd/ cholesky/ lsqr/ sparse_cg/ sag/ saga)model = Ridge(alpha=1.0) # fit: 训练模型,学习系数和截距# 参数:# X_train - 训练集特征(二维数组,形状 [n_samples, n_features])# y_train - 训练集目标(一维数组,形状 [n_samples])model.fit(X_train, y_train) # ========== 4. 在测试集上做预测 ==========# predict: 使用训练好的模型对数据进行预测# 参数:# X_test - 测试集特征(二维数组)# 返回值: 预测的目标值数组y_pred = model.predict(X_test) # ========== 5. 查看模型参数 ==========# coef_: 模型的系数(斜率),对于一元回归是一个包含一个元素的数组# intercept_: 模型的截距(偏置项)print("系数 coef_ =", model.coef_[0])print("截距 intercept_ =", model.intercept_) # ========== 6. 为绘图准备平滑直线 ==========# argsort: 返回数组排序后的索引# 作用: 将X按第一列(特征值)从小到大排序,使画出的回归直线连续且无交叉order = np.argsort(X[:, 0])X_sorted = X[order] # 按排序后的索引重排Xy_line = model.predict(X_sorted) # 在排序后的X上做预测,得到平滑的回归直线 # ========== 7. 可视化:散点图 + 回归直线 ==========plt.figure(figsize=(8, 5)) # 创建画布,大小为宽8英寸、高5英寸plt.scatter(X_train, y_train, label="训练样本") # 绘制训练集散点图plt.scatter(X_test, y_test, label="测试样本") # 绘制测试集散点图plt.plot(X_sorted, y_line, linewidth=2, label="岭回归直线") # 绘制回归直线plt.xlabel("特征值") # x轴标签plt.ylabel("目标值") # y轴标签plt.title("一元岭回归示例") # 图表标题plt.legend() # 显示图例plt.show() # 显示图像输出示意图:
这段代码展示了岭回归最基本的工作流:
1、生成或加载数据
2、划分训练集与测试集
3、创建模型并训练
4、做预测
5、查看系数与截距
6、用散点图和回归直线观察拟合效果
从形式上看,这个流程与普通线性回归非常接近,最主要的区别在于:模型由 LinearRegression 换成了 Ridge(alpha=1.0),也就是在拟合时加入了正则化约束。
六、Python 实现:多特征岭回归示例
下面再给出一个多特征示例,用来说明岭回归在特征较多时的基本使用方式。
from sklearn.datasets import make_regressionfrom sklearn.linear_model import Ridgefrom sklearn.model_selection import train_test_split # 1. 生成多特征回归数据X, y = make_regression( n_samples=200, n_features=5, n_informative=5, noise=25, random_state=42) # 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42) # 3. 创建并训练模型model = Ridge(alpha=2.0)model.fit(X_train, y_train) # 4. 输出模型参数print("各特征系数:", model.coef_)print("截距:", model.intercept_) # 5. 查看测试集上的部分预测结果y_pred = model.predict(X_test) for i in range(5): print(f"真实值: {y_test[i]:.2f} 预测值: {y_pred[i]:.2f}")在这个例子中,coef_ 不再是单个数,而是一组系数,每个系数对应一个输入特征。
与普通线性回归相比,岭回归的这些系数通常会更平滑、更保守。
如果把这个例子与普通线性回归对比,往往会发现:
• 岭回归的系数绝对值通常更小
• 模型在新样本上的表现可能更稳定
• 当特征相关性较强时,这种稳定性优势会更明显
七、岭回归适用场景与主要局限
1、适用场景
岭回归较适合以下情况:
• 目标是连续数值
• 特征之间可能存在较强相关性
• 特征数量较多,模型容易变复杂
• 希望保留全部特征,而不是直接删去某些变量
• 需要一个比普通线性回归更稳健的基线模型
在很多实际问题中,岭回归可以看作普通线性回归的重要增强版本。它特别适合作为“先从线性模型出发,再通过正则化改善稳定性”的自然过渡。
2、主要局限
岭回归虽然重要,但也并不是万能方法。
• 仍然是线性模型:如果真实关系明显非线性,岭回归也无法从根本上解决表达能力不足的问题
• 不会产生稀疏解:岭回归通常会缩小系数,但一般不会把系数直接压到 0
• 参数解释会受正则化影响:系数反映的不只是数据关系,也反映了正则化约束
• 需要选择合适的 α:若 α 过大,模型可能过于保守;若 α 过小,则可能接近普通线性回归而失去正则化优势
📘 小结
岭回归在线性回归的误差目标之外加入 L2 正则化项,通过约束系数大小来提高模型稳定性。它是理解正则化、参数收缩与泛化能力之间关系的重要起点。
“点赞有美意,赞赏是鼓励”