机器学习-过拟合、正则化、稀疏性、交叉验证概述

时间:2024-03-23 13:43:42
  • 在机器学习中,我们将模型在训练集上的误差称之为训练误差,又称之为经验误差,在新的数据集(比如测试集)上的误差称之为泛化误差,泛化误差也可以说是模型在总体样本上的误差。对于一个好的模型应该是经验误差约等于泛化误差,也就是经验误差要收敛于泛化误差,根据霍夫丁不等式可知经验误差在一定条件下是可以收敛于泛化误差的。

  •   当机器学习模型对训练集学习的太好的时候(再学习数据集的通性的时候,也学习了数据集上的特性,这些特性是会影响模型在新的数据集上的表达能力的,也就是泛化能力),此时表现为经验误差很小,但往往此时的泛化误差会很大,这种情况我们称之为过拟合,而当模型在数据集上学习的不够好的时候,此时经验误差较大,这种情况我们称之为欠拟合。具体表现如下图所示,第一幅图就是欠拟合,第三幅图就是过拟合。

  • 机器学习-过拟合、正则化、稀疏性、交叉验证概述

  • 奥卡姆剃刀原理: 如无必要,勿增实体,大道至简的思想  越高阶的方程式越不容易用到.

  •  

  • 对于欠拟合的问题比较好处理,只要增大模型的复杂度就行,而且欠拟合会在训练过程中就表现出来(通过看训练集的损失来判断),更容易去控制。

  • 对于过拟合不会体现在训练集上,因此常见的方式是采用交叉验证来检测过拟合。

  •  

  • 关于交叉验证:

  • 1.交叉验证简介

  • 交叉验证(Cross Validation) 是在机器学习建立模型和验证模型参数时常用的方法。顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集。用训练集来训练模型,测试集来评估模型的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的样本,在下次可能成为测试集中的样本,也就是所谓的交叉。

  • 2.为什么用交叉验证?

  • 交叉验证用在数据量不是很充足的情况(比如数据量小于一万条),能够从有限的数据中获取尽可能多的有效信息。

  • 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,能够一定程度上减小过拟合。

  • 3.交叉验证的方法:

  • 留出法 (Hold-Out Cross Validation) 是一种简单交叉验证,即针对原始数据集,通常分为训练集、测试集。训练集用于训练模型、测试集对于模型来说是未知数据,用于评估模型的泛化能力。

  • 比如我们随机的将样本数据分为两部分(70%的训练集,30%的测试集),然后用训练集来训练模型,测试集上验证模型及参数,最后选择损失函数评估最优的模型和参数。

  • k折交叉验证 (k-fold Cross Validation) 过程如下所示:

  • 不重复抽样将原始数据随机分成k份。

  • 每次挑选其中1份作为测试集,剩余k-1份作为训练集用于训练模型。

  • 重复第2步k次,在每个训练集上训练后得到一个模型。用这个模型在相应的测试集上测试,计算并保存模型的评估指标。

  • 计算k组测试结果的平均值作为模型准确度的估计,并作为当前k折交叉验证下模型的性能指标。

