机器学习-模型评估与选择

模型评估与选择

(一)机器学习的性能评估方法
(二)经验误差与过拟合
(三)偏差与方差

  如西瓜书前言所述,本章属于第一部分机器学习基础知识:第一章绪论介绍了什么是机器学习及机器学习的相关数学符号,本章则进一步介绍机器学习的相关概念,具体来说介绍的内容正如本章标题“模型评估与选择”所述的相关概念,为后续章节介绍算法做好准备,因为研究机器学习最常做的事情就是比较一个算法与另一个算法的优劣。

(零)知识梳理

这里梳理一些概念:
错误率(error rate): \(E = \frac{a}{m}\),其中\(m\)为样本个数,\(a\)为分类错误样本个数。
精度(accuracy): 精度 = 1 - 错误率
误差(error): 学习器的实际预测输出与样本的真实输出之间的差异。
训练误差(training error): 学习器在训练集上的误差,又称为经验误差(empirical error)

\[E(h;\mathcal{D}) = P_{x\sim \mathcal{D}}(h(x) \neq y) \]

泛化误差(generalization): 学习器在新样本上的误差。

\[\hat E(h; D) = \frac{1}{m} \sum \limits_{i=1}^m \mathbb{I}(h(x_i) \neq y_i) \]

代价(cost),指将某种类别样本预测为另一种类别时付出的代价。
代价函数(cost function)近似于损失函数(cost也可翻译为损失,但损失一般对应的单词是loss,损失和代价概念基本一致)。
风险(risk):决策论中将“期望损失”称“风险”(risk)。
经验风险(empirical risk): 学习器在训练集上的风险称为经验风险。
在实际训练学习器时,常见的做法是经验风险最小化(empirical risk minimization,ERM)。

接下来辨析以上几个概念。
  错误率和精度最容易理解,而且很明显是针对分类问题的,并且是数据集层面的概念。
  误差的概念更适用于回归问题,当然分类问题也可以由回归问题求解,比如对数几率回归,虽然名字里有“回归”,但实际解决的是二分类问题;但是,根据计算学习理论中对泛化误差与经验误差的讨论可以看出,在分类问题中也会使用误差的概念,而此时的“差异”指的是学习器的实际预测输出的类别与样本真实的类别是否一致,若一致则“差异”为0,若不一致则“差异”为1,训练误差是在训练集上差异的平均值,而泛化误差是在新样本上差异的平均值,即在数据集层面考虑“误差”的概念时,误差与错误率相同。

  代价和损失在很多场合上的概念和意义是一致的,学习器预测出错就要付出代价或产生损失,这里只习惯性将其称为代价矩阵(cost matrix)
类似的,对于分类问题,将某种类别样本预测为另一种类别时也要付出代价;例如,对于分类问题中的误差(若一致则“差异”为0,若不一致则“差异”为1),若此时代价矩阵为预测正确则代价为0、预测错误则代价为1,因此从数据集层面考虑时,这里的错误率、误差、代价、损失实际上都是一个概念;代价函数或损失函数是以学习器参数(如线性二分类器\(h(x) = sign(w^Tx + b)\)中的\(w\),\(b\))为自变量的函数,最小化代价函数就可以得到学习器的参数(即经验风险最小化)。
  在刚刚讨论的错误率、误差、代价、损失的场景中,其实风险的概念也是一样的;针对某个数据集,错误率可以理解为分类错误样本个数的平均值,误差、代价、损失也都是平均值层面的概念,即”期望损失“,即风险(即风险与错误率一样都是数据集层面的概念)。

  过拟合(overfitting)是由于模型的学习能力相对于数据来说过于强大;反过来说,欠拟合(underfitting)是因为模型的学习能力相对于数据来说过于低下。暂且抛开”没有免费的午餐“定理不谈,例如对于下图1.4中的训练样本(黑点)来说,用类似于抛物线的曲线A去拟合则较为合理,而比较崎岖的曲线B相对于训练样本来说学习能力过于强大,但若仅用一条直线去训练则相对于训练样本来说直线的学习能力过于低下。

  这里用第12章的计算学习理论去解释:不严谨地说,泛化误差上限经验误差加上学习器学习能力。当学习器学习很强大时,虽然经验误差会很小(甚至等于0),但由于上限中的另一部分学习器学习能力很大,也会使泛化误差很大。

(一)机器学习的性能评估方法

  在现实任务中,我们往往有多种算法可供选择,那么我们应该选择哪一个算法才是最适合的呢?如上所述,我们希望得到的是泛化误差小的学习器,理想的解决方案是对模型的泛化误差进行评估,然后选择泛化误差最小的那个学习器。但是,泛化误差指的是模型在所有新样本上的适用能力,我们无法直接获得泛化误差。

  因此,通常我们采用一个“测试集”来测试学习器对新样本的判别能力,然后以“测试集”上的“测试误差”作为“泛化误差”的近似。显然:我们选取的测试集应尽可能与训练集互斥,下面用一个小故事来解释why:

  假设老师出了10 道习题供同学们练习,考试时老师又用同样的这10道题作为试题,可能有的童鞋只会做这10 道题却能得高分,很明显:这个考试成绩并不能有效地反映出真实水平。回到我们的问题上来,我们希望得到泛化性能好的模型,好比希望同学们课程学得好并获得了对所学知识"举一反三"的能力;训练样本相当于给同学们练习的习题,测试过程则相当于考试。显然,若测试样本被用作训练了,则得到的将是过于"乐观"的估计结果。
 

1. 模型性能评估综述

对于模型性能的评估,我们通常分为以下三步:
(1)对数据集进行划分,分为训练集和测试集两个部分;
(2)对模型在测试集上面的泛化性能进行度量;
(3)基于测试集上面的泛化性能,依据假设检验来推广到全部数据集上面的泛化性能。

2. 数据集的划分

  我们来回顾一下,对于模型来说,其在训练集合上面的误差,我们称之为"训练误差"或者“经验误差”,而在测试集上的误差称之为“测试误差”。由于测试集是用来测试学习器(模型)对于新样本的学习能力的,因此我们可以近似地把测试误差作为泛化误差(泛化误差:新样本上的误差)。

  对于我们来说,我们更关注的是模型对于新样本的学习能力,也即我们希望通过对已有样本的学习,尽可能的将所有潜在样本的普遍规律学到手,而如果模型对训练样本学得太好,则有可能把训练样本自身所具有的一些特点当做所有潜在样本的普遍特点,这时候就会出现“过拟合”的问题。

  因此我们通常将已有的数据集划分为训练集测试集两部分,其中训练集用来训练模型,而测试集则是用来评估模型对新样本的判别能力。

  对于数据集的划分,我们通常要保证满足以下两个条件
  1.训练集和测试集的分布要与样本真实分布一致,也即训练集和测试集都要保证是从样本真实分布中独立同分布采样而得;
   2.训练集和测试集要互斥

  基于以上两个条件,我们主要有三种划分数据集的方式:留出法交叉验证法自助法

  如上所述:我们希望用一个“测试集”的“测试误差”来作为“泛化误差”的近似,因此我们需要对初始数据集进行有效划分,划分出互斥的“训练集”和“测试集”。

下面介绍几种常用的划分方法:
(三种方法在看论文时均可见到,只是对比不同算法的性能时多见留出法和交叉验证法,而集成学习产生基分类器时多见自助法)

2.1 留出法

  将数据集D划分为两个互斥的集合,一个作为训练集S,一个作为测试集T,满足D=S∪T且S∩T=∅,常见的划分为:大约2/3-4/5的样本用作训练,剩下的用作测试。
  我们需要注意的是:训练/测试集的划分要尽可能保持数据分布的一致性,以避免由于分布的差异引入额外的偏差,而对最终结果造成影响。
  
  为了保证数据分布的一致性,通常我们采用 分层采样 的方式来对数据进行采样。假设我们的数据有m1个正样本,有m2个负样本,而训练集S占数据集D的比例为p,那么测试集T占数据集D的比例即为1-p,我们可以通过在m2个负样本中采样m2×p个样本作为训练集S中的负样本,其余的作为测试集T中的样本。
  另外,对于样本的不同划分方式也会导致模型评估的相应结果出现差别。例如,若我们将一组数据中的正样本进行了排序,那么在排序后的样本中的采样与未排序的样本采样得到的结果也会有一些不同,因此,通常我们都会进行多次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
  
  
