《机器学习》周志华西瓜书学习笔记(二):模型评估与选择

【机器学习】《机器学习》周志华西瓜书 笔记/习题答案 总目录

  • https://blog.csdn.net/TeFuirnever/article/details/96178919

——————————————————————————————————————————————————————

  • 【机器学习】《机器学习》周志华西瓜书习题参考答案:第2章 - 模型评估与选择

模型评估与选择

误差

在分类任务中,通常把错分的样本数占样本总数的比例称为错误率(error rate)。比如m个样本有a个预测错了,错误率就是E = a/m;与错误率相对的1 - a/m称为精度(accuracy),或者说正确率,数值上精度 = 1 - 错误率

更一般地,我们通常会把学习器的实际预测输出与样本的真实输出之间的差异称为误差(error)。学习器在训练集上的误差称为训练误差(training error)或者经验误差(empirical error)。而在新样本上的误差则称为泛化误差(generalization error)。显然,我们希望得到泛化误差小的学习器。所以我们希望模型的泛化误差尽可能小,但现实是,我们无法知道新样本是怎样的,所以只能尽可能地利用训练数据来最小化经验误差。

但是否经验误差小,泛化误差就一定小呢?这不是一定的,如果模型相比训练数据来说过于复杂,那就很有可能把训练样本自身的一些特点当作整个样本空间的特点,这样就会导致泛化性能下降,从而使得在训练数据上有很小的经验误差,但一旦面对新样本就会有很大误差,这种情况叫做过拟合(overfitting),亦称过配。相对的是欠拟合(underfitting),亦称欠配

《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第1张图片
有多种因素可能导致过拟合,其中最常见的情况是由于学习能力过于强大,以至于把训练样本所包含的不太一般的特性都学到了,而欠拟合则通常是由于学习能力低下而造成的。

欠拟合比较容易克服,只要适当地增加模型复杂度(比方说增加神经网络的层数或者训练轮数,扩展决策树学习中的分支)就好。但过拟合是无法彻底避免的,我们所能做的只是缓解,或者说减小其风险(比如减少模型复杂度/增加训练数据),这也是机器学习发展中的一个关键阻碍。

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

P类问题:存在多项式时间算法的问题。
NP类问题:能在多项式时间内验证得出一个正确解的问题。
P类问题是NP问题的子集,因为存在多项式时间解法的问题,总能在多项式时间内验证它,但是存在多项式时间验证解的问题未必都能存在多项式时间算法。

在现实任务中,我们往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型,那么,我们该选用哪一个学习算法、使用哪一种参数配置呢?这就是机器学习中的**模型选择(model selection)**问题。.理想的解决方案当然是对候选模型的泛化误差进行评估,然后选择泛化误差最小的那个模型。既然泛化误差无法使用,而经验误差又存在着过拟合问题,不适合作为标准,那么我们应该如何进行模型选择呢?针对这个问题,后面的三个小节会给出回答。

这里先简单归纳一下,书中将模型选择问题拆解为(1)评估方法;(2)性能度量;(3)比较检验;三个子问题。可以这样理解:

  • 评估方法:用什么数据做评估?如何获得这些数据?

  • 性能度量:评估时如何衡量模型的好坏?有哪些评价标准?

  • 比较检验:如何比较模型的性能?

注意不是简单地比大小!在机器学习中性能比较是相当复杂的。

——————————————————————————————————————————————————————

评估方法

前面已经提到了不能把经验误差用作模型评估,否则会存在过拟合。那么很自然地,我们就会想到是否有一种方法能近似泛化误差呢?答案是有的,就是使用**测试集(testing set)来测试学习器对新样本的判别能力,然后以测试集上的测试误差(testing error)**作为泛化误差的近似。

通常我们假设测试样本也是从样本真实分布中独立同分布采样而得,但需注意的是,测试集应该尽可能与训练集互斥, 即测试样本尽量不在训练集中出现、未在训练过程中使用过,否则就会高估模型的性能。为什么呢?为理解这一点我们来举个例子,假设老师出了10 道习题供同学们练习,考试时老师又用同样的这10道题作为试题,这个考试成绩能否有效反映出同学们学得好不好呢?答案毫无疑问是否定的。因为这只能证明大家是不是记住了这10道题;只有出不一样的题,才能看出大家是否对课程学得很好,真的掌握了知识,具备了对所有知识举一反三的能力。

Note!!!测试数据其实就是类比于模型在实际应用中遇到的数据,为了和模型评估中使用的测试数据进行区分,一般会把模型评估用的测试数据称为验证集(validation set)。举个例子,在Kaggle或者天池上参加比赛,我们一般会拿到一份带标记的原始数据集和一份不带标记的测试数据集。我们需要选用一种评估方法来把原始数据集划分成训练集和验证集,然后进行训练,并按照模型在验证集上的性能表现来进行选择,最后挑出最好的模型对测试集的样本进行预测,并提交预测结果。总结一下就是三个数据集:训练集、验证集(训练阶段的测试集)、测试集(最后用于测试模型性能的数据)。

