4.5 偏差、方差与交叉验证#
在第4.4节中,我们介绍了什么是正则化,以及正则化为什么能够缓解过拟合的原理。同时我们知道,越是复杂的模型越可能产生过拟合的现象,这也就为模型在其他未知数据集上的预测带来了误差,但是这些误差来自哪里,又是怎么产生的呢?知道这些误差的来源后对改善我们的模型有什么样的帮助呢?接下来我们就来介绍关于误差分析及模型选择的若干方法。
4.5.1 偏差与方差定义#
在机器学习的建模中,模型的误差普遍来自于偏差(Bias)或方差(Variance)。什么是偏差与方差呢?
如图4-23所示 [12],假设你拿着一把枪射击红色的靶心,在你连打数十枪后出现了以下4种情况:
(1)所有子弹都密集打在了红色靶心的位置,这就是典型的方差小(子弹集中),偏差小(都在靶心位置)。
(2)子弹都散落在靶心周围的位置,这就是典型的方差大(子弹很散乱),偏差小(都在靶心附近)。
(3)所有子弹都密集打在靶心旁边的位置,这就是典型的方差小(子弹很集中),偏差大(距离靶心远)。
(4)子弹都散落在靶心旁边的位置,这就是典型的方差大(子弹散乱),偏差大(距离靶心远)。
由此可知,偏差描述的是预测值的期望与真实值之间的差距,即偏差越大,越偏离真实值,如图4-23第2行所示。方差描述的是预测值之间的变化范围和离散程度,也就是离其期望值的距离,即方差越大数据的分布越分散,如图4-23右列所示。

4.5.2 模型的偏差与方差#
上面介绍了什么是偏差与方差,那么这4种情况又对应于机器学习中的哪些场景呢?通常来讲,一个简单的模型会带来比较小的方差(Low Variance),而复杂的模型会带来比较大的方差(High Variance)。这是由于简单的模型不容易受到噪声的影响,而复杂的模型(例如过拟合)容易受到噪声的影响而产生较大的误差。一个极端的例子,$\hat{y}=C$这个模型不管输入是什么,输出都是常数$C$,那么其对应的方差就会是0。对于偏差来讲,一个简单的模型容易产生较高的偏差(High Bias),而复杂的模型容易产生较低的偏差(Low Bias),这是由于越复杂的模型越容易拟合更多的样本。
如图4-24所示为模型的偏差、方差与模型复杂度的变化情况。从图中可以看出,方差随着模型的复杂度增大而上升,偏差与之恰好相反。同时,如果一个模型的主要误差来自于较大的方差,则这个模型呈现出的就是过拟合的状态,而当一个模型的主要误差来自于较大的偏差时,此时模型呈现出的就是欠拟合状态。
总结来讲,模型的高方差与高偏差分别对应于过拟合与欠拟合。如果一个模型不能很好地拟合训练样本,则此时模型呈现的就是高偏差(欠拟合)的状态。 如果能够很好地拟合训练样本,但是在测试集上有较大的误差,这就意味着此时模型出现了高方差(过拟合)的状态,因此,当模型出现这类情况时,我们完全可以按照前面处理过拟合与欠拟合的方法对模型进行改善,然后在这两者之间寻找平衡。
4.5.3 超参数选择#
在之前的介绍中,我们知道了模型中的权重参数可以通过训练集利用梯度下降算法求解得到,但超参数又是什么呢?所谓超参数(Hyper Parameter)是指那些不能通过数据集训练得到的参数,但它的取值同样会影响最终模型的效果,因此同样重要。到目前为止,我们一共接触过了3个超参数,只是第一次出现的时候我们并没有提起其名字,在这里再做一个细致的总结。这3个超参数分别是: 惩罚系数$\lambda$、学习率$\alpha$ 及特征映射时多项式的次数,其中最为重要的是前面两个。
1. 惩罚系数$\lambda$
从4.4节内容中对正则化的介绍可知,$\lambda$越大也就意味着对模型的惩罚力度越大,最终训练得到的模型也就相对越简单,因此,在模型的训练过程中,也需要选择一个合适的$\lambda$来使模型的泛化能力尽可能好。
2. 学习率$\alpha$
在介绍线性回归的求解过程中,我们首次介绍了梯度下降算法,如式(4-26)所示。
$$ W=W-\alpha \cdot \frac{\partial J}{\partial W}\tag{4-26} $$并且讲过,$\alpha$ 的作用是用来控制每次向前跳跃的距离,较大的$\alpha$可以更快地跳到谷底并找到最优解,但是过大的$\alpha$同样能使目标函数在峡谷的两边来回振荡,以至于需要多次迭代才可以得到最优解,不过也可能得不到最优解。
如图4-25所示为相同模型采用不同学习率后,经梯度下降算法在同一初始位置优化后的结果,其中黑色五角星表示全局最优解(Global Optimum),ite表示迭代次数。

