共计 1555 个字符,预计需要花费 4 分钟才能阅读完成。
基本概念与问题表现
过拟合 (Overfitting) 指模型在训练集上表现优异,但在测试集或新数据上表现显著下降,通常伴随高方差。其损失函数曲线表现为训练误差持续降低而验证误差后期上升。数学表达式为:

$$\mathcal{L}{train} \ll \mathcal{L}$$
欠拟合 (Underfitting) 则是模型无法捕捉数据的基本关系,在训练集和测试集上都表现不佳,对应高偏差状态。损失曲线显示双高平台:
$$\mathcal{L}{train} \approx \mathcal{L} \gg 0$$
业务场景痛点
- 电商推荐系统中,过度记忆用户历史行为(过拟合)导致新品推荐效果差
- 金融风控模型因特征利用不足(欠拟合)误判高风险交易
- 医疗影像诊断模型在训练数据上达到 99% 准确率,实际部署时识别率骤降 40%
解决方案技术对比
过拟合应对方案
- L2 正则化(Ridge Regression)
通过在损失函数中添加权重惩罚项:
$$J(\theta) = \text{MSE}(\theta) + \alpha\frac{1}{2}\sum_{i=1}^n \theta_i^2$$ - $\alpha$ 越大,权重收缩越强
-
适合特征间存在共线性的场景
-
Dropout
前向传播时随机丢弃部分神经元,打破神经元间的适应性 -
早停法(Early Stopping)
监控验证集性能,在过拟合发生前终止训练
欠拟合改进方案
-
多项式特征扩展
将原始特征升维,例如:from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=3, include_bias=False) X_poly = poly.fit_transform(X) -
模型复杂度提升
- 决策树增加 max_depth
- 神经网络添加隐藏层
实战代码示例
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import numpy as np
# 数据准备
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3, random_state=42)
# 带 L2 正则化的逻辑回归
try:
model = LogisticRegression(
penalty='l2',
C=0.1, # 正则化强度倒数
max_iter=1000,
solver='lbfgs'
).fit(X_train, y_train)
except ConvergenceWarning:
print("需增加 max_iter 或调整学习率")
# 超参数网格搜索
from sklearn.model_selection import GridSearchCV
param_grid = {'C': np.logspace(-3, 3, 7)}
grid = GridSearchCV(model, param_grid, cv=5)
grid.fit(X_train, y_train)
关键调优技巧
- 验证集比例选择
- 小数据集(10k 样本):建议 20-30% 验证集
-
大数据集(100w+ 样本):1-5% 即可
-
学习率与正则化协同
- 高学习率需配合强正则化
- Adam 优化器建议初始 lr=0.001 + alpha=0.1
效果验证
| 方案 | 训练 F1 | 验证 F1 | 改进幅度 |
|---|---|---|---|
| 原始模型 | 0.92 | 0.76 | – |
| L2 正则化 | 0.88 | 0.83 | +9.2% |
| 多项式扩展 | 0.85 | 0.82 | +7.9% |
延伸思考
当正则化导致训练集准确率下降时,可能原因包括:
– 正则化系数 $\alpha$ 设置过大
– 原始模型本就处于欠拟合状态
– 特征工程阶段信息损失严重
建议通过学习曲线分析模型当前处于高偏差还是高方差状态,再针对性调整。
正文完
发表至: 未分类
近两天内
