机器学习(西瓜书) 第二章 模型评估与选择
作者前言:本章内容是作者阅读《机器学习》(周志华)(网友戏称“西瓜书”,因为本书作者从第一章开始便通过如何辨别好的西瓜的例子来剖析机器学习的实质。)及相关资料写的。笔者在写此博客前,也看到了网上发布了大量相关此书的读书笔记,但翻来看去发现存在公式放的较多、大量拍摄书上的内容照片直接贴图等情况,不太适合新手阅读。故,作者写下此篇博客。笔者尽可能简化公式或者不放公式,读者在阅读过程中不要过于纠结看懂里面的数学公式,只需搞懂里面各种的作用,内在大致的缘由即可。
PS:本书的第一章是绪论,里面大都是一些导论及机器学习的发展历史,没有过多的知识点,故从本书的第二章开始,一直持续更新。(但为了避免新手可能不太能看懂,后续我会更新一下第一章来说明一下机器学习的常用术语)
目录
一、经验误差与过拟合
二、评估方法
1、留出法
2、交叉验证法
3、自助法
三、调参与最终模型
四、性能度量
1、错误率与精度
2、查准率(精确率)、查全率(召回率)与F1值
3、ROC与AUC
4、代价敏感错误率与代价曲线
五、比较检验
1、假设检验
(1)单个学习器泛化性能的假设检验
a、二项检验(基于二项分布)
b、t检验(基于t分布)
(2)针对不同学习器的性能进行假设检验
a、交叉验证t检验
b、McNemar检验
c、Friedman检验和Nemenyi后续检验
六、偏差与方差
一、经验误差与过拟合
错误率:模型预测的错误样本数占样本总数的比例
精度=1-错误率
误差:学习器的实际预测输出与样本的真实输出之间的差异
经验误差(训练误差):学习器在训练集上的误差
泛化误差:在新样本上的误差
过拟合:学习器把训练样本学习得“太好了”的时候,很可能已经把训练样本自身的一些特点作了所有潜在样本都会具有的一般性质,导致泛化性能下降。
欠拟合:没有学习到训练样本的一般性质,与过拟合相对
过拟合是模型的学习能力太过于强大,以至于把训练样本所包含的特殊的特性都学到了;欠拟合是学习能力低下造成的。
注:欠拟合可以通过增加训练轮数,扩展分支即可解决;但过拟合很麻烦,无法彻底避免,只能“缓解”。
二、评估方法
通过实验测试对学习器的泛化误差进行评估并进而做出选择(是否选择使用该学习器),需使用一个“测试集”来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”作为泛化误差的近似。测试样本与训练样本需要互斥且都需要遵循独立同分布。
1、留出法
原理:将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,即D=S∪T ,S∩T=∅. 在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。
注意:训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。(例:在分类任务中至少要保持样本的比例相似,如果从采样的角度来看待数据集的划分过程,需要采用分层采样。)
单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。(例如:进行100次随机划分,每次产生一个训练/测试集用于实验评估,100次后就得到100个结果,而留出法返回的则是这个100个结果的平均。)
PS:但需要注意的是训练集S如果包含绝大多数样本时,训练出来的模型可能接近于数据集D训练出来的模型,但由于测试集T比较小,评估结果可能不够稳定准确;若令测试集T多包含一些样本,则训练集S与D差别更大,被评估的模型与用D训练出来的模型相比可能有较大差别,从而降低了评估结果的保真性。此问题没有完美的解决方案,常见的做法是73、82划分法则(73划分法则:70%划为训练集,30%划为测试集;82划分法则:80%划为训练集,20%划为测试集)
2、交叉验证法
原理:先将数据集D划为k个大小相似的互斥子集,即D=D1∪D2...∪Dk,Di∩Dj=∅(i≠j),每个子集都是从D中通过分层采样得到。然后,每次用k-1个子集的并集作为训练集,余下的那个自己作为测试集;这个有k组的训练集/测试集,从而进行k次训练和测试,最终返回的是这个k个测试的结果的均值。
注:
交叉验证法评估结果的稳定性和保真性在很多程度上取决于k的取值(k折交叉验证)。k最常用的取值是10,此时为10折交叉验证。其他常用的k值有5、20等。
与留出法相似,为减少因样本划分不同而引入的差别,k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值。(例:10次10折交叉验证,与100次留出法都是进行了100次训练/测试)
3、自助法
目的:解决因训练样本不同而导致的估计偏差
原理:给定包含m个样本的数据集D,我们对它进行采样产生数据集D':每次随机从数据集D中挑选出一个样本,将其拷贝放入数据集D',然后再将该样本放回数据集D中,使得该样本在下次采用时还能被采到;这个过程重复执行m次后,我们就得到包含了m个样本的数据集D',这就是自助采用的结果(D'作为训练集,D-D'(“-”为集合减法)作为测试集)。
数据集D中会有一部分的样本在D'中多次出现,有一部分样本不出现。通过计算(有一个求极限的公式可以计算出来,为避免读者绕晕这里不给出,只需知道即可)大约为36.8%(约1/3的数据总量没有在训练集中出现且用于测试,这样的测试结果为“包外估计”。)
注:
自助法在数据集较小且难以有效划分训练/测试集的情况下很有用;
自助法从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大好处
自助法产生的数据集改变了初始数据集的分布,会引入估计偏差,这时不太适合使用自助法。在初始数据量足够时,留出法和交叉验证法更常用一些。
三、调参与最终模型
调参:学习模型的参数设定
注:
机器学习模型常涉及两类参数:一类是算法的参数(超参数),参数数目常在10以内;另一类是模型的参数,数目可能很多,例如:大型“深度学习”模型有上百亿个参数。前者调参是通过人工设定多个参数候选值后产生模型,后者则是通过学习来产生多个候选模型。
包含m个样本的数据集D,在模型评估和选择的过程中需要留出一部分数据来进行评估测试。故,事实上我们没有使用完整的数据集D来进行训练。在确认了相应模型参数后,要用完整数据集D来进行重新训练这个模型
我们通常把学习好的模型进行实际的使用中遇到的数据称为测试集,为进行区分:模型与评估与选择用于评估测试的数据称为验证集。故,在实际使用模型去验证模型的泛化能力的数据称为测试集,而把训练数据另外划分为训练集和验证集。
四、性能度量
性能度量:对学习器(学习模型)的泛化性能进行评估,衡量模型泛化能力的评价标准
回归任务中最常用的性能度量“均方误差”(RSE、MSE等),本书重点是讲解了分类任务中常用的性能度量。若读者对回归任务的常用性能度量需自己查阅资料,笔者在后面讲解回归任务的模型时也会加入介绍。
1、错误率与精度
分类任务中最常用的两种性能度量,既适合二分类任务,也适用于多分类任务。
错误率:分类错误的样本数占样本总数的比例
精度=1-错误率(分类正确的样本数占样本总数的比例)
2、查准率(精确率)、查全率(召回率)与F1值
对于二分类问题,可以根据真实类别与学习器预测类别的组合划分为真正例(TP)、假正例(FP)、真反例(TN)、假反例(FN),具体理解见下图:
查准率(精确率)= TP/(TP+FP) :在预测为正向数据中,有多少实际是正向的比例(挑选出来的东西,有多少比例是正向的。举个例子:挑选西瓜时有好瓜和坏瓜之分,查准率就是挑选出来的西瓜,有多少比例是好瓜。)
查全率(召回率)= TP/(TP+FN) :在实际为正向的数据中,有多少预测是正向的比例(所有正向数据有多少比例被挑选出来。举个例子:挑选西瓜时有好瓜和坏瓜之分,查全率就是所有好瓜,有多少比例被挑选到了。)
查准率和查全率是一对矛盾的度量,一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低;
P-R曲线(查准率-查全率曲线):在很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为“最可能”是正例的样本,排在最后的则是学习器认为“最不可能”是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率。以查准率为y轴,查全率为x轴作图,就得到了此曲线图(下图是三个学习器的P-R曲线图)。
P-R图直观显示出学习器在样本总体上的查全率、查准率:在进行比较时,若一个学习器的P-R曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者。但很少存在完全包住的情况,大多都是发生交叉情况。故,此时需要借助平衡点指标。
平衡点(BEP):查准率=查全率时的取值,例如:上图中的学习器C的BEP为0.64,,基于BEP的比较,可认为学习器A优于B。
但BEP过于简单了些,更常用的是F1值:在一些应用中,对查准率和查全率的重视程度有所不同,F1值的一般形式Fβ能表达出对查准率/查全率的不同偏好。F1值是基于查准率和查全率的调和平均定义的,Fβ是加权调和平均定义的。(这里的公式可以看一下,但不要过于执着。其中的P是查准率,R是查全率。)
- β>0度量了查全率对查准率的相对重要性;
- β=1时退化为标准的F1
- β>1时查全率有更大影响
- β<1查准率有更大影响
很多时候,有多个二分类的混淆矩阵(进行多次训练/测试,每次得会到一个混淆阵),若此时需要评估算法的“全局性能”,直接的做法就是计算每个混淆矩阵的查准率和查全率,再计算其平均值,得到宏查准率、宏查全率、宏F1值;也可以对各混淆矩阵对应的元素进行求平均,得到TP、FP、TN、FN的平均值,再基于这些平均值计算出微查准率、微查全率、微F1值。
3、ROC与AUC
之前我们对分类样本的预测进行排序,“最可能”是正例的排在前面,"最不可能"是正例排在后面,这样分类过程以某个“截断点”将样本分为两部分,前一部分判作正例,后一部分判作反例。在实际应用中,根据任务需求来采用不同的截断点(例如:更重视”查准率“,则可选择排序中靠前的位置进行阶段;更重视”查全率“,则可选择靠后的位置进行阶段)。一般情况下泛化性能的好坏就是通过排序本身质量的好坏。ROC曲线就是从这个角度出发来研究学习器泛化性能的有力工具。
ROC(受试者工作特征)曲线:纵轴为“真正例率(TPR)”,横轴为"假正例率(FPR)"
进行学习器的比较时,与P-R图相似,若一个学习器的ROC的曲线被另一个学习器的ROC曲线完全“包住”,则可断言后者的性能优于前者;若发生交叉时,此时要进行比较则需要通过AUC(AUC:ROC曲线下的面积)
4、代价敏感错误率与代价曲线
不同类型的判断错误所造成的后果不同(例如:错误把患者诊断为健康人与错误地把健康人诊断为患者,前者的后果是丧失拯救生命的最佳时机,后者是增加进一步检查的麻烦),为权衡不同类型所造成的不同损失,可为错误赋予“非均等代价”。
以二分类为例,可根据任务的领域知识设定一个代价矩阵。其中,costij表示将第i类样本预测为第j类样本的代价。一般来说,costii=0(预测结果与实际结果符合);若将第0类判断为第1类所造成的损失更大,则cost01>cost10;损失程度相差越大,cost01与cost10值的差别越大。
前面我们大都隐式地假设了均等代价,例如前面所定义的错误率是直接计算错误次数,并没有考虑不同错误会造成不同后果。在非均等代价下,我们所希望的不再是简单地最小化“错误次数”,而是希望最小化“总体代价”。若将表2.2中的第0类作为正类、第1类作为反类,令D+与D-分别代表样例集D的正例子集和反例子集,则“代价敏感”(cost-sensitive)错误率为
类似的,可给出基于分布定义的代价敏感错误率,以及其他一些性能度量如精度的代价敏感版本。若令cost,j中的i、j取值不限于0、1,则可定义出多分类任务的代价敏感性能度量。
五、比较检验
在某种度量下取得评估结果后,是否可以直接比较性能度量的值来评判学习器的优劣?
不行! 因为:
- 测试性能不等于泛化性能
- 测试性能随着测试集的变化而变化
- 很多算法本身一定的随机性
即只用一个数据集就说明学习器性能好坏的结论往往是不可靠的,这就需要运用统计知识统计假设检验,进而性能比较提供重要依据。
1、假设检验
假设检验中的“假设”是对学习器泛化错误率分布的某种判断或猜想,因为现实中我们并不知道学习器的泛化错误率p,只能知道其测试错误率p',泛化错误率不一定等于测试错误率。但在直观上,我们认为二者很可能接近。因此,我们可以根据测试错误率估推出泛化错误率的分布。
(1)单个学习器泛化性能的假设检验
a、二项检验(基于二项分布)
针对只做一次留出法的训练/测试得出的测试错误率进行估计:若测试错误率p'<临界值p0,在α的显著度下,假设“p≤p0”不能被拒绝,即能以1-α的置信度认为,学习的泛化错误p不大于p0(α的常用取值为0.05、0.1)。
b、t检验(基于t分布)
针对多次重复留出法或者交叉验证法等进行多次训练/测试,得到的k个测试错误率。计算平均错误率μ和方差σ²,通过服从自由度k-1的t分布 :
假设”μ=p“和显著度α,我们可计算出当测试错误率均值为p时,在1-α概率内能观测到的最大错误率,即临界值。只要平均错误率μ与p之差|μ-p|在临界值范围内,则认为假设成立,即“μ=p”
(2)针对不同学习器的性能进行假设检验
a、交叉验证t检验
注:由于样本有限,在使用交叉验证等实验估计方法时,不同轮次的训练集会出现一定程度的重叠,但此假设检验有效的前提是测试错误率均为泛化错误率的独立采样。这里,就破坏了测试错误率的独立性,会导致过高估计假设成立的概率。为缓解这一问题,采用“5×2交叉验证”。
5×2交叉验证:做5次2折交叉验证,在每次2折交叉验证之前随机将数据打乱,使得5次交叉验证中的数据划分不重复。
b、McNemar检验
目的:针对二分类问题且使用留出法的多个学习器的比较。
使用留出法可以估计出学习器A和学习器B的测试错误率,还可以获得两学习器分类结果的差别。(即:两者都正确、都错误,一个正确另一个错误的样本数,如“列联表”)
若假设“两学习器的性能相同”,则有e01=e10,那么变量|e01-e10|应当服从正态分布,且均值为1,方差为e01+e10。因此变量:
服从自由度为1的卡方分布(标准正态分布变量的平方),给定显著度α,当以上变量值小于临界值X²α时,假设成了,两学习器的性能没有显著差别。否则,平均错误率较小的那个学习器性能较优。
c、Friedman检验和Nemenyi后续检验
前面的交叉验证t检验和McNemar检验都是在一个数据集上比较两个算法的性能,而在很多时候,我们会在一组数据集上对多个算法进行比较。
两种做法:1、在每个数据集上用交叉验证t检验或McNemar检验分别列出两两比较的结果 2、使用基于算法排序的Friedman检验。
Friedman检验:假定使用D1,D2,D3,D4四个数据集对算法A、B、C进行比较,可以在4个数据集上采用留出法或交叉验证法得到每个算法在每个数据集上的测试结果,然后按照在每个数据集上根据测试性能由好到坏排序,并赋予值1,2,...;若算法的测试性能相同,则平分序值。
然后,使用Friedman检验来判断这些算法是否性能相同(若相同,则它们的平均序值相同)。可通过F检验来进行检验是否假设成立;若“所有算法的性能相同”假设被拒绝,则说明算法的性能显著不同,这时需进行“后续检验”来进一步区分各算法(常用的算法:Nemenyi后续检验)
Nemenyi后续检验 :计算出平均序值差别的临界值域
若两个算法的平均序值之差超出了临界值域CD,则以相应的置信度拒绝“两个算法性能相同”这一假设“。
如图所示是三种算法的Friedman检验图,横轴是平均序值,对每个算法用一个圆点显示其平均序值,以圆点为中心的横线段表示临界值域的大小。若两个算法的横线有交叠,则说明这两个算法没有显著差别,否则说明有显著差别。(如图所示,算法A和B没有显著差别,因为它们横线段有交叠区域,而算法A显著优于算法C,因为它们的横线段没有交叠区域且算法A的平均序值小于算法C(平均序值是根据算法的优劣从小到大排列)。)
六、偏差与方差
“偏差-方差分解”是解释学习算法泛化性能的一种重要工具
偏差:度量学习算法的期望预测与真实结果的偏离程度(刻画学习算法本身的拟合能力)
方差:同样大小的训练集的变动所导致的学习性能变化(刻画了数据扰动所造成的影响)
噪声:训练样本的标记与真实标记区别,表达了在当前任务上任何学习算法能达到的期望泛化误差的下界(刻画了学习问题本身的难度)
泛化误差=偏差+方差+噪声(为了取得好的泛化性能,需使偏差较小(能充分拟合数据),方差较小(数据扰动产生的影响小))
但偏差与方差是有冲突称为“偏差-方差窘境”。
给定学习任务,假定我们能控制学习算法的训练程度,则在训练不足,学习器的拟合能力不够,训练数据的扰动不足以使学习器产生显著变化,此时偏差主导了泛化错误率;随着训练程序的加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐主导了泛化错误率;在训练程序充足后,学习器的拟合能力已非常强,训练数据发生轻微扰动都会导致学习器发生显著变化。若训练数据自身的、非全局的特性被学习器学到了,则发生过拟合 。
PS:好的 ,如果你能看到这里,说明读者非常有毅力!恭喜你,你做什么事都会成功的。机器学习里面含有大量数学公式作为基础,对于数学不好的读者来说,理解起来难如登天。笔者希望可以尽可能简化这些公式来讲解机器学习!(我会持续更新下去,您的点赞+收藏是我更新的动力!)
一路坎坷,便是为了迎接那一刻的巅峰风景。