988 字
5 分钟
正则化与归一化
正则化与归一化
1. 正则化 (Regularization)
目的:通过在损失函数中添加惩罚项,限制模型复杂度,防止过拟合。
1.1 L2 正则化(岭回归 Ridge)
- 惩罚大权重,使权重趋向于小但不为零
- 效果:模型更平滑,适合特征间存在多重共线性详解
1.2 L1 正则化(Lasso)
- 会将部分权重压缩为精确的零
- 效果:自动特征选择,产生稀疏模型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 归一化
- 适合范围已知、需要压到固定区间的场景
- 缺点:对离群点敏感,极端值会压缩大部分样本的分布
2.2 Z-Score 标准化
- 输出均值为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)
目的:在经验损失之外增加”复杂度代价”,防止模型因为参数过大或过多而过拟合。
- :模型在训练数据上的误差
- :惩罚项,用来约束模型复杂度
- :权衡”拟合训练集”与”控制复杂度”的强度
常见形式:
- L1 惩罚项:,会产生稀疏权重,可用于特征选择
- L2 惩罚项:,会让权重整体变小,训练更平滑稳定
可以把它理解成”模型越复杂,额外成本越高”。升维负责增强表达能力,惩罚项负责抑制复杂度,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
-
稀疏模型:大多数参数权重为零,只有少数特征真正起作用的模型。好处是可解释性强(能直接看出哪些特征重要),且在高维数据中计算效率高。 ↩