留出法的缺点
:对于留出法,如果我们对数据集D进行划分后,训练集S中的样本很多,数据规模接近于数据集D,其训练出来的模型与数据集D本身训练出来的模型可能很接近,但由于测试集 T的数据规模比较小,这时候可能会导致评估结果不够准确稳定;另一方面,若训练集S样本很少,又会使得训练出来的样本与数据集D所训练出来的样本相差很大。

2.2 交叉验证法

  将数据集D划分为k个大小相同的互斥子集,满足D=D1∪D2∪...∪Dk,Di∩Dj=∅(i≠j),同样地尽可能保持数据分布的一致性,即采用分层抽样的方法获得这些子集。交叉验证法的思想是:每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样就有K种训练集/测试集划分的情况,从而可进行k次训练和测试,最终返回k次测试结果的均值。交叉验证法也称“k折交叉验证”,k最常用的取值是10,下图给出了10折交叉验证的示意图。

  与留出法类似,将数据集D划分为K个子集的过程具有随机性,因此K折交叉验证通常也要重复p次,称为p次k折交叉验证,常见的是10次10折交叉验证,即进行了100次训练/测试。特殊地,当划分的k个子集的每个子集中只有一个样本时(k=1),称为“留一法”。我们发现留一法并不需要多次划分,因为其划分方式只有一种,并且得到的训练集S和数据集D在数据规模上很接近,从而训练集S所训练出来的模型应该与数据集D所训练出来的模型很接近,因此通常留一法得到的结果是比较准确的。但当数据集很大的时候,留一法的运算成本将会非常高以至于无法忍受。

2.3 自助法

  我们希望评估的是用整个D训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致的估计偏差。留一法受训练样本规模变化的影响较小,但计算复杂度又太高了。“自助法”正是解决了这样的问题。“留出法”和“交叉验证法”都是使用分层采样的方式进行数据采样与划分的,而“自助法”则使用有放回重复采样的方式进行数据采样。

  自助法的基本思想是:给定包含m个样本的数据集D,每次随机从D 中挑选一个样本,将其拷贝放入D',然后再将该样本放回初始数据集D 中,使得该样本在下次采样时仍有可能被采到。重复执行m 次,就可以得到了包含m个样本的数据集D'。可以得知在m次采样中,样本始终不被采到的概率取极限为:

\[\lim \limits_{m \mapsto \infty}(1 - \frac{1}{m})^m \mapsto \frac{1}{e} \approx 0.368 \]

  这样,通过自助采样,初始样本集D中大约有36.8%的样本没有出现在D'中,于是可以将D'作为训练集,D-D'作为测试集。自助法在数据集较小,难以有效划分训练集/测试集时很有用,但由于自助法产生的数据集(随机抽样)改变了初始数据集的分布导致会引入估计偏差。在初始数据集足够时,留出法和交叉验证法更加常用。

2.4 关于划分方式的总结

对于数据量充足的时候,通常采用留出法或者k折交叉验证法来进行训练/测试集的划分;
对于数据量小且难以有效划分训练/测试集时使用自助法
对于数据集小且可有效划分的时候,最好使用留一法来进行划分,因为这种方法最为准确。

2.5 调参与最终模型

  机器学习算法不同于传统算法,大多数学习算法都有些参数(parameter) 需要设定,参数配置不同,学得模型的性能往往有显著差别,因此在进行模型评估和选择时,除了要对适用学习算法进行选择,还需对算法进行设定,这就是通常所说的"参数调节"或简称"调参" (parameter tuning)。

  机器学习常涉及两类参数:一类是算法的参数,亦称”超参数“,数目常在10以内;
  另一类是模型的参数,数目可能很多,例如大型”深度学习“模型甚至有上百亿个参数。两者调参方式相似,均是产生多个模型之后基于某种评估方法来进行选择;不同之处在于前者调参是由前者(超参数)通常是由人工设定多个参数候选值后产生模型,后者(模型参数)则是通过学习来产生多个候选模型(例如神经网络在不同轮数停止训练)。

  首先来看,”算法“和”模型“的关系。在机器学习背景下,算法与其生成模型有一定的对应关系,具体来说,例如k近邻、支持向量机都是一种算法,每个算法按某个参数配置训练之后都会得到一个模型。
  其次,算法本身的一些参数,例如k近邻的近邻个数k、支持向量机的参数C就是这里提到的算法参数,亦称超参数。
  最后,算法训练后会得到一个模型,例如支持向量机最终会得到\(w\)\(b\)具体的值(此处不考虑核函数),这就是模型参数;用模型参数就可以对未见样本做预测了。

  学习算法的很多参数是在实数范围内取值,因此,对每种参数取值都训练出模型来是不可行的。常用的做法是:对每个参数选定一个范围和步长λ,这样使得学习的过程变得可行。例如:假定算法有3 个参数,每个参数仅考虑5 个候选值,这样对每一组训练/测试集就有555= 125 个模型需考察;很多强大的学习算法有大量参数需设定,这将导致极大的调参工程量,以至于在不少应用任务中,参数调得好不好往往对最终模型性能有关键性影响。

  给定包含m个样本的数据集D,在模型评估与选择过程中,由于需要留出一部分数据进行评估测试,事实上我们只使用了一部分数据训练模型。因此,在模型选择完成后,学习算法和参数配置已选定,此时应该用数据集D重新训练模型。这个模型在训练过程中使用了所有m个样本,这才是我们最终提交给用户的模型。

  

  这里简单回顾一下一些训练集(training set)和测试集(testing set)的概念。上面介绍的留出法、交叉验证法、自助法均可将数据集划分为训练集和测试集。我们很容易理解训练集和测试集,训练集用来训练模型,测试集则是用来评估模型对新样本的判别能力。此外,我们通常把学得模型在实际使用中遇到的数据称为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集常称为“验证集”(validation set)。

  然而,有时算法需要从候选超参数中选择使用其一,例如支持向量机的参数C:这时需要先将训练集继续划分为两个部分,其中一部分用于训练使用了不同候选超参数的模型,暂且称之为小训练集,然后将剩余部分(即验证集)用于测试,进而基于验证集测试结果选出较好的超参数;然后,再以此超参数为准,在整个训练集上重新训练,再用测试集进行测试其性能。

  根据前面的讨论,我们可以发现,验证集在选择超参数过程中的角色与算法对比时测试集的角色相同,因为选择超参数过程实际也是对比多个模型的性能。因此,在工程实际中(可理解为做比赛),若客户(比赛出题方)给你提供了数据集,在研发阶段则可以将数据集划分为训练集和测试集来选择不同的算法,也可以进一步地将训练集继续划分为小训练集和验证集对算法的超参数进行选择,但最后提交给客户(比赛网站)的一定是基于整个数据集重新训练的模型。

  这里需要指出的是,算法研究与工程落地实际是不一样的。算法研究是要将自己的算法与其算法在现有的数据集上做对比,因此肯定是将数据集划分为训练集和测试集,但若需要确定算法超参数则需要进一步将训练集划分为小训练集和验证集;而工程落地实际是在以上基础上再提交一个学习器给客户,所以最后要基于整个数据集重新训练一遍后,将得到的学习器交给客户。

  需要注意的是:在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,给予验证集上的性能来进行模型选择和调参。当选定好模型和调参完成后,我们需要使用初始的数据集D重新训练模型,即让最初划分出来用于评估的测试集也被模型学习,增强模型的学习效果。

  特别注意,测试集在整个过程中只能用于测试,不能参与到参数的选择过程中(这里指的是算法研究,若对应到工程落地,真实的测试集标记信息本身是不可见的,例如做比赛时,最终使用的测试数据);但在有的论文中,会在最后基于测试集做参数敏感度分析(控制变量利用法,与其他算法对比时固定某个超参数);例如,对于支持向量机,在与其它算法对比时使用C=1作为默认参数,在实验分析时将\(C=\left\{0.01, 0.1,1,10,10 \right\}\)几个参数都训练一遍并得到测试结果,来说明算法性能是否会随着参数\(C\)的变化而变化,若基本不变那正好符合我们希望算法对超参数不敏感的预期,这样依赖,工程落地中就可以任意取某个参数即可;一般算法给出的默认值是参数敏感度分析中结果最好的那个,但其实这有点使用测试集调参的味道。

