岭回归与Lasso回归:从原理到实战的一篇全教程
本文面向已了解“线性回归”的读者,但可能遇到过拟合、共线性和特征过多的问题。我们将从“为何普通线性回归会出现偏差”开始,系统地介绍岭回归(Ridge)和Lasso回归的原理、公式、编程应用及结果解读,并提供一个带有示例数据的实战案例。
一、为何需要岭回归和Lasso回归?
在回归分析中,最常用的起点是最小二乘线性回归(OLS):
模型:
y = β + βx + ... + βx + ε
目标:
min β ∑(y - ) = min β ||y - Xβ||
然而,OLS存在两个主要问题:
- 当特征间高度相关(多重共线性)时,模型系数会变得极其不稳定,即使数据稍有变化,系数也会大幅波动;某些系数可能变得异常大,影响模型的解释性。
- 当特征数量庞大时,模型易发生过拟合,即在训练集上表现良好,但在测试集上的预测性能较差。
解决方案是通过正则化(regularization)来同时惩罚误差(残差平方和)和过大的系数。
二、岭回归(Ridge Regression)
2.1 基本概念
岭回归在最小二乘损失的基础上添加了L2范数惩罚项:
目标函数(惩罚形式):
min β [∑(y - ) + λ ∑β]
或表示为矩阵形式:
min β ||y - Xβ|| + λ ||β||
其中:
- X 是 n × p 的特征矩阵;
- β = (β, ..., β) 是系数向量;
- λ ≥ 0 是正则化系数(惩罚参数)。
直观理解:
- 减小误差(提高拟合度);
- 限制系数大小(防止模型过于敏感);
- λ 控制这两者之间的平衡。
2.2 解析解
岭回归具有一个优雅的解析解:
βridge = (XX + λI)Xy
其中 I 是单位矩阵。
特别地:
- 当 λ = 0 时,退化为普通的最小二乘解;
- 当 λ → +∞ 时,所有 β → 0。
需要注意的是,岭回归不会将任何系数完全压缩至0,而是使它们“缩小”。因此,岭回归主要用于平滑系数、缓解多重共线性,而不进行特征选择。
2.3 何时使用岭回归?
岭回归适用于以下情况:
- 特征间存在显著的多重共线性;
- 希望保留所有特征,但不希望系数波动过大;
- 更重视预测性能而非确定最重要的少数几个变量。
典型应用场景包括:
- 环境监测中多种污染物指标高度相关;
- 金融领域中的多个相关指标;
- 物理实验中多个变量的线性耦合。
三、Lasso回归(Lasso Regression)
3.1 基本概念
Lasso回归引入了L1范数惩罚:
目标函数:
min β [∑(y - ) + λ ∑|β|]
L1惩罚的关键特性在于它能够将部分系数压缩至0,从而实现特征选择。
对比:
- 岭回归:所有系数变小,但大多不为0;
- Lasso回归:部分系数直接变为0(自动筛选特征)。
3.2 Lasso的约束形式
Lasso回归也可以表示为约束优化问题:
岭回归约束形式:
min β ||y - Xβ|| s.t. ∑β ≤ t
Lasso回归约束形式:
min β ||y - Xβ|| s.t. ∑|β| ≤ t
其中 t 是一个常数。
回归模型中的约束形式
L2 约束形式:
\(\min_{\beta} \ \|y - X\beta\|_2^2 \quad \text{s.t.} \ \sum_{j=1}^p \beta_j^2 \le t\)
Lasso 约束形式:
\(\min_{\beta} \ \|y - X\beta\|_2^2 \quad \text{s.t.} \ \sum_{j=1}^p |\beta_j| \le t\)
图形直觉(在二维):
L2 约束表现为一个“圆形/椭圆”,其与误差等高线的相切点通常不会出现在坐标轴上;
L1 约束则形成一个“菱形”,更容易在坐标轴上相切,这导致某一维度的系数可能变为 0。
何时使用 Lasso?
当特征数量较多(\(p\) 较大),但你认为只有少数特征是关键时,Lasso 是个不错的选择;
Lasso 可以帮助模型自动“选择重要特征”,提高模型的可解释性;
此外,Lasso 允许模型舍弃一些不重要的变量,从而简化模型。
典型应用场景:
- 高维数据:如基因表达、文本特征、传感器网络等;
- 建模比赛:当你有许多构造的特征,希望模型能自动筛选出有用的特征;
- 数学建模论文:你希望通过模型说明哪些因素是主要影响因素。
如何选择正则化强度 \(\lambda\)?
无论是岭回归还是 Lasso,选择合适的 \(\lambda\) 都非常重要:
- \(\lambda\) 太小:模型接近普通最小二乘法,容易过拟合;
- \(\lambda\) 太大:模型系数会被过度压缩,导致欠拟合,预测能力下降。
实践中,常用的 \(\lambda\) 选择方法是交叉验证(Cross Validation):
- 将数据划分为训练集和验证集;
- 对一系列候选 \(\lambda\) 值进行训练;
- 在验证集上计算误差(如均方误差 MSE);
- 选择验证误差最小的 \(\lambda\) 作为最终参数。
在
scikit-learn 中,可以使用 RidgeCV:带交叉验证的岭回归;或者 LassoCV:带交叉验证的 Lasso 回归。
实践要点:标准化与输出结果解读
5.1 特征标准化(Standardization)
由于惩罚项中包含 \(\beta_j\),不同特征的量纲可能差异很大(例如“面积”和“距离”),如果不进行标准化,会导致惩罚不公平:
- 面积(几十到几百);
- 学校评分(1 到 10);
这可能导致模型偏向某些特征。因此,在进行 Ridge 或 Lasso 回归之前,几乎总是需要对数据进行标准化:
\(x_j' = \frac{x_j - \mu_j}{\sigma_j}\)
在 sklearn 中,可以使用
StandardScaler 或 Pipeline 和 Ridge/Lasso 联合使用。
5.2 解读输出结果(以 sklearn 为例)
假设我们使用
sklearn.linear_model,一般会看到以下输出:
:回归系数 \(\beta_j\)model.coef_
:截距 \(\beta_0\)model.intercept_
:对应的 \(\lambda\)(在 sklearn 中称为alpha
)alpha
解读时可以从以下几个方面入手:
- 系数大小与符号:
- 正:自变量增加 → 预测值增加;
- 负:自变量增加 → 预测值减少;
- 绝对值越大 → 影响越强(在相同尺度下);
- Lasso 中系数为 0 的特征:可以解释为“模型认为这些特征贡献较小或冗余”。
- 比较 OLS / Ridge / Lasso 的测试集误差:如果 Ridge 或 Lasso 的测试误差降低且系数更平滑,则说明正则化有效。
示例:房价预测中的岭回归 & Lasso 回归实战
6.1 背景题目
某城市研究二手房价格,希望建立模型,根据房屋特征预测房价(万元)。已采集部分历史交易数据,其中部分特征高度相关(例如“面积”和“卧室数”)。我们有以下特征:
:面积(平方米)area
:卧室数量rooms
:到地铁站的距离(公里)distance_metro
:房龄(年)age
:学区评分(1–10)school_score
目标:
price:房价(万元)
6.2 示例数据(小样本演示)
(真实应用中数据会更多,这里为了演示简化)
index, area, rooms, distance_metro, age, school_score, price
1, 80, 2, 0.5, 5, 9, 220
2, 95, 3, 0.3, 3, 8, 260
3, 120, 3, 1.0, 8, 7, 280
4, 60, 1, 0.2, 10, 8, 200
5, 150, 4, 2.0, 2, 9, 350
6, 130, 3, 1.5, 6, 6, 300
7, 85, 2, 0.8, 4, 7, 230
8, 70, 2, 0.4, 12, 8, 210
可以预期:
和area
有明显正相关(多重共线性风险);rooms
越远,价格可能越低;distance_metro
越老,价格可能偏低;age
越高,价格可能越高。school_score
6.3 使用 Python + sklearn 进行岭回归 & Lasso 回归
注意:以下代码是教学示例(需安装
scikit-learn)。
import numpy as np
import pandas as pd
from sklearn.linear_model import Ridge, Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
从 sklearn.metrics 导入 mean_squared_error 和 r2_score 模块。本示例通过构造一组关于房屋价格的数据来演示如何使用岭回归和 Lasso 回归模型进行预测。
首先,我们构建一个包含房屋面积、房间数量、距地铁站的距离、房龄以及学校评分等信息的数据集:
data = {
"area": [80, 95, 120, 60, 150, 130, 85, 70],
"rooms": [2, 3, 3, 1, 4, 3, 2, 2],
"distance_metro": [0.5, 0.3, 1.0, 0.2, 2.0, 1.5, 0.8, 0.4],
"age": [5, 3, 8, 10, 2, 6, 4, 12],
"school_score": [9, 8, 7, 8, 9, 6, 7, 8],
"price": [220, 260, 280, 200, 350, 300, 230, 210]
}
df = pd.DataFrame(data)
X = df[["area", "rooms", "distance_metro", "age", "school_score"]]
y = df["price"]
由于数据量较小,这里不进行训练集和测试集的划分,仅用于演示目的。在实际应用中,强烈建议进行数据集的划分。
接下来,我们将分别创建并训练岭回归和 Lasso 回归模型,同时对输入数据进行标准化处理:
# 岭回归模型
ridge_model = Pipeline([
("scaler", StandardScaler()),
("ridge", Ridge(alpha=10.0)) # 正则化参数 α
])
ridge_model.fit(X, y)
y_pred_ridge = ridge_model.predict(X)
# Lasso 回归模型
lasso_model = Pipeline([
("scaler", StandardScaler()),
("lasso", Lasso(alpha=5.0)) # α 越大,压缩系数至零的可能性越高
])
lasso_model.fit(X, y)
y_pred_lasso = lasso_model.predict(X)
最后,我们查看两种模型的系数及拟合效果:
print("=== 岭回归系数 ===")
ridge_coef = ridge_model.named_steps["ridge"].coef_
for name, coef in zip(X.columns, ridge_coef):
print(f"{name}: {coef:.3f}")
print("截距:", ridge_model.named_steps["ridge"].intercept_)
print("R:", r2_score(y, y_pred_ridge))
print("MSE:", mean_squared_error(y, y_pred_ridge))
print("\n=== Lasso 回归系数 ===")
lasso_coef = lasso_model.named_steps["lasso"].coef_
for name, coef in zip(X.columns, lasso_coef):
print(f"{name}: {coef:.3f}")
print("截距:", lasso_model.named_steps["lasso"].intercept_)
print("R:", r2_score(y, y_pred_lasso))
print("MSE:", mean_squared_error(y, y_pred_lasso))
如何解读这些结果?
假设执行上述代码后获得以下结果(以下数值仅为示例,用于说明解读方法):
=== 岭回归系数 ===
area: 11.326
rooms: 10.626
distance_metro: 10.079
age: -4.927
school_score: -0.531
截距: 256.25
R^2: 0.8904268486769894
MSE: 254.58636877705754
=== Lasso 回归系数 ===
area: 37.008
rooms: 6.002
distance_metro: 0.000
age: -0.000
school_score: 0.000
截距: 256.25
R^2: 0.968046650680714
MSE: 74.24161005902835
解读思路如下:
1. 岭回归(Ridge)的解读
岭回归的主要特点在于它能够平滑系数但不会将其压缩至零,这一特性在我们的结果中得到了充分体现。
- 所有主要特征均得以保留,且其系数既不过高也不过低,表明每个因素都在一定程度上影响着房价。
- 例如,“area”(面积)和“rooms”(房间数)的系数分别为 11.326 和 10.626,这表示较大的房屋面积和更多的房间数量通常与较高的房价相关联。
- “distance_metro”(距地铁站距离)的系数为 10.079,这一正向系数可能因样本量小而显得不合理,一般预期是距离地铁站越近,房价越高。
- “age”(房龄)的系数为 -4.927,意味着房屋越老旧,其价格越低,这符合一般的市场规律。
- “school_score”(学校评分)的系数为 -0.531,显示学区评分对房价的影响微乎其微,甚至呈负相关,这也可能是由于样本量不足造成的偏差。
R 值为 0.89,MSE 为 254,这意味着模型能够解释大约 89% 的房价变化,拟合效果良好,但仍有改进的空间。总体而言,岭回归模型中的系数较为稳定,没有出现极端的振荡情况。
2. 总结:岭回归的行为
通过上述分析,我们可以得出以下几点结论:
- 岭回归成功地保留了所有的特征,并为每个特征分配了合理的权重。
- 该模型有效地缓解了多变量之间的多重共线性问题,即使某些特征(如“area”和“rooms”)之间存在高度相关性,它们仍能共存于模型中。
- 然而,由于样本量较小,部分系数的方向(如“distance_metro”的正向系数)可能受到了干扰。
Lasso 回归解析
分析结果显示,Lasso 回归具备两个核心特性:“稀疏性”和“高效特征选择”。具体表现在以下几个方面:
1. 特征选择结果
| 特征 | 系数 | 是否保留 | 解读 |
|---|---|---|---|
| 面积 (area) | 37.008 | 保留 | 被认为是最重要的影响因素 |
| 房间数 (rooms) | 6.002 | 保留 | 有一定影响,但远不如面积重要 |
| 地铁距离 (distance_metro) | 0.000 | 删除 | 学区评分和地铁距离被视为冗余或影响较弱 |
| 年龄 (age) | -0.000 | 删除 | |
| 学区评分 (school_score) | 0.000 | 删除 |
Lasso 明确指出,“面积”是最具影响力的变量,其次是“房间数”,而其他三个特征的影响极小,几乎被忽略。
这展示了 Lasso 在“自动特征选择”方面的强大功能。
2. 模型性能评估
R = 0.968,MSE = 74.24 —— 这一成绩远远超过了岭回归的表现。这一结果的意义在于:
- 即使移除了三个特征,模型的表现反而更佳;
- 这表明在小样本数据集中,过多的特征可能会引入噪声;
- Lasso 通过简化模型结构,提高了预测精度,这与理论预期相符。
3. 系数变化
由于 Lasso 减少了特征的数量,为了更好地拟合数据,某些特征的系数有所增加:
- 面积 (area) 的系数显著增大(从 11.3 增至 37.0);
- 房间数 (rooms) 的系数也有所增长(从 10.6 增至 6.0),但仍保持一定影响力。
这是常见的现象,Lasso 通过减少特征数量,将影响集中在少数几个关键特征上,从而导致这些特征的系数增大。
综合分析
基于以上分析,我们可以得出以下几点结论:
结论 1:Lasso 更适用于本数据集
原因包括:
- 数据量较少(n=8),过多的特征可能导致过拟合;
- 面积和房间数高度相关,Lasso 能更有效地处理这种关系;
- 移除地铁距离、房龄和学区评分后,模型更加简洁;
- Lasso 在 MSE 和 R 方面均优于岭回归。
结论 2:面积是最重要的特征
无论是在岭回归还是 Lasso 回归中,面积始终保持着显著的正向影响,特别是在 Lasso 中权重最大。这表明房价与面积之间存在强烈的正相关关系,面积是主导变量。
结论 3:Lasso 的特征选择效果显著
通过移除三个弱特征,模型简化为:
价格 = α × 面积 + β × 房间数 + 截距
这种简化模型更适合“小样本 + 关键变量”的情境。
结论 4:岭回归提供更平衡的解释
如果目标是:
- 解释所有特征;
- 保持模型的完整性;
那么岭回归可能更为合适。然而,在预测性能方面,Lasso 在本例中表现更优。
总结段落(示例)
在本研究中,我们分别采用了岭回归(Ridge)和 Lasso 回归对房价数据进行了建模。岭回归保留了所有特征,得到了较为平滑的系数估计,模型的 R = 0.89,具有一定的解释能力。相比之下,Lasso 回归通过引入 L1 正则化,将“到地铁距离”、“房龄”和“学区评分”三个系数压缩为 0,实现了自动特征选择;同时,Lasso 模型的拟合优度显著提升(R = 0.97,MSE 降至 74.2)。这表明在样本量较小且特征存在相关性的情况下,Lasso 能以更简洁的结构获得更好的预测性能,而“面积”和“房间数”是决定房价的主要因素。
小结
岭回归(Ridge)
- 目标:减少系数波动,缓解多重共线性;
- 特点:不会使系数变为 0;
- 适用场景:希望保留所有特征,但模型更稳定、泛化能力更强。
Lasso 回归(Lasso)
- 目标:同时提高泛化能力和自动特征选择;
- 特点:可以将不重要的系数压缩为 0;
- 适用场景:特征较多,希望自动筛选出关键变量。
实战建议
- 特征数量不多,主要关注模型稳定性时,优先尝试 Ridge;
- 特征数量较多,需要进行特征选择时,优先尝试 Lasso 或 Elastic Net(L1+L2 混合);
- 务必记住:先标准化,再正则化,否则系数的比较没有意义。


雷达卡


京公网安备 11010802022788号