从图4-25可以看出,当学习率为0.4时,模型大概在迭代12次后就基本达到了全局最优解附近。当学习率为3.5时,模型在大约迭代12次后同样能够收敛于全局最优解附近,但是,当学习率为4.1时,此时的模型已经处于了发散状态。可以发现,由于模型的目标函数为凸形函数(例如线性回归),所以尽管使用了较大的学习率3.5,目标函数依旧能够收敛,但在后面的学习过程中,遇到更多的情况便是非凸型的目标函数,此时的模型对于学习率的大小将会更加敏感。
如图4-26所示为一个非凸形的目标函数,三者均从同一初始点开始进行迭代优化,只是各自采用了不同的学习率。其中黑色五角星表示全局最优解,ite表示迭代次数。

从图4-26可以看出,当采用较小的学习率0.02时,模型在迭代20次后陷入了局部最优解(Local Optimum),并且可以知道此时无论再继续迭代多少次,其依旧会收敛于此处,因为此时的梯度已经开始接近于0,而使参数无法得到更新。当采用较大一点的学习率0.4时,模型在迭代4次后便能收敛于全局最优解附近。当采用学习率为0.6时,模型在这20次的迭代过程中总是来回振荡,并且没有一次接近于全局最优解。
从上面两个示例的分析可以得出,学习率的大小对于模型的收敛性及收敛速度有着严重的影响,并且非凸函数在优化过程中对于学习率的敏感性更大。同时值得注意的是,所谓学习率过大或者过小,在不同模型间没有可比性。例如在上面凸函数的图示中学习率为0.4时可能还算小,但是在非凸函数的这个例子中0.4已经算是相对较大了。
经过上面的介绍,我们明白了超参数对于模型最终的性能有着重要的影响。那到底应该如何选择这些超参数呢?对于超参数的选择,首先可以列出各个参数的备选取值,例如$\alpha=[0.001,0.03,0.1,0.3,1]$,$\lambda=[0.1,0.3,1,3,10]$,然后根据不同的超参数组合训练得到不同的模型(例如这里就有25个备选模型),然后通过4.5.4节所介绍的交叉验证来确立模型。不过这一整套步骤sklearn中也有现成的类方法可供使用,并且使用起来也非常方便,在4.6节中将会通过一个详细的示例进行说明。不过随着介绍的模型越来越复杂,就会出现更多的超参数组合,训练一个模型也会花费一定的时间,因此,对于模型调参的一个基本要求就是要理解各个参数的含义,这样才可能更快地排除不可能的参数取值,以便于更快地训练出可用的模型。
4.5.4 模型选择#
当在对模型进行改善时,自然而然地就会出现很多备选模型,而我们的目的便是尽可能地选择一个较好的模型,以达到低偏差与低方差之间的平衡。该如何选择一个好的模型呢?通常来讲有两种方式: 第1种就是4.3.3节中介绍过的将整个数据集划分成3部份的方式; 第2种则是使用K折交叉验证(KFold Cross Validation)[9] 的方式。对于第1种方法来说,其步骤为先在训练集上训练不同的模型,然后在验证集上选择其中表现最好的模型,最后在测试集上测试模型的泛化能力。但是这种做法的缺点在于可能某一次数据集的划分结果具有较强的偶然性,导致模型表现出来的泛化误差不准确,因此可以通过K折交叉验证来解决。同时,在数据量有限的情况下,交叉验证还可以充分利用数据,让每个样本都有机会被用作训练集和验证集。
如图4-27所示,以3折交叉验证为例,首先需要将整个完整的数据集分为训练集与测试集两部分,同时再将训练集划分成3份,每次选择其中两份作为训练数据,另外一份作为验证数据进行模型的训练与验证,最后选择平均误差最小的模型。

假设现在有4个不同的备选模型,其各自在不同验证集上的误差如表4-1所示。根据得到的结果,可以选择平均误差最小的模型2作为最终选择的模型。进一步,再利用图4-27中的整个训练集对模型2进行一次训练,最后用测试集测试其泛化误差。当然,还有一种简单的交叉验证方式,即一开始并不划分出测试集,而是直接将整个数据划分成为K份进行交叉验证,然后选择平均误差最小的模型即可。整个详细的示例过程将在4.6节内容中进行介绍。

4.5.5 小结#
在本节内容中,我们首先通过一个例子直观地介绍了什么是偏差与方差,以及在机器学习中当模型出现高偏差与高方差时所对应的现象和处理方法,然后介绍了什么是超参数,以及超参数能够给模型带来什么样的影响,最后介绍了在改善模型的过程中如何通过K折交叉验证进行模型的选择。在4.6节内容中,我们将通过一个真实的例子对上述过程进行完整介绍。