3.性能度量

  对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量(performance measure)。性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的”好坏“是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求。

  在预测任务中,给定样例集\(D=\left\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\right\}\),其中\(y_i\)是示例\(x_i\)的真实标记。要评估学习器\(f\)的性能,就要把学习器预测结果\(f(x)\)与真实标记\(y\)进行比较。

  回归任务最常用的性能度量是”均方误差“(mean squared error)

\[E(f; D) = \frac{1}{m} \sum \limits_{i=1}^m (f(x_i) - y_i)^2 \quad (2.2) \]

更一般的,对于数据分布\(\mathcal{D}\)和概率密度函数\(p(\cdot)\),均方误差可描述为

\[E(f;D) = \int_{x \sim \mathcal{D}}(f(x) - y)^2 p(x)dx \quad (2.3) \]

对于模型的性能度量,我们通常用以下几种方法来进行度量:

  1. 错误率与精度 (accuracy)
  2. 准确率 (查准率, precision) 、召回率 (查全率, recall)与F1
  3. P-R 曲线, F-Measure度量
  4. ROC曲线 / AUC (最常用)
  5. 代价敏感错误率与代价曲线
3.1 错误率与精度(accuracy)

  错误率:通常我们把分类错误的样本数占样本总数的比例称为“错误率”(error rate),即如果在m个样本中有a个样本分类错误,则错误率E=a/m;
  分类错误率定义为

\[E(f;D) = \frac{1}{m} \sum \limits_{i=1}^m \mathbb{I}(f(x_i) \neq y_i). \quad (2.4) \]

  更一般的,对于数据分布\(\mathcal{D}\)和概率密度函数\(p(\cdot)\),错误率可描述为

\[acc(f; D) = \int_{x \sim \mathcal{D}}\mathbb{I}(f(x) \neq y)p(x)dx \quad (2.6) \]

  精度:相应地,1 - E = 1 - a / m = (m - a) / m,称为“精度”,即“精度 = 1 - 错误率”。
     精度常写成百分比形式 (1-a/m)×100%
  精度定义为

\[acc(f;\mathcal{D}) = \frac{1}{m} \sum \limits_{i=1}^m \mathbb{I}(f(x_i) = y_i) = 1 - E(f:D) \quad (2.5) \]

  更一般的,对于数据分布\(\mathcal{D}\)和概率密度函数\(p(\cdot)\),精度可描述为

\[acc(f; \mathcal{D}) = \int_{x \in \mathcal{D}}\mathbb{I}(f(x) = y)p(x)dx = 1 - E(f;D). \quad (2.7) \]

3.2 准确率(查准率) 、召回率 (查全率)与F1

  错误率和精度虽然常用,但不能满足所有的需求。这里以西瓜问题为例,假定瓜农拉来一车西瓜,我们用训练好的模型对这些西瓜进行判别,显然,错误率衡量了有多少比例的瓜被判别错误。但是若我们关心的是”挑出的西瓜中有多少比例是好瓜“,或者”所有好瓜中有多少比例被挑出来“,那么错误率显然就不足以描述这些信息了,此时则需要使用其他的性能度量。

  类似的,在信息检索、Web搜索等应用场景中,我们以”查准率“(precision)”查全率“(recall)来作为性能度量标准,描述"检索出的信息中有多少比例是用户感兴趣的"(即查准率),"用户感兴趣的信息中有多少被检索出来了"(即查全率)。显然,两者更适应于此类问题的需求性能度量。

对于二分类问题,分类结果混淆矩阵与查准/查全率定义如下:

  **准确率(查准率) **:
            (预测为真) ^ (实际也为真) 的个体个数
准确率(查准率) = ———————— —————————————————— 
            (预测为真)的个体个数

   召回率 (查全率)
            (预测为真) ^ (实际也为真) 的个体个数
召回率 (查全率) = ———————— —————————————————— 
            (实际为真)的个体个数

混淆矩阵
5.png

我们将准确率记为P,召回率记为R,通过混淆矩阵,我们有下表:
其中,TP真正例(true positive),FP假正例(false positive),FN假反例(false negative),TN真反例(true negative)

查准率P和查全率R分别定义为 $$ P = \frac{TP}{TP+FP} \\R = \frac{TP}{TP+FN} $$

  通过上面对准确率和召回率的描述,我们可以发现,准确率更关注的是,在已经预测为真的结果中,预测正确的比例,这时候我们可以发现,如果我们预测为真的个体数月少,那么准确率越高的可能性就会越大,也即如果我们只预测最可能为真的那一个个体为真,其余的都为假,则这时的准确率很可能为100%,但此时召回率就会很低;

  而召回率更关注的是,在所有为真的个体总,被预测正确的个体所占的比例,可以看到如果我们预测为真的个体越多,那么召回率更高的可能性就会越大,即如果我们把所有的个体都预测为真,那么此时的召回率必然为100%,但是准确率此时就会很低。

  因此,我们可以看到,这两个度量往往是相互对立的,也即准确率高则召回率通常比较低,召回率高则准确率往往会很低。因此,若我们分别用准确率或召回率对模型的预测结果进行评价会有片面性,不够客观。

3.3 P-R曲线 / F1度量

  正如天下没有免费的午餐,查准率和查全率是一对矛盾的度量。例如我们想让推送的内容尽可能用户全都感兴趣,那只能推送我们把握高的内容,这样就漏掉了一些用户感兴趣的内容,查全率就低了;如果想让用户感兴趣的内容都被推送,那只有将所有内容都推送上,宁可错杀一千,不可放过一个,这样查准率就很低了

  P-R曲线是以召回率R为横轴,准确率P为纵轴,然后根据模型的预测结果对样本进行排序,把最有可能是正样本的个体排在前面,而后面的则是模型认为最不可能为正例的样本,再按此顺序逐个把样本作为“正例”进行预测并计算出当前的准确率和召回率得到的曲线。

6.png

  通过上图我们可以看到,当我们只把最可能为正例的个体预测为正样本时,其准确率最高位1.0,而此时的召回率则几乎为0,而我们如果把所有的个体都预测为正样本的时候,召回率为1.0,此时准确率则最低。但是我们如何通过PR曲线来判断哪个模型更好呢?

这里有以下集中判断方式:

  ###### 3.3.1 基于曲线是否覆盖来进行判断。

  即如果模型B的PR曲线此时完全包住了模型C的PR曲线,此时我们认为模型B对于该问题更优于模型C,这也可以理解,因为在相同召回率的情况下,模型B的准确率要比模型C的更高,因此B必然更优一些。但是一般来说,曲线下的面积是很难进行估算的,因此这种方法在曲线有交叉的时候不好判断;

  ###### 3.3.2 基于平衡点(Break-Event Point,简称BEP)来进行判断。

  平衡点即为召回率与准确率相等的点,如果该点的值越大,则认为模型越优,但这样的判断过于简单;

  ###### 3.3.3 利用F-Measure度量来进行判断。

  P和R指标有时会出现矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure,又称F-Score。F-Measure是P和R的加权调和平均,即:

