5.过拟合及其避免

author author     2023-03-23     147

关键词:

参考技术A Fundamental concepts:generalization(泛化、普遍化、一般化);fitting (拟合)and overfitting(过拟合);complexity control(复杂度控制)。

Exemplary techniques:cross-validation(交叉验证);attribute selection(特征/属性选择);tree pruning(树剪枝);regularization(正则化)。

Generalization(泛化):指一个模型对于学习集以外的新数据的适应性。

在讨论怎么应对过拟合之前,我们先要知道如何识别过拟合。

Fitting Graph: 拟合图形以一个复杂度函数的形式来展示模型的精确程度。

为了检测过拟合,需要引入一个数据科学的概念, holdout data (留出法,留出数据)。

直接点说就是把学习集分一些数据出来当做模型验证数据,当留出法数据在这个场景下被使用时,通常被叫做“测试集”(相比学习集而言)。

模型结果函数越复杂,对学习集的拟合度则越高,但对测试集的贴合度会降低,这是一个反向关系,使用这个反向关系来寻找合适的模型函数的复杂度,以避免过拟合状况的发生。(可参考下图拟合图进行查看)

关于前面的churn案例的一个拟合图,如下图5-2所示:

关于churn的拟合图中错误率的判断,基于churn数据表中对target variable的yes和no的定义,即已知对于新加入的要素,默认不会churn也就是不会换运营商,新元素no churn=right,churn=wrong。基于全量样本下,会有一个每年固定的churn几率,这个固定的churn几率即为y轴上b的值,这个几率就叫做基础概率即base rate,在朴素贝叶斯的概率预测方法中,base rate被使用的较为广泛,后续章节会有相关介绍。

决策树的每一个叶子节点是否要拆分的依据是查看当前该叶子节点中的所有元素是否有同样的target variable值,若都相同,则不用再拆分,当做叶子节点处理。

决策树的复杂程度取决于它的节点数量。

决策树拟合曲线左侧,树小且预测精度低,右侧精度高。可以看出在sweet spot右侧,学习集适配度随着节点增多而增加,但是测试集准确度随着节点增多而降低,复杂度多过sweet spot时就发生了过拟合。

不幸的是,目前还没有一个理论型的方法可以预测何时能达到这个sweet spot,只能凭借经验主义来做判断。

增加函数复杂度可能有以下情形:

1.  增加变量的数量(即公式中 的数量,i=1,2,3...);

2. 增加非线性变量,如新增变量 ;

3. 增加非线性变量,如新增变量 ;

此时目标函数变为:

这个就是一个典型的非直线函数,并且典型来说,更多参数也就是更高维度,一般带来更高的预测准确度。

这里还通过之前的鸢尾花的花瓣和花萼宽度的例子来解释线性函数的过拟合。

下面我们将原先的2个变量引申为3个变量,即原先的花瓣宽度(petal width)、花萼宽度(sepal width)加上花萼宽度的平方,得到下图所示的曲线:

加入平方变量后,分割线均变为了抛物线(parabola)。

这个小节会讨论过拟合如何产生和为何产生,这节不重要,跳过也不影响学习。

模型越复杂,就越有可能产生有害的假的关联关系(feature和target variable之间的关联关系),这种错误关联关系的泛化影响了对学习集以外的新元素的target variable的预测,从而降低了模型预测的准确度

可以发现通过上述学习集,得出:

1. x=p时,75%可能性class是c1,25%可能性class是c2,所以可以通过x进行class预测;

2. 当已经计入x变量后再添加y变量,则y对class的预测不起作用,即x=p时y=r则class都是c1,x=p时y=s则class都是c2,在决策树中不具备新的预测意义;

3. 但是可以得出结论x=p并且y=r时,class必为c1,这个节点的增加可以获得新的information gain,但是却把整体模型的预测错误率从25%提高到30%,也就是增加的information gain同时增加了错误率。

从这个案例总结出:

1. 这种过拟合现象不仅出现在决策树模型中,只是决策树模型中更明显能看出来;

2. 这种现象并不是表5-1的数据特殊性导致的,所有数据集都会出现类似的问题;

3. 没有一个通用的理论方案来提前知道这个模型是否已经过拟合了,所以一定要留下一个holdout set(即测试集)来对过拟合现象的发生进行判断。

交叉验证的步骤如下:

1. 将数据集分成k个部分并且分别进行标签标记,这些部分命名为folds(子类),通常情况下k会取5或者10;

