logo头像

不忘初心,奋力前行

机器学习第2章:模型评估和选择(model evaluation and selection)笔记

本文于318天之前发表,文中内容可能已经过时,如有问题,请联系我。

西瓜书阅读知识点整理

第2章 模型评估与选择

评估方法

  1. 学习器的实际预测输出与样本的真实输出之间的差异称为“误差”,其中在训练集上的误差称为“训练误差(training error)”或“经验误差(empirical error)”;在新样本上的误差称为“泛化误差(generalization error)”。往往训练误差为0的方法泛化误差都很大。
  2. 上述种训练误差极其小的往往泛化误差很大,称之为过拟合;反之对训练样本的一般性质尚未学好,就是欠拟合。欠拟合可以通过增加训练轮数等方式来解决,但是过拟合无法解决,只能缓解。
  3. 评估一种机器学习方法的时候,要保证测试集和训练集尽可能不一样。当我们含有一个包含有m个样例的数据集的时候,可以用下面的方法产生训练集S和测试集T:

    • 留出法。直接将数据集D划分为两个互斥的集合,其中一个集合为训练集S,另一个为测试集T,即D=S∪T,且S∩T=∅。要注意:一方面,训练集合测试集的划分要尽可能保持数据分布的一致性,避免数据划分过程中引入额外的偏差对最终结果产生影响。另一方面,即便在给定训练集和测试集样本比例后,仍存在多种划分方式对初始数据集进行分割。不同划分会导致不同的训练集/测试集,模型评估的结果也会有差别。因此一般使用留出法时,要采用若干次随机分隔、重复进行试验评估后取平均值作为留出法的评估结果。
      另外还有一个问题就在于,如果令S包含大多数样本,则训练出来的模型可能更接近于用D训练出来的模型,但由于T较小,评估结果可能不够稳定准确;若令测试集多一些样本,则训练集S与D差别更大了,被评估的模型与用D训练出来的模型相比可能有较大差别,从而降低了评估结果的保真性。一般是将2/3~4/5的样本用于训练,剩余样本用于测试。
    • 交叉验证法。先将数据集D划分为k个大小相似的互斥子集,即D=D1∪D2∪…∪Dk,且Di∩Dj=∅(i≠j)。每个子集尽可能保持数据分布的一致性。然后每次用k-1个子集的并集做训练集,余下那个做测试集。这样就可以获得k组训练集/测试集,从而可以进行k次训练和测试,最终返回这k个厕所结果的平均值。k最常取指是10,此时称为10折交叉验证。同上,因为划分子集用多种方法,为了减少差别,k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证的结果的均值。常见有10次10折交叉验证
    • 留一法(Leave-One-Out,简称LOO)。假设数据集D中包含m个样本,若令k=m,就是留一法。优点是:它不受随机样本划分方式的影响;使用训练集与初始数据集相比只少了一个样本,使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似。但是缺点是:在数据集较大的时候,训练m个模型的计算开销是难以忍受的;另外留一法估计的结果未必永远比其他方法准确。
    • 自助法。直接以自助采样法(bootstrap sampling)为基础,给定包含m个样本的数据集D,对它进行采样产生数据集D’:每次随机从D中挑选一个样本,将其拷贝放入D’,再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行m次以后,就得到了包含m个样本的数据集D’。这样约有36.8%的样本没有出现在D’中,所以可以将D’用作训练集,D/D’(就是将D中除去D’的样本)用作测试集。这样,实际评估的模型与期望评估的模型都使用m个训练,而我们仍有数据总量约1/3的、没在训练集中出现的样本用于测试。这样的测试结果称为包外估计(out-of-bag estimate)。该方法在数据集较小、难以有效划分训练集和测试集的时候很有用,且对集成学习等方法有很大好处。但是这个方法改变了初始数据集的分部,会引入估计偏差,所以在初始数据多的情况下,留出法和交叉验证法更常用。
  4. 模型评估与选择种用于评估测试的数据集常被称为“验证集”。例如在研究对比不同算法泛化性能的时候,用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集进行模型选择和调参。

性能度量

性能度量反映了任务需求,用来衡量模型泛化能力。在对比不同模型能力时,使用不同的性能度量往往会导致不同的评判结果。
回归任务中用的是均方误差(mean squared error),也就是