\[\frac{1}{F_{\beta}} = \frac{1}{1+\beta^2} \cdot (\frac{1}{P} + \frac{\beta^2}{R}) \\F_{\beta} = \frac{(1+\beta^2)×P×R}{(\beta^2×P)+R} \]

特别地,当β=1时,也就是常见的F1度量,是P和R的调和平均,当F1较高时,模型的性能越好。

\[\frac{1}{F1} = \frac{1}{2} \cdot (\frac{1}{P} + \frac{1}{R}) \\ F1 = \frac{2×P×R}{P+R} = \frac{2×TP}{样例总数+TP - TN} \]

3.3.4 ROC曲线 / AUC (最常用)

  如上所述:学习器对测试样本的评估结果一般为一个实值或概率,设定一个阈值,大于阈值为正例,小于阈值为负例,因此这个实值的好坏直接决定了学习器的泛化性能,若将这些实值排序,则排序的好坏决定了学习器的性能高低。
  ROC曲线正是从这个角度出发来研究学习器的泛化性能,ROC曲线与P-R曲线十分类似,都是按照排序的顺序逐一按照正例预测,不同的是ROC曲线以“真正例率”(True Positive Rate,简称TPR)为横轴,纵轴为“假正例率”(False Positive Rate,简称FPR),ROC偏重研究基于测试样本评估值的排序好坏。

\[横轴: 真正例率 \quad TPR = \frac{TP}{TP + FN} \\纵轴:假正例率 \quad FPR = \frac{FP}{TN + FP} \]

13.png
  
  简单分析图像,可以得知:当FN=0时,TN也必须0,反之也成立,我们可以画一个队列,试着使用不同的截断点(即阈值)去分割队列,来分析曲线的形状。
对于该曲线,我们首先有4个特殊的点要说明一下:
(0,0)点:表示将所有的样本预测为负例(所有样本个体都预测为假,那么TP和FP都为0)
(1,1)点:表示将所有的样本预测为正例(相当于随机预测)
(0,1)点:表示正例全部出现在负例之前的理想情况(此时TP=TP+FN,FP=0)
(1,0)点:表示负例全部出现在正例之前的最差情况(此时FP=FP+TN,TP=0)
  
  现实中的任务通常都是有限个测试样本,因此只能绘制出近似ROC曲线。
绘制方法:首先根据测试样本的评估值对测试样本排序,接着按照以下规则进行绘制。
绘制过程:给定\(m^+\)个正例和\(m^-\)个反例,根据学习器预测结果对样例进行排序,然后把分类阈值设为最大,即把所有样例均预测为反例,此时真正例率和假正例率均为0,在坐标\((0,0)\)处标记一个点。
然后,将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。
设前一个标记点坐标为\((x,y)\),当前若为真正例,则对应标记点坐标为\((x,y+\frac{1}{m^+})\);
当前若为假正例,则对应标记点的坐标为\((x+\frac{1}{m^-},y)\),然后用线段连接相邻点即得。

  我们可以发现,如果一个模型的ROC曲线越靠近左上角,那么该模型就越优,其泛化性能就越好,但是对于两个模型,我们如何判断哪一个模型的泛化性能更优呢?这里主要有以下两种方法:

  进行模型的性能比较时,若一个学习器A的ROC曲线被另一个学习器B的ROC曲线完全包住,则称B的性能优于A。若A和B的曲线发生了交叉,则谁的曲线下的面积大,谁的性能更优。
  ROC曲线下的面积定义为AUC(Area Uder ROC Curve),不同于P-R的是,这里的AUC是可估算的,即AOC曲线下每一个小矩形的面积之和。
  易知:AUC越大,证明排序的质量越好,AUC为1时,证明所有正例排在了负例的前面,AUC为0时,所有的负例排在了正例的前面。

\[AUC = \frac{1}{2} \sum \limits_{i=1}^{m-1} (x_{i+1} - x_i) \cdot (y_i + y_{i+1}) \quad (2.20) \]

  通过上面的公式运算,我们发现ROC曲线对于样本类别是否平衡并不敏感,即其并不受样本先验分布的影响,因此在实际工作中,更多的是用ROC/AUC来对模型的性能进行评价。

3.3.5. 代价敏感错误率与代价曲线

  在上面所描述的衡量模型性能的方法都是基于错误分类同等代价来开展的,即我们把True预测为False与把False预测为True所导致的代价是同等的,但在很多情况下其实并不都是这样的,这里依然以癌症诊断为例,如果我们把一个患有癌症的患者预测为不患有与把不患有癌症的患者预测为患有明显其造成的损失是不同的,因此在这种情况下发我们是不可能以同等代价来进行预测。将无疾病-->有疾病只是增多了检查,但有疾病-->无疾病却是增加了生命危险。为权衡不同类型错误所造成的不同损失,可为错误赋予“非均等代价”(unequal cost)。

  以二分类为例,我们可根据任务的领域知识设定一个“代价矩阵”(cost matrix)。

16.png

  在非均等错误代价下,我们希望的是最小化“总体代价”,这样“代价敏感”的错误率为:

\[E(f; D; cost) = \frac{1}{m} \left(\sum \limits_{x_i \in D^+} \mathbb{I}(f(x_i) \neq y_i)×cost_{01} + \sum \limits_{x_i \in D^-} \mathbb{I}(f(x_i) \neq y_i)×cost_{10} \right) \quad \quad (2.23) \]

  同样对于ROC曲线,在非均等错误代价下,演变成了“代价曲线”,代价曲线横轴是取值在[0,1]之间的正例概率代价,式中p表示正例的概率,纵轴是取值为[0,1]的归一化代价。
正例概率代价计算公式为:

\[P(+)cost = \frac{p×cost_{01}}{p×cost_{01} + (1-p)×cost_{10}} \quad \quad (2.24) \]

归一化代价计算公式为:

\[cost_{norm} = \frac{FNR×p×cost_{01} + FPR×(1-p)×cost_{10}}{p×cost_{01} + (1-p)×cost_{10}} \quad \quad (2.25) \]

  代价曲线的绘制很简单:设ROC曲线上一点的坐标为(TPR,FPR) ,则可相应计算出FNR,然后在代价平面上绘制一条从(0,FPR) 到(1,FNR) 的线段,线段下的面积即表示了该条件下的期望总体代价;如此将ROC 曲线土的每个点转化为代价平面上的一条线段,然后取所有线段的下界,围成的面积即为在所有条件下学习器的期望总体代价,如图所示:

20.png

4.比较检验

  实际上,机器学习中性能比较这件事要比大家想象的复杂得多,这里涉及几个重要因素:
  首先,我们希望比较的是泛化性能,然而通过实验评估方法,我们获得的是测试集上的性能,两者的对比可能未必相同;
  其次,测试集上的性能与测试集本身的选择有很大关系,且不论使用不同大小的测试集会得到不同的结果,即便用相同大小的测试集,若包含的测试样例不同,测试得到的结果也会有不同。
  最后,很多机器学习算法本身有一定的随机性,即便用相同的参数设置在同一个测试集上多次运行,其结果也会不同。

  前面介绍了各种性能度量方式,但是其度量的是模型在测试集下的测试误差的性能状况,虽然其可以近似代替泛化性能,但毕竟与真实的泛化性能有一定的距离。在比较学习器泛化性能的过程中,**统计 假设检验 **(hypothesis test)为学习器性能比较提供了重要依据,即若A在某测试集上的性能优于B,那A学习器比B好的把握有多大。在这里我们介绍通过假设检验的方式,利用测试误差来预估泛化误差从而得到模型的泛化性能情况,即 **基于假设检验结果我们可以推断出若在测试集上观察到模型A比B好,那么A的泛化性能在统计意义上优于B的概率有多大 **

