机器学习模型调优实战:过拟合与欠拟合的诊断与解决方案

1次阅读
没有评论

共计 1555 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

基本概念与问题表现

过拟合 (Overfitting) 指模型在训练集上表现优异,但在测试集或新数据上表现显著下降,通常伴随高方差。其损失函数曲线表现为训练误差持续降低而验证误差后期上升。数学表达式为:

机器学习模型调优实战:过拟合与欠拟合的诊断与解决方案

$$\mathcal{L}{train} \ll \mathcal{L}$$

欠拟合 (Underfitting) 则是模型无法捕捉数据的基本关系,在训练集和测试集上都表现不佳,对应高偏差状态。损失曲线显示双高平台:

$$\mathcal{L}{train} \approx \mathcal{L} \gg 0$$

业务场景痛点

  • 电商推荐系统中,过度记忆用户历史行为(过拟合)导致新品推荐效果差
  • 金融风控模型因特征利用不足(欠拟合)误判高风险交易
  • 医疗影像诊断模型在训练数据上达到 99% 准确率,实际部署时识别率骤降 40%

解决方案技术对比

过拟合应对方案

  1. L2 正则化(Ridge Regression)
    通过在损失函数中添加权重惩罚项:
    $$J(\theta) = \text{MSE}(\theta) + \alpha\frac{1}{2}\sum_{i=1}^n \theta_i^2$$
  2. $\alpha$ 越大,权重收缩越强
  3. 适合特征间存在共线性的场景

  4. Dropout
    前向传播时随机丢弃部分神经元,打破神经元间的适应性

  5. 早停法(Early Stopping)
    监控验证集性能,在过拟合发生前终止训练

欠拟合改进方案

  1. 多项式特征扩展
    将原始特征升维,例如:

    from sklearn.preprocessing import PolynomialFeatures
    poly = PolynomialFeatures(degree=3, include_bias=False)
    X_poly = poly.fit_transform(X)

  2. 模型复杂度提升

  3. 决策树增加 max_depth
  4. 神经网络添加隐藏层

实战代码示例

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)

关键调优技巧

  1. 验证集比例选择
  2. 小数据集(10k 样本):建议 20-30% 验证集
  3. 大数据集(100w+ 样本):1-5% 即可

  4. 学习率与正则化协同

  5. 高学习率需配合强正则化
  6. 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$ 设置过大
– 原始模型本就处于欠拟合状态
– 特征工程阶段信息损失严重

建议通过学习曲线分析模型当前处于高偏差还是高方差状态,再针对性调整。

正文完
 0
评论(没有评论)