2. 随后对分组好的数据进行k次模型学习和模型验证的迭代,在每一次迭代中,一个不同的子类被选做测试集,此时其他几个子类共同组成学习集,所以每一个迭代都会有(k-1)/k的数据当做学习集,有1/k的数据当做测试集。

交叉验证的过程直观展现如下图:

3. 通过k次迭代后,可以得到k个不同的模型结果,可通过这k个结果计算出平均值和标准差。

(得到平均值就是数字化的预测结果,而标准差则是浮动范围)

通过这个数据实践可以发现如下几个点:

1. 各子类平均准确度为68.6%,而之前章节全量数据当学习集时的预测准确度为73%,可见全量数据做学习集时出现了显著的过拟合现象;

2. 不同子类的预测准确度有差异,所以取平均值是一个好主意,同时也可以使用这些数据产生的方差;

3. 对比逻辑回归和决策树的结果,发现两种模型在分组3精确度都不高,在分组10精确度都较高,但两种模式是不同的,并且逻辑回归展示了较低的整体准确度64.1%和较高的标准差1.3,所以在这个数据集上面,决策树更适用,因为准确度高并且预测结果更稳定(方差较小),但这个不是绝对的,换到其他数据集,结果就完全不一样了。

模型的 泛化表现 和学习集 数据数量 的关系被叫做 学习曲线(learning curve) 。

学习曲线(learning curve)展示的是基于测试集的泛化表现,针对训练集的数据数量来统计,和训练集数据量相对应(x轴)。

拟合图(fitting graph)展示泛化表现同时也展示模型在学习集的表现,但是和模型的复杂度相对应(x轴),拟合图中训练集数据量通常不会变化。

先从决策树模型开始,逐渐得到一个可适用于多种模型的广泛的避免过拟合的机制(mechanism)。

决策树中一般使用的避免过拟合方法有以下两种:

1. 在决策树过于庞大前停止扩张;

2. 持续扩张决策树,然后回删“prune”决策树,减小它的规模。

关于控制决策树的复杂度的方法包括:

1. 限制每个叶子节点的最小元素个数。那么这个最小个数怎么定呢?

统计学家使用了一种假设测试“hypothesis test”。在停止扩张决策树时,先判定增加节点获得的information gain是否是通过运气(chance)获得的,如果不是通过运气获得的,那么就继续扩张决策树。这个判断基于一个显著性(p-value),通过p-value来定义分叉后的差异是否是由运气产生的,通常这个几率使用5%。

2. 对一个大的决策树进行删节点“prune”,表示使用叶子节点来替换其他的叶子节点或分叉节点。

这个方法取决于替换后,模型的准确度是否会降低,这个过程可以持续迭代直到任何一次替换都会降低模型准确度为止。

那么接下来思考下,如果我们使用所有类型的复杂度来制作决策树会怎样?例如,搭一个节点就停止,然后再搭一个2节点的树,再另外搭一个三节点的树,然后得到了一堆不同复杂度的决策树,然后只要有一个方法能证明模型的泛化表现,那么我们就可以选择到泛化表现最好的这个模型。(应该是拿来承上启下的一段)

嵌套留出测试(nested holdout testing) :将原有的学习集进行再次拆分,拆为子学习集(训练集)和子确认集(validation set for clarity),然后通过子学习集来训练模型,然后用子确认集来验证。

嵌套交叉验证(nested cross-validation) :假如我们要对一组数据进行建模,这组数据有一个未知的复杂度变量C,此时首先对交叉验证中的每个场景(即n个fold(组)为训练集,1个fold为测试集)进行一次仅针对训练集数据的交叉验证,得到此时的最优C值,找到这个场景下的最优复杂度情况,然后再使用这个C值来进行真正的全场景全fold的交叉验证。(与一般的交叉验证的区别在于,先只用训练集数据找到最优复杂度参数C,再执行全数据的交叉验证)

来使用决策树方法简单解释下嵌套交叉验证,根据图5-3所示,最优准确率的决策树节点数是122个,那么就先用子训练集和确认集来得到122节点的这个数值,然后再使用122这个节点数,来对全训练集数据进行建模,此处的122个节点数就可以当做复杂度参数C。

若使用嵌套交叉验证对5个fold的数据集进行分析,那么需要进行30次建模,即对每个折叠情况下的训练集进行子训练集和确认集的拆分的时候,将4个原训练集的fold再拆成5份进行参数C的确认,此时每个outerloop的inner loop包含5个模型(共6个),故一共需要30次建模,可参考下图及链接:

