L1和L2正则化解释
1 课程概览
本课详细讲解L1和L2正则化的原理和作用。欠拟合解决方案是增加特征(添加多项式特征),过拟合解决方案包括重新清洗数据、增加训练量、正则化。重点讲解正则化的概念、L1(Lasso)和L2(Ridge)的区别,以及惩罚系数α的作用。
2 核心概念与定义
- 正则化:解决模型过拟合的方法,减少特征维度,防止过拟合。
- L1正则化(Lasso):使权重趋向于0甚至等于0,达到特征筛选目的。
- L2正则化(Ridge):使权重接近0但不为0,削弱特征影响。
- 惩罚系数(α):控制权重调整幅度,α越大调整越大。
- Lasso:L1正则化的回归模型。
- Ridge:L2正则化的回归模型。
3 算法与模型详解
3.1 欠拟合解决方案
原因:学到的数据特征少,模型过于简单
解决方案:增加模型复杂度
- 添加其他特征
- 添加多项式特征(二项式、三项式)
示例:
- 原始:基于学历预测薪资(1个特征)
- 增加:学历 + 专业 + 考试成绩 + 从业时间(4个特征)
3.2 过拟合解决方案
原因:原始特征过多,存在嘈杂特征,模型过于复杂
解决方案:
| 方法 | 说明 |
|---|---|
| 重新清洗数据 | 处理异常值,数据预处理没做好 |
| 增加训练量 | 训练数据太少(如只有白天鹅,没有黑天鹅) |
| 正则化 | L1/L2正则化 |
3.3 正则化的作用
作用:
- 解决模型过拟合
- 减少特征维度
- 防止过拟合
适用:机器学习和深度学习中大量应用
注意:正则化只能解决过拟合,不能解决欠拟合
3.4 正则化原理
概念:模型训练时,数据中有些特征影响模型的复杂度,通过正则化减少特征的影响,甚至将影响变为0(删除特征)。
实现:通过在损失函数中加入惩罚项,使权重W减小。
3.5 L1正则化(Lasso)
损失函数: $$L = MSE + \alpha \sum_{i=1}^{n} |W_i|$$
特点:
- 使权重趋向于0,甚至等于0
- 某些特征失效(权重为0)
- 达到特征筛选的目的
导数(分段函数):
- X > 0:导数为1
- X = 0:导数不存在
- X < 0:导数为-1
模型:Lasso回归
3.6 L2正则化(Ridge)
损失函数: $$L = MSE + \alpha \sum_{i=1}^{n} W_i^2$$
特点:
- 使权重接近0但不为0
- 削弱特征影响但不删除
- 保留所有特征
模型:Ridge回归(岭回归)
3.7 惩罚系数α
作用:控制权重调整幅度
特点:
- α越大,权重调整幅度越大
- α越小,权重调整幅度越小
示例:
- 原始权重:1
- α = 2
- 调整后权重:0.7
3.8 L1 vs L2 对比
| 对比 | L1正则化 | L2正则化 |
|---|---|---|
| 损失函数 | MSE + α·Σ|W| | MSE + α·ΣW² |
| 权重 | 趋向0或等于0 | 接近0但不为0 |
| 特征筛选 | 是(权重为0的特征被删除) | 否(所有特征保留) |
| 模型 | Lasso | Ridge |
| 适用场景 | 特征选择 | 削弱特征影响 |
4 数学原理与推导
4.1 L1正则化
$$L = \frac{1}{2m}\sum_{i=1}^{m} (h_\theta(X_i) - Y_i)^2 + \alpha \sum_{j=1}^{n} |W_j|$$
4.2 L2正则化
$$L = \frac{1}{2m}\sum_{i=1}^{m} (h_\theta(X_i) - Y_i)^2 + \alpha \sum_{j=1}^{n} W_j^2$$
4.3 L1导数(分段函数)
$$\frac{\partial}{\partial W} |W| = \begin{cases} 1, & W > 0 \ 0, & W = 0 \ -1, & W < 0 \end{cases}$$
4.4 L2导数
$$\frac{\partial}{\partial W} W^2 = 2W$$
5 代码示例
from sklearn.linear_model import Lasso, Ridge, LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
# 生成数据
np.random.seed(42)
X = np.random.rand(100, 10) # 10个特征
Y = X[:, 0] * 2 + X[:, 1] * 3 + np.random.randn(100) * 0.1
# 划分数据
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)
# 1. 普通线性回归(可能过拟合)
lr = LinearRegression()
lr.fit(X_train_scaled, y_train)
print("=== LinearRegression ===")
print("权重:", lr.coef_)
print("训练集MSE:", mean_squared_error(y_train, lr.predict(X_train_scaled)))
print("测试集MSE:", mean_squared_error(y_test, lr.predict(X_test_scaled)))
# 2. L1正则化(Lasso)
lasso = Lasso(alpha=0.1) # alpha是惩罚系数
lasso.fit(X_train_scaled, y_train)
print("\n=== Lasso (L1) ===")
print("权重:", lasso.coef_)
print("训练集MSE:", mean_squared_error(y_train, lasso.predict(X_train_scaled)))
print("测试集MSE:", mean_squared_error(y_test, lasso.predict(X_test_scaled)))
# 3. L2正则化(Ridge)
ridge = Ridge(alpha=0.1) # alpha是惩罚系数
ridge.fit(X_train_scaled, y_train)
print("\n=== Ridge (L2) ===")
print("权重:", ridge.coef_)
print("训练集MSE:", mean_squared_error(y_train, ridge.predict(X_train_scaled)))
print("测试集MSE:", mean_squared_error(y_test, ridge.predict(X_test_scaled)))
6 重难点与易错提醒
- ❗重点:正则化只能解决过拟合,不能解决欠拟合。
- ❗重点:L1使权重为0(特征筛选),L2使权重接近0(削弱影响)。
- ❗重点:惩罚系数α越大,权重调整越大。
- ❗重点:L1用Lasso,L2用Ridge。
- ⚠️易错:混淆L1和L2的作用(L1删特征,L2削弱特征)。
- ⚠️易错:α设置过大导致欠拟合。
- 💡深入理解:L1适合特征选择,L2适合保留所有特征。
7 课堂问答精选
Q: L1和L2正则化有什么区别?
A:
- L1正则化(Lasso):损失函数加 α·Σ|W|,使权重趋向0甚至等于0,达到特征筛选目的,会删除不重要的特征。
- L2正则化(Ridge):损失函数加 α·ΣW²,使权重接近0但不为0,削弱特征影响但保留所有特征。
Q: 惩罚系数α的作用是什么?
A: 惩罚系数α控制权重调整幅度。α越大,权重调整越大;α越小,权重调整越小。例如原始权重为1,α=2时,调整后可能变为0.7。α过大会导致欠拟合,需要合理设置。
8 本课小结
- 欠拟合解决:增加特征(多项式特征)。
- 过拟合解决:重新清洗数据、增加训练量、正则化。
- 正则化:解决过拟合,减少特征维度。
- L1(Lasso):权重为0,特征筛选。
- L2(Ridge):权重接近0,削弱影响。
- 惩罚系数α:控制权重调整幅度。
9 延伸思考与实践
- 实践:用Lasso和Ridge对比正则化效果。
- 预习:逻辑回归。
- 思考:什么情况下用L1,什么情况下用L2?