🎯 学习目标

  • 理解正则化的作用与原理
  • 掌握L1和L2正则化的区别
  • 学会在模型中应用正则化
  • 了解Dropout等深度学习正则化方法
正则化概念图

为什么需要正则化

模型在训练集上表现很好但在测试集上表现差,这是过拟合的典型症状。 正则化通过限制模型复杂度,防止模型过度拟合训练数据,从而提高泛化能力。

⚖️ L1 vs L2 正则化

L1 正则化 (Lasso)

Loss = MSE + λ * Σ|w|
  • 使部分权重变为零
  • 具有特征选择效果
  • 产生稀疏解
  • 适合高维稀疏数据

L2 正则化 (Ridge)

Loss = MSE + λ * Σw²
  • 权重趋向于小而非零
  • 防止权重过大
  • 平滑的解
  • 适合共线性数据

💻 代码实现

from sklearn.linear_model import Ridge, Lasso, ElasticNet from sklearn.preprocessing import StandardScaler # 数据标准化(重要!) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # L2正则化 (Ridge) ridge = Ridge(alpha=1.0) # alpha是正则化强度 ridge.fit(X_scaled, y) # L1正则化 (Lasso) lasso = Lasso(alpha=0.1) lasso.fit(X_scaled, y) # 查看哪些特征被选中 print(f'Lasso非零系数: {(lasso.coef_ != 0).sum()}') # ElasticNet (L1+L2组合) elastic = ElasticNet(alpha=0.1, l1_ratio=0.5) elastic.fit(X_scaled, y)

📊 正则化方法对比

方法 公式 特点 适用场景
Lasso L1范数 稀疏解,特征选择 高维数据,特征选择
Ridge L2范数 权重衰减 共线性,防止过拟合
ElasticNet L1+L2 结合两者优点 特征多且相关
Dropout 随机失活 神经网络专用 深度学习

🧠 深度学习正则化

import torch.nn as nn # Dropout层 model = nn.Sequential( nn.Linear(784, 256), nn.ReLU(), nn.Dropout(0.5), # 50%神经元失活 nn.Linear(256, 128), nn.ReLU(), nn.Dropout(0.3), nn.Linear(128, 10) ) # 权重衰减(L2正则化) optimizer = torch.optim.Adam( model.parameters(), lr=0.001, weight_decay=1e-4 # L2正则化系数 )
💡
正则化强度选择

正则化强度λ是超参数,需要通过交叉验证选择。太大会导致欠拟合,太小则正则化效果不明显。

正则化效果
图:正则化使决策边界更平滑,提高泛化能力

📝 本节小结

  • • 正则化防止过拟合,提高模型泛化能力
  • • L1正则化产生稀疏解,具有特征选择效果
  • • L2正则化使权重趋向于小,防止过大
  • • ElasticNet结合L1和L2的优点
  • • Dropout是神经网络常用的正则化方法