序列向前选择(sequential forward selection - SFS):仍然是测试集(拆分为子测试集和确认集)、验证集,当有n多个特征时,先使用一个feature建模,然后加上第二个,选择其中最好的,然后加上第三个在三个feature的模型中选最好的,以此类推,逐个增加,直到增加feature不能让确认集数据预测更准确为止,此时使用的feature就是建立整个数据集模型要使用的feature。(同样也可以先用全量feature建模,然后一个一个减少,方法类似,名称为sequential backward elimination)

正则化(regularization) :将数字化的回归函数结果简单化的过程,模型拟合度越高越好,同时越简单也越好。

逻辑回归的正则化表达式如下:

其中, 是针对这个回归的最佳模型结果, 是惩罚系数, 是惩罚函数。

通过给原有的最佳模型增加惩罚函数来调整最终结果,得到正则化后的数学表达式。

最常用到的惩罚是各系数(各w值)的平方和,通常叫做w的L2范数(L2-norm of w),当系数很大时,w值的平方和会是一个很大的惩罚值(较大的正值或负值w会使模型更贴合学习集数据,同时也会使L2范数变大即惩罚增大,以此来应对过拟合)。

岭回归(ridge  regression) :是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法(least-squares linear regression)(将L2-norm惩罚应用在最小二乘法上之后得到的模型结果)。

最小二乘法(ordinary least squares) :最小二乘法是解决曲线拟合问题最常用的方法。其基本思路是:令

其中, 是事先选定的一组线性无关的函数, (k=1、2...m,m<n)是待定系数,拟合准则是使 (y=1,2...n)与 的距离 的平方和最小,称为最小二乘准则。

如果不使用系数平方和,而使用系数的绝对值来当做惩罚函数,此时叫做L1范数(L1-norm),加上惩罚后的模型称为lasso(LASSO回归)或者L1正则化(L1-regularization)。

L1正则化会使很多系数归零,并且可以通过系数归零来进行feature的选择。

支持向量机的正则化表达式如下:

相比于逻辑回归,支持向量机中把最佳函数更换为hinge loss(铰链损失)判定函数的拟合度,铰链损失越低拟合度越好,所以函数前面加了负号。

grid search(网格搜索):在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search),本书中所提到的嵌套交叉验证寻找最优解的过程也被叫做网格搜索。

场景简介:你的投资公司要成立一个投资基金,将资金投入到1000个基金中,每个基金包含了若干随机挑选的股票,5年后,这些基金有些涨了有些跌了,你可以清算掉跌的,留下涨的,然后宣称你的公司投资回报率很好。

更直观比喻,拿1000个硬币扔很多次,肯定会有某个硬币正面朝上的概率高于50%很多,那么找到这个硬币当成最好的硬币,其实是很傻逼的一种决策。这种问题就叫做多重比较问题。

也就是说通过学习集来得到的多个不同复杂度的模型,就像这多个硬币一样,从这里挑选出来的最优模型,在进行预测时,可能也会遇到“最好硬币”相同的问题,即多重比较误区。

总结就是顺了一遍前面讲的知识点,没啥新内容。

什么是过拟合,如何避免?

参考技术A过拟合:训练集上表现很好,但是在测试集上表现很差,泛化性能差。降低过拟合的方法:(1)试着寻找最简单的假设(2)正则化(3)earlystopping说明:在每一个epoch结束的时候,计算验证集的accurancy,记录到目前为... 查看详情

欠拟合过拟合及其解决方法

...我们机器学习或者训练深度神经网络的时候经常会出现欠拟合和过拟合这两个问题,但是,一开始我们的模型往往是欠拟合的,也正是因为如此才有了优化的空间,我们需要不断的调整算法来使得模型的表达能拿更强。但是优化... 查看详情

什么是过拟合?如何避免过拟合问题?

参考技术A过拟合:所选模型的复杂度比真模型更高;学习时选择的模型所包含的参数过多,对已经数据预测得很好,但是对未知数据预测得很差的现象.过拟合一般特点:高方差,低偏差;导致过拟合原因:训练数据不够,模型进行过度训练... 查看详情

tensorflow:实战google深度学习框架第四章02神经网络优化(学习率,避免过拟合,滑动平均模型)

1、学习率的设置既不能太小,又不能太大,解决方法:使用指数衰减法例如: 假设我们要最小化函数 y=x2y=x2,选择初始点 x0=5x0=5  1.学习率为1的时候,x在5和-5之间震荡。importtensorflowastfTRAINING_STEPS=10LEARNING_RATE=1x... 查看详情

