第二章 模型评估与选择

1. 误差、欠拟合与过拟合

        在训练过程中,每一次训练并测试时都会发现有部分样本识别错误。我们把识别错误样本占总数的比例称为错误率,定义错误率,其中a为错误样本数,m为样本总数。与其对应的则称为精度。更一般情况,称实际输出与真实输出的差异为误差,在训练集上的误差称为训练误差经验误差,在测试时预测的误差称为泛化误差。当然我们希望得到误差最小,也即精度最大的模型。那么精度为100%的学习器是我们想要的模型吗?其实这种模型大多泛化能力不强,因此不会选取。这里涉及到欠拟合与过拟合。

        当学习器学习样本准确率过高时,其极有可能把样本独有的特征学习到了,而相对的忽略大多样本的一般特征。这种情况称为过拟合,一般过拟合的模型泛化能力都相对较差。相对的,欠拟合就是模型训练的精度太低,连样本的一般特征也没有学习到。这两种情况在下图中都有很好的诠释。

图1:过拟合与欠拟合的类比

        欠拟合很好解决,就是加多数据,加大训练次数即可。过拟合较麻烦,机器学习算法中过拟合无法彻底避免,优秀的算法会想办法减轻过拟合的影响。当前有多种算法和参数调整方法可以建立机器学习模型,这里涉及到了模型选择问题,我们应当有相应的评估和选择方法可以找到泛化能力最强的模型。下面将介绍一些模型评估和选择的方法。

2. 评估方法

        现在已知有数据集D,我们的目标是将它划分为训练集S和测试集T,使得模型的学习和泛化能力尽可能的被开发出来。

方法一:留出法

        留出法思想简单,就是将数据集D直接划分为两个互斥的集合,一个作为训练集,另一个作为测试集。数据集在划分细节上也有要求,我们必须保证在划分时整个数据集的标签种类是程均匀分布的,即保证机器在训练和测试时可以遇到所有情况。单次使用留出法结果不够准确,因为不同的分法训练和测试结果会不同,所以一般会多次随机划分训练集和测试集并进行训练测试,最终得到的多个精度取平均得到最后结果。训练集占数据集的比例没有完美的解决方案,一般经验值为2/3~4/5。

方法二:交叉验证法

        交叉验证法首先将有m个样本的数据集D划分为k个大小相似的互斥子集,且均保持数据标签的均匀分布。每次利用k-1个子集进行训练,剩下的1个用于测试,如此尝试有k种,我们最终返回k个结果的均值。算法验证的好坏主要取决于k的取值,通常取k=10,所以算法又称为“十折交叉验证”,其示意图如下。相比留出法,交叉验证显然更加稳定与公平。

图2:十折交叉验证法示意图

        当k=m这种特殊情况时,每个样本被视为一个自己,则可称评估方法为留一法(LOO),该方法不受样本顺序随机的影响,所以结果会更加准确。但若数据集过大,样本过多,计算时间会大幅增加。

方法三:自助法

        前两种方法都需要从数据集中分训练集和测试集进行学习预测,这种方式会导致分法不同得到的结果也不同,留一法不会有这种情况,但数据集过大会导致算法复杂度增加。为了可以综合上述算法的两种优点,这里提出自助法。

自助法的特点是,训练集和测试集均出自同一数据集。我们每次从数据集中抽取一个样本并复制到训练集中,重复m次,所以我们有m训练集的样本。当然这种做法会出现重复样本,不过我们计算一个样本永远不会被采集到的概率如下:

               

所以当样本足够多的时,我们同样可以抽出约2/3的部分当做训练集,剩下的作为测试集。这种算法使得每个样本都有被抽中的可能,这种测试又称为“包外估计”。自助法产生的数据集会改变初始数据集的分布,所以需要引入估计偏差,所以再次强调,在数据足够多的时,为了避免计算麻烦,建议使用前两者,反之使用该算法。

        除了以上评估方法,每个算法还需要调节参数,因为参数的不同训练结果会有显著差异,所以调参也很重要,它影响着最终的评估结果。事实上,调参也是一种算法选择,在现实中我们常采用“尝试”的方法得到一个相对较优的参数结果。首先设置该参数的范围,进而设置步长,让计算机遍历每种情况并选择最好的结果。一般步长选择要慎重,因为大型的工程参数众多,步长越短代表算法复杂度越高,消耗的计算资源越多。

        当我们评估完毕并选取算法后,应当用数据集中所有的数据进行训练,并交付最终的训练模型。此外为了区分,又称模型评估选择的数据集为验证集。例如在估计某训练模型的泛化能力时,会将数据集划分为训练集和验证集,其中验证集的结果主要用于调参。