下文将介绍几种常用的评估方法。

留出法

“留出法” (hold-out)直接将数据集 D D D划分为两个互斥的集合,其中一个集合作为训练集 S S S,另一个作为测试集 T T T, 即 D = S ∪ T , S ∩ T = ∅ D=S \cup T, S \cap T=\varnothing D=ST,ST=。在 S S S上训练出模型后,用 T T T来评估其测试误差,作为对泛化误差的估计。需注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要保持样本的类别比例相似。

如果从采样(sampling)的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为分层采样(stratified sampling)。例如通过对 D D D进行分层采样而获得含70%样本的训练集 S S S和含30%样本的测试集 T T T, 若 D D D包含500 个正例、500 个反例,则分层采样得到的 S S S应包含350 个正例、350 个反例,而 T T T则包含150 个正例和150 个反例;若
S S S T T T 中样本类别比例差别很大,则误差估计将由于训练/测试数据分布的差异而产生偏差。

另一个需注意的问题是,即使在给定训练/测试集的样本比例后,仍存在多种划分方式对初始数据集 D D D进行分割。例如在上面的例子中,可以把 D D D中的样本排序,然后把前350 个正例放到训练集中,也可以把最后350 个正例放到训练集中,……这些不同的划分将导致不同的训练/测试集,相应的,模型评估的结果也会有差别。因此单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。 例如进行100 次随机划分,每次产生一个训练/测试集用于实验评估, 100 次后就得到100 个结果,而留出法返回的则是这100 个结果的平均。

此外,我们希望评估的是用 D D D训练出的模型的性能,但留出法需划分训练/测试集,这就会导致一个窘境:若令训练集 S S S包含绝大多数样本,则训练出的模型可能更接近于用 D D D训练出的模型, 但由于 T T T比较小,评估结果可能不够稳定准确;若令测试集 T T T多包含一些样本, 则训练集 S S S D D D差别更大了,被评估的模型与用 D D D训练出的模型相比可能有较大差别,从而降低了评估结果的保真性(fidelity),这个问题没有完美的解决方案,常见做法是将大约2 / 3 ∼ 4 / 5 / 3 \sim 4 / 5 /34/5的样本用于训练,剩余样本用于测试。

交叉验证

“交叉验证法” (cross validation)先将数据集 D D D划分为 k k k个大小相似的互斥子集, 即 D = D 1 ∪ D 2 ∪ … ∪ D k , D i ∩ D j = ∅ ( i ≠ j ) D=D_{1} \cup D_{2} \cup \ldots \cup D_{k}, D_{i} \cap D_{j}=\varnothing(i \neq j) D=D1D2Dk,DiDj=(i̸=j)。每个子集 D i D_i Di都尽可能保持数据分布的一致性,即从 D D D中通过分层采样得到。然后,每次用 k − 1 k-1 k1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得k组训练/测试集,从而可进行 k k k次训练和测试,最终返回的是这 k k k个测试结果的均值。

显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于 k k k的取值,为强调这一点,通常把交叉验证法称为" k k k折交叉验证" (k-fold crossvalidation)。 k k k最常用的取值是10 ,此时称为10折交叉验证; 其他常用的 k k k值有5、20 等。

《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第2张图片
与留出法相似,将数据集 D D D划分为 k k k个子集同样存在多种划分方式。为减小因样本划分不同而引入的差别, k k k折交叉验证通常要随机使用不同的划分重复 p p p次,最终的评估结果是这 p p p k k k折交叉验证结果的均值,例如常见的有“10 次10 折交叉验证”。

10 次10 折交又验证法与100 次留出法都是进行了100 次训练/测试。

特别地,假定数据集 D D D中包含 m m m个样本,若令 k = m k=m k=m,则得到了交叉验证法的一个特例:留一法(Leave-One-Out,简称LOO)。这样做的好处是不受随机样本划分方式的影响,因为 m m m个样本只有唯一的方式划分为 m m m个子集一一每个子集包含一个样本;留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用 D D D训练出的模型很相似。因此一般来说,留一法的评估结果往往被认为是比较准确的。但是!!!留一法也有其缺陷:在数据集比较大时,训练 m m m个模型的计算开销可能是难以忍受的(例如数据集包含1 百万个样本,则需训练1 百万个模型),而这还是在未考虑算法调参的情况下。另外,留一法的估计结果也未必永远比其他评估方法准确;"没有免费的午餐"定理对实验评估方法同样适用。

自助法