4.1 假设检验

  “假设”指的是对样本总体的分布或已知分布中某个参数值的一种猜想,例如:假设总体服从泊松分布,或假设正态总体的期望u=u0。所谓假设检验,就是数理统计中依据一定的假设条件,由样本推断总体的一种方法。我们可以通过测试获得测试错误率,但直观上测试错误率和泛化错误率相差不会太远,因此可以通过测试错误率来推测泛化错误率的分布,这就是一种假设检验。其步骤如下所示:
  (1) 根据问题的需要对所研究的总体做某种假设,记为H。
  (2) 选择合适的统计量,这个统计量的选取要使得在假设H。成立时,其分布是已知的(这里的统计量,我们可以视为样本的函数)。
  (3) 由实测的样本计算出统计量的值,根据预先给定的显著性水平进行检验,做出拒绝或接受假设H。的判断。

  根据以上三步,我们知道首先要对所研究的总体做出某种假设,在我们所研究的问题中就是对模型泛化错误率分布做出某种假设或猜想。通常,测试错误率与泛化误差率的差别很小,因此我们可以根据测试误差率来估计泛化误差率的分布。

  
  泛化错误率为\(\epsilon\)的学习器在一个样本上犯错的概率为\(\epsilon\);测试错误率\(\hat \epsilon\)意味着在\(m\)个测试样本中恰有\(\hat \epsilon×m\)个被误分类。假定测试样本是从样本总体分布中独立采样而得,那么泛化错误率为\(\epsilon\)的学习器将其中\(m'\)个样本误分类、其余样本全都分类正确的概率是\(e^{m'}(1-\epsilon)^{m-m'}\);由此可估算出其恰将\(\hat \epsilon×m\)个样本误分类的概率如下式所示,这也表达了在包含\(m\)个样本的测试集上,泛化错误率为\(\epsilon\)的学习器被测得测试错误率为\(\hat \epsilon\)的概率:

\[P(\hat \epsilon; \epsilon) = \begin{pmatrix}m \\\hat \epsilon×m\end{pmatrix}\epsilon^{\hat \epsilon×m}(1-\epsilon)^{m - \hat \epsilon×m} \quad (2.26) \]

为了便于说明问题,这里引入符号\(\varepsilon\),则泛化错误率为\(\varepsilon=\epsilon\)的学习器,被测得测试错误率为\(\hat \varepsilon = \hat \epsilon\)的概率为:

\[P(\varepsilon = \hat \epsilon; \varepsilon = \epsilon) = \begin{pmatrix}m \\\hat \epsilon×m\end{pmatrix}\epsilon^{\hat \epsilon×m}(1-\epsilon)^{m - \hat \epsilon×m}  \]

\(\hat \varepsilon,\varepsilon\)表示变量,\(\hat \epsilon,\epsilon\)表示变量值,其中\(\begin{pmatrix}m \\\hat \epsilon×m\end{pmatrix} = \frac{m!}{(\hat \epsilon×m)!(m-\hat \epsilon×m)!}\),即为组合数,表示从包含m个元素的集合中不重复地抽取\(\hat \epsilon×m\)个元素的可能取法,中学课本中将其记为\(C_{m}^{\hat \epsilon×m}\),有的资料中也记为C(m,\(\hat \epsilon×m\))。
  以上公式中,若已知\(\varepsilon = \epsilon\),求\(\hat \varepsilon\)为任意值时的条件概率,记后验概率\(P(\hat \varepsilon|\varepsilon = \epsilon)\);反之,若已知\(\hat \varepsilon = \hat \epsilon\),求其由\(\varepsilon\)为任意值时导致\(\hat \varepsilon = \hat \epsilon\)的概率,即似然概率\(P(\hat \varepsilon = \epsilon|\epsilon)\)
后验概率和似然概率区别在于:对于P(果|因),若已知”因“的取值,则P(果|因)为后验概率,即为在知道”因“的取值后”果“发生的概率;反之,若已知”果“的取值则P(果|因)为似然概率,即当前的”果“更像是由哪个”因“所导致的。
特别地,\(\hat \epsilon =\arg \max \limits_{\hat \varepsilon}P(\hat \varepsilon|\varepsilon = \epsilon)\)表示最大后验概率(maximum a posteriori,MAP)估计
\(\epsilon =\arg \max \limits_{\hat \varepsilon}P(\hat \varepsilon = \epsilon|\varepsilon)\)表示最大似然估计(maximum likelihood estimation,MLE)。
  若欲求最大似然估计,只需令\(\frac{\partial P(\hat \varepsilon=\hat \epsilon|\varepsilon)}{\partial \varepsilon} = 0\),解得\(\varepsilon = \hat \epsilon\),即泛化错误率\(\varepsilon\)等于测试错误率\(\hat \epsilon\),其中

\[\frac{\partial P(\hat \varepsilon = \hat \epsilon|\varepsilon)}{\partial \varepsilon} = \begin{pmatrix}m \\\hat \epsilon×m\end{pmatrix}\varepsilon^{\hat \epsilon×m-1}(1-\varepsilon)^{m-\hat \epsilon×m-1}(\hat \epsilon×m - \varepsilon×m) \]

其中\(C_{m}^{\hat \varepsilon×m}\)为常数,\(\varepsilon^{\hat \epsilon×m-1}\)只有当\(\varepsilon=0\)时等于0,\((1-\varepsilon)^{m-\hat \epsilon×m-1}\)只有当\(\varepsilon=1\)时等于0,所以只能令\((\hat \epsilon×m - \varepsilon×m) = 0\),解得\(\varepsilon=\hat \epsilon\)

给定测试错误率,则解\(\frac{\partial P(\hat \epsilon; \epsilon)}{\partial \epsilon} = 0\)可知,\(P(\hat \epsilon; \epsilon)\)\(\epsilon = \hat \epsilon\)时最大,\(|\epsilon - \hat \epsilon|\)增大时\(P(\hat \epsilon; \epsilon)\)减小。
这符合二项(binomial)分布。

如下图所示,若\(\epsilon=0.3\),则10个样本中测得3个被误分类的概率最大。

  这里有两种估算误差率的方法:“二项检验”(binomial test) 和 “t检验”(t-test)

  ###### 4.1.1 “二项检验”(binomial test)

  我们可使用“二项检验”(binomial test)来对“ϵ≤0.3”(即“泛化错误率是否不大于0.3”)这样的假设进行检验。推广之,更一般地,我们考虑假设“ϵ≤ϵ。”,则在1 - α的概率内所能观测到的最大错误率如下式计算。这里1 - α反映了结论的“置信度”(confidence),直观地来看,相应于上图2.6中非阴影部分的范围。

\[\overline{\epsilon} = \max \epsilon  s.t \sum \limits_{i=\epsilon_0×m+1}^m \begin{pmatrix}m \\i\end{pmatrix}\epsilon^i(1-\epsilon)^{m-i} < \alpha \quad (2.27)\\ \]

\(s.t\)是“subject to”的简写,使左边式子在右边条件满足时成立。
此时若测试错误率\(\hat \epsilon\)小于临界值\(\overline{\epsilon}\),则根据二项检验可得出结论:
\(\alpha\)的显著度下,假设"\(\epsilon \leq \epsilon_0\)"不能被拒绝,即能以\(1-\alpha\)的置信度认为,学习器的泛化错误率不大于\(\epsilon_0\)
否则该假设可被拒绝,即在\(\alpha\)的显著度下可认为学习器的泛化错误率大于\(\epsilon_0\)
这里需要区分两个问题,即当测试错误率\(\hat \epsilon\)小于临界值\(\overline{\epsilon}\)时,【事件\(\epsilon\leq \epsilon_0\)以不小于\(1-\alpha\)的概率成立】与【能以\(1-\alpha\)的置信度认为假设\(\epsilon\leq \epsilon_0\)成立】这两件事情;其中
(a) 当测得测试错误率\(\hat \epsilon\)小于临界值\(\overline{\epsilon}\)时,【事件\(\epsilon \leq \epsilon_0\)以不小于\(1-\alpha\)的概率成立】翻译为数学符号为\(P(\epsilon\leq \epsilon_0|\hat \epsilon \leq \overline{\epsilon}) \geq 1 - \alpha\);
(b) 当测得测试错误率\(\hat \epsilon\)小于临界值\(\overline{\epsilon}\)时,【能以\(1-\alpha\)的置信度认为假设\(\epsilon\leq \epsilon_0\)成立】翻译为数学符号为\(P(\epsilon\leq \overline{\epsilon}|\epsilon \leq \epsilon_0) \geq 1 - \alpha\);
本质上看,这完全是两个问题,即\(P(A|B)\)\(P(B|A)\)的关系。

  ###### 4.1.2“t检验”(t-test)

  在很多时候我们往往并非仅做一次留出法估计,而是通过多次重复留出法或是交叉验证法等进行多次训练/测试,这样会得到多个测试错误率,此时可以使用“t检验”(t-test)。
假定我们得到了k个测试错误率,,则平均测试错误率μ和方差

\[\begin{align}& 平均测试错误率 \mu = \frac{1}{k} \sum \limits_{i=1}^k \hat \epsilon_i, \quad (2.28) \\& 方差 \sigma^2 = \frac{1}{k-1} \sum \limits_{i=1}^k (\hat \epsilon_i - \mu)^2 \quad (2.29)\end{align} \]

  这里讨论一下方差\(\sigma^2\)的公式,有人认为应该除以样本数量k,也有人认为应该除以样本数量减1(即k-1)。简单来说,根据总体样本集求方差时就除以总体样本数量k,而根据抽样样本集求方差就除以抽样样本集数量减1;总体样本集是我们真正想调查的对象集合,而抽样样本集是从总体采样集合中被选出来的部分样本组成的集合,用来估计总体样本集的方差;一般来说,总体样本集是不可得的,我们拿到的都是抽样样本集。CSDN 博主 hearthougan篇博客《彻底理解样本方差为何除以 n-1》通过严格的数学推导证明了样本方差应该除以 n-1
才会得到总体样本的无偏估计,若除以 n 则得到的是有偏估计。

  考虑到这\(k\)个测试错误率可看作泛化错误率\(\epsilon_0\)的独立采样,则变量

\[\mathcal{T}_t = \frac{\sqrt{k}(\mu - \epsilon_0)}{\sigma} \quad (2.30) \]

  服从自由度为\(k-1\)\(t\)分布,如下图2.7所示。

  对假设"\(\mu = \epsilon_0\)"和显著度\(\alpha\),我们可计算出当测试错误率均值为\(\epsilon_0\)时,在\(1-\alpha\)概率内能观测到的最大错误率,即临界值。这里考虑双边(two-tailed)假设,如上图2.7所示,两边阴影部分各有\(\frac{\alpha}{2}\)的面积;假定阴影部分范围分别为\([-\infty, t_{-\alpha/2}]\)\([t_{\alpha/2},\infty]\)

  若平均错误率\(\mu\)\(\epsilon_0\)之差\(|\mu - \epsilon_0|\)位于临界值范围\([t_{-\alpha/2},t_{\alpha/2}]\)内,则不能拒绝假设"\(\mu = \epsilon_0\)",即可认为泛化错误率为\(\epsilon_0\),置信度为\(1-\alpha\);否则可拒绝该假设,即在该显著度下认为泛化错误率与\(\epsilon_0\)有显著不同。
\(\alpha\)常用取值有0.05和0.1。下表2.3给出了一些常用临界值。

上面介绍的两种方法都是对关于单个学习器泛化性能的假设进行检验,而在现实任务中,更多时候我们需对不同学习器的性能进行比较。

下面将介绍适用于此类情况的假设检验方法。

4.2 交叉验证t检验

  对两个学习器A和B,若我们使用k折交叉验证法得到的测试错误率分别为\(\epsilon_1^A, \epsilon_2^A,...,\epsilon_k^A\)\(\epsilon_1^B,\epsilon_2^B,...,\epsilon_k^B\),其中\(\epsilon_i^A\)\(\epsilon_i^B\)是在相同的第\(i\)折训练/测试集上得到的结果,则可用\(k\)折交叉验证“成对t检验”(paired t-tests)来进行比较检验。
  这类的基本思想是若两个学习器的性能相同,则它们使用相同的训练/测试集得到的测试错误率应相同,即\(\epsilon_i^A=\epsilon_i^B\)

  具体来说,对k折交叉验证法产生的k对测试错误率:先对每对结果求差,\(\Delta_i = \epsilon_i^A -\epsilon_i^B\);若两个学习器性能相同,则差值均值应为零。因此,可根据差值\(\Delta_1,\Delta_2,...,\Delta_k\)来对“学习器A和B性能相同”这个假设做t检验,计算出差值的均值\(\mu\)和方差\(\sigma^2\),在显著度\(\alpha\)下,若变量

\[\mathcal{T}_t = \big|\frac{\sqrt{k}\mu}{\sigma} \big| \quad \quad (2.31) \]

小于临界值\(t_{\alpha/2,k-1}\),则假设不能被拒绝,即认为两个学习器的性能没有显著差别;
否则可认为两个学习器的性能有显著差别,且平均错误率较小的那个学习器性能较优。
这里的\(t_{\alpha/2,k-1}\)是自由度为\(k-1\)\(t\)分布上尾部累积分布为\(\alpha/2\)的临界值。
  
  欲进行有效的假设检验,一个重要前提是测试错误率均为泛化错误率的独立采样。然而,通常情况下由于样本有限,在使用交叉验证等实验估计方法时,不同轮次的训练集会有一定程度的重叠,这就使得测试错误率实际上并不独立,会导致过高估计假设成立的概率。
  为缓解这一问题,可采用"5×2交叉验证"法。

  \(5×2\)交叉验证是做5次2折交叉验证,在每次2折交叉验证之前随机将数据打乱,使得5次交叉验证中的数据划分不重复。对两个学习器A和B,第\(i\)次2折交叉验证将产生两对测试错误率,我们对它们分别求差,得到第1折上的差值\(\Delta_i^1\)和第2折上的差值\(\Delta_i^2\)

  为缓解测试错误率的非独立性,我们仅计算第1次2折交叉验证的两个结果的平均值\(\mu=0.5(\Delta_1^1+\Delta_1^2)\),但对每次2折实验的结果都计算出其方差\(\sigma_i^2 = (\Delta_i^1 - \frac{\Delta_i^1 + \Delta_i^2}{2}) + (\Delta_i^2 - \frac{\Delta_i^1 + \Delta_i^2}{2})\)

  变量

\[\mathcal{T}_t = \frac{\mu}{\sqrt{0.2 \sum \limits_{i=1}^5 \sigma_i^2}} \]

服从自由度为5的t分布,其双边检验的临界值\(t_{\alpha/2,5}\)\(\alpha=0.05\)时为2.5706,\(\alpha=0.1\)时为2.0150。

4.3 McNemar检验

  对于二分类问题,使用留出法不仅可估算出学习器A(模型)和B的测试错误率,还可获得两个学习器分类结果的差别,也即两者都正确、都错误、一个正确另一个错误的样本数,如“列联表”(contingency table)所示。

若我们做的假设是两个学习器性能相同,则应有\(e_{01} = e_{10}\),那么变量\(|e_{01} - e_{10}|\)应当服从正态分布,且均值为1,方差为\(e_{01}+e_{10}\)。因此变量

\[\mathcal{T}_{\mathcal{X}^2} = \frac{(|e_{01} - e_{10}|-1)^2}{e_{01}+e_{10}} \quad (2.33) \]

服从自由度为1的\(\mathcal{X}^2\)分布,即标准正态分布变量的平方。
给定显著度\(\alpha\),当以上变量值小于临界值\(\mathcal{X}_{\alpha}^2\)时,不能拒绝假设,即认为两个学习器的性能没有显著差别;
否则拒绝假设,即认为两者性能有显著差别,且平均错误率较小的那个学习器性能较优。
自由度为1的\(\mathcal{X}^2\)检验的临界值当\(\alpha=0.05\)为3.8415,\(\alpha=0.1\)时为2.7055。

4.4 Friedman检验和Nemenyi后续检验

  交叉验证t检验和McNemar检验都是一个数据集上比较两个算法的性能,而在很多时候,我们会在一组数据集上对多个算法进行比较。当有多个算法参与比较时,一种做法是在每个数据集上分别列出两两比较的结果,而在比较时可使用前述方法;另一种方法更为直接,也即使用基于算法排序的Friedman检验。
  假定我们用\(D_1、D_2、D_3\)\(D_4\)四个数据集对算法A、B、C进行比较。首先,使用留出法或交叉验证法得到每个算法在每个数据集上的测试结果,然后在每个数据集上根据测试性能由好到坏,并赋予序值1,2,...,; 若算法的测试性能相同,则平分序值。例如,在\(D_1\)\(D_3\)上,A最好、B其次、C最差,而在\(D_2\)上,A最好、B与C性能相同,......,则可列出表2.5,其中最后一行通过对每一列的序值求平均,得到平均序值。

然后,使用\(Friedman\)检验来判断这些算法是否性能都相同。若相同,则它们的平均序值应当相同。
假定我们在N个数据集上比较k个算法,令\(r_i\)表示第\(i\)个算法的平均序值,为简化讨论,暂不考虑平分序值的情况,则\(r_i\)服从正态分布,其均值和方差分别为\((k+1)/2\)\((k^2-1)/12\)
  变量

\[\mathcal{T}_{\mathcal{X}^2} = \frac{k-1}{k} \cdot \frac{12N}{k^2-1}\sum \limits_{i=1}^k (r_i - \frac{k+1}{2})^2 \quad \quad (2.34) \]

在k和N都较大时,服从自由度为\(k-1\)\(\mathcal{X}^2\)分布。

  然而,上述这样的”原始Friedman检验“过于保守,现在通常使用变量

\[\mathcal{T}_F = \frac{(N-1)\mathcal{T}_{\mathcal{X}^2}}{N(k-1)-\mathcal{T}_{\mathcal{X}^2}} \quad \quad (2.35) \]

其中\(\mathcal{T}_{\mathcal{X}^2}\)由(2.34)得到。\(\mathcal{T}_F\)服从自由度为\(k-1\)\((k-1)(N-1)\)的F分布。

下表2.6给出了一些常用临界值。

  若”所有算法的性能相同“这个假设被拒绝,则说明算法的性能显著不同。这时需进行”后续检验“(post-hoc test)来进一步区分各算法。常用的有Nemenyi后续检验。

  Nemenyi检计算出平均序值差别的临界值域

\[CD = q_{\alpha}\sqrt{\frac{k(k+1)}{6N}}, \quad \quad (2.36) \]

下表2.7给出了\(\alpha=0.05\)和0.1时常用的\(q_{\alpha}\)值。
若两个算法的平均序值之差超过了临界值域CD,则以相应的置信度拒绝”两个算法性能相同“这一假设。

以表2.5中的数据为例,先根据(2.34)和(2.35)计算出\(\mathcal{T}_F = 24.429\),由表2.6可知,它大于\(\alpha=0.05\)时的\(F\)检验临界值5.143,因此拒绝”素有算法性能相同“这个假设。然后使用Nemenyi后续检验,在表2.7中找到k=3时\(q_{0.05}=2.344\),根据式(2.36)计算出临界值域\(CD=1.657\),由表2.5中的平均序值可知,算法A和B的差距,以及算法B和C的差距均未超过临界值域,而算法A与C的差距超过临界值域,因此检验结果认为算法A和C的性能显著不同,算法A和B、以及算法B与C的性能没有显著差别。

  上述检验比较可以直观地用Friedman检验图显示。例如根据表2.5的序值结果可绘制出图2.8,图中纵轴显示各个算法,横轴是平均序值。对每个算法,用一个圆点显示其平均序值,以圆点为中心的横线段表示临界值域的大小。然后就可从图中观察,若两个算法的横线有交叠,则说明这两个算法没有显著差别,否则即说明有显著差别。

  从下图2.8中可容易地看出,算法A与B没有显著差别,因为它们的横线段有交叠区域,而算法A显著优于算法C,因为它们的横线段没有交叠区域。

  Friedman 检验的假设是在所有数据集上“所有算法性能相同” ,若假设被拒绝则说明算
法的性能显著不同,此时就需要使用 Nemenyi 后续检验进一步比较哪些算法之间性能有显
著不同。Nemenyi 后续检验结果一般会画成图 2.8 的形式,可以直观地看出各算法性能之间
的关系。
  检验流程如下:

(二)经验误差与过拟合

  不考虑噪声,偏差很大可以认为是由模型欠拟合引起的,方差很大可以认为是由模型过拟合引起的。

  误差:更一般地,我们把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”(这里表述的误差,实际上均为误差期望。)

1.“经验误差”(empirical error)

  其中,学习器(模型)在训练集上的误差称为“训练误差”(training error)或“经验误差”(empirical error),在新样本上的误差称为“泛化误差”

  我们的目标是,希望得到泛化误差小的学习器(模型)。然而,我们事先并不知道新样本是什么样,实际能做的是努力使经验误差最小化。在很多情况下,我们可以学得一个经验误差很小、在训练集上表现很好的学习器(模型),例如甚至对所有训练样本都分类正确,即分类错误率为零,分类精度为100%,但这是不是我们想要的学习器呢? 令人遗憾的是,这样的学习器往往在多数情况下都不好。

  我们实际希望的目的,是在新样本上能表现得很好的学习器(模型)。为了达成这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的“普遍规律”,这样才能在遇到新的样本时做出正确的判别。

2. “过拟合”(overfitting)

  然而,当学习器把训练样本学得“太好”了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降。这种现象在机器学习中称为“过拟合”(overfitting)。有多种因素可能导致过拟合,其中最常见的情况是由于学习能力过于强大,以至于把训练样本所包含的不太一般的特性都学到了。过拟合是机器学习面临的关键障碍,处理起来较为麻烦,虽然各类学习算法都必然带有一些针对过拟合的措施,但必须认识到,过拟合是无法彻底避免的,我们能做的仅仅只是“缓解”(过拟合带来的影响),或者说减小其风险(对学习器造成的误差)。

3.“欠拟合”(underfitting)

  与“过拟合”相对的是“欠拟合”(underfitting),这是对训练样本的一般性质尚未学好。欠拟合通常是由于学习能力低下而造成的。欠拟合比较容易克服,例如在决策树学习中扩展分支、在神经网络学习中增加训练轮数量等。

  关于过拟合的处理,可大致这样理解:机器学习面临的问题通常是NP难甚至更难,而有效的学习算法必然是在多项式时间内运行完成,若可彻底避免过拟合,则通过经验误差最小化就能或者最优解,这就意味着我们构造性地证明了“P=NP”;因此只要相信“P!=NP”,过拟合就无可避免。

  在现实任务中,我们往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型。我们针对特定的问题,选用匹配的学习算法,使用某种参数配置,这就是机器学习中的“模型选择”(model selection)问题。
  理想的解决方案自然是针对候选模型的泛化误差进行评估,进而选择泛化误差最小的模型。然而,如上述讨论,我们无法直接获得泛化误差,而训练误差又由于过拟合现象的存在而不适合作为标准,因此我们需要引入相应的评估方法来进行模型评估与模型选择。

(三)偏差与方差

  “偏差-方差分解”(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。
  偏差—方差分解试图对学习算法的期望泛化错误率进行拆解。
我们知道,算法在不同训练集上学得的结果很可能不同,即便这些训练集是来自同一个分布。
对测试样本x,令\(y_D\)为x在数据集中的标记,y为x的真实标记,f(x;D)为训练集D上学得模型f在x上的预测输出。以回归任务为例,学习算法的期望预测

\[\overline{f}(x) = \mathbb{E}_D[f(x;D)] \quad (2.37) \\ = \frac{1}{n}(f(x;D_1)+f(x;D_2)+...+f(x;D_n)) \]

使用样本数相同的不同训练集产生的方差

\[var(x) = \mathbb{E}_D[(y_D-y)^2] \quad (2.38) \\ = \frac{1}{n} \left((f(x;D_1) - \overline{f}(x))^2 + ... + (f(x;D_n) - \overline{f}(x))^2 \right) \]

噪声

\[\varepsilon^2 = \mathbb{E}_D[(y_D-y)^2] \quad (2.39) \\ = \frac{1}{n}((y_{D_1}-y)^2 + ... + (y_{D_n}-y)^2) \]

期望输出与真实标记的差别称为偏差(bias),即

\[bias^2(x) = (\overline{f}(x) - y)^2 \quad (2.40) \]

为便于讨论,假定噪声期望为零,即\(\mathbb{E}_D[y_D-y]=0\)
通过简单的多项式展开合并,可对算法的期望泛化误差进行分解:

\[\begin{align} & E(f; D) \\ & (1)= \mathbb{E}_D\left[(f(x;D) - y_D)^2\right] \\ & (2)= \mathbb{E}_D \left[(f(x;D) - \overline{f}(x) + \overline{f}(x) -y_D) \right] \\ & (3)= \mathbb{E}_D \left[(f(x;D) - \overline{f}(x))^2 \right] + \mathbb{E}_D \left[(\overline{f}(x) - y_D)^2 \right] + \mathbb{E}_D[2(f(x;D)-\overline{f}(x))(\overline{f}(x) - y_D)] \\ & (4)= \mathbb{E}_D[(f(x; D)-\overline{f}(x))^2] + \mathbb{E}_D[(\overline{f}(x-y_D)^2)] \\ & (5)= \mathbb{E}_D[(f(x;D) - \overline{f}(x))^2] + \mathbb{E}_D[(\overline{f}(x) - y + y - y_D)^2] \\ & (6)= \mathbb{E}_D[(f(x;D) - \overline{f}(x))^2] + \mathbb{E}_D[(\overline{f}(x)-y)^2] + \mathbb{E}_D[(y-y_D)^2] + 2\mathbb{E}_D[(\overline{f}(x)-y)(y - y_D)] \\ & (7)= \mathbb{E}_D[(f(x; D)-\overline{f}(x))^2] + (\overline{f}(x)-y)^2 + \mathbb{E}_D[(y_D-y)^2] \quad \quad (2.41) \\ \end{align} \]

推导说明:
(1)这是期望泛化误差的定义式,类似地,可直观地写为

\[\mathbb{E}_D[(f(x;D)-y_D)^2] = \frac{1}{n}((f(x;D_1)-y_{D_1})^2 + ... +(f(x;D_1)-y_{D_1})^2) \]

我们只能使用数据集中的标记\(y_D\)评估学习器泛化性能,因为真实标记\(y\)
(2)常用的配项技巧,减去\(\overline{f}(x)\)再加上\(\overline{f}(x)\)就是乘开,把式子的括号去掉;
(3)令\(a = f(x;D)- \overline{f}(x)\),\(b=\overline{f}(x)-y_D\),则\((a+b)^2 = a^2 + 2ab + b^2\),再结合数学期望的性质\(\mathbb{E}[X+Y] = \mathbb{E}[X]+\mathbb{E}[Y]\)即可。
(4)只须证明第三个等号最后一项目等于0;首先

\[\begin{align} &\mathbb{E}_{D}[2(f(x;D) - \overline{f}(x))(\overline{f}(x - y_D)] \\ &= \mathbb{E}_D[2(f(x;D) - \overline{f}(x))\overline{f}(x)] - \mathbb{E}_D[2(f(x;D) - \overline{f}(x))y_D] \end{align} \]

这就是使用了数学期望的性质\(\mathbb{E}[X+Y] = \mathbb{E}[X] + \mathbb{E}[Y]\)
对于第1项

\[\begin{align} & \mathbb{E}_{D}[2(f(x;D) - \overline{f}(x))\overline{f}(x)] = \mathbb{E}_D[2f(x;D)\overline{f}(x) - 2\overline{f}(x)2\overline{f}(x)] \\ & = 2\mathbb{E}_D[f(x;D)]\overline{f}(x) - 2\overline{f}(x)2\overline{f}(x)\\ & = 2\overline{f}(x)2\overline{f}(x) - 2\overline{f}(x)2\overline{f}(x) = 0 \end{align} \]

对于第2项

\[\begin{align} & \mathbb{E}_D[2(f(x;D) - \overline{f}(x))y_D] = \mathbb{E}_D[2f(x;D)y_D - 2\overline{f}(x)y_D] \\ & = \mathbb{E}_D[2f(x;D)y_D] - \mathbb{E}_D[2\overline{f}(x)y_D] \\ & = 2\mathbb{E}_D[f(x;D)]\mathbb{E}_D[y_D] - 2\overline{f}(x)\mathbb{E}_D[y_D] \\ & = 2\overline{f}(x)\mathbb{E}_D[y_D] -2\overline{f}(x)\mathbb{E}_D[y_D] = 0 \end{align} \]

由于最后一项等于0,代入即得(4)
(5)类似于(2),对第二项使用了配项技巧;
(6)类似于(3),对第二项使用了性质\(\mathbb{E}[X+Y] = \mathbb{E}[X] + \mathbb{E}[Y]\);
(7)只须证明第(6)最后一项等于0;由于\(\overline{f}(x)\)\(y\)均为常量,因此

\[\begin{align} & 2\mathbb{E}_D[(\overline{f}(x)-y)(y-y_D)] = 2(\overline{f}(x) - y)\mathbb{E}_D[(y-y_D)] \\ & = 2(\overline{f}(x) - y)(y-\mathbb{E}_D[y_D]) \\ & = 2(\overline{f}(x)-y)(y-y) = 0 \end{align} \]

结合上面的讨论,于是就有

\[E(f; D) = bias^2(x) + var(x) + \varepsilon^2 \quad \quad (2.42) \]

也就是说,泛化误差可分解为偏差、方差与噪声之和。

这里回顾偏差、方差、噪声的含义:
 偏差:度量了学习算法的期望预测与真实结果的偏离程度,也即刻画了学习算法本身的拟合能力;
  期望输出与真实标记的差别称为偏差

\[bias^2(x) = (\overline{f}(x) - y)^2 \quad \quad (2.40) \]

 方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。

\[var(x) = \mathbb{E}_D \left[(f(x;D) - \overline{f}(x))^2\right] \quad \quad (2.38) \]

 噪声:表达了当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

\[\varepsilon^2 = \mathbb{E}_D[(y_D-y)^2] \quad (2.39) \]

  偏差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。
  
  一般来说,偏差与方差是有冲突的,这种冲突称为偏差-方差窘境(bias-variance dilemma)。
  给定学习任务,假设我们能控制学习算法的训练程度,则在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时偏差(bias)主导了泛化错误率; 
随着训练程度的加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐主导了泛化错误率;
  在训练程度充足后,学习器的拟合能力已非常强,训练数据发生的轻微扰动都会导致学习器发生显著变化,
  若训练数据自身的、非全局的特性被学习器学到了,则将发生过拟合。

——————
参考材料:
[1] 周志华著《机器学习》
[2] 西瓜书开源学习笔记
[3] 机器学习模型性能评估方法 

posted @ 2021-04-07 00:47  Xu_Lin  阅读(205)  评论(0编辑  收藏  举报