一文弄懂机器学习中的偏差和方差
一文弄懂机器学习中的偏差和方差
在机器学习领域,偏差和方差是两个非常重要的概念,它们直接影响模型的泛化能力。本文将详细解释偏差和方差的定义,探讨它们与模型泛化能力的关系,并介绍如何判断和优化模型的偏差和方差问题。
一、理解偏差、方差
偏差(Bias)描述的是预测值的期望与真实值之间的差距,偏差越大,越偏离真实数据。
方差(Variance)描述的是预测值的变化范围,离散程度,也就是离预测值期望值的距离,方差越大,数据的分布越分散。
为了更好地理解偏差和方差,我们可以通过一个射击的例子来说明:
在这个例子中,一次射击代表一个机器学习模型对一个样本进行预测,射中红色靶心位置代表预测准确,偏离靶心越远代表预测误差越大。偏差衡量的是射击的蓝点离红圈的远近,射击位置即蓝点离红色靶心越近则偏差越小,蓝点离红色靶心越远则偏差越大;方差衡量的是射击时手是否稳即射击的位置蓝点是否聚集,蓝点越集中则方差越小,蓝点越分散则方差越大。
二、偏差、方差与模型泛化能力
模型的泛化能力(泛化误差)是由偏差、方差与数据噪声之和,具体公式如下:
$$
\text{Err}\left( x \right) = \ \text{bias}^{2}\left( x \right) + var\left( x \right) + \ \varepsilon^{2}
$$
其中:
- $\text{bias}^{2}\left( x \right)$ 表示偏差的平方
- $var\left( x \right)$ 表示方差
- $\varepsilon^{2}$ 表示噪声的平方
偏差度量的是学习算法预测误差和真实误差的偏离程度,即刻画学习算法本身的学习能力;方差度量同样大小的训练数据的变动所导致的学习性能的变化,即刻画数据扰动所造成的影响;噪声则表达了当前任务上任何学习算法所能到达的期望预测误差的下界,即刻画了学习问题本身的难度。因此,泛化误差是由学习算法的能力、数据的充分性以及问题本身难度决定。
学习算法刚训练时,训练不足欠拟合,此时偏差较大;当训练程度加深之后,训练数据的扰动也被算法学习到了,此时算法过拟合,方差过大,训练数据轻微扰动都会使得学习模型发生显著变化。因此我们得出结论:模型欠拟合时偏差过大,模型过拟合时方差过大。
上图展示了不同偏差和方差情况下的模型拟合效果:
- 左图:高偏差低方差,模型欠拟合
- 中图:低偏差低方差,模型拟合效果最好
- 右图:低偏差高方差,模型过拟合
三、模型偏差高 or 方差高
在实际应用中,如果一个模型对于测试集的预测不理想,如何判断是由于高偏差导致还是高方差导致呢?这个判断对于后续模型优化至关重要。
参考方法:通过训练集误差和测试集误差来看高偏差 or 高方差
我们以猫狗分类模型为背景来看具体如何判断,对于猫狗分类首先我们有一个前提假设就是该数据本身能够达到很高的正确率,例如99%的正确率,看下面四种情况:
- 训练集错误率:1%,测试集错误率:11% 低偏差高方差
- 训练集错误率:15%,测试集错误率:16% 高偏差低方差
- 训练集错误率:15%,测试集错误率:30% 高偏差高方差
- 训练集错误率:0.5%,测试集错误率:1% 低偏差低方差
因此在实际工程中我们便可以通过比较训练集误差和测试集误差来看模型是由何种原因导致,然后采取相应的错误,下一节介绍如何优化模型
四、高偏差高方差时优化模型
1、高偏差(模型欠拟合)时模型优化方法
添加特征数
当特征不足或者选取的特征与标签之间相关性不强时,模型容易出现欠拟合,通过挖掘上下文特征、ID类特征、组合特征等新特征,往往可以达到防止欠拟合的效果,在深度学习中,有很多模型可以帮助完成特征工程,如因子分解机、梯度提升决策树、Deep-crossing等都可以称为丰富特征的方法增加模型复杂度
模型过于简单则学习能力会差,通过增加模型的复杂度可以使得模型拥有更强的你和能力,例如在线性模型中添加高此项,在神经网络模型中增加隐层层数或增加隐层神经元个数延长训练时间
在决策树、神经网络中,通过增加训练时间可以增强模型的泛化能力,使得模型有足够的时间学习到数据的特征,可达到更好的效果减小正则化系数
正则化是用来方式过拟合的,但当模型出现欠拟合时则需要有针对的较小正则化系数,如xgboost算法集成学习方法Boosting
Boosting算法是将多个弱分类串联在一起,如Boosting算法训练过程中,我们计算弱分类器的错误和残差,作为下一个分类器的输入,这个过程本身就在不断减小损失函数,减小模型的偏差选用更合适的模型
有时候欠拟合的原因是因为模型选的不对,如非线性数据使用线性模型,拟合效果肯定不够好,因此有时需要考虑是否是模型使用的不合适
2、高方差(模型过拟合)时模型优化方法
增加数据集
增加数据集是解决过拟合问题最有效的手段,因为更多的数据能够让模型学到更多更有效的特征,减小噪声的影响度。当然数据是很宝贵的,有时候并没有那么多数据可用或者获取代价太高,但我们也可以通过一定的规则来扩充训练数据,比如在图像分类问题上,可以通过图像的平移,旋转,缩放、模糊以及添加噪音等方式扩充数据集,在我的这篇文章中有介绍,更一步,可使用生成式对抗网络来合成大量的新数据降低模型的复杂度
数据集少时,模型复杂是过拟合的主要因素,适当降低模型复杂度可以避免模型拟合过多的采样噪音,例如在决策树算法中降低树深度、进行剪枝;在深度网络中减少网络层数、神经元个数等正则化防止过拟合
正则化思想:由于模型过拟合很大可能是因为训练模型过于复杂,因此在训练时,在对损失函数进行最小化的同时,我们要限定模型参数的数量,即加入正则项,即不是以为的去减小损失函数,同时还考虑模型的复杂程度未加入正则项的模型损失函数:
$$
C\left( x \right) = \ \frac{1}{2}\sum_{i = 1}^{n}{(f\left( x \right) - y_{i})}^{2}
$$加入正则项L后损失函数:
$$
C\left( x \right) = \ \frac{1}{2}\sum_{i = 1}^{n}{{(f\left( x \right) - y_{i})}^{2} + \ \lambda L}
$$其中λ是正则项系数,是用来权衡正则项和损失函数之间权重,正则化有以下两种:
L1正则化(L1范数):权重向量w的绝对值之和
$$
L_{1} = \ \sum_{i = 1}^{k}{||w_{i}||}_{1}
$$L2正则化(L2范数):权重向量w的平方和,欧几里得范数
$$
L_{2} = \ \sum_{i = 1}^{k}{||w_{i}||}_{2}^{2}
$$其中w代表模型的参数,k则代表了模型参数的个数
集成学习方法Bagging
集成学习Bagging是把多个模型集成在一起,来降低单一模型的过拟合风险选用更合适的模型
在上诉方法都没有达到很好的效果时可以考虑选择使用其他模型处理数据
五、谈偏差和Boosting、方差和Bagging
上文在提到高偏差和高方差优化时使用集成学习方法,这小节再深入介绍一下为什么Bagging降低了模型方差,Boosting降低了模型的偏差
1、Bagging和方差
Bagging算法对数据重采样,然后在每个样本集训练出来的模型上取平均值
假设有n个随机变量,方差记为σ2,两两变量之间的相关性是ρ,则n个随机变量的均值的方差为:
$$
var = \ n^{2}\gamma^{2}\delta^{2}\rho + m\gamma^{2}\delta^{2}(1 - \rho)
$$
$$
= n^{2}\frac{1}{n^{2}}\delta^{2}\rho + m\frac{1}{n^{2}}\delta^{2}(1 - \rho)
$$
$$
= \rho*\delta^{2} + (1 - \rho)*\frac{\delta^{2}}{n}
$$
在随机变量完全独立的情况下,n个随机变量的方差是原来的1/n
Bagging算法对n个独立不相关的模型的预测结果取平均,方差是原来单个模型1/n,上述描述不严谨因为在实际问题中,模型不可能完全独立,但为了追求模型的独立性,Bagging的方法做了不同的改进,比如随机森林算法中,每次选取节点分裂属性时,会随机抽取一个属性子集,而不是从所有的属性中选最有属性,这就为了避免弱分类器之间过强的关联性,通过训练集的重采样也能够带来弱分类器之间的一定独立性,这样多个模型学习数据,不会因为一个模型学习到数据某个特殊特性而造成方差过高
2、Boosting和偏差
Boosting算法训练过程中,我们计算弱分类器的错误和残差,作为下一个分类器的输入,这个过程本身就在不断减小损失函数,其bias自然逐步下降。但由于是采取这种sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。所以说boosting主要还是靠降低bias来提升预测精度
六、偏差方差平衡(Bias-Variance Tradeoff)
在实际的问题中噪音是数据自带的,没有办法优化,因此为了优化模型,降低模型的泛化误差,我们便从降低偏差和方差入手,但是方差和偏差存在权衡问题,即在优化一个时便会导致另一个升高,下图给出了泛化误差和偏差、方差的变化关系:
在训练不足时,模型的拟合能力不强,此时偏差主导着总体误差(泛化误差),随着训练程度的加深,模型的拟合能力已经很强,训练数据发生的噪音扰动也被模型学到,方差逐渐主导总体误差。因此我们在实际工程中需要找到一个合适的方式来权衡模型的偏差和方差?
1、偏差方差权衡之经验风险最小化模型
从上面的分析中,我们知道偏差方差权衡既是要同时降低测试误差和训练误差,即如果模型满足下式便是一个好模型:
$$
\text{Error}{\text{train}} = \text{Error}{\text{test}}
$$
$$
\text{Error}_{\text{train}}\ \approx \ \ 0
$$
为了说明如何得到上述模型,先要提出一个更为一般的机器学习模型,经验风险最小化,这里给出两个引理:
(1)联合界引理
时间A1,A2,…,Ak表示k个不同的事件,k个事件之间不是相互独立的,可能是有关联的:
$$
P\left( A_{1}\bigcup..\bigcup A_{k} \right) \leq P\left( A_{1} \right) + P\left( A_{2} \right) + \ldots + P(A_{k})
$$
(2)Hoeffding不等式
Z1,Z2,…,Zm是m个独立同分布的随机变量,他们服从均值为φ的伯努利分布(0-1分布),即表示P(Zi=1)=φ,所有对m个独立同分布的随机变量,其均值为φ,给定λ > 0
下面式子成立:
$$
P\left( \left| \phi - \hat{\phi} \right| > \gamma \right) \leq 2exp( - 2\gamma^{2}m)
$$
不等式含义是:估计的值φ与真实值φ之间的差异,不会超过不等式右侧的这个上界
经验风险最小化ERM算法证明了:当数据集m足够大时,一般误差与最小误差之间是有上界的,简单地说,当训练误差很小时,一般误差也不会很大,具体证明请参考博文:
https://blog.csdn.net/zb123455445/article/details/78538361
2、偏差方差权衡之交叉验证
(1) Hold-out cross validation 保留交叉验证
训练子集70%、保留交叉验证子集30%,通常对于保留交叉验证70%、30%是合理的划分,先用训练子集训练模型,然后在剩下的保留交叉验证子集中测试模型,选测试误差小的模型
保留交叉验证存在两个问题:
第一: 最终模型和参数的选取将极大程度上依赖于对于训练数据和测试数据的划分
第二:部分数据用于训练,不能很好的利用数据集
有些数据获取十分珍贵,上述方法没有很好的利用数据集进行模型训练,下面提出交叉验证的变种,更好的利用数据集进行模型训练
(2)留1交叉验证
这种计算量更大,仅仅针对于样本量很少的情况,如样本数15
如果数据集有n个,留1交叉验证总共要训练n次,每次选择一个数据作为测试集,其他n-1个数据作为验证集
(3)K重交叉验证
通常情况下k取5份或10份,若k=10,每次留其中一份作为数据测试,用剩下9份做模型训练,优点是很好的利用数据,缺点是要进行多次训练,计算量大,算是上面两种方式的综合,当K值大的时候,我们会有更少的Bias(偏差), 更多的Variance。,当K值小的时候,我们会有更多的Bias(偏差),更少的Variance,因此选择k对于优化结果也有十分重要的影响,一般工程中选择k=5、10较多
注意事项1:上面提到的保留交叉验证70%,30%是针对小数据量时划分,当百万数据及以上时,我们需要对数据划分训练集、验证集、测试集,验证集目的:在多个算法中选出最有效的算法;测试集目的:正确评估分类器的性能,;例如100万,我们可能只需要10000个作为验证集,10000作为测试集,划分比例(98%,1%,1%),当数据量很大时,有时候训练集可高大99.5%
注意事项2:训练数据和验证,测试数据分布不匹配的问题,例如:训练集是非常高清标准的图片,测试集是用户随意拍照上传的不清楚模糊的图片,建议:保证验证集和测试集是来自同一个分布,有的时候验证集和测试集被看成同一概念