机器学习:防止过拟合的方法
2016-04-07 13:18
288 查看
在对模型进行训练时,有可能遇到训练数据不够,即训练数据无法对整个数据的分布进行估计的时候,或者在对模型进行过度训练(overtraining)时,常常会导致模型的过拟合(overfitting),即模型复杂度比实际数据复杂度还要高。
防止过拟合,主要从以下几方面着手:
模型参数:减少特征、权值衰减、Early stopping
数据集:数据集扩增(源头取数、复制数据+随机噪声、重采样、分布估计)、验证数据(验证最小误差的迭代次数,常用交叉验证)
增加罚项:正则化方法、Dropout(修改神经网络本身结构)
下面具体介绍
1. 模型参数
减少特征:
人工选择,预留一些特征;利用算法选取一些比较好的特征。
权值衰减:
在每次迭代过程中以某个小因子降低每个权值,这等效于修改E的定义,加入一个与网络权值的总量相应的惩罚项。此方法的动机是保持权值较小,避免weight decay,从而使学习过程向着复杂决策面的反方向偏。
Early stopping:
对模型进行训练的过程即是对模型的参数进行学习更新的过程,这个参数学习的过程往往会用到一些迭代方法,如梯度下降(Gradient descent)学习算法。
Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。
一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取,如10、20、30……
2. 数据集
数据集扩增:
在数据挖掘领域流行着这样的一句话,“有时候往往拥有更多的数据胜过一个好的模型”。
通俗得讲,数据机扩增即需要得到更多的符合要求的数据,即和已有的数据是独立同分布的,或者近似独立同分布的。一般有以下方法:
从数据源头采集更多数据
复制原有数据并加上随机噪声
重采样
根据当前数据集估计数据分布参数,使用该分布产生更多数据等
验证数据:
一个最成功的方法是在训练数据外再为算法提供一套验证数据,应该使用在验证集合上产生最小误差的迭代次数。
交叉验证方法在可获得额外的数据提供验证集合时工作得很好,但是小训练集合的过度拟合问题更为严重。
k-fold交叉方法:
把训练样例分成k份,然后进行k次交叉验证过程,每次使用不同的一份作为验证集合,其余k-1份合并作为训练集合。
每个样例会在一次实验中被用作验证样例,在k-1次实验中被用作训练样例;每次实验中,使用上面讨论的交叉验证过程来决定在验证集合上取得最佳性能的迭代次数n*,然后计算这些迭代次数的均值,作为最终需要的迭代次数。
3.增加罚项
正则化方法:
L1正则
L1正则是基于L1范数,即在目标函数后面加上参数的L1范数和项,即参数绝对值和与参数的积项,即:
C=C0+λn∑w|w|
其中C0代表原始的代价函数,n是样本的个数,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L1正则项。
L2正则
L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即参数的平方和与参数的积项,即:
C=C0+λ2n∑ww2
其中C0代表原始的代价函数,n是样本的个数,与L1正则化项前面的参数不同的是,L2项的参数称了12,是为了便于计算以及公式的美感性,因为平方项求导有个2,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L2正则项。
Dropout(修改神经网络本身结构):
在神经网络中,有一种方法是通过修改神经网络本身结构来实现的,其名为Dropout。该方法是在对网络进行训练时用一种技巧(trike),对于如下所示的三层人工神经网络:
![](https://img-blog.csdn.net/20151026204937425)
对于上图所示的网络,在训练开始时,随机得删除一些(可以设定为一半,也可以为1/3,1/4等)隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层神经元的个数不变,这样便得到如下的ANN:
![](https://img-blog.csdn.net/20151026204952319)
然后按照BP学习算法对ANN中的参数进行学习更新(虚线连接的单元不更新,因为认为这些神经元被临时删除了)。这样一次迭代更新便完成了。下一次迭代中,同样随机删除一些神经元,与上次不一样,做随机选择。这样一直进行瑕疵,直至训练结束。
Dropout方法是通过修改ANN中隐藏层的神经元个数来防止ANN的过拟合。
参考文献:
防止过拟合以及解决过拟合
机器学习中防止过拟合的处理方法
防止过拟合,主要从以下几方面着手:
模型参数:减少特征、权值衰减、Early stopping
数据集:数据集扩增(源头取数、复制数据+随机噪声、重采样、分布估计)、验证数据(验证最小误差的迭代次数,常用交叉验证)
增加罚项:正则化方法、Dropout(修改神经网络本身结构)
下面具体介绍
1. 模型参数
减少特征:
人工选择,预留一些特征;利用算法选取一些比较好的特征。
权值衰减:
在每次迭代过程中以某个小因子降低每个权值,这等效于修改E的定义,加入一个与网络权值的总量相应的惩罚项。此方法的动机是保持权值较小,避免weight decay,从而使学习过程向着复杂决策面的反方向偏。
Early stopping:
对模型进行训练的过程即是对模型的参数进行学习更新的过程,这个参数学习的过程往往会用到一些迭代方法,如梯度下降(Gradient descent)学习算法。
Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。
一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取,如10、20、30……
2. 数据集
数据集扩增:
在数据挖掘领域流行着这样的一句话,“有时候往往拥有更多的数据胜过一个好的模型”。
通俗得讲,数据机扩增即需要得到更多的符合要求的数据,即和已有的数据是独立同分布的,或者近似独立同分布的。一般有以下方法:
从数据源头采集更多数据
复制原有数据并加上随机噪声
重采样
根据当前数据集估计数据分布参数,使用该分布产生更多数据等
验证数据:
一个最成功的方法是在训练数据外再为算法提供一套验证数据,应该使用在验证集合上产生最小误差的迭代次数。
交叉验证方法在可获得额外的数据提供验证集合时工作得很好,但是小训练集合的过度拟合问题更为严重。
k-fold交叉方法:
把训练样例分成k份,然后进行k次交叉验证过程,每次使用不同的一份作为验证集合,其余k-1份合并作为训练集合。
每个样例会在一次实验中被用作验证样例,在k-1次实验中被用作训练样例;每次实验中,使用上面讨论的交叉验证过程来决定在验证集合上取得最佳性能的迭代次数n*,然后计算这些迭代次数的均值,作为最终需要的迭代次数。
3.增加罚项
正则化方法:
L1正则
L1正则是基于L1范数,即在目标函数后面加上参数的L1范数和项,即参数绝对值和与参数的积项,即:
C=C0+λn∑w|w|
其中C0代表原始的代价函数,n是样本的个数,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L1正则项。
L2正则
L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即参数的平方和与参数的积项,即:
C=C0+λ2n∑ww2
其中C0代表原始的代价函数,n是样本的个数,与L1正则化项前面的参数不同的是,L2项的参数称了12,是为了便于计算以及公式的美感性,因为平方项求导有个2,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L2正则项。
Dropout(修改神经网络本身结构):
在神经网络中,有一种方法是通过修改神经网络本身结构来实现的,其名为Dropout。该方法是在对网络进行训练时用一种技巧(trike),对于如下所示的三层人工神经网络:
对于上图所示的网络,在训练开始时,随机得删除一些(可以设定为一半,也可以为1/3,1/4等)隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层神经元的个数不变,这样便得到如下的ANN:
然后按照BP学习算法对ANN中的参数进行学习更新(虚线连接的单元不更新,因为认为这些神经元被临时删除了)。这样一次迭代更新便完成了。下一次迭代中,同样随机删除一些神经元,与上次不一样,做随机选择。这样一直进行瑕疵,直至训练结束。
Dropout方法是通过修改ANN中隐藏层的神经元个数来防止ANN的过拟合。
参考文献:
防止过拟合以及解决过拟合
机器学习中防止过拟合的处理方法
相关文章推荐
- 关于要使用全局dialog的解决方案
- iOS图片裁剪和小图看大图动画
- 如何在TabBar上自定义添加个性按钮
- Tomcat部署项目去除项目名和端口号通过IP地址(或域名)访问
- ajax异步提交以及nicevalidator自定义验证示例
- 【BLE】CC2541之添加自定义任务
- 【CodeForces】[610B]Vika and Squares
- Fragemnt嵌套出现的问题解决办法
- 工程师容易犯的三个错误 (2)
- Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
- (OpenCV)函数cv::partition解析
- 揭秘你不知道的京东管理体系!
- adb error: device offline 的处理方法
- .NET 通过代码创建带属性的XML文档
- SSH中baseDao的写法
- 一种头像缓存策略
- 通过有线网络调试进行Android应用调试
- 蛇形矩阵
- tomcat和apache关系总结
- 安卓开发与分析者的利器--安卓右键工具