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

1次阅读
没有评论

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

image.webp

核心概念

欠拟合与过拟合

  • 欠拟合 :模型在训练集和测试集上表现都很差,通常是因为模型太简单,无法捕捉数据中的复杂模式。常见原因包括:
  • 模型复杂度不足(如线性模型拟合非线性数据)
  • 特征工程不充分(缺少关键特征)
  • 训练数据量太少

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

  • 过拟合 :模型在训练集上表现很好但在测试集上表现差,通常是因为模型过于复杂,记住了训练数据的噪声而非学习通用模式。常见原因包括:

  • 模型复杂度过高(如深度神经网络层数过多)
  • 训练数据不足或缺乏多样性
  • 训练迭代次数过多(未及时停止)

偏差 - 方差权衡

  • 高偏差 :模型过于简单,导致预测值与真实值差距大(欠拟合)
  • 高方差 :模型过于复杂,对训练数据过度敏感(过拟合)
  • 理想模型应在偏差和方差之间取得平衡

痛点分析

典型场景

  1. 欠拟合场景
  2. 训练集和验证集准确率都很低
  3. 模型预测结果与真实值偏差较大
  4. 特征重要性分析显示关键特征未被有效利用

  5. 过拟合场景

  6. 训练集准确率高但验证集准确率低
  7. 模型在噪声数据上表现异常好
  8. 不同训练批次间模型表现波动大

技术方案

L2 正则化

  • 数学原理 :在损失函数中添加权重向量的 L2 范数作为惩罚项
     新损失函数 = 原损失函数 + λ * ||w||²
  • λ:正则化强度超参数
  • ||w||²:所有权重平方和

  • 实现效果

  • 限制权重值过大
  • 使模型参数分布更平滑

  • PyTorch 实现

    import torch
    import torch.nn as nn
    
    model = nn.Sequential(nn.Linear(100, 50),
        nn.ReLU(),
        nn.Linear(50, 10)
    )
    
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01, weight_decay=0.01)  # weight_decay 即 λ 

Dropout

  • 工作机制
  • 训练时随机 ” 关闭 ” 部分神经元(置为 0)
  • 预测时使用全部神经元但按比例缩小权重
  • 相当于对多个子模型进行集成

  • 实现要点

  • 通常设置在 0.2-0.5 之间的关闭概率
  • 仅用于全连接层和卷积层

  • TensorFlow 实现

    import tensorflow as tf
    
    model = tf.keras.Sequential([tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dropout(0.3),  # 30% 的神经元会被随机关闭
        tf.keras.layers.Dense(10, activation='softmax')
    ])

数据增强

  • 图像数据常用方法
  • 随机旋转 / 翻转
  • 颜色抖动
  • 随机裁剪
  • 添加噪声

  • 文本数据常用方法

  • 同义词替换
  • 随机插入 / 删除
  • 回译(翻译成其他语言再译回)

  • PyTorch 图像增强示例

    from torchvision import transforms
    
    transform = transforms.Compose([transforms.RandomHorizontalFlip(),
        transforms.RandomRotation(15),
        transforms.ColorJitter(brightness=0.2, contrast=0.2),
        transforms.ToTensor()])


性能考量

方法 训练开销 推理开销 适用场景
L2 正则化 所有模型
Dropout 深度神经网络
数据增强 数据不足时
提前终止 可变 训练过程容易过拟合时

避坑指南

  1. 正则化强度选择
  2. λ 过大导致欠拟合
  3. λ 过小无法抑制过拟合
  4. 建议使用网格搜索确定最佳值

  5. Dropout 使用误区

  6. 不要在测试时忘记关闭 Dropout
  7. 不要在所有层都使用相同 dropout 率

  8. 数据增强注意事项

  9. 确保增强操作不会改变数据语义
  10. 对验证 / 测试集不要使用增强

思考题

  1. 当你的模型在训练集和验证集上表现都很差时,除了增加模型复杂度,还有哪些可能的改进方向?
  2. 为什么 Dropout 在测试时需要按比例缩小权重?请从数学期望的角度解释。
  3. 对于时间序列数据,哪些数据增强方法可能适用?它们需要满足什么约束条件?
正文完
 0
评论(没有评论)