岭回归 vs Lasso回归
Source: Dev.to
介绍
线性回归是数据科学家工具箱中最基础的工具之一。其核心是 普通最小二乘法(OLS),该方法通过最小化预测值与实际值之间的平方差之和来估计模型参数。
在许多实际问题中——例如房价预测——数据集往往包含大量特征、相关变量以及噪声输入。在这种情况下,传统的 OLS 回归会变得不稳定且容易过拟合。为了解决这些挑战,通常会使用正则化技术。两种最重要的基于正则化的模型是:
- 岭回归(L2 正则化)
- 套索回归(L1 正则化)
普通最小二乘法 (OLS)
OLS 通过最小化预测值与实际值之间的平方残差之和来估计模型参数:
[ \text{Loss}{\text{OLS}} = \sum{i=1}^{n} (y_i - \hat{y}_i)^2 ]
其中 (\hat{y}_i) 表示对观测值 (i) 的预测价格。
OLS 在小型、干净的数据集上表现良好,但在以下情况下会出现困难:
- 特征数量很多
- 特征之间高度相关(多重共线性)
- 数据中包含噪声
这些情况会导致过拟合:模型在训练数据上表现良好,但在未见过的数据上表现不佳。
线性回归中的正则化
正则化在损失函数中加入惩罚项,对模型的复杂度进行收费。模型现在必须在准确性和简洁性之间取得平衡,而不仅仅是最小化误差。
[ \text{Loss} = \text{Error} + \text{Penalty} ]
大型系数被抑制,这通常会产生对新数据具有更好泛化能力的模型。
岭回归(L2 正则化)
Ridge 回归通过在 OLS 损失函数中加入与系数平方和成比例的 L2 惩罚项来进行修改。
[ \text{Loss}{\text{Ridge}} = \underbrace{\sum{i=1}^{n}(y_i - \hat{y}i)^2}{\text{RSS}} ;+; \lambda \underbrace{\sum_{j=1}^{p}\beta_j^{2}}_{\text{L2 penalty}} ]
- (\lambda \ge 0) 是正则化参数。
- 截距 (\beta_0) 不 受惩罚。
概念性效果
- 平滑收缩系数
- 降低模型方差
- 保留 所有 特征
- 良好地处理多重共线性
关键属性
Ridge 回归 不 执行特征选择;系数会被缩小,但永远不会恰好为零。
Python 示例
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=1.0) # alpha == λ
ridge.fit(X_train_scaled, y_train)
y_pred_ridge = ridge.predict(X_test_scaled)
Lasso回归(L1 正则化)
Lasso 添加了 L1 惩罚,即系数绝对值的总和。
[ \text{Loss}{\text{Lasso}} = \underbrace{\sum{i=1}^{n}(y_i - \hat{y}i)^2}{\text{RSS}} ;+; \lambda \underbrace{\sum_{j=1}^{p}|\beta_j|}_{\text{L1 penalty}} ]
- (\lambda) 控制正则化的强度。
概念性影响
- 创建 稀疏 模型
- 强制部分系数恰好为零
- 自动剔除弱特征
关键特性
Lasso 执行 特征选择,生成更简洁、更易解释的模型。
Python 示例
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.1) # alpha == λ
lasso.fit(X_train_scaled, y_train)
y_pred_lasso = lasso.predict(X_test_scaled)
比较 Ridge 与 Lasso
| 方面 | Ridge | Lasso |
|---|---|---|
| 特征选择 | 保留所有特征(系数被收缩) | 将部分系数设为零 → 自动选择 |
| 与相关特征的行为 | 在相关预测变量之间平滑分配权重 | 选择一个预测变量,将其他的系数设为零 |
| 可解释性 | “价格取决于全部 10 个因素,重要性各不相同。” | “价格主要取决于面积、位置和年龄;其他因素无关紧要。” |
示例:两个相关预测变量(面积和房间数,(r = 0.85)):
- Ridge: 面积 = $120/平方英尺,房间 = $8,000/间(均保留)
- Lasso: 面积 = $180/平方英尺,房间 = $0(选择一个,舍弃另一个)
应用场景:房价预测
假设数据集包含:
- 房屋面积
- 卧室数量
- 到市中心的距离
- 附近学校数量
- 若干噪声或弱特征
何时使用 Ridge
- 大多数特征预计会影响价格
- 存在多重共线性
- 需要稳定的预测
何时使用 Lasso
- 只有少数特征真正重要
- 许多变量会增加噪声
- 模型可解释性很重要
Python 实现
数据准备
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import mean_squared_error
# Assume df is a pandas DataFrame containing the data
X = df[['size', 'bedrooms', 'distance_city', 'schools_nearby', 'noise_feature']]
y = df['price']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
OLS 模型
ols = LinearRegression()
ols.fit(X_train_scaled, y_train)
y_pred_ols = ols.predict(X_test_scaled)
mse_ols = mean_squared_error(y_test, y_pred_ols)
print(f'OLS MSE: {mse_ols:.2f}')
Ridge 模型
ridge = Ridge(alpha=1.0)
ridge.fit(X_train_scaled, y_train)
y_pred_ridge = ridge.predict(X_test_scaled)
mse_ridge = mean_squared_error(y_test, y_pred_ridge)
print(f'Ridge MSE: {mse_ridge:.2f}')
Lasso 模型
lasso = Lasso(alpha=0.1)
lasso.fit(X_train_scaled, y_train)
y_pred_lasso = lasso.predict(X_test_scaled)
mse_lasso = mean_squared_error(y_test, y_pred_lasso)
print(f'Lasso MSE: {mse_lasso:.2f}')
为房价选择合适的模型
- 岭回归 – 当 所有特征都有意义贡献(例如,面积、卧室数量、学校、距离)时更为推荐。
- 套索回归 – 当 只有少数特征真正重要,其他特征只是噪声 时更适合,因其内置的特征选择能力。
模型评估与过拟合检测
过拟合可以通过比较训练和测试性能来检测:
- 训练得分高但测试得分低 → 过拟合。
- 训练和测试得分相似 → 良好的泛化能力。
残差分析也起关键作用。残差应随机分布;若出现明显模式,可能表明缺少变量或存在非线性关系。
结论
- OLS 简单,但在复杂数据集上容易过拟合。
- Ridge 和 Lasso 回归引入正则化,以提升稳定性和泛化能力。
- 当所有特征都重要时,Ridge 是最佳选择。
- 对于稀疏、可解释的模型,Lasso 更受青睐。
理解何时以及如何应用这些技术对考试和实际机器学习问题都至关重要。