2.3 性能度量方法

        性能度量主要用于对机器学习模型性能的量化评估。不同的模型,使用不同的度量方法结果会不同。所以说评判结果是相对的,模型好坏取决于算法、数据和任务需求。最常用的性能度量方法是均方根误差,并结合概率密度定义表征,这里不多介绍,下面将介绍分类任务中常用的性能度量的方法。建立模型前,做如下符号说明:

样例集:

其中是的正确标记。设学习器为,则为预测结果。

2.3.1 错误率、精度

错误率定义:

精度定义:

其中是二值符号,括号内逻辑正确为1,错误为0。

这是分类任务常用的两个方法,适应二分类任务和多分类任务。我们可以根据概率密度定义,利用数据分布D和概率分布P对其做更一般的定义:

错误率概率分布定义:

精度概率分布定义:

2.3.2 查准率、查全率与

        2.3.1中的方法虽然常用,但我们有时候会关心训练集或数据集中具体训练数据如何(好西瓜中我具体分正确多少等),此时该方法不满足需求。所以这里又提出三种方法,以对模型进行更精确的度量。这里以二分类为分析对象,则我们可以把预测结果分为四种:真正例、假正例、真反例、假反例,分别用字母TP、FP、TN、FN,T表示true、F为false,P为positive,N为negative。则定义混淆矩阵如下图:

图3:分类结果混淆矩阵


根据以上符号假设,定义查准率P和查全率R如下:

        

        查准率与查全率是矛盾的,可以理解:算法查询正确的“范围”(比如西瓜的种类数)扩大了,正确率肯定会下降,反之亦然。所以我们应当在两者之间取得一平衡点,使得机器学习模型评估效果最佳,而我们可以通过“P-R曲线”找到平衡点。曲线横坐标为查全率,纵坐标为查准率,在对机器学习结果样例进行排序后,计算器查准率与查全率,一般性的可以得到类似下图:

图4:P-R曲线与寻找平衡点示意图

        根据图4,我们知道曲线与直线相交的点即为平衡点(BEP),这里有多个平衡点。我们一般认为曲线下方面积越大则性能越好,所以选最外层的一个。不过看到最外层与内一层的曲线有交叉点,这使得我们无法肉眼判断优良。此时我们可以计算平衡点的函数值,越大的代表性能越好。不过书中给出了更精确的量化比较方法,即F1度量法,公式如下:

        

在现实中,我们有可能对查准率和查全率有不同重视程度,所以此时引出F1度量的一般形式,定义字母和公式如下:

        

其中,当=1时退化为F1度量,当>1时对查全率的权重更高,当<1时对查准率的权重较高。

        现在我们讨论更一般的情况,之前的度量是针对一组混淆矩阵,现在我们将数量上升到n个。解决方案很简单,第一种方案是:可以通过计算查准率与查全率的平均值,求得宏查准率宏查全率,带入F1公式后可求得宏F1度量。第二种方案是:先求得真正例等四类数据的平均值,再将其们带入求得几个宏数值。

2.3.3 ROC与AUC

        机器学习一般的二分类方法是:根据模型求得一个0~1的数,假设阈值为0.5,则大于0.5为一类,小于为另一类。根据模型分类结果,我们以“最有可能”到“最不可能”方式排序,定义一截断点,将样本分为正例和反例。截断点由认为规定,若给查准率更高的权重,则将截断点前移,若给查全率更高权重,则后移。ROC就是利用据排序结果的好坏计算学习器泛化性能。

        ROC全称为受试者工作特征(Receiver Operating Charactoristic),方法与P-R曲线类似,也是画一条曲线称“ROC图”,以真正例率(TPR)和为纵坐标,以正例率(FPR)为横坐标划出。两个新的维度定义如下:

        

