什么是过拟合?
训练一个机器学习模型时,有时候它在训练数据上表现特别好,准确率接近100%,可一换到新数据上就傻眼了,错误百出。这种情况就是“过拟合”。就像一个学生只会死记硬背课本例题,遇到考试稍微变个花样就不会做了。
增加数据量
最直接的办法是给模型“见多识广”。数据越多,模型就越难记住所有细节,反而会学会其中的规律。比如你教孩子认猫,只给他看三张猫的照片,他可能会认为所有带胡须的都是猫;但如果看了上千张不同角度、品种、环境下的猫图,他就更容易抓住“猫”的本质特征。
简化模型结构
模型太复杂也容易过拟合。比如用一个超级深的神经网络去解决一个简单的分类问题,就像拿高射炮打蚊子。这时候可以减少网络层数或每层的神经元数量,让模型没那么强的记忆能力,逼它去学规律而不是背答案。
使用正则化
正则化是在损失函数中加点“约束”,不让模型的参数变得太大。常见的有L1和L2正则化。以L2为例,在线性回归中,损失函数变成:
loss = MSE + λ * Σ(w²)
这里的λ控制惩罚力度,w是模型权重。参数越大,惩罚越重,模型就会倾向于选择更小的权重,降低对个别特征的依赖。
引入Dropout
在训练神经网络时,Dropout是一种很实用的技巧。它随机“关闭”一部分神经元,让每次训练都像在不同的简化网络上进行。这样模型就不能依赖某几个固定的神经元做判断,必须分散注意力,提升泛化能力。
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.3))
早停法(Early Stopping)
训练过程中,随着轮次增加,训练误差持续下降,但验证误差可能先降后升。这说明模型开始过拟合了。早停法就是监控验证误差,一旦发现连续几轮不再下降,就立即停止训练。就像健身时教练提醒你“别练过头了”,及时收手效果更好。
交叉验证选模型
在调整超参数时,如果只用训练集和测试集,可能会无意中让模型适应了测试集。用交叉验证可以把数据分成几份,轮流当训练和验证用,更公平地评估模型性能,避免因为一次划分导致的偶然过拟合。
数据增强
尤其在图像任务中,可以通过旋转、翻转、裁剪、调亮度等方式,从原始图片生成新的训练样本。虽然这些图是“人造”的,但能有效扩充数据多样性,让模型看到更多变化,不容易钻牛角尖。
集成学习
把多个弱模型组合起来,比如随机森林或梯度提升树。每个模型可能有点小偏差,但合在一起反而更稳定。就像一群人投票决策,比一个人拍脑袋更靠谱。这类方法天然具有抑制过拟合的能力,因为单个模型很难同时过拟合到相同程度。