1. 过拟合及其解决方式
过拟合经常发生:
先看范例:
运行结果:
模型在训练集上的精度是98.5%, 在测试集上的精度是90.0%,显然发生过拟合了。
解决办法:
加入Dropout层 ,模型修改为:
运行结果:
加入权重正则化 ,模型修改为
运行结果:
模型在训练集上的精度是86.3%, 在测试集上的精度是87.4%,显然增加过Dropout+L2后,模型过拟合好了,但又发生了欠拟合 把Epochs增加为:20,其运行结果:
模型在训练集上的精度是88.02%, 在测试集上的精度是88.7%
结论:
2. 什么是过拟合?如何避免过拟合问题?
过拟合 :所选模型的复杂度比真模型更高;学习时选择的模型所包含的参数过多,对已经数据预测得很好,但是对未知数据预测得很差的现象.
过拟合一般特点 :高方差,低偏差;
导致过拟合原因: 训练数据不够,模型进行过度训练(overtraining)等
如何避免过拟合:
1) Early stopping (适当的stopping criterion): Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合
2) 数据集扩增 : 数据机扩增即需要得到更多的符合要求的数据,即和已有的数据是独立同分布的,或者近似独立同分布的。一般方法有:从数据源头采集更多数据,复制原有数据并加上随机噪声,重采样,根据当前数据集估计数据分布参数,使用该分布产生更多数据等
3)正则化方法: 一般有L1正则与L2正则等
4)Dropout: 正则是通过在代价函数后面加上正则项来防止模型过拟合的。而在神经网络中,有一种方法是通过修改神经网络本身结构来实现的,其名为Dropout
3. 如何理解“过拟合是无法避免的”?
因为这是发展的必然规律。
过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。
给定一个假设空间H,一个假设h属于H,如果存在其他的假设h’属于H,使得在训练样例上h的错误率比h’小,但在整个实例分布上h’比h的错误率小,那么就说假设h过度拟合训练数据。
一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。
常见原因:
(1)建模样本选取有误,如样本数量太少,选样方法错误,样本标签错误等,导致选取的样本数据不足以代表预定的分类规则;
(2)样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则;
(3)假设的模型无法合理存在,或者说是假设成立的条件实际并不成立;
(4)参数太多,模型复杂度过高;
(5)对于决策树模型,如果我们对于其生长没有合理的限制,其自由生长有可能使节点只包含单纯的事件数据(event)或非事件数据(no event),使其虽然可以完美匹配(拟合)训练数据,但是无法适应其他数据集。
4. 过拟合问题
过拟合会造成模型变得复杂,并尽可能拟合训练集,造成在训练集上的准确率特别高,这里就会有一个问题就是:训练集是不靠谱的,其中有容错的数据。直接点,训练集中特别是十几万的数据,会有脏数据,这些脏数据也成为负样本,会造成模型训练有误差,模型在训练的时候并不清楚那些是脏数据,它只会不停的去拟合这些数据,所以过拟合的模型在训练集上准确率特别高,但训练集其实只是整个数据集中的一部分,其包含两部分特征,一部分是整个数据集共有的特征,一部分是训练集自身共有的特征,当过拟合时,模型学到的是这两部分的特征,此时拿模型去在测试集上测试时,因为测试集不包含训练集自身共有的特征,所以测试集在模型上就不会取得很好的效果。因此需要防止过拟合。主要优缺点如下:
训练集的准确率很高,其实这个训练集准确率高只能说明 模型拟合数据不错,但是 针对测试集来说效果可能就不一定了,这个很难评估,不过大致可以说明模型还是可以的。
模型在测试集上的效果不好,过度的拟合噪音数据,过度拟合训练集中特有特征,所以过拟合的模型在测试集上表现都非常差。
欠拟合比较好理解就是模型简单或者说语料集偏少、特征太多,在训练集上的准确率不高,同时在测试集上的准确率也不高,这样如何训练都无法训练出有意义的参数,模型也得不到较好的效果,这个优缺点就不说了,基本上欠拟合就选择合理的模型,合理的特征,提高训练集就行。
1、early stopping
Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。 Early stopping方法的具体做法是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data的accuracy,当accuracy不再提高时,就停止训练。
2、数据集扩增
通过扩充数据集,让训练集中的噪音数据占比越来越小,这样噪音对模型的影响就较小,防止模型过拟合。
3、正则化
正则化是指在优化目标函数或代价函数是,在目标函数后面加上一个正则项。正则项通常有L1正则项和L2正则项。
4、 Dropout
正则是通过在代价函数后面加上正则项来防止模型过拟合。在神经网络中,有一种方法是通过修改自身结构来实现的,叫做Dropout。这是对网络训练的一种技巧,在训练过程中随机删除一些隐藏层的神经元,同时保证输入层和输出层的神经元不变。
5、挑选合适的模型
模型不合适,挑选相对简单的模型进行训练,对模型中的参数、训练层数等做限制。
6、可变化的学习率
————————————————
原文链接: https://blog.csdn.net/randompeople/article/details/82107740
5. 减少过拟合的方法
1增大数据量 2early stoping 通过在模型的训练的过程中同时通过验证集测试模型的准确率,如果模型在测试集上效果上升但是验证集上的效果下降就停止训练,防止过拟合。 3加入正则化项 正则化项包括L1正则化和L2正则化,其中L1正则化让参数等于零,L2正则化会让参数更加平均 因为L1正则化是加入的是权重的绝对值,把这个L1加入损失函数之后,如果使用梯度下降的算法更新权重,我们会对损失函数求每个参数的倒数,对正则化项求导之后如果原来的w大于零那么 w(新的)=w(老的)-(损失函数求导部分+λ sgn(w))。sgn(w)就大于零让新的w减小,如果原来的w小于零那么sgn(w)就是负的让变大,所以总体来说就是会导致w一直靠近零,这样就就导致权重稀疏。 如果是L2正则 w(新的)=w(老的)-(损失函数求导部分+(λ w(老的)))=(1-λ)w(老的)-损失函数求导部分。这样就相当于一直让w变小(无论正负),但是方向不是不会趋于零。
4dropout 随机失活就是让神经网络当中隐藏层的神经单元随机的不被激活,这样的理由是对于神经网络来说我们也是更倾向于每个神经元都是同等重要的,但是在训练的过程中会导致某些神经元上的权重极大,随机失活就会告诉神经网络不要集中于网络中的某几个主要节点,应该面面俱到,这样的本质也是和正则化一样的。如果将权重集中在某些特征当中容易造成过拟合,如果数据的分布情况变了就会导致模型整体的预测能力下降。 5 决策树剪枝 决策树损失函数里加入叶子节点的个数和树的颗数 从底层开始对于每一个中间节点计算剪枝钱的损失函数和剪枝后的损失函数。如果剪枝后的损失小于剪枝前的损失那么就把两个叶子节点上的样本样本合并赋予给这个中间节点,如果是回归树就用所有样本的均值,如果是分类树就采用投票多数的样本作为该叶子节点的预测值。
6. 过拟合及解决方案
是什么
过拟合(overfitting)是指在模型参数拟合过程中的问题,由于训练数据包含 抽样误差 ,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合。
具体表现就是最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。
为什么
为什么要解决过拟合现象?这是因为我们拟合的模型一般是用来预测未知的结果(不在训练集内),过拟合虽然在训练集上效果好,但是在实际使用时(测试集)效果差。同时,在很多问题上,我们无法穷尽所有状态,不可能将所有情况都包含在训练集上。所以,必须要解决过拟合问题。
为什么在机器学习中比较常见?这是因为机器学习算法为了满足尽可能复杂的任务,其模型的拟合能力一般远远高于问题复杂度,也就是说,机器学习算法有「拟合出正确规则的前提下,进一步拟合噪声」的能力。
而传统的函数拟合问题(如机器人系统辨识),一般都是通过经验、物理、数学等推导出一个含参模型,模型复杂度确定了,只需要调整个别参数即可。模型「无多余能力」拟合噪声。
怎么样
如何防止过拟合:
主要是以下4点
1. 获取更多数据
这是解决过拟合最有效的方法,只要给足够多的数据,让模型「看见」尽可能多的「例外情况」,它就会不断修正自己,从而得到更好的结果:
如何获取更多数据,可以有以下几个方法:
2. 使用合适的模型
前面说了,过拟合主要是有两个原因造成的:数据太少 + 模型太复杂。所以,我们可以通过使用合适复杂度的模型来防止过拟合问题,让其足够拟合真正的规则,同时又不至于拟合太多抽样误差。
(PS:如果能通过物理、数学建模,确定模型复杂度,这是最好的方法,这也就是为什么深度学习这么火的现在,我还坚持说初学者要学掌握传统的建模方法。)
对于神经网络而言,我们可以从以下四个方面来 限制网络能力 :
2.1 网络结构 Architecture
这个很好理解,减少网络的层数、神经元个数等均可以限制网络的拟合能力;
2.2 训练时间 Early stopping
对于每个神经元而言,其激活函数在不同区间的性能是不同的:
当网络权值较小时,神经元的激活函数工作在线性区,此时神经元的拟合能力较弱(类似线性神经元)。
有了上述共识之后,我们就可以解释为什么限制训练时间(early stopping)有用:因为我们在初始化网络的时候一般都是初始为较小的权值。训练时间越长,部分网络权值可能越大。如果我们在合适时间停止训练,就可以将网络的能力限制在一定范围内。
2.3 限制权值 Weight-decay,也叫正则化(regularization)
原理同上,但是这类方法直接将权值的大小加入到 Cost 里,在训练的时候限制权值变大。以 L2 regularization 为例:
训练过程需要降低整体的 Cost,这时候,一方面能降低实际输出与样本之间的误差C 0 ,也能降低权值大小。
2.4 增加噪声 Noise
给网络加噪声也有很多方法:
2.4.1 在输入中加噪声:
噪声会随着网络传播,按照权值的平方放大,并传播到输出层,对误差 Cost 产生影响。推导直接看 Hinton 的 PPT 吧:
在输入中加高斯噪声,会在输出中生成 \Sigma_i\sigma^2_i\cdot w^2_i 的干扰项。训练时,减小误差,同时也会对噪声产生的干扰项进行惩罚,达到减小权值的平方的目的,达到与 L2 regularization 类似的效果(对比公式)。
2.4.2 在权值上加噪声
在初始化网络的时候,用 0 均值的高斯分布作为初始化。Alex Graves 的手写识别 RNN 就是用了这个方法
2.4.3 对网络的响应加噪声
如在前向传播过程中,让默写神经元的输出变为 binary 或 random。显然,这种有点乱来的做法会打乱网络的训练过程,让训练更慢,但据 Hinton 说,在测试集上效果会有显著提升 (But it does significantly better on the test set!)。
3. 结合多种模型
简而言之,训练多个模型,以每个模型的平均输出作为结果。
从 N 个模型里随机选择一个作为输出的期望误差 ,会比所有模型的平均输出的误差 大 (我不知道公式里的圆括号为什么显示不了) :
大概基于这个原理,就可以有很多方法了:
3.1 Bagging
简单理解,就是分段函数的概念:用不同的模型拟合不同部分的训练集。以随机森林(Rand Forests)为例,就是训练了一堆互不关联的决策树。但由于训练神经网络本身就需要耗费较多自由,所以一般不单独使用神经网络做 Bagging。
3.2 Boosting
既然训练复杂神经网络比较慢,那我们就可以只使用简单的神经网络(层数、神经元数限制等)。通过训练一系列简单的神经网络,加权平均其输出。
3.3 Dropout
这是一个很高效的方法。
在训练时, 每次 随机(如 50% 概率)忽略隐层的某些节点;这样,我们相当于随机从 2^H 个模型中采样选择模型;同时,由于每个网络只见过一个训练数据(每次都是随机的新网络),所以类似 bagging 的做法,这就是我为什么将它分类到「结合多种模型」中;
此外,而不同模型之间权值共享(共同使用这 H 个神经元的连接权值),相当于一种权值正则方法,实际效果比 L2 regularization 更好。
4. 贝叶斯方法
这部分我还没有想好怎么才能讲得清楚,为了不误导初学者,我就先空着,以后如果想清楚了再更新。当然,这也是防止过拟合的一类重要方法。
7. 怎么防止过拟合?
1)在训练和建立模型的时候,从相对简单的模型开始,不要一开始就把特征做的非常多,模型参数跳的非常复杂。
2)增加样本,要覆盖全部的数据类型。数据经过清洗之后再进行模型训练,防止噪声数据干扰模型。
3)正则化。在模型算法中添加惩罚函数来防止过拟合。常见的有L1,L2正则化。
4)集成学习方法bagging(如随机森林)能有效防止过拟合
5)减少特征个数(不是太推荐)注意:降维不能解决过拟合。降维只是减小了特征的维度,并没有减小特征所有的信息。
8. 防止过拟合的方法有哪些
防止过拟合的方法:
1,从模型和数据角度
获取更多数据,你的模型可以存储很多很多的信息,这意味着你输入模型的训练数据越多,模型就越不可能发生过拟合。原因是随着你添加更多数据,模型会无法过拟合所有的数据样本,被迫产生泛化以取得进步。
收集更多的数据样本应该是所有数据科学任务的第一步,数据越多会让模型的准确率更高,这样也就能降低发生过拟合的概率。
2,数据增强和噪声数据
收集更多的数据会比较耗时耗力。如果没有时间和精力做这个,应该尝试让你的数据看起来更多元化一些。利用数据增强的方法可以做到这一点,这样模型每次处理样本的时候,都会以不同于前一次的角度看待样本。这就提高了模型从每个样本中学习参数的难度。