机器学习-过拟合、正则化、稀疏性、交叉验证概述

  • k一般取10,数据量大的时候,k可以设置的小一些。数据量小的时候,k可以设置的大一些,这样训练集占整体数据的比例就比较大,不过同时训练的模型个数也就相应增加。

  • 3.3 留一法交叉验证
    留一法交叉验证 (Leave-one-out Cross Validation) 是k折交叉验证的特例,此时的k等于样本数N。因此,对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型的好坏。此方法主要适用于数据量非常小的情况,比如N小于50的时候,推荐采用留一交叉验证。

  • 3.4 交叉验证方法选择

  • 那这三种情况,到底应该选择哪一种方法呢?其实很简单,如果我们只是对数据做一个初步的模型建立,不是要做深入分析的话,简单交叉验证就可以。否则就用k折交叉验证。在样本量少的时候,使用留一交叉验证。

  • 解决过拟合的两条主线:一是增大数据集,二是降低模型的复杂度(根据VC维理论可知)。一般来说扩展数据集是比较难的,而且数据集大,模型复杂度高的时候即使能获得好的泛化结果,也会增大计算量,当然通过数据增强和GAN还有特征降维也能达到目的。目前常见使用的方式都是以降低模型的复杂度为主,接下来看看有哪些常见的方法可以自适应地降低模型的复杂度。

  • 1. 正则化方法 L1 L2 正则化

  • 正则化是机器学习中最常见的过拟合解决方法,在损失函数中加入正则项来惩罚模型的参数,以此来降低模型的复杂度,常见的添加正则项的正则化技术有L1,L2正则化。

  •   L1正则化

  •   机器学习-过拟合、正则化、稀疏性、交叉验证概述

  •   L1正则化是基于L1范数的,J是我们的损失函数,在损失函数优化时,我们要使得损失函数无限小,要满足这个结果,表达式中的第二项也必须无限小。关于L1正则化项的函数可以在二维平面图中表示出来,令

  •    机器学习-过拟合、正则化、稀疏性、交叉验证概述

  •  

  •   机器学习-过拟合、正则化、稀疏性、交叉验证概述

  •   图中的等值线(就是那些曲线)是J0的等值线,黑色方形是正则项函数L的图形。在图中。当J0等值线和L图形首次相交的地方就是最优解(根据拉格朗日约束问题的最小值可知,L函数可以看作J0函数的约束,没有该约束,J0函数的最小值应该是最里面的等值线,加上约束之后,就是首次相交的点处),从图中可以看出在相交点这里有w1为0,这也是L1正则的特点。加入L1正则项之后,数据集中那些对模型贡献不大的特征所对应的参数w可以为0,因此L1正则项得出的参数是稀疏的。

  • L2正则化

  •   机器学习-过拟合、正则化、稀疏性、交叉验证概述

  •   同样可以画出在二维平面中的图形来描述

  •   机器学习-过拟合、正则化、稀疏性、交叉验证概述

  •   原理和L1正则中差不多,但是L2正则化不会获得稀疏解,只会将对模型贡献不大的特征所对应的参数置于无限小的值,以此来忽略该特征对模型的影响。

  •   因此正则化都是在通过控制模型参数的大小来降低模型的复杂度。

  •  

  • 这里再来谈谈稀疏性的问题

  • 稀疏性是指数据或权重为0的数目 数目越多稀疏性越大

  • 参数稀疏性的好处

  • 1)特征选择(Feature Selection): 大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。

  • 2)可解释性(Interpretability): 另一个青睐于稀疏的理由是,模型更容易解释。例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型:y=w1*x1+w2*x2+…+w1000*x1000+b(当然了,为了让y限定在[0,1]的范围,一般还得加个sigmoid函数)。通过学习,如果最后学习到的w*就只有很少的非零元素,例如只有5个非零的wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但如果1000个wi都非0,医生面对这1000种因素.

  • 稀疏矢量通常包含许多维度。创建特征组合会导致包含更多维度。

  • 由于使用此类高维度特征矢量,因此模型可能会非常庞大,并且需要大量的 RAM。

  •  

  • 在高维度稀疏矢量中,最好尽可能使权重正好降至 0。

  • 正好为 0 的权重基本上会使相应特征从模型中移除。 

  • 将特征设为 0 可节省 RAM 空间,且可以减少模型中的噪点。

  •  

  • 通过添加适当选择的正则化项,最好情况下,可以使无意义维度的权重正好降至 0,就能够避免在推理时支付这些模型系数的存储费用。

  • 可以使用 L1 正则化使模型中很多信息缺乏的系数正好为 0,从而在推理时节省 RAM。

  • 注意:L2 正则化可以使权重变小,但是并不能使它们正好为 0.0,因此L2 正则化并不适合此场景。

  • 2、剪枝处理

  •   剪枝是决策树中一种控制过拟合的方法,我们知道决策树是一种非常容易陷入过拟合的算法,剪枝处理主要有预剪枝和后剪枝这两种,常见的是两种方法一起使用。预剪枝通过在训练过程中控制树深、叶子节点数、叶子节点中样本的个数等来控制树的复杂度。后剪枝则是在训练好树模型之后,采用交叉验证的方式进行剪枝以找到最优的树模型。

  •  

  • 3、提前终止迭代(Early stopping)

  •   该方法主要是用在神经网络中的,在神经网络的训练过程中我们会初始化一组较小的权值参数,此时模型的拟合能力较弱,通过迭代训练来提高模型的拟合能力,随着迭代次数的增大,部分的权值也会不断的增大。如果我们提前终止迭代可以有效的控制权值参数的大小,从而降低模型的复杂度。

  •  

  • 4、权值共享

  •   权值共享最常见的就是在卷积神经网络中,权值共享的目的旨在减小模型中的参数,同时还能较少计算量。在循环神经网络中也用到了权值共享。

  •  

  • 5、增加噪声

  •   这也是深度学习中的一种避免过拟合的方法(没办法,深度学习模型太复杂,容易过拟合),添加噪声的途径有很多,可以在输入数据上添加,增大数据的多样性,可以在权值上添加噪声,这种方法类似于L2正则化。

  •  

  • 6、Batch Normalization

  •   BM算法是一种非常有用的正则化方法,而且可以让大型的卷积神经网络快速收敛,同时还能提高分类的准确率,而且可以不需要使用局部响应归一化处理,也可以不需要加入Dropout。BM算法会将每一层的输入值做归一化处理,并且会重构归一化处理之后的数据,确保数据的分布不会发生变化。

  •   而且有很多变种,比如Layer Normalization,在RNN或者Transformer中用的比较多。

  •   上面的几种方法都是操作在一个模型上 ,通过改变模型的复杂度来控制过拟合。另一种可行的方法是结合多种模型来控制过拟合。

  •  

  • 7、Bagging和Boosting

  •   Bagging和Boosting是机器学习中的集成方法,多个模型的组合可以弱化每个模型中的异常点的影响,保留模型之间的通性,弱化单个模型的特性。

  •  

  • 8、Dropout

  •   Dropout是深度学习中最常用的控制过拟合的方法,主要用在全连接层处。Dropout方法是在一定的概率上(通常设置为0.5,原因是此时随机生成的网络结构最多)隐式的去除网络中的神经元,具体如下图

  •   机器学习-过拟合、正则化、稀疏性、交叉验证概述

  •   Dropout控制过拟合的思想和机器学习中的集成方法中的bagging类似,在每个batch更新的网络结构都有所不同,也就相当于在训练时有很多个不同的子网络,在每次迭代时dropout的神经元都不一样,因此对于整个模型参数而言,每次都会有一些参数不被训练到。Dropout会导致网络的训练速度慢2、3倍,而且数据小的时候,Dropout的效果并不会太好。因此只会在大型网络上使用。

  • 参考:

  • https://www.cnblogs.com/jiangxinyang/p/9281107.html

  • https://blog.csdn.net/onehao/article/details/89086859