我们希望评估的是用 D D D训练出的模型。但在留出法和交叉验证法中,我们都需要对数据集进行划分,保留了一部分样本用于测试,从而使得实际评估的模型所用的数据集比 D D D小,引入了一些因训练样本规模不同而导致的估计偏差。留一法受训练样本规模变化的影响较小,但计算复杂度又太高了。有没有什么办法可以减少训练样本规模不同造成的影响,同时还能比较高效地进行实验估计呢?

自助法(bootstrapping) 正是我们需要的答案,以自助采样(bootstrap sampling) 为基础,对包含 m m m样本的数据集 D D D进行有放回的 m m m次采样以获得同等规模的训练集。在这m次采样中都不被抽到的概率大约为0.368,也即数据集 D D D中有大约1/3的样本是训练集中没有的。因此,我们可以采用这部分样本作为验证集,所得的结果称为包外估计(out-of-bag estimate)

Note!!!自助法适用于数据集小,难以划分训练/验证集的情况。此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。但是!自助法产生的数据集改变了初始数据集的分布,也因此引入了一些额外的误差。因此,在初始数据量足够时,留出法和交叉验证法更常用一些。

调参和最终模型

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

特别注意,学习算法的很多参数是在实数范围内取值,因此,对每种参数配置都训练出模型来是不可行的。现实中常用的做法是,调参(parameter tuning) 时一般先选定一个范围和变化步长,比如(0,1],步长0.2,这样就有五个参数候选值。然后进行评估,最终是从这5 个候选值中产生选定值。这样选出的未必是全局最优的参数,但为了在开销和性能之间折中,只能这么做才让学习过程变得可行,毕竟我们无法试尽参数的所有取值。而且多个参数组合的情况是指数上升的,比方说有3个参数,每个参数仅考虑5个候选值,这样对每一组训练/测试集就有 5 3 = 125 5^3 = 125 53=125个模型需考察。

训练/验证这个过程是为了让我们确定学习算法和确定算法参数,确定了这些之后,我们需要再利用整个数据集 D D D进行训练,这次训练所得的模型才是最终模型,也即提交给用户,进行测试的模型。

——————————————————————————————————————————————————————

性能度量

对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量(performance measure)。性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果。比方说搭建推荐系统,两个模型中一个精度高,一个覆盖度高,如果我们想让更多的商品得到推荐可以就会选后一个模型。所以说,模型的好坏是相对的,取决于我们采用什么性能度量,而采用什么性能度量则应取决于我们的任务需求

这个小节主要介绍分类任务中常用的性能度量。

错误率和精度

在本章的开头已经提及到了,不再累述,这两个性能度量可写作更一般的形式,基于数据分布和概率密度函数进行定义。

查准率,查全率,F1

假设我们正常处理一个二分类问题,按照模型预测值和真实值可以把测试样本划分为四种情形:真正例(true positive),假正例(false positive),真反例(true negative),假反例(false negative)。可以把结果表示为下图这个矩阵——混淆矩阵(confusion matrix)

真实情况 预测结果
正例 反例
正例 TP(真正例) FN(假反例)
反例 FP(假正例) TN(真反例)

显然有TP+FP+TN+FN=样例总数。

查准率,又称准确率(precision),用于衡量模型避免错误的能力,分母是模型预测的正例数目。

p r e c i s i o n = T P T P + F P precision = \frac{TP}{TP+FP} precision=TP+FPTP

查全率,又称召回率(recall),用于衡量模型避免缺漏的能力,分母是测试样本真正包含的正例数目。

r e c a l l = T P T P + F N recall = \frac{TP}{TP+FN} recall=TP+FNTP

一般来说,这两者是矛盾的,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。通常只有在一些简单任务中才可能使查全率和查准率都很高。

在很多情形札我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为"最可能"是正例的样本,排在最后的则是学习器认为"最不可能"是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率以查准率为纵轴、查全率为横轴作图,就得到了查准率-查全率曲线,简称" P-R 曲线"显示该曲线的图称为" P-R图"。

《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第3张图片
在进行比较时,若一个学习器的P-R 曲线被另一个学习器的曲线完全"包住" , 则可断言后者的性能优于前者, 例如图2 . 3 中学习器A 的性能优于学习器C;如果两个学习器的P-R 曲线发生了交叉,例如图2 . 3 中的A 与B ,则难以一般性地断言两者孰优孰劣,只能在具体的查准率或查全率条件下进行比较。那么有没有综合考虑查准率、查全率的性能度量?答案就是"平衡点" (Break-Event Point,简称BEP),它是" 查准率=查全率"时的取值,例如图2.3 中学习器C 的BEP 是0 . 64,而基于BEP的比较,可认为学习器A 优于B 。

但BEP 还是过于简化了些,更常用的是F1 度量:

F1,是查准率和查全率的调和平均,用于综合考虑这两个性能度量。