深度学习避免过拟合方法整理

...经元;一般来说,增加隐藏层数使模型先达到过拟合再droupout的效果会比减少隐藏层数避免过拟合好。BN:用于卷积层有待完善…… 查看详情

paper123:svm如何避免过拟合

过拟合(Overfitting)表现为在训练数据上模型的预测很准,在未知数据上预测很差。过拟合主要是因为训练数据中的异常点,这些点严重偏离正常位置。我们知道,决定SVM最优分类超平面的恰恰是那些占少数的支持向量,如果支... 查看详情

识别 SVM 中可能的过拟合

】识别SVM中可能的过拟合【英文标题】:identifyingpossibleoverfittinginSVM【发布时间】:2013-12-1310:04:40【问题描述】:SVM可以通过正确选择参数来避免过度拟合。如何知道经过训练的svm是否过拟合?有没有办法识别?如何避免?使用... 查看详情

过拟合怎么办

...考技术B为了得到一致假设而使假设变得过度严格称为过拟合。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。 查看详情

机器学习防止过拟合这是作弊吗?

】机器学习防止过拟合这是作弊吗?【英文标题】:machinelearningpreventingoverfittingisthischeating?【发布时间】:2016-09-0418:17:57【问题描述】:在训练期间评估训练/测试结果时说这些值:Train:50.5%-Test:50.2%Train:55.5%-Test:53.2%Train:62.5%-Test:5... 查看详情

过拟合问题是什么?

为了得到一致假设而使假设变得过度严格,称为过拟合。避免过拟合,是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。想象某种学习算法产生了一个过拟合分类器,这个分类器... 查看详情

TensorFlow 对象检测 API 过拟合

】TensorFlow对象检测API过拟合【英文标题】:TensorflowobjectdetectionAPIoverfitting【发布时间】:2021-10-1807:44:52【问题描述】:我正在借助以下教程使用Tensoflow对象检测API创建树检测器:https://www.youtube.com/watch?v=a1br6gW-8Ss我的问题是模型... 查看详情

减少神经网络中的过拟合

】减少神经网络中的过拟合【英文标题】:Reduceover-fittinginneuralnetwork【发布时间】:2017-11-2700:18:00【问题描述】:我编写了一个小型神经网络,用于对汽车和非汽车图像进行分类。我需要帮助来避免过度拟合。模型如下图:model=... 查看详情

机器学习笔记:过拟合

1过拟合介绍如果模型设计的太复杂,可能会过拟合下图的1~5分别代表最高项为1~5次幂的线性回归问题: 当模型太复杂的时候,虽然训练集上我们得到较小的误差,但是在测试集上,误差就奇大无比       ... 查看详情

python深度学习之路-2.2过拟合与集成学习

2.3过拟合计算机对数据进行了过度的学习而产生的状态,简称“过拟合”。避免过拟合的方法:深度学习中会使用“Dropout”的方法,而在常规解决方案中,我们通常会使用“归一化”来消除对存在偏差的数据所造... 查看详情

dropout为什么能够防止过拟合

...知乎:dropout的过程好像很奇怪,为什么说它可以解决过拟合呢?(正则化)取平均的作用:先回到正常的模型(没有dropout),我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用&ldqu... 查看详情

如何使用随机森林对不平衡类进行分类以避免过度拟合

】如何使用随机森林对不平衡类进行分类以避免过度拟合【英文标题】:HowtoClassifyunbalancedclasseswithRandomForestavoidingoverfitting【发布时间】:2017-01-0917:36:11【问题描述】:我陷入了数据科学问题。我正在尝试使用随机森林预测一些... 查看详情

如何降低神经网络模型的过拟合和欠拟合?

...真正复杂度之间的相对大小,其主要存在三种情况:(1)欠拟合:underfitting(2)相对准确(3)过拟合:overfitting图2、一般情况下在不知数据模型复杂度的情况下,很容易出现建立模型过拟合的情况,这是因为原始数据中本身存在一些噪... 查看详情

通过给目标函数增加一个正则项来防止其过拟合

为什么可以通过给目标函数增加一个正则项来防止其过拟合?(来使其更圆滑?) 在实现MF矩阵分解算法的时候,也有给损失函数增加一个正则项:推荐系统之矩阵分解及其Python代码实现   【Reference】1、正则化为... 查看详情