这里给出一个样例图如下图。我们希望画出来的是a图,但由于数据时离散且有限的,我们只能画出b图。

图5:ROC曲线与AUC的示意图

绘制过程如下:

给定个正例和个反例,根据模型预测结果排序。

将分类阈值设置为最大,设所有的结果为反例,没有正例。当前点的坐标则为(0, 0)。

每次将序列中的一个提出并划分到正例,设前一点坐标为。当该点为真正例,则该点坐标记为,若为反正例,则记为。

重复③,直至所有点都被划分为正例,即最后一点坐标为(1, 1)。

        从图判断好坏的标准和P-R图极其类似,其判断依据就是ROC曲线下面积(Area Under ROC Curve,AUC)。其越大表示性能越好。因为点都是离散的,所以我们利用求和的方式求得面积,公式如下:

        

设D表示数据集,+表示正例的,-表示反例的,则定义排序损失(loss)如下:

{l_{rank}} = \frac{1}{{{m^ + }{m^ - }}}\sum\limits_{{x^ + } \in {D^ + }} {\sum\limits_{{x^ - } \in {D^ - }} {\left( {\parallel (f({x^ + }) < f({x^ - })) + \frac{1}{2}\parallel (f({x^ + }) = f({x^ - }))} \right)} }

它与AUC关系为:

2.3.4 代价敏感错误与代价曲线

        我们之前几小节衡量量化时,将正确的和错误的整体内部看做平等的,即他们内部权重相等,但在现实中并不然。一次西瓜识别错误导致农民损失100元与金库错把小偷放入损失几个亿对比,可以看到错误是有区别的,因为造成后果的代价(cost)不同。为了衡量不同的错误,我们可以给错误赋值不同的代价,称“非均等代价”

        拿二分类举例,根据代价思想,可以设计代价矩阵,如下图:

图6:二分类代价矩阵样例

其中cost代表代价,角标表示矩阵行与列的位置,一般矩阵主对角线为0(自己对自己完全相同,不会付出代价)。在考虑非均等代价前提下,我们的目标是使得整体的错误代价最小化。若将图6中0类作为正例,1为反例,则可定义敏感代价错误率公式如下:

E(f;D;cost) = \frac{1}{m}\left( {\sum\limits_{{x_i}^ +  \in {D^ + }} {\parallel (f({x_i}) \ne {y_i})cos{t_{01}} + \sum\limits_{{x_i}^ -  \in {D^ - }} {\parallel (f({x_i}) \ne {y_i})cos{t_{10}}} } } \right)

我们可以看到公式的变化,在原来判断的基础上,针对不同的情况给出不同的cost权重,这样代价会影响到最终的代价大小。

在非均等代价下,ROC曲线也要改变,以反映真正的总体期望代价,所以这里提出代价曲线。其横轴为[0, 1]的正例率代价纵轴是在[0, 1]的归一化代价。它们的公式分别表示如下:

        \eqalign{  & P{( + )_{cost}} = \frac{{p \cdot cos{t_{01}}}}{{p \cdot cos{t_{01}} + (1 - p) \cdot cos{t_{10}}}}  \cr   & cos{t_{norm}} = \frac{{FNR \cdot p \cdot cos{t_{01}} + FPR \cdot (1 - p) \cdot cos{t_{10}}}}{{p \cdot cos{t_{01}} + (1 - p) \cdot cos{t_{10}}}} \cr}

其中p表示样例为正例率的概率。我们来理解一下这两个式子。首先根据图6,只会出现假反例假正例两种可能会付出错误代价,那么分母就表示代价的总量。其次,在正例中,我们会有p的概率出现假正例的可能,而有p-1的概率在反例中出现假反例可能,所以根据正例率代价的意思,第一个公式分子就代表假反例的总量。最后理解一下归一化总代价,分子中在定义同正例率代价一样的代价总量外,还加上了不同错误概率的区分,所以该式分子包含错误细分种类错误细分代价两个细节。这两个也即总代价的两个特点。根据公式,参考ROC中曲线的作图方法,可得到下图:

