988 字
5 分钟
正则化与归一化

正则化与归一化#

1. 正则化 (Regularization)#

目的:通过在损失函数中添加惩罚项,限制模型复杂度,防止过拟合。

1.1 L2 正则化(岭回归 Ridge)#

L=MSE+λwi2L = MSE + \lambda \sum w_i^2

  • 惩罚大权重,使权重趋向于小但不为零
  • 效果:模型更平滑,适合特征间存在多重共线性详解

1.2 L1 正则化(Lasso)#

L=MSE+λwiL = MSE + \lambda \sum |w_i|

  • 会将部分权重压缩为精确的零
  • 效果:自动特征选择,产生稀疏模型1

1.3 对比#

特性L1 (Lasso)L2 (Ridge)
权重结果稀疏(部分为0)小但非零
特征选择
对多重共线性可做稀疏选择,但选择可能不稳定更稳定,常用于缓解共线性
适用场景高维稀疏特征特征相关性高

ElasticNet = L1 + L2,兼顾两者优点,是工业界常用选择。

from sklearn.linear_model import Ridge, Lasso, ElasticNet
ridge = Ridge(alpha=1.0) # alpha 即 λ
lasso = Lasso(alpha=0.1)
elastic = ElasticNet(alpha=0.1, l1_ratio=0.5)

2. 特征缩放(Normalization / Standardization)#

目的:消除特征量纲差异,加速梯度下降收敛,提升模型稳定性。

严格来说,归一化标准化 不是同一个操作;日常讨论里常被统称为“特征缩放”。

2.1 Min-Max 归一化#

x=xxminxmaxxmin[0,1]x' = \frac{x - x_{min}}{x_{max} - x_{min}} \in [0, 1]

  • 适合范围已知、需要压到固定区间的场景
  • 缺点:对离群点敏感,极端值会压缩大部分样本的分布

2.2 Z-Score 标准化#

x=xμσx' = \frac{x - \mu}{\sigma}

  • 输出均值为0、标准差为1
  • 在线性模型、距离度量模型、神经网络预处理里都很常见
  • 注意:它同样会受到离群点影响;如果异常值很多,更适合考虑 RobustScaler
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # 注意:测试集只 transform,不 fit
robust_scaler = RobustScaler() # 异常值较多时可选

重要:归一化参数必须在训练集上 fit,再应用到测试集,防止数据泄露。


3. 正则化 vs 归一化#

两者解决不同问题,实际项目中通常同时使用


4. 惩罚项(Penalty Term)#

目的:在经验损失之外增加”复杂度代价”,防止模型因为参数过大或过多而过拟合。

Objective=Data Loss+λΩ(w)\text{Objective} = \text{Data Loss} + \lambda \Omega(w)

  • Data Loss\text{Data Loss}:模型在训练数据上的误差
  • Ω(w)\Omega(w):惩罚项,用来约束模型复杂度
  • λ\lambda:权衡”拟合训练集”与”控制复杂度”的强度

常见形式:

  • L1 惩罚项Ω(w)=wi\Omega(w) = \sum |w_i|,会产生稀疏权重,可用于特征选择
  • L2 惩罚项Ω(w)=wi2\Omega(w) = \sum w_i^2,会让权重整体变小,训练更平滑稳定

可以把它理解成”模型越复杂,额外成本越高”。升维负责增强表达能力,惩罚项负责抑制复杂度,Early Stopping 则是在训练过程中提前刹车。


5. Early Stopping#

目的:在验证集损失开始上升时提前终止训练,防止过拟合。

实现示例(PyTorch)

import torch
best_val_loss = float('inf')
patience, counter = 10, 0
for epoch in range(max_epochs):
train(model)
val_loss = evaluate(model)
if val_loss < best_val_loss:
best_val_loss = val_loss
counter = 0
torch.save(model.state_dict(), 'best_model.pt')
else:
counter += 1
if counter >= patience:
print(f"Early stopping at epoch {epoch}")
break

patience 参数控制容忍验证集损失不改善的轮数,通常设为 5~20。工程上通常还会在停止后恢复验证集表现最好的那版权重。

Footnotes#

  1. 稀疏模型:大多数参数权重为零,只有少数特征真正起作用的模型。好处是可解释性强(能直接看出哪些特征重要),且在高维数据中计算效率高。