1 F 1 = 1 2 × ( 1 p r e c i s i o n + 1 r e c a l l ) ⇒ F 1 = 2 × p r e c i s i o n × r e c a l l p r e s i o n + r e c a l l \frac{1}{F1} = \frac{1}{2} \times (\frac{1}{precision} + \frac{1}{recall}) \Rightarrow F1 = \frac{2 \times precision \times recall}{presion + recall} F11=21×(precision1+recall1)F1=presion+recall2×precision×recall

有时候我们对查准率,查全率的需求是不同的。比方说广告推荐,要尽量避免打扰用户,因此查准率更重要;而逃犯检索,因为漏检的危害很大,所以查全率更重要。这时就需要使用 F β F_\beta Fβ了。

F β F_\beta Fβ,是查准率和查全率的加权调和平均,用于综合考虑这两个性能度量,并采用不同的权重。

1 F β = 1 1 + β 2 × ( 1 p r e c i s i o n + β 2 r e c a l l ) ⇒ F β = ( 1 + β 2 ) × p r e c i s i o n × r e c a l l ( β 2 × p r e s i o n ) + r e c a l l \frac{1}{F_\beta} = \frac{1}{1+\beta^2} \times (\frac{1}{precision} + \frac{\beta^2}{recall}) \Rightarrow F_\beta = \frac{(1+\beta^2) \times precision \times recall}{(\beta^2 \times presion) + recall} Fβ1=1+β21×(precision1+recallβ2)Fβ=(β2×presion)+recall(1+β2)×precision×recall

其中 β > 0 \beta>0 β>0 度量了查全率对查准率的相对重要性,等于1时 F β F_\beta Fβ退化为F1,小于1时查准率更重要,大于1时查全率更重要。

书中还介绍了如何对多次训练/测试产生的多个混淆矩阵进行评估,包括宏方法(先分别计算性能度量,再计算均值)和微方法(先对混淆矩阵各元素计算均值,再基于均值计算性能度量)两种途径。

ROC与AUC

很多时候,使用模型对测试样本进行预测得到的是一个实值或者概率预测(比如神经网络),需要进一步设置分类阈值(threshold),然后把预测值和阈值进行比较才能获得最终预测的标记。

我们可以按照预测值对所有测试样本进行排序,最可能是正例的排前面,最不能是正例的排后面。这样分类时就像是在这个序列中以某个截断点(cut point)把样本分成两部分。我们需要根据任务需求来设置截断点。比如广告推荐更重视查准率,可能就会把截断点设置得更靠前。

因此!排序本身的质量很能体现出一个模型的泛化性能,ROC曲线就是一个用来衡量学习器泛化性能的工具。ROC,全称受试者工作特征(Receiver Operating Characteristic) 。怎样画ROC曲线呢?先定义两个重要的计算量:真正例率(True Positive Rate,简称TPR)假正例率(False Positive Rate,简称FPR)

T P R = T P T P + F N TPR = \frac{TP}{TP+FN} TPR=TP+FNTP

F P R = F P T P + F N FPR = \frac{FP}{TP+FN} FPR=TP+FNFP

TPR其实就等于召回率。在绘制ROC曲线时,纵轴为TPR,横轴为FPR。首先按预测值对样本进行排序,然后按序逐个把样本预测为正例,并计算此时的TPR和FPR,然后在图上画出该点,并与前一个点连线。如下图:

《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第4张图片

有两个值得注意的特例:

  • 经过 (0,1) 点的曲线,这代表所有正例都在反例之前出现(否则会先出现假正例从而无法经过 (0,1) 点),这是一个理想模型,我们可以设置一个阈值,完美地分割开正例和反例。

  • 对角线,这对应于随机猜测模型,可以理解为真正例和假正例轮换出现,即每预测对一次接下来就预测错一次,可以看作是随机猜测的结果。

若一个模型的ROC曲线完全包住了另一个模型的ROC曲线,我们就认为这个模型更优。但是如果两条曲线发生交叉,要怎么判断呢?比较合理的判据是AUC(Area Under ROC Curve),即ROC曲线下的面积。

A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ⋅ ( y i + y i + 1 ) AUC=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)\cdot(y_i+y_{i+1}) AUC=21i=1m1(xi+1xi)(yi+yi+1)

解析:
《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第5张图片
南瓜书——https://datawhalechina.github.io/pumpkin-book/#/

补充一点,ROC曲线上的面积等于排序损失(loss)。也即有:

A U C = 1 − ℓ r a n k AUC = 1 - \ell_{rank} AUC=1rank

证明在习题答案中有详细的讲解——【机器学习】《机器学习》周志华西瓜书习题参考答案:第2章 - 模型评估与选择

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