575654d237f8d3923a6fea2d1c369c36.png
以上是对于数据分布D和概率密度函数p()来说的。

在分类任务重常用的性能度量有:

  1. 错误率与精度。

0b1cdc20bf9e85113091592181d7c9bc.png

  1. 查准率(准确率Precision)、查全率(召回率,Recall)和F1。

查准率定义为:认为真且确实为真的样本数/(认为真切确实为真+认为真但是为假)

查全率定义为:认为真且确实为真/(认为真且确实为真+认为假但是为真)。
官方写法如下:

48c33effa6d5265d20a3d6d5ad296474.png

查准率和查全率是一对矛盾的度量,除非非常简单的任务,否则不可能使查全率和查准率都很高。

64efca21029c26c161f8c9cfefe0ca0e.png

P-R图直观显示出学习器在样本总体上的查全率和查准率。若一个学习器的P-R曲线被另一个学习器的曲线完全包住,则可断言后者的性能优于前者(例如A优于C),但是如果两个曲线发生了交叉,就难以一般性断言两者的性能,只能在具体的查准率或查全率条件下进行比较
平衡点(Break-Even Point,简称BEP)是查准率=查全率时的取值。基于BEP的比较,可以认为图中的A优于B。
F1变量是基于查准率与查全率的调和平均,定义如下:

cf28964757a317b1485ced94d37d41b4.png

但是由于某些情况下,对于查准率和查全率的重视程度可能不同,F1有了一般形式,即Fβ,它是查准率与查全率的加权调和平均,定义如下:
23a289f3f1629b347034292060fac6e5.png

β值恒大于0,当β>1的时候,查全率有更大影响;当β<1的时候,查准率有更大影响。

很多时候我们有多个二分类混淆矩阵,我们希望估计算法的“全局”性能,这样有两种方法。一种方法是现在各混淆矩阵上分别计算Recall和Precision,分别即为(P1,R1),(P2,R2)…,(Pn,Rn),再计算平均值,这样就得到宏查准率(macro-P),宏查准率和相应的宏F1:

962695631d0fa96178149de3b0b0852d.png

  1. ROC和AUC
    很多学习器是为测试样本产生一个实值或者概率预测,然后将这个预测值与一个分类阈值进行比较,若大于阈值则分为正类,否则为反类。这个实值或概率预测结果的好坏,直接决定了学习器的泛化能力。实际上,根据这个值我们可以将测试样本进行排序,“最可能”是正例的排在最前面,“最不可能”的是正例的排在最后面。这样,分类过程就相当于在这个排序中以某个“截断点”将样本分为两部分,前一部分判作正例,后面是反例。排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能“的好坏,或者说,一般情况下“泛化性能的好坏”。ROC曲线就是从这个角度来研究学习器泛化性能的工具。

ROC全称是“受试者工作特征”(Receiver Operating Characteristic)曲线。ROC曲线的纵轴是真正例率(True Positive Rate,TPR),横轴是假正例率(False Positive Rate, FPR)。两者定义分别是
c8b2c40b4d0a2e8aa87d09e3829eb115.png
若一个学习器的ROC曲线被另一个学习器的曲线包住,则另一个学习器性能优于前者。如果两个学习器的ROC曲线发生交叉,则难以一般性判断两者孰优孰劣,此时如果一定要进行比较,则较为合理的判据是比较ROC曲线下的面积(AUC,Area Under ROC Curve)

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

不同类型的错误造成结果的严重程度不同。所以为了权衡不同类型错误所造成的不同损失,可以为错误赋予非均等代价(unequal cost)
例如我们可以对一个二分类代价矩阵做以下处理:
548e26f9cfb59287be0613ef9c919563.png

一般情况下,重要的是代价比而不是绝对值

若将上面的第0类和第1类分别作为正类和反类,令D+和D-分别代表样例集D的正例自己和反例子集,则代价敏感(cost-sensitive)的错误率为
f94597c52e09c384af9b8c4337814201.png
类似的,可以给出基于分布定义的代价敏感错误率,以及其它一些性能度量,如京都的代价敏感版本。若令costij中的i,j取值不限于0/1,则可以定义出多分类任务的代价的敏感性能度量。
9e46c41b9494ad1ace80b3169b6c249c.png

比较检验