图7:代价曲线与期望总体代价

        高中时应该做过线性规划吧,当时画图利用曲线方程不等式表示阴影部分以限制二维区域的范围,代价曲线也是如此。ROC曲线的没一点对应代价平面一条直线,因为这些直线是当前代价下的最大值(最糟糕情况),所以每个直线的下方即为总体代价,也即所有直线下方面积的并集即为期望总体代价,通过计算比较面积大小,来间接比较模型性能的好坏。

2.4 比较检验

        有了之前的评估方法和性能度量方法,我们就可以开始对模型的比较了,一般的顺序是:首先使用评估方法,选择合适的学习器,利用性能度量方法对不同学习结果测试,然后就进行比较了。比较不是简单的比较大小,主要有以下几个原因: 如何更精确的比较“泛化”性能,而不是单单“测试集”上的性能。  测试集是随机的,不同测试集结果不同。  机器学习算法具有随机性,相同的模型参数得到的结果也会不同。那么应该如何比较?这节着重讲这个,我们主要采用概率论中的假设检验法。本节将介绍两个常用假设检验方法和结果常用机器学习性能比较方法。其中设公式符号表示错误率,表示性能度量结果。

2.4.1 比较检验

统计中只能计算测试的错误率,该方法思路是通过测试错误率间接的表示泛化错误率。假设是独立采样,若测试中有m个样本,则整体测试错误概率可由二项分布表示如下:

        

给定,则可解对的一阶偏导方程可知,在时最大,当时,对10个样本求解到下图:

图8:P(10,0.3)二项分布示意图

通过二项检验,假设,在的概率内,计算其置信区间

        

以上假设检验是针对一个模型的一个结果,但有时我们会产生多个结果,比如采用多次留出法或交叉验证法,此时可采用t检验。设已测试k个错误率,设其均值为,方差为,定义如下:

        

k个测试错误率可看做泛化错误率的独立采样,T变量:

服从自由度为k-1的t分布,如下图所示:

图9:k=10的t分布示意图

使用双边假设,图中阴影部分在和两个区间,若在内,则接受假设,否则拒绝假设。

2.4.2 交叉验证t检验

        设有学习器A和B,均使用k折交叉验证法,得到的错误率为和,i取值为1到k,其一对采用的是相同的折数位置训练的。则可以使用“成对t检验”,这里认为若两个学习器相同,相同折数的错误率也相同。算法的具体做法如下:

令, 计算均值和方差。

求变量,若小于,则接受假设,否则拒绝假设,且错误率小的模型较优。

        之前我们提到,计算泛化误差的一个假设前提是测试错误率是泛化错误率的独立采样,但k折交叉验证显然在多次测试时数据选用重叠,使得最终的计算结果比正常值偏高。为解决问题,可采用交叉验证。以下是该方法的实现过程:

做2折交叉检验,做5次。

每次2折交叉检验前将数据随机打乱,使得五次检验数据分布不同。

设第n折得到的插值为,每做两次2折交叉检验求一次均值和方差

利用三步求得的已知,可求变量T:,其服从自由度为n的t分布,可以通过查表得到结果。

2.4.3 McNemar检验

        该检验方法最适合二分类问题,使用留出法可估计学习器AB的测试错误率,还可以得到学习器分类结果差别,可以通过列联表展示,示例如下图:

图10:学习器AB的分类差别列联表

        若两学习器性能形同,则,均值为1,方差为,所以变量T:

        

服从自由度为1的卡方分布,设显著度为,则当变量结果小于临界值,接受假设,否则拒绝假设。

2.4.5 Friedman检验与Memenyi后续检验

        前面的几种检验方法主要同于比较两个学习器对于同一数据集的学习性能,虽然比较更多算法时可以两两比较,但不如Friedman检验直接,它是基于算法排序的,可以直接进行多算法比较。现在假设有四个数据集和三个算法ABC,则它的算法过程如下:

使用留出法或交叉检验法得到每个算法在每个数据集的测试结果,并填入算法比较序值表中。

在每个数据集中对每个算法的性能好坏排序,赋值1,2,3等,如果两算法性能相同,则取平均值。表格示例如下图:

图11:比较序值表

从表中判算法性能是否相同,若相同则平均序值相同,否则取平均,示例可见图11。