现实任务中,有时会遇到不同类型错误造成后果不同的状况。例如在医疗诊断中,错误地把患者诊断为健康人与错误地把健康人诊断为患者,看起来都是犯了"一次错误"但后者的影响是增加了进→步检查的麻烦,前者的后果却可能是丧失了拯救生命的最佳时机;再如,门禁系统错误地把可通行人员拦在门外,将使得用户体验不佳,但错误地把陌生人放进门内,则会造成严重的安全事故。为了权衡不同类型错误带来的不同损失,可以为这些错误类型赋以非均等代价(unequal cost)

还是举二分类为类,可以根据任务的领域知识来设定一个代价矩阵(cost matrix):

真实类别 预测类别
第0类 第1类
第0类 0 $cost_{01}$
第1类 $cost_{10}$ 0

预测值与真实值相等时,自然错误代价为0。但把第0类错预测为第1类和把第1类错预测为第0类这两种错误的代价是不同的。注意,重要的不是代价在数值上的大小,而是它们的比值。比方说 c o s t 01 c o s t 10 > 1 \frac{cost_{01}}{cost_{10}} > 1 cost10cost01>1, 这就说明把第0类错预测为第1类的代价更高。

使用了非均等代价之后,我们在使用性能度量时自然也需要作出相应的改变,比方说代价敏感(cost-sensitive) 版本的错误率:

E ( f ; D ; c o s t ) = 1 m ⟮ ∑ x i ∈ D + I ( f ( x i ) ≠ y i ) × c o s t 01 + ∑ x i ∈ D − I ( f ( x i ) ≠ y i ) × c o s t 10 ⟯ E(f;D;cost) = \frac{1}{m}\lgroup\sum_{x_i \in D^+}\mathbb{I}(f(x_i) \neq y_i) \times cost_{01} + \sum_{x_i \in D^-}\mathbb{I}(f(x_i) \neq y_i) \times cost_{10}\rgroup E(f;D;cost)=m1xiD+I(f(xi)̸=yi)×cost01+xiDI(f(xi)̸=yi)×cost10

由于ROC曲线不能反应使用非均等代价之后的期望总体代价,所以改用代价曲线(cost curve) 来取替。

代价曲线图的纵轴为归一化代价(将代价映射到 [0,1] 区间),横轴为正例概率代价。画法类似于ROC曲线,它是将ROC曲线的每一个点转为图中的一条线。依次计算出ROC曲线每个点对应的FPR和FNR,然后把点 (0,FPR) 和点 (0,FNR) 连线。最终所得的图中,所有线的下界所围成的面积就是该模型的期望总体代价。

《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第6张图片

——————————————————————————————————————————————————————

比较检验

看起来似乎有了获取测试集 ∗ ^{*} 的评估方法和用于比较模型的性能度量之后,就能够通过不同模型在测试集上的性能表现来判断优劣了。但怎么来做这个"比较"呢?是直接取得性能度量的值然后"比大小"吗?实际上,机器学习中性能比较这件事要比大家想象的复杂得多。

Note!!!指验证集,但无论是书中还是论文中,都使用测试集较多,明白两者的区别就可以了。

在模型比较中,主要有以下三个重要考虑:

  1. 希望比较的是泛化性能,然而通过实验评估方法我们获得的是测试集上的性能,两者的对比结果可能未必相同;
  2. 测试集上的性能与测试集本身的选择有很大关系,且不论使用不同大小的测试集会得到不同的结果,即使用相同大小的测试集,若包含的测试样例不同,测试结果也会有不同;
  3. ,很多机器学习算法本身有一定的随机性,即便用相同的参数设置在同一个测试集上多次运行,其结果也会有不同;

那么应该如何有效地进行模型比较呢?答案是采用假设检验(hypothesis test)。基于假设检验的结果,我们可以推断出,若在测试集上观察到模型A优于B,则是否A的泛化性能在统计意义上也优于B,以及做这个结论的把握有多大。

本小节首先介绍最基本的二项检验和t检验,然后再深入介绍其他几种比较检验方法。默认以错误率 ϵ \epsilon ϵ 作为性能度量。

几个基础概念:

  • 置信度:表示有多大的把握认为假设是正确的。
  • 显著度:也称“显著性水平”,表示假设出错的概率。显著度越大,假设被拒绝的可能性越大。
  • 自由度:不被限制的样本数,也可以理解为能自由取值的样本数,记为 v v v d f df df

单个模型、单个数据集上的泛化性能检验

我们有多大把握相信对一个模型泛化性能的假设?

二项检验

在进行比较检验前,完成了一次模型预测,已知测试错误率为 ϵ ^ \hat{\epsilon} ϵ^

一个泛化错误率为 ϵ \epsilon ϵ 的模型在 m m m 个样本上预测错 m ′ m' m 个样本的概率为:

P ( ϵ ^ ; ϵ ) = ( m m ′ ) ϵ m ′ ( 1 − ϵ ) m − m ′ P(\hat{\epsilon};\epsilon) = \binom{m}{m'} \epsilon^{m'} (1-\epsilon)^{m - m'} P(ϵ^;ϵ)=(mm)ϵm(1ϵ)mm

给定测试错误率,则解 ∂ P ( ϵ ^ ; ϵ ) / ∂ ϵ = 0 \partial P(\hat{\epsilon} ; \epsilon) / \partial \epsilon=0 P(ϵ^;ϵ)/ϵ=0可知, P ( ϵ ^ ; ϵ ) P(\hat{\epsilon} ; \epsilon) P(ϵ^;ϵ) ϵ = ϵ ^ \epsilon=\hat{\epsilon} ϵ=ϵ^时最大, ∣ ϵ − ϵ ^ ∣ |\epsilon-\hat{\epsilon}| ϵϵ^增大时 P ( ϵ ^ ; ϵ ) P(\hat{\epsilon} ; \epsilon) P(ϵ^;ϵ)减小。这符合二项(binomial)分布,如图2.6 所示,若f = 0. 3,则10 个样本中测得3 个被误分类的概率最大。

《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第7张图片

α 的常用取位有0.05 、0.1 ,图2.6 中α 较大是为了绘图方便。

使用二项检验(binomial test),假设泛化错误率 ϵ ≤ ϵ 0 \epsilon \leq \epsilon_0 ϵϵ0,并且设定置信度为 1 − α 1-\alpha 1α。则在 ϵ ≤ ϵ 0 \epsilon \leq \epsilon_0 ϵϵ0的概率内所能观测到的最大错误率 ϵ ‾ \overline{\epsilon} ϵ 如下式计算。

ϵ ‾ = max ⁡ ϵ s . t . ∑ i = ϵ 0 × m + 1 m ( m i ) ϵ i ( 1 − ϵ ) m − i < α \overline{\epsilon} = \max{\epsilon} \qquad s.t. \qquad \sum_{i=\epsilon_0 \times m+1}^m \binom{m}{i}\epsilon^i (1-\epsilon)^{m-i} < \alpha ϵ=maxϵs.t.i=ϵ0×m+1m(im)ϵi(1ϵ)mi<α

其中 s . t . s.t. s.t. 是"subject to" 的简写,使左边式子在右边条件满足时成立。右式计算的是发生不符合假设的事件的总概率,如果我们要有 1 − α 1-\alpha 1α 的把握认为假设成立,那么发生不符合假设的事件的总概率就必须低过 α \alpha α

在满足右式的所有 ϵ \epsilon ϵ 中,选择最大的作为阈值 ϵ ‾ \overline{\epsilon} ϵ。如果在测试集中观测到的测试错误率 ϵ ^ \hat{\epsilon} ϵ^ 是小于阈值 ϵ ‾ \overline{\epsilon} ϵ的, 我们就能以 1 − α 1-\alpha 1α 的把握认为假设成立,即该模型的泛化误差 ϵ ≤ ϵ 0 \epsilon \leq \epsilon_0 ϵϵ0

t检验

二项检验只用于检验某一次测试的性能度量,但实际任务中我们会进行多次的训练/测试,得到多个测试错误率,比方说进行了k次测试,得到 ϵ ^ 1 \hat{\epsilon}_1 ϵ^1, ϵ ^ 2 \hat{\epsilon}_2 ϵ^2, … , ϵ ^ k \hat{\epsilon}_k ϵ^k。这次就会用到t检验(t-test)

定义这 k k k 次测试的平均错误率 μ \mu μ 和方差 σ 2 \sigma^2 σ2

μ = 1 k ∑ i = 1 k ϵ i ^ \mu = \frac{1}{k} \sum_{i=1}^k \hat{\epsilon_i} μ=k1i=1kϵi^

σ 2 = 1 k − 1 ∑ i = 1 k ( ϵ i ^ − μ ) 2 \sigma^2 = \frac{1}{k-1} \sum_{i=1}^k (\hat{\epsilon_i} - \mu)^2 σ2=k11i=1k(ϵi^μ)2

注意!这里使用的是无偏估计样本方差,分母是 k − 1 k-1 k1,因为当均值确定,并且已知 k − 1 k-1 k1 个样本的值时,第 k k k 个样本的值是可以算出来的,也可以说是受限的

假设泛化错误率 ϵ = ϵ 0 \epsilon = \epsilon_0 ϵ=ϵ0,并且设定显著度为 α \alpha α。计算统计量t:

t = k ( μ − ϵ 0 ) σ t = \frac{\sqrt{k}(\mu-\epsilon_0)}{\sigma} t=σk (μϵ0)

该统计量服从自由度 v = k − 1 v = k-1 v=k1 的t分布,如下图:

《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第8张图片
自由度越大,约接近于正态分布,自由度为无穷大时变为标准正态分布( μ = 0 \mu=0 μ=0 σ = 1 \sigma=1 σ=1)。

如果计算出的t统计量落在临界值范围 [ t − a / 2 t_{-a/2} ta/2, t a / 2 t_{a/2} ta/2] 之内(注:临界值由自由度 k k k 和显著度 α \alpha α 决定,通过查表得出),我们就能以 1 − α 1-\alpha 1α 的把握认为假设成立,即该模型的泛化误差 ϵ = ϵ 0 \epsilon = \epsilon_0 ϵ=ϵ0

两个模型/算法、单个数据集上的泛化性能检验

我们有多大把握相信两个模型的泛化性能无显著差别?

交叉验证t检验

对两个模型A和B,各使用k折交叉验证分别得到k个测试错误率,即 ϵ ^ 1 A \hat{\epsilon}_1^A ϵ^1A, ϵ ^ 2 A \hat{\epsilon}_2^A ϵ^2A, … , ϵ ^ k A \hat{\epsilon}_k^A ϵ^kA ϵ ^ 1 B \hat{\epsilon}_1^B ϵ^1B, ϵ ^ 2 B \hat{\epsilon}_2^B ϵ^2B, … , ϵ ^ k B \hat{\epsilon}_k^B ϵ^kB。使用k折交叉验证成对t检验(paired t-tests) 来进行比较检验。

对于这两组k个测试错误率,计算两组之间的每一对的差,即 △ i = ϵ ^ k A − ϵ ^ k B \triangle_i = \hat{\epsilon}_k^A - \hat{\epsilon}_k^B i=ϵ^kAϵ^kB,从而得到k个 △ \triangle 。我们可以计算 △ \triangle 的均值 μ \mu μ 和方差 σ 2 \sigma^2 σ2,定义统计量t:

t = ∣ k μ σ ∣ t = \lvert \frac{\sqrt{k}\mu}{\sigma} \rvert t=σk μ

可以看到,和前面的t检验相比,这里的分子没有被减项,其实是省略了。因为我们假设两个模型的泛化错误率相同,实际上是假设 ∣ ϵ A − ϵ B ∣ = 0 \lvert \epsilon^A - \epsilon^B \rvert = 0 ϵAϵB=0,这个 0 0 0 被省略了。

类似地,这个统计量服从自由度 v = k − 1 v = k-1 v=k1 的t分布。我们设定好显著度 α \alpha α,查表获取临界值范围,如果计算出的t统计量落在在范围内,就能以 1 − α 1-\alpha 1α 的把握认为假设成立,即两个模型的泛化性能无显著差别,否则认为平均测试错误率较低的模型更胜一筹。

McNemar检验

对于一个二分类问题,如果使用留出法,我们不仅可以获得两个算法A和B各自的测试错误率,或能够获得它们分类结果的差别(都预测正确、都预测错误、一个预测正确一个预测错误),构成一张列联表(contingency table)

算法B 算法A
分类正确 分类错误
分类正确 $e_{00}$ $e_{01}$
分类错误 $e_{10}$ $e_{11}$

假设两个算法的泛化性能无显著区别,则 e 01 e_{01} e01 应该等于 e 10 e_{10} e10,变量 ∣ e 01 − e 10 ∣ \lvert e_{01}-e_{10} \rvert e01e10 应服从均值为 1 1 1,方差为 e 01 + e 10 e_{01} + e_{10} e01+e10 的正态分布,可以计算统计量 χ 2 \chi^2 χ2

χ 2 = ( ∣ e 01 − e 10 ∣ − 1 ) 2 e 01 + e 10 \chi^2 = \frac{(\lvert e_{01}-e_{10} \rvert -1)^2}{e_{01} + e_{10}} χ2=e01+e10(e01e101)2

该变量服从自由度为 v = 1 v=1 v=1 χ 2 \chi^2 χ2 分布(卡方分布),类似t检验,设定好显著度 α \alpha α,按照自由度和显著度查表获得临界值。若计算所得的统计量 χ 2 \chi^2 χ2 小于临界值,则能以 1 − α 1-\alpha 1α 的把握认为假设成立,即两个算法的泛化性能无显著差别,否则认为平均测试错误率较低的算法更胜一筹。

注:这里 v v v 为1是因为只有2个算法

多个模型/算法、多个数据集上的泛化性能检验

我们有多大把握相信多个模型的泛化性能皆无显著差别?若有,接下来怎样做?

一组数据集上进行多个算法的比较,情况就变得较复杂了,一种做法是使用前面的方法分开两两比较;另一种更直接的做法是使用基于算法排序的Friedman检验。

Friedman检验

假设有 N = 4 N=4 N=4 个数据集, k = 3 k=3 k=3 种算法,可以使用一种评估方法,获得各个算法在各个数据集上的测试结果,然后按照性能度量由好到坏进行排序,序值为1,2,3。若并列,则取序值的平均值。然后对各个算法在各数据集上的序值求平均得到平均序值,如:

数据集 算法A 算法B 算法C
D1 1 2 3
D2 1 2.5 2.5
D3 1 2 3
D4 1 2 3
平均序值 1 2.125 2.875

r i r_i ri 表示第 i i i 个算法的平均序值,则 r i r_i ri 服从均值为 k + 1 2 \frac{k+1}{2} 2k+1,方差为 ( k 2 ) − 1 12 \frac{(k^2)-1}{12} 12(k2)1 的正态分布。可以计算统计量 χ 2 \chi^2 χ2

χ 2 = 12 N k ( k + 1 ) ( ∑ i = 1 k r i 2 − k ( k + 1 ) 2 4 ) \chi^2 = \frac{12N}{k(k+1)}(\sum_{i=1}^k r_i^2 - \frac{k(k+1)^2}{4}) χ2=k(k+1)12N(i=1kri24k(k+1)2)

k k k N N N 都较大时(通常要求 k > 30 k>30 k>30),该变量服从自由度为 v = k − 1 v=k-1 v=k1 χ 2 \chi^2 χ2 分布(卡方分布)。

以上这种检验方式也称为原始Friedman检验,被认为过于保守,现在通常用统计量 F F F 代替:

F = ( N − 1 ) χ 2 N ( k − 1 ) − χ 2 F = \frac{(N-1)\chi^2}{N(k-1)-\chi^2} F=N(k1)χ2(N1)χ2

该变量服从于自由度为 v = k − 1 v=k-1 v=k1 v = ( k − 1 ) ( N − 1 ) v=(k-1)(N-1) v=(k1)(N1) F F F 分布。

和前面的检验方式有所区别,F检验是根据设定的显著度 α \alpha α算法个数 k k k 以及 数据集个数 N N N 这三者来查表的,如果计算出的统计量 F F F 小于查表所得的临界值,则假设成立,能以 1 − α 1-\alpha 1α 的把握认为认为这 k k k 个算法的泛化性能无显著区别。

但如果这个假设被拒绝了呢?这时就需要进行后续检验(post-hoc test),常用的有 Nemenyi后续检验

Nemenyi后续检验

定义平均序值差别的临界值域为:

C D = q α k ( k + 1 ) 6 N CD = q_\alpha \sqrt{\frac{k(k+1)}{6N}} CD=qα6Nk(k+1)

其中 q α q_\alpha qα是由 显著度 α \alpha α算法个数 k k k 确定的,通过查表获取。若两个算法的平均序值之差不超过 C D CD CD,则能以 1 − α 1-\alpha 1α 的把握认为这两个算法的泛化性能无显著区别,否则认为平均序值较小的更胜一筹。

Nemenyi后续检验还可以通过Friedman检验图更直观地体现出来,横轴为性能度量,纵轴为算法,每个算法用一段水平线段表示,线段中心点为该算法的平均序值,线段长度为 C D CD CD。若两个算法的线段投影到x轴上有重叠部分,则可以认为这两个算法的泛化性能无显著区别。

偏差与方差

除了估计算法的泛化性能,我们往往还希望知道为什么有这样的性能?这时一个有用的工具就是偏差-方差分解(bias-variance decomposition)

知乎上面有两个问题都有不错的答案,不妨先看看。[1] 机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?;[2] 偏差和方差有什么区别?。

对学习算法的期望繁华错误率进行拆解,最终会发现能拆解为三个项(需要推导):

《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第9张图片

于是,
在这里插入图片描述
依次对应于方差(variance)偏差(bias)噪声(noise),也就是说泛化误差可分解为偏差、方差与噪声之和。

这三者的含义是这样的:

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

  • 偏差:度量了学习算法的期望预测与真实结果的偏离程度,刻画学习算法本身的拟合能力

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

也即是说,泛化性能是有学习算法的拟合能力,数据的充分性以及问题本身的难度共同决定的。给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。

但是这两者其实是有冲突的,这称为偏差-方差窘境(bias-variance dilemma)。给定学习任务,假定我们能控制学习算法的训练程度,则在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以便学习器产生显著变化,此时偏差主导了泛化错误率;随着训练程度的加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐主导了泛化错误率;在训练程度充足后,学习器的拟合能力已非常强,训练数据发生的轻微扰动都会导致学习器发生显著变化,若训练数据自身的、非全局的特性被学习器学到了,则将发生过拟合。

《机器学习》周志华西瓜书学习笔记(二):模型评估与选择_第10张图片
注意,将泛化性能完美地分解为方差、偏差、噪声这三项仅在基于均方误差的回归任务中得以推导出,分类任务由于损失函数的跳变性导致难以从理论上推导出分解形式,但已经有很多方法可以通过实验进行估计了。

你可能感兴趣的:(Machine,Learning)