机器学习中性能检验涉及了以下几个重要因素:

  • 我们要比较泛化性能,然而实验评估的是在测试集上的性能,测试集和泛化的性能未必相同。
  • 测试集上的性能与测试集的选择有很大的关系,不同大小测试集、同样大小测试集的样例不同,测试结果都会不同。
  • 很多机器学习算法具有随机性,即便相同参数在同一测试集上运行,多次运行结果可能也不一样。

统计假设检验(Hypothesis Test)可以提供给我们一些帮助,基于此,若在测试集上观测到A性能好于B,则A的泛化性能在统计意义上优于B,还能得到这个结论的把握有多大。(下面以错误率为性能度量,以ε表示)

1.假设检验
假设是对学习器泛化错误率分布的某种判断或猜想。包含m个样本的测试集上,基于假设测试样本是从样本总体分布中独立采样的,那么泛化错误率为ε的学习器将其中m’个样本五分类,其余样本全都分类正确的概率是
d97ce96148fd14c8252d7fa9479653b0.png

由此可以估算其恰将ε’xm个样本误分类的概率如下式所示,这也表达了在包含m个样本的测试集上,泛化错误率为ε的学习器被测得测试错误率为ε’的概率:
32c80883d26f918be70b7a15c5af83b5.png

给定测试错误率,则对上式求对ε的偏导,并令其等于0可得到P在ε=ε’时最大,|ε-ε’|增大时P减小,这符合二项分布。
我们可以使用二项检验(Binomial Test)对ε<=0.3(即泛化错误率是否不大于0.3)这也的假设来进行检验。更一般来说,我们考虑假设ε小于等于ε0,则在1-α概率内所能观测到的最大错误率如下式计算。这里1-α反映了结论的置信度(confidence)。
35aec645c834b1b86eac4f6fb1404a80.png

此时若测试错误率ε’小于临界值,则可以根据二项检验得到:在α显著度下,假设“ε≤ε0”不能被拒绝,即能以1-α的置信度认为,学习器的泛化错误率不大于ε0;否则该假设可被拒绝,即在α显著度下可认为学习器的泛化错误率大于ε0

二项检验的临界值可以使用icdf('Binomial',1-α,m,ε0)来计算得到。

在很多时候,我们并非做一次留出法估计,而是多次重复留出法或者交叉验证法进行多次训练测试,这样会得到多个测试错误率,此时可以使用t检验来求解。

2.交叉验证t检验

3.McNemar检验
对于二分类问题,使用留出法不仅可以估计出学习器A和B的测试错误率,还可以获得两学习器分类结果的差别,即两者都正确、都错误、一个正确一个错误的样本数,如下表所示。

算法B 算法A 算法A
正确 错误
正确 e00 e01
错误 e10 e11

若我们做的假设是两个学习器性能相同,也就是说e01=e10,那么|e01-e10|应该服从正态分布。McNemar检验考虑变量

因为e01+e10通常很小,需要考虑连续性校正,所以分子中有-1一项。这个服从的分部就是卡方分布。临界值在Matlab中可以使用icdf('Chisquare'1-α,k-1)来计算。

4.Friedman检验和Nemenyi检验
在一组数据及上对多个算法进行比较时,有两种方法:一是两两比较,在两两比较可以使用前面的方法;二是使用基于算法排序的Friedman检验。若“所有算法的性能相同”这个假设被拒绝,则说明算法的性能显著不同。这个时候需要使用“后续检验(post-hoc test)”来进一步区分算法,常用的有Nemenyi算法。

偏差与方差

前面的检验是为了估计其泛化性能,而我们还希望了解它为什么具有这样的性能,偏差-方差分解(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。它试图对学习算法的期望泛化错误率进行拆解。我们知道,算法在不同训练集上学得的结果很可能不同,即便这些训练是来自同一个分布。
86f8e5ddb1307583f21e4d75708f259e.png
846f51d9edf4a63569ae423c016f1a25.png

总结一下,偏差(2.40)度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的你和能力;方差(2.38)度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;噪声(2.39)则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。偏差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性和学习任务本身的难度共同决定的。给定学习任务,为了取得较好的泛化性能,则需要使偏差较小,即能够充分拟合数据,方差较小。使得数据扰动产生的影响小。

支付宝打赏 微信打赏 QQ钱包打赏

感觉不错?欢迎给我 打个赏~我将不胜感激!