机器学习中的过拟合问题

    最近研究一下机器学习中的过拟合问题,看了很多大牛们的资料,写的都不错,我这里面主要是整理,开始正文。

什么是过拟合

过拟合(overfitting)是指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合。

具体表现就是最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱

过拟合产生的原因

过拟合主要由以下三点原因产生:

1) 数据有噪声

造成原因:

(1)大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系

     当噪声数量在训练集中占有相当大的比例时,就会与正常数据一起影响训练集的分布,机器学习算法在学习过程中,把正常数据和噪声数据同时拟合,学习到了一个正常数据与噪声数据共同决定的模型,用此模型去预测从正常数据分布上取的未知数据,就很有可能得到不理想的泛化效果。

2) 训练数据不足

造成的原因:

(1)主要是因为训练集的数量级和模型的复杂度不匹配。训练集的数量级要小于模型的复杂度,使用的模型太复杂,甚至出现训练数据跟模型参数个数差不多,这样模型的参数会把所有情况都记录下来

3) 训练模的选取和使用

(1)使用的模型太复杂,训练的数据不能满足模型复杂度(同2中)

(2)overtraining,在有噪声的训练数据中,我们要是训练过度,会让模型学习到噪声的特征,无疑是会造成在没有噪声的真实测试集上准确率下降。

如何解决过拟合问题

1)解决数据有噪声

(1)数据清洗

     数据清洗从名字上也看的出就是把“脏”的“洗掉”,指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等

2)解决训练数据不足问题

(1)获取和使用更多的数据集

       可以通过标注或者挖掘更多的数据,使其能够尽量反应数据的真实分布,训练集越多,过拟合的概率越小

(2)选择复杂度适当的训练模型和参数

         这类问题跟下面3中的解决有重复,但是却是一个考虑点

3) 训练模型选取

训练模型选取和使用方面,有些方法是通用方法,基本适用于所有场景,比如早停和正则化,而有些方法需要根据事情情况去作出调整,比如简化模型和使用集成模型

(1)早停(通用方法)

      Early Stopping 是参数微调中的一种,即在每个循环结束一次以后(这里的循环可能是 full data batch,也可能是 mini batch size),计算模型的准确率(accuracy),当准确率不再增加时就停止训练。

     这是一种非常简单和自然的办法,在训练过程中观察训练结果的情况,早停可以防止过度训练,准确率不再增加时就停止训练,也是为了防止模型过度训练,把噪音数据都拟合的很好(其实早停也是解决有噪音的一种方法)

    但是问题在于,准确率在每个循环之后的计算是变化的,没有任何人和任何模型能保证准确率不会变化,可能某次循环结束后,准确率很高,但是下一轮结束后准确率又降得很低。这里笔者建议的一个办法是人为地设定一个范围。当连续10次准确率在此范围内波动时就停止循环。

(2)正则化 (通用方法)

    正则化又称为权重衰减,具体做法是将权值的大小加入到损失函数中,降低权重值,,在实际使用中分为 L1 正则与 L2 正则。

L1范数稀疏模型,选择少量重要特征。L2范数会选择更多特征,使这些特征接近于零。

L1正则会倾向于使得w要么取1,要么取0 ,稀疏矩阵 ,可以达到降维的角度,这样会去除掉一些没有用的特征使得泛华能力更好

L2正则会整体的把w变小,从而使得模型更加平滑(求导时候导数的大小很大程度取决于权重,权重小的话模型约平滑),而越平滑的模型泛华能力越好

正则的选取:

默认情况下选用L2正则。

如若认为少数特征有用,可以用L1正则

关于L1和L2正则的详细介绍参考下文:

参考 https://www.cnblogs.com/alexanderkun/p/6922428.html 和 https://blog.youkuaiyun.com/winycg/article/details/80313123以及https://www.cnblogs.com/LHWorldBlog/p/8336733.html

(3)简化模型复杂度

     如简化网络结构,如层数,单层神经元个数等,适当的优化网络结构和参数,使得不至于训练模型的复杂度过高,训练数据被“完全训练”,避免噪音都拟合的很好的情况

(4) 集成多种模型

      这是一种通过结合几个模型降低泛化误差的技术。主要想法是通过对训练数据有放回的采样来训练多个模型,然后让所有模型表决(采用投票多数表决,取所有模型分类结果最多的分类作为结果)测试样例的输出。这种方法虽然在准确率和稳定性都会有提高,但是训练多个模型的计算成本也是非常高的

      通过集成手段解决问题的方法有

      1、bagging,类似于分段函数的概念,不同部分的训练集使用不同模型拟合

      2、boosting,综合多个简单的模型的结果得到一个‘靠谱的结果

      3、dropout,实际效果其实是用不同的训练集训练了不同的网络模型,然后这些网络模型形成了一个整体的模型

 

参考文献

http://www.cnblogs.com/houjun/p/8956333.html 

https://blog.youkuaiyun.com/huangfei711/article/details/79436698 

https://blog.youkuaiyun.com/NIGHT_SILENT/article/details/80795640

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值