机器学习之正则化(Regularization)学习笔记面试篇
机器学习之正则化(Regularization)学习笔记
一、核心概念:正则化到底是什么?
1. 定义
正则化是在模型训练过程中,通过在损失函数中加入额外的惩罚项,限制模型参数规模、降低模型复杂度,从而防止过拟合、提升泛化能力的技术。
2. 核心目标拆解
- 短期目标:让模型在训练数据上 “学好知识”,同时避免死记硬背噪声和异常值。
- 长期目标:让模型在从未见过的测试数据上也能保持稳定的预测效果,即提升泛化能力。
3. 通俗理解
可以把模型训练比作学生备考:
- 原损失项:学生刷题(拟合训练数据),目标是把题目做对。
- 正则化项:老师给学生划重点(限制学习范围),不让学生死记硬背题目答案,而是掌握通用解题方法,避免 “原题满分、新题翻车”。
二、核心公式拆解(面试必背)
1. 通用正则化损失函数(以 L2 为例)
( Loss = \underbrace{\frac{1}{n}\sum_{i=1}^n (f(x_i) - y_i)^2}{\text{原损失项:拟合数据}} + \underbrace{\lambda \sum{i=1}^k \theta_i^2}_{\text{正则化项:惩罚复杂}} )
2. 两部分关键作用
| 组成部分 | 核心作用 | 直观理解 |
|---|---|---|
| 原损失项 | 衡量模型预测值与真实值的偏差,驱动模型学习数据规律 | 学生刷题,追求正确率 |
| 正则化项 | 惩罚过大的参数,限制模型复杂度 | 老师划重点,防止死记硬背 |
3. 超参数 (\lambda) 的影响(面试高频)
(\lambda) 是正则化强度的控制开关,直接决定模型的复杂度:
- (\lambda = 0):无正则化,损失函数退化为原始形式,模型容易过拟合。
- (\lambda) 较小:正则化强度弱,参数惩罚力度小,模型复杂度接近原始状态,仍可能过拟合。
- (\lambda) 较大:正则化强度强,参数被大幅压缩,模型更简单,易出现欠拟合。
- 调参关键:通过交叉验证找到最优 (\lambda),在 “拟合训练数据” 和 “泛化测试数据” 之间找到平衡。
三、正则化的底层逻辑:为什么能防过拟合?
1. 过拟合的本质
过拟合的核心原因是模型参数过多、复杂度太高,导致模型过度学习了训练数据中的噪声和异常值,而忽略了数据的通用规律。此时模型在训练集误差极低,但在测试集误差极高。
2. 正则化的解决思路
通过在损失函数中加入惩罚项,给模型参数 “加上约束”:
- 对大参数施加惩罚,迫使模型降低参数规模,减少不必要的特征权重。
- 让模型更关注数据的通用规律,而非训练集中的噪声,从而提升在测试集上的表现。
四、常见正则化类型(面试重点:L1/L2/ElasticNet)
1. L1 正则化(Lasso 回归)
(1)核心公式
( Loss = \frac{1}{n}\sum_{i=1}^n (f(x_i) - y_i)^2 + \lambda \sum_{i=1}^k |\theta_i| )
- 惩罚项为参数的绝对值之和。
(2)核心特点
- 能产生稀疏解:不重要特征的权重会被直接压缩为 0,实现自动特征选择。
- 几何解释:L1 的约束区域是菱形,损失函数的等高线更容易与菱形的顶点(坐标轴)相交,此时对应的参数值为 0。
(3)优缺点
| 优点 | 缺点 |
|---|---|
| 自动筛选重要特征,模型解释性强 | 特征高度相关时,会随机选择其中一个,稳定性较差 |
| 适用于高维数据,可有效降低特征维度 | 对异常值较敏感,训练过程中可能出现参数震荡 |
(4)适用场景
- 特征维度远大于样本数的场景(如文本分类、基因数据)。
- 需要模型具备强解释性、明确特征重要性的业务场景(如金融风控、医疗诊断)。
2. L2 正则化(Ridge 回归 / 岭回归)
(1)核心公式
( Loss = \frac{1}{n}\sum_{i=1}^n (f(x_i) - y_i)^2 + \lambda \sum_{i=1}^k \theta_i^2 )
- 惩罚项为参数的平方和。
(2)核心特点
- 不会产生稀疏解:仅均匀缩小所有参数的绝对值,不会让任何参数变为 0,保留所有特征。
- 几何解释:L2 的约束区域是圆形,损失函数的等高线与圆形的交点均匀分布,所有参数都会被小幅压缩。
(3)优缺点
| 优点 | 缺点 |
|---|---|
| 对多重共线性和异常值鲁棒性强,训练稳定 | 无法自动特征选择,模型解释性弱于 L1 |
| 适用于低维数据,能有效降低过拟合风险 | 特征高度相关时,会导致相关特征的权重被均匀压缩,影响模型表现 |
(4)适用场景
- 特征间存在多重共线性的场景(如房价预测、金融数据)。
- 数据噪声较大、追求模型稳定性的业务场景(如工业预测、销量预测)。
3. ElasticNet 正则化(弹性网络回归)
(1)核心公式
( Loss = \frac{1}{n}\sum_{i=1}^n (f(x_i) - y_i)^2 + \lambda_1 \sum_{i=1}^k |\theta_i| + \lambda_2 \sum_{i=1}^k \theta_i^2 )
- 同时包含 L1 和 L2 惩罚项,是两者的折中方案。
(2)核心特点
- 结合了 L1 的特征选择能力和 L2 的稳定性。
- 解决了 L1 在特征高度相关时的不稳定问题,同时保留了稀疏性。
(3)优缺点
| 优点 | 缺点 |
|---|---|
| 兼顾特征选择和稳定性,适用场景更广 | 超参数调参复杂度更高,需要同时优化(\lambda_1)和(\lambda_2) |
| 对高维、多重共线性数据表现优异 | 模型解释性介于 L1 和 L2 之间,不如纯 L1 直观 |
(4)适用场景
- 特征维度远大于样本数、特征间存在多重共线性的场景(如生物信息学数据、高维电商用户数据)。
- 不确定使用 L1 还是 L2 时的折中选择。
五、L1 vs L2 vs ElasticNet 对比总结(面试速记)
| 对比维度 | L1 正则化(Lasso) | L2 正则化(Ridge) | ElasticNet |
|---|---|---|---|
| 惩罚项形式 | 参数绝对值之和 | 参数平方和 | L1+L2 混合 |
| 稀疏性 | 产生稀疏解(部分参数为 0) | 无稀疏解(参数仅缩小) | 部分稀疏(可控制) |
| 特征选择 | 自动筛选重要特征 | 不筛选,保留所有特征 | 可实现特征选择 |
| 稳定性 | 较差(对特征相关性敏感) | 强(对多重共线性鲁棒) | 强(解决 L1 的不稳定问题) |
| 适用场景 | 高维数据、需强解释性 | 低维数据、多重共线性 | 高维 + 多重共线性、折中选择 |
六、面试高频问答(必背)
1. 正则化为什么能防止过拟合?
过拟合的本质是模型参数过大、复杂度太高,过度学习了训练数据的噪声。正则化通过在损失函数中加入惩罚项,对大参数施加惩罚,限制模型的复杂度,迫使模型学习数据的通用规律而非噪声,从而提升泛化能力。
2. L1 和 L2 正则化哪个更适合特征选择?为什么?
L1 正则化更适合特征选择。因为 L1 的惩罚项是参数绝对值之和,会让不重要特征的权重直接变为 0,实现自动特征筛选;而 L2 仅缩小参数,不会让任何参数变为 0,无法有效筛选特征。
3. 为什么 L1 会产生稀疏解,而 L2 不会?
从几何角度看,L1 的约束区域是菱形,损失函数的等高线更容易与菱形的顶点(坐标轴)相交,此时对应的参数值为 0;而 L2 的约束区域是圆形,等高线与圆形的交点均匀分布,所有参数都会被小幅压缩,不会出现为 0 的情况。
4. 超参数 (\lambda) 过大或过小会有什么影响?
- (\lambda) 过大:正则化强度过强,参数被过度压缩,模型复杂度不足,易出现欠拟合。
- (\lambda) 过小:正则化强度过弱,参数几乎不受惩罚,模型仍易过拟合。
- 解决方法:通过交叉验证(如网格搜索、随机搜索)找到最优 (\lambda)。
5. ElasticNet 和 L1、L2 相比有什么优势?
ElasticNet 结合了 L1 和 L2 的优点,既具备 L1 的特征选择能力,又解决了 L1 在特征高度相关时的不稳定问题,同时保留了 L2 的鲁棒性,适用场景更广,尤其是高维、多重共线性数据。
七、Python 代码示例(线性回归 + 正则化)
import numpy as np
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 1. 构造模拟数据(含多重共线性特征)
np.random.seed(42)
n_samples, n_features = 100, 10
X = np.random.randn(n_samples, n_features)
# 构造高度相关的特征(第2个特征是第1个特征的线性组合)
X[:, 1] = X[:, 0] * 0.8 + np.random.randn(n_samples) * 0.1
y = 2 * X[:, 0] + 3 * X[:, 2] + np.random.randn(n_samples) * 0.5
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. 初始化不同模型
models = {
"原始线性回归": LinearRegression(),
"L2正则化(Ridge)": Ridge(alpha=1.0), # alpha对应λ
"L1正则化(Lasso)": Lasso(alpha=0.1),
"ElasticNet": ElasticNet(alpha=0.1, l1_ratio=0.5) # l1_ratio控制L1占比
}
# 4. 训练并评估模型
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"{name} 测试集MSE: {mse:.4f}")
print(f"模型参数(前5个): {model.coef_[:5]}\n")
八、学习总结
- 正则化的核心是通过惩罚项限制模型复杂度,平衡偏差与方差,防止过拟合。
- L1、L2、ElasticNet 的选择需结合数据场景:高维数据选 L1,多重共线性选 L2,折中选 ElasticNet。
- 超参数 (\lambda) 的调参是关键,需通过交叉验证找到最优值。
- 面试中重点掌握公式、底层逻辑、对比差异和适用场景。
更多推荐


所有评论(0)