西瓜书第二章的笔记,本章主要是如何评估一个学习算法的各种方法,类似传统算法书中用时间复杂度和空间复杂度来评估类似,机器学习算法的评估要复杂得多。
一、基本概念
错误率(error rate)-分类错误的样本数占样本总数的比例,在m个样本中有a个样本分类错误,则错误率E=a/m,则精度(accuracy)为1-a/m。
误差(error)-学习算法在实际预测输出与样本的真实输出之间的差异,在训练集上的误差称为“训练误差(training error)”或“经验误差(empirical error)”,在新样本上的误差称为“泛化误差(generalization error)”。
过拟合(overfitting)-学习器把训练样本自身的特点当作了所有潜在样本都具有的一般性质,导致泛化性能下降。与之相对是欠拟合(underfitting)。
测试集(testing set)-用于测试学习器的泛化误差的样本集。
验证集(validation set)-模型评估与选择中用于评估测试的数据集,验证集一般用于调参。
二、评估方法
留出法(hold-out)-直接将数据集D划分为两个互斥的集合,分别是训练集S和测试集T,在S上训练模型,用T来评估测试误差作为对泛化误差的估计。
在采用留出法时训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的差别而对最终结果产生影响,从采样角度来看数据集的划分过程,保留类别比例的采样方式通常称为“分层采样”。并且因为单次留出法得到的估计结果往往不稳定可靠,所一般要采用若干次随即划分、重复进行实验评估后取平均值作为留出法的评估结果。
留出法面临S和T的划分矛盾,即S过大则模型更接近于D的训练结果但是T的评价结果不准确,T过大则S和D的差别扩大,降低评估结果的保真性。
交叉验证法(cross validation)-将数据集D划分为k个大小相似的互斥子集,即,每个子集Di都尽可能保持数据分布的一致性,每次用k-1个子集的并集作为训练集,余下的作为测试集,这样可以进行k次训练和测试,最终返回k个测试结果的均值。该方法又称k折交叉验证(k-fold cross validation)。
为减少因样本划分不同引入的差别,k折交叉验证通常要随机使用不同的划分重复p次,最终评估结果取均值。
留一法(leave-one-out)属于交叉验证法的特例,假定数据集D中包含m个样本,若令k=m便是留一法,且留一法不受样本划分方式的影响,留一法的缺点是当数据量较大时训练m个模型开销过大。
自助法(bootstrapping)-一种可以减少训练样本规模不同造成的影响,同时还能比较高效的进行实验评估的方法。给定包含m个样本的数据集D,我们对其进行有放回的随机抽取,获得数据集C,重复执行m次后,得到一个包含m个样本的数据集C,通过自助采样,D中约有36.8%的样本不会出现在C中。自助法在数据集较小、难以有效划分训练/测试集时很有用。
三、性能度量
先列举一些接下来要用的假设量,样例集,其中
是示例
的真实标记,学习算法f,要评估其性能则其预测结果f(x)与真实标记y进行比较,下面介绍一些简单的指标。
均方误差(mean squared error)-回归任务最常用的性能度量
更一般的,对于数据分布D和概率密度函数p(x),均方差描述为
错误率
其中是指示函数,x为真时取1否则取0,精度定义为
而对于数据分布D和概率密度函数p(x),错误率和精度可以描述为
查准率(precision)-检索出来的信息中有多少是需要的。
查全率(recall)-需要的信息由多少被检索出来。
对于二分类问题,可将样例根据其真是类别与学习器预测类别的组合划分为真正例(true positive)、假正例(false positive)、真反例(true negative)、假反例(false negative),则查准率P和查全率R可以分别定义为,查全率和查准率是一对矛盾值:
根据查全率和查准率可以画出P-R图,P-R图直观地显示出学习器在样本总体上的查全率、查准率,可以用于比较学习器之间的性能,从图上可用曲线覆盖面积来进行比较还可以使用平衡点(break-even point)-查准率=查全率进行比较,更长用的是F1度量。
F1度量是基于查准率和查全率的调和平均
F1的更一般形式Fβ可以反映对查全率和查准率的不同偏好,Fβ是查全率和查准率的加权调和平均,定义为
β>1时查全率有更大影响,β<1时查准率有更大影响。对于多分类任务,当我们需要n个二分类混淆矩阵上综合考察查准率和查全率。一种是先在各混沌矩阵上分别计算再求平均,便可得到宏查准率(macro-P)、宏查全率(macro-R)、宏F1(macro-F1):
也可以先分别计算TP、FP、TN、FN等值,再计算出微查全率(micro-R)、微查准率(micro-P)、微F1(micro-F1)。
许多学习算法会为样本产生一个概率值,根据概率值是否达到阈值来进行分类,那么我们可以将所有的样本根据其概率值进行排序,排列本身的质量好坏,体现了综合考虑算法在不同任务下的“期望泛化性能”的好坏,可以理解为如果我们将样本按照真实分类排序即正例在前反例在后那么更好的算法可以使样本更靠近真实排序,ROC曲线是研究排序质量的有力工具。真正例率(True Positive Rate,TPR)和假正例率(False Positive Rate,FPR)是绘制ROC曲线的关键量,分别定义为
ROC曲线的绘制过程,首先将样本按预测概率排序,然后按顺序逐个选择某个样本,将该样本之前的样本均视为正例之后的样本视为反例,计算TPR和FPR,以TPR为纵轴、FPR为横轴,根据样本点可以绘制出ROC曲线,根据比较ROC曲线与横轴所围面积AUC的大小可以判断两个学习算法的性能优劣。因为TPR和FPR的取值都在0-1之间,所以ROC曲线坐标轴所围成的总面积为1,AUC考虑的是样本预测的排序质量,而排序的误差可以定位为排序的损失,也就是对排序的误差进行量化得到,对于给定的m+个正例和m-个反例,令D+和D-分别表示正、反例集合:
对于模型的预测结果,我们往往有不同的重视程度即代价,从代价的角度来衡量一个模型,从二分类任务来看,错误预测才会有代价,我们将真实类别为第0类而预测为第1类所产生的代价定义为cost01,而真实类别为第1类被预测为第0类的结果的代价定义为cost10,则代价敏感错误率为
类似可以定义其他的评估量,ROC曲线在代价敏感下不能很好的反映模型的性能,通过代价曲线则可以,代价曲线的横轴是取值为0-1的正概率代价Pcost,纵轴costnorm是取值为0-1的归一化代价。
根据ROC曲线上的每个点,可以计算出FNR=1-TPR,然后在代价平面上绘制一条从(0,FPR)到(1,FNR)的线段,线段下的面积即表示该条件下的期望总代价,所有线段的下界所围成的面积即为学习器期望的总代价。
四、比较检验
不管我们用什么评估量去衡量学习模型,我们都只是在用测试集上的结果和统计量去逼近真实的结果和泛化误差,所以为了进行学习器之间的性能比较即上述统计量所反映的差别是否可以是真正的差别,统计假设检验可以成为重要的依据。假设检验是概率论中内容这里不再赘述,仅介绍一下统计量和验证方法。
通过测试错误率来逼近泛化错误率的假设检验
对于普通一次测试得到的错误率去估计泛化错误率,用简单的二项检验便可。对于多次训练/测试,可使用t检验,首先算出错误率的平均值和方差,则有统计量
符合自由度为k-1的t分布,式中u是均值,是方差的开方,
为泛化错误率,该统计量可用于验证均值等于泛化错误率这一假设。
交叉验证t检验
k折交叉验证法会进行k次训练和测试,得到k个测试错误率,对于两个学习算法,若他们的第k次测试错误率相同则可认为他们性能相同,记每次测试错误率的差值,并计算其均值和方差,对其进行t检验,检验假设为均值为0,若假设可接受则认为两个学习算法性能没有显著差异。
McNemar检验
对于二分类问题有分类差别列联表,根据列联表可以验证两个学习算法性能上的差距。
![](https://i-blog.csdnimg.cn/blog_migrate/6d78ad1a7c788481056c412eb6b50eec.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6a72cc9b830200f841098756709438f9.png)
FriedMan检验和Nemenyi后续检验
上述检验都是在一个数据集上比较两个算法的性能,当需要对比多个算法的性能时就要用到FriedMan检验和Nemenyi后续检验,通过对多个算法在多个数据集上的测试性能进行排序,并求得每个算法的平均序值ri,根据平均序值,可检验变量
该变量在k和N较大时,服从自由度为k-1的卡方分布。
另一个变量是
该变量服从自由度为k-1和(k-1)(N-1)的F分布,该两个变量用于检验假设“所有的算法性能相同”,若该假设被拒接则Nemenyi后续检验来区分各算法,需要计算平均序列差别的临界值
若两个算法的平均序值之差超出临界值CD,则拒绝两个算法性能相同的假设。
五、总结
最后通过对泛化误差的“偏差-方差分解”了解到泛化误差可分解为偏差、方差与噪声之和。
第二章总体来说介绍了如何测评学习算法的性能和如何比较各算法的性能差别,是学好机器学习的重要基础。