本文面向已了解“线性回归”的读者,但可能遇到过拟合、共线性和特征过多的问题。我们将从“为何普通线性回归会出现偏差”开始,系统地介绍岭回归(Ridge)和Lasso回归的原理、公式、编程应用及结果解读,并提供一个带有示例数据的实战案例。
在回归分析中,最常用的起点是最小二乘线性回归(OLS):
模型:
y = β + βx + ... + βx + ε
目标:
min β ∑(y - ) = min β ||y - Xβ||
然而,OLS存在两个主要问题:
解决方案是通过正则化(regularization)来同时惩罚误差(残差平方和)和过大的系数。
岭回归在最小二乘损失的基础上添加了L2范数惩罚项:
目标函数(惩罚形式):
min β [∑(y - ) + λ ∑β]
或表示为矩阵形式:
min β ||y - Xβ|| + λ ||β||
其中:
直观理解:
岭回归具有一个优雅的解析解:
βridge = (XX + λI)Xy
其中 I 是单位矩阵。
特别地:
需要注意的是,岭回归不会将任何系数完全压缩至0,而是使它们“缩小”。因此,岭回归主要用于平滑系数、缓解多重共线性,而不进行特征选择。
岭回归适用于以下情况:
典型应用场景包括:
Lasso回归引入了L1范数惩罚:
目标函数:
min β [∑(y - ) + λ ∑|β|]
L1惩罚的关键特性在于它能够将部分系数压缩至0,从而实现特征选择。
对比:
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。
当特征数量较多(\(p\) 较大),但你认为只有少数特征是关键时,Lasso 是个不错的选择;
Lasso 可以帮助模型自动“选择重要特征”,提高模型的可解释性;
此外,Lasso 允许模型舍弃一些不重要的变量,从而简化模型。
无论是岭回归还是 Lasso,选择合适的 \(\lambda\) 都非常重要:
实践中,常用的 \(\lambda\) 选择方法是交叉验证(Cross Validation):
在
scikit-learn 中,可以使用 RidgeCV:带交叉验证的岭回归;或者 LassoCV:带交叉验证的 Lasso 回归。
由于惩罚项中包含 \(\beta_j\),不同特征的量纲可能差异很大(例如“面积”和“距离”),如果不进行标准化,会导致惩罚不公平:
这可能导致模型偏向某些特征。因此,在进行 Ridge 或 Lasso 回归之前,几乎总是需要对数据进行标准化:
\(x_j' = \frac{x_j - \mu_j}{\sigma_j}\)
在 sklearn 中,可以使用
StandardScaler 或 Pipeline 和 Ridge/Lasso 联合使用。
假设我们使用
sklearn.linear_model,一般会看到以下输出:
model.coef_:回归系数 \(\beta_j\)model.intercept_:截距 \(\beta_0\)alpha:对应的 \(\lambda\)(在 sklearn 中称为 alpha)解读时可以从以下几个方面入手:
某城市研究二手房价格,希望建立模型,根据房屋特征预测房价(万元)。已采集部分历史交易数据,其中部分特征高度相关(例如“面积”和“卧室数”)。我们有以下特征:
area:面积(平方米)rooms:卧室数量distance_metro:到地铁站的距离(公里)age:房龄(年)school_score:学区评分(1–10)目标:
price:房价(万元)
(真实应用中数据会更多,这里为了演示简化)
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 越高,价格可能越高。注意:以下代码是教学示例(需安装
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
解读思路如下:
岭回归的主要特点在于它能够平滑系数但不会将其压缩至零,这一特性在我们的结果中得到了充分体现。
R 值为 0.89,MSE 为 254,这意味着模型能够解释大约 89% 的房价变化,拟合效果良好,但仍有改进的空间。总体而言,岭回归模型中的系数较为稳定,没有出现极端的振荡情况。
通过上述分析,我们可以得出以下几点结论:
分析结果显示,Lasso 回归具备两个核心特性:“稀疏性”和“高效特征选择”。具体表现在以下几个方面:
| 特征 | 系数 | 是否保留 | 解读 |
|---|---|---|---|
| 面积 (area) | 37.008 | 保留 | 被认为是最重要的影响因素 |
| 房间数 (rooms) | 6.002 | 保留 | 有一定影响,但远不如面积重要 |
| 地铁距离 (distance_metro) | 0.000 | 删除 | 学区评分和地铁距离被视为冗余或影响较弱 |
| 年龄 (age) | -0.000 | 删除 | |
| 学区评分 (school_score) | 0.000 | 删除 |
Lasso 明确指出,“面积”是最具影响力的变量,其次是“房间数”,而其他三个特征的影响极小,几乎被忽略。
这展示了 Lasso 在“自动特征选择”方面的强大功能。
R = 0.968,MSE = 74.24 —— 这一成绩远远超过了岭回归的表现。这一结果的意义在于:
由于 Lasso 减少了特征的数量,为了更好地拟合数据,某些特征的系数有所增加:
这是常见的现象,Lasso 通过减少特征数量,将影响集中在少数几个关键特征上,从而导致这些特征的系数增大。
基于以上分析,我们可以得出以下几点结论:
原因包括:
无论是在岭回归还是 Lasso 回归中,面积始终保持着显著的正向影响,特别是在 Lasso 中权重最大。这表明房价与面积之间存在强烈的正相关关系,面积是主导变量。
通过移除三个弱特征,模型简化为:
价格 = α × 面积 + β × 房间数 + 截距
这种简化模型更适合“小样本 + 关键变量”的情境。
如果目标是:
那么岭回归可能更为合适。然而,在预测性能方面,Lasso 在本例中表现更优。
在本研究中,我们分别采用了岭回归(Ridge)和 Lasso 回归对房价数据进行了建模。岭回归保留了所有特征,得到了较为平滑的系数估计,模型的 R = 0.89,具有一定的解释能力。相比之下,Lasso 回归通过引入 L1 正则化,将“到地铁距离”、“房龄”和“学区评分”三个系数压缩为 0,实现了自动特征选择;同时,Lasso 模型的拟合优度显著提升(R = 0.97,MSE 降至 74.2)。这表明在样本量较小且特征存在相关性的情况下,Lasso 能以更简洁的结构获得更好的预测性能,而“面积”和“房间数”是决定房价的主要因素。
扫码加好友,拉您进群



收藏