设存在N个数据集,比较k个算法,设表示第i个算法的平均序值,设其服从正态分布,均值为,方差为,则变量T:

{\tau _{{\chi ^2}}} = \frac{{k - 1}}{k} \cdot \frac{{12N}}{{{k^2} - 1}}\sum\limits_{i = 1}^k {{{({r_i} - \frac{{k + 1}}{2})}^2} = } \frac{{12N}}{{k(k + 1)}}\left( {\sum\limits_{i = 1}^k {({r_i} - \frac{{k{{(k + 1)}^2}}}{4})} } \right)

在k和N较大时,变量服从自由度为k-1的卡方分布。上式有些保守,改进的公式将分布变为F分布,使得结果更精确,改变后如下:

        

该变量服从自由度为k-1和的F分布,下图给出常用临界值:

图13:F分布数值查找表

        若通过上述检验比较发现“所有算法性能相同”的假设被拒绝,则说明算法性能显著不同,此时要使用Memenyi后续检验做进一步分析。其通过下面公式计算平均序值差别的临界值域。

        

下图给出几个的常用取值:

图14:常用取值表

        上述两个检验方法结合算出结果后,可在Friedman检验图中直观的展示。上述算法ABC的例子得到的结果展示图如下:

图15:Friedman检验图示例

图中横轴是平均序值,用圆点表示,横线是表示临界值域。若算法间横线有交叠,则两算法无先出差别,否则说明有显著差别。图15中A与B有交叠,所以没有显著差别,A与C没有交叠,且A序值更高,说明算法A优于算法C。(这里其实有个疑问,图中算法B与算法C交叠,说明B与C无显著差别,那么根据传递关系,是不是三者都没有显著差别呢?)<1>

2.5 偏差与方差

        除了评估泛化性能外,我们往往还需要知道模型为什么会呈现这样的性能,这是我们就需要使用“偏差-方差分解”(bias-variance decomposition)方法进行解释。它的基本思想是,将学习算法评估得到的期望泛化错误率进行分解。本节主要讲解其实现。

2.5.1 符号说明

        对测试样本,令为在数据集中的真实标记,表示训练集D上学习模型在的预测输出。这里推导以回归任务为例。

2.5.2 模型建立与推导

定义期望预期:

定义方差:

定义噪声:

则期望输出与真实标记的差别称为偏差,定义为:

为便于推导,设=0,推导过程书上写的很详细,也比较重要,截图如下:

图16:推导过程

所以带入之前定义变量有:

也即泛化误差可分解为偏差、方差和噪声之和

2.5.3 理解

        公式中,偏差表示预期与真实结果的误差,也即机器学习算法的拟合能力;方差度量同样的训练集变动,其学习性能的变化,也即数据扰动造成的影响;噪声表示泛化误差的下界,也即学习问题本身的难度。推导结果说明,泛化误差是由这三者组成的

        一般情况,偏差与误差是矛盾的,如下图所示,(下方的黑线表示偏差,上方黑线表示泛化误差)这代表我们无法保证每个指标都达到自身的最佳。当训练程度小时,由于欠拟合,数据预测的偏差较大,此时影响泛化误差变大主要因素是偏差。当训练程度逐渐变大时,模型越来越完善,偏差会变小,方差会变大。当训练程度过大时,模型过拟合,虽然偏差非常小,但方差非常大,此时影响泛化误差变大的主要因素是方差。根据理论,我们应当给出的训练程度恰好使得泛化误差最小。


图17:泛化误差、偏差与方差的关系

2.6 总结

        本章学习如何评估与选择模型,首先我们知道学习模型学习程度不同,会导致欠拟合与过拟合。然后我们学习了模型选择方法:留出法、k折交叉验证法、自助法。选择好模型后就要进行性能度量,本文采取计算误差来表征,提到了错误率、精度、查准率、查全率、、ROC、AUC、代价敏感错误、代价曲线这几种方法。计算完性能,我们要对几个模型进行比较,本文讲了Friedman检验、Memenyi后续检验、 McNemar检验、 交叉验证t检验、 比较检验这几种方法。最后我们讲了利用偏差与方差,理解该模型产生性能结果的原因。

你可能感兴趣的:(第二章 模型评估与选择)