参考资料:[1]周志华.机器学习[M].清华大学出版社,2016.
一、经验误差与过拟合
通常我们把分类错误的样本数占样本总数的比例称为"错误率"(erroe rate),即如果在 m m m 个样本中有 a a a 个样本分类错误,则错误率 E = a / m E=a/m E=a/m;相应地, 1 − a / m 1-a/m 1−a/m 称为"精度"(accuracy)。
更一般地,我们把学习器的实际预测输出与样本的真是输出之间的差异称为"误差"(error),学习器在训练集上的误差称为"训练误差"(training error)或"经验误差"(empirical error),在新样本上的误差称为"泛化误差"(generalization error)。
显然,我们希望得到泛化误差小的学习器。然而,我们事先并不知道新样本是什么样,实际能做的是努力使经验误差最小化。
在很多情况下,我们可以学得一个经验误差很小、在训练集上表现很好的学习器,例如甚至对所有训练样本都分类正确,但这是不是我们想要的学习器呢?
遗憾的是,这样的学习器在多数情况下都不好。
我们实际希望的,是在新样本上能表现得很好的学习器。为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的"普遍规律",这样才能在遇到新样本时做出正确的判别。
然而,当学习器把训练样本学得"太好"了的时候,很可能已经把训练样本自身的特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能的下降。这种现象在机器学习中称为"过拟合"(overfitting)。
与"过拟合"相对的是"欠拟合"(underfitting),这是值对训练样本的一般性质尚未学好。图2.1给出了关于过拟合和欠拟合的一个直观对比。
有多种因素可能导致过拟合,其中最常见的情况是由于学习能力过于强大,以至于把训练样本所包含的不太一般的特性都学到了;而欠拟合则通常是由于学习能力低下而造成的。
学习能力是否"过于强大",是由学习算法和数据内涵共同决定的。
欠拟合比较容易克服,例如在决策树学习中扩展分支、在神经网络学习中增加训练轮数等;而过拟合则很麻烦。
过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一些针对过拟合的措施;然而必须认识到,过拟合是无法彻底避免的,我们所能做的只是"缓解",或者说减小其风险。
换句话说,机器学习面临的问题通常是 NP 难甚至更难,而有效的学习算法必然是在多项式时间内运行完成,若可彻底避免过拟合,则通过经验误差最小化就能取得最优解,这就意味着我们构造线地证明了"P=NP";因此,只要相信"P ≠ \ne = NP",过拟合就不可避免。
在现实任务中,我们往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型。
那么,我们该选用哪一个学习算法、使用哪一种参数配置呢?
这就是机器学习中的"模型选择"(model selection)问题。理想的解决方案当然是对候选模型的泛化误差进行评估,然后选择泛化误差最小的那个模型。
然而我们无法直接获得泛化误差,而训练误差又由于过拟合现象的存在,不适合作为标准,如何对模型进行有效的评估与选择呢?
二、评估方法
通常,我们可通过实验测试来对学习器的泛化误差进行评估并进而做出选择。为此,需使用一个"测试集"(testing set)来测试学习器对新样本的判别能力,然后以测试集上的"测试误差"(testing error)作为泛化误差的近似。
通常我们假设测试样本也是从样本真是分布中独立同分布采样而得。但需注意的是,测试集应尽可能与训练集互斥,即测试样本尽量不在训练集中出现、不在训练过程中使用。
测试样本为什么要尽可能不出现在训练集中呢?可以想想如下场景:
老师出了 10 道习题供同学们练习,考试时老师又用同样的 10 道题作为试题,这个考试成绩能否有效反映同学们学得好不好呢?答案是否定的。
可是,我们只有一个包含 m m m 个样本的数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ... , ( x m , y m ) } D=\{(\pmb{x_1},y_1),(\pmb{x_2},y_2),\dots,(\pmb{x_m},y_m)\} D={(x1,y1),(x2,y2),...,(xm,ym)},既要训练,又要测试,具体该怎么做呢?
答案是:通过对 D D D 进行适当的处理,从中产生训练集 S S S 和测试集 T T T 。下面介绍几种常见的做法。
2.1 留出法
"留出法"(hold-out)直接将数据集 D D D 划分为两个互斥的集合,其中一个集合作为训练集 S S S,另一个作为测试集 T T T。在 S S S 上训练出模型后,用 T T T 来评估其测试误差,作为对泛化误差的估计。
需注意的是,训练或测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要保持样本的类别比例相似。
如果从采样(sampling)的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为"分层抽样"(stratified sampling)。
另一个需注意的问题是,即便在给定训练或测试集的样本比例后,仍存在多种划分方式对初始数据集 D D D 进行分割。
因此,单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
此外,我们希望评估的是用 D D D 训练出的模型的性能,但留出法需划分训练集或测试集,这会导致一个窘境:
若令训练集 S S S 包含绝大多数样本,则训练出的模型可能更接近于用 D D D 训练出的模型,但由于 T T T 较小,评估结果可能不够稳定准确;若令测试集多包涵一些样本,则训练集 S S S 与 D D D 的差别更大了,被评估的模型与用 D D D 训练出的模型相比可能有较大差别,从而降低了评估结果的保真性(fidelity)。
测试集小时,评估结果的方差较大;训练集小时,评估结果的偏差较大。
这个问题没有完美的解决方案,常见做法是将大约 2 / 3 2/3 2/3~ 4 / 5 4/5 4/5 的样本用作训练,剩余样本用于测试。一般而言,测试集应至少包含 30 个样例。
2.2 交叉验证法
"交叉验证法"(cross validation)先将数据集 D D D 划分为 k k k 个大小相似的互斥子集。每个子集 D i D_i Di 都尽可能保持数据分布的一致性,即从 D D D 中分层采样得到。
然后,每次用 k − 1 k-1 k−1 个子集的并集作为训练集,余下那个子集作为测试集;这样就可以获得 k k k 组训练/测试集,从而可进行 k k k 次训练和测试,最终返回的是这 k k k 个测试结果的均值。
显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于 k k k 的取值,为强调这一点,通常把交叉验证法称为 " k k k 折交叉验证"( k k k-fold cross validation)。
k k k 最常用的取值是 10,其他常用的 k k k 值有 5、20等。图2.2给出了 10 折交叉验证的示意图。
与留出法相似,将数据集 D D D 划分为 k k k 个子集通用存在多种划分方式。为减小因样本划分不同而引入的差别, k k k 折交叉验证通常要随机使用不同的划分重复 p p p 次,最终的评估结果取这 p p p 次结果的均值,常见的有"10 次 10 折交叉验证"。
假定数据集 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 个模型的计算开销可能是难以忍受的,而这还是在未考虑算法调参的情况下。另外,留一法的估计结果也未必永远比其他评估方法准确;"没有免费的午餐"定理对实验评估方法同样适用。
2.3 自助法
我们希望评估的是用 D D D 训练出的模型,但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比 D D D 小,这必然会引入一些因训练样本规模不同而导致的估计偏差。
留一法受训练样本规模变化较小,但计算复杂度太高了。有没有什么办法既可以减少训练样本规模不同造成的影响,又能比较高效地进行实验估计呢?
"自助法"(bootstrapping)是一个比较好的解决方案,它直接以自助采样法(bootstrap sampling)为基础,给定包含 m m m 个样本数据集 D D D,我们对它进行采样产生数据集 D ′ D' D′:
每次随机从 D D D 中挑选一个样本,将其拷贝放入 D ′ D' D′,然后再将该样本放回初始数据集 D D D 中,使得该样本再下次采样时仍有可能被采到;这个过程重复执行 m m m 次后,我们就得到了包含 m m m 个样本的数据集 D ′ D' D′,这是自助采样的结果。
显然, D D D 中有一部分样本会在 D ′ D' D′ 中多次出现,而另一部分样本不出现。可以做一个简单的估计,样本在 m m m 次采样中始终不被采到的概率是 ( 1 − 1 / m ) m (1-1/m)^m (1−1/m)m,取极限得到 lim m → ∞ ( 1 − 1 m ) m = e − 1 ≈ 0.368 , \lim_{m\to\infty}\bigg(1-\frac{1}{m}\bigg)^m=e^{-1}\approx 0.368, m→∞lim(1−m1)m=e−1≈0.368, 即通过自助采样,初始数据集 D D D 中约有 36.8% 的样本未出现在采样数据集 D ′ D' D′ 中。于是我们可将 D ′ D' D′用作训练集, D D D \ D ′ D' D′ 用作测试集;这样,实际评估的模型与期望评估的模型都使用 m m m 个训练样本,而我们仍有数据总量约 1 / 3 1/3 1/3 的、没在训练集中出现的样本用于测试。这样的测试结果,亦称"包外估计"(out-of-bag estimate)。
自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。
然而,自助法产生的数据改变了初始数据集的分布,这会引入估计误差。因此,在初始数据量足够时,留出法和交叉验证法更常用一些。
2.4 调参与最终模型
大多数学习算法都有些参数(parameter)需要设定,参数配置不同,学得模型的性能往往有显著差异。因此,在进行模型评估与选择时,除了要对适用学习算法进行选择,还需要对算法参数进行设定,这就是所谓"调参"(parameter tuning)。
调参的一般考虑是:对每种参数配置都训练出模型,然后把对应最好模型的参数作为结果。
但有一点需注意:学习算法的很多参数是在实数范围内取值,因此,对每种参数配置都训练出模型来是不可行的。
现实中常用的做法,是对每个参数选定一个范围和变化步长,例如在 [ 0 , 0.2 ] [0,0.2] [0,0.2] 范围内以 0.05 为步长,则实际评估的候选参数值有 5 个。
显然,这样选定的参数值往往不是"最佳"值,但这是在计算开销和性能估计之间进行折中的结果。
事实上,即便在进行这样的折中后,调参往往仍很困难。很多强大的学习算法有大量参数需要设定,以至于不少任务中,参数调得好不好往往对模型性能有关键影响。
给定包含 m m m 个样本的数据集 D D D,在模型评估与选择过程中由于需要留出一部分数据进行评估测试,事实上我们只使用了一部分数据集。
因此,在模型选择完成、学习算法和参数配置已经选定后,应用数据集 D D D 重新训练模型。这个模型在训练过程中使用了所有 m m m 个样本,这才是我们最终提交给用户的模型。
另外,需注意的是,我们通常把学得模型在实际使用中遇到的数据称为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集常称为"验证集"(validation set)。
例如,在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参。
三、性能度量
对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量(performance measure)。
性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的"好坏"是相对的,不仅取决于算法和数据,还取决于任务需求。
在预测任务中,给定样例集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ... , ( x m , y m ) } D=\{(\pmb{x_1},y_1),(\pmb{x_2},y_2),\dots,(\pmb{x_m},y_m)\} D={(x1,y1),(x2,y2),...,(xm,ym)},要评估学习器 f f f 的性能,就要把预测结果 f ( x ) f(\pmb{x}) f(x) 与真实标记 y y y 进行比较。
回归任务最常用的性能度量是"均方误差"(mean squared error) E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 . E(f;D)=\frac{1}{m}\sum_{i=1}^m(f(\pmb{x_i})-y_i)^2. E(f;D)=m1i=1∑m(f(xi)−yi)2. 下面介绍分类任务中常用的性能度量。
3.1 错误率与精度
开头就提到了错误率与精度,这是分类任务中最常用的两种性能度量,既适用于二分类任务,也适用于多分类任务。
错误率是分类错误的样本数占样本总数的比例,精度则是分类正确的样本数占样本总数的比例。
3.2 查准率、查全率与 F 1 F1 F1
错误率与精度虽常用,但并不能满足所有任务需求。以西瓜问题为例,假定瓜农拉来一车西瓜,我们用训练好的模型对这些西瓜进行判别,显然,错误率衡量了有多少比例的瓜被判别错误。
但是,如果我们关心的问题是"所有好瓜里面有多少比例被挑出来了",那么,错误率就不够用了。
类似的需求在信息检索等应用中经常出现,例如在信息检索中,我们会关心"检索出的信息有多少比例是用户感兴趣的"、"用户感兴趣的信息中有多少被检索出来了"。
"查准率"(precision)与"查全率"(recall)是更为合适的性能度量。
对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(true positive)、假正率(false positive)、真反例(true negative)、假反例(false negative)四种情形。
true 表示的是模型是否判断对了;positive 表示模型预测的结果。
下表为分类结果的"混淆矩阵"(confusion matrix),其中主对角线为判断对了的。
令 T P , F P , T N , F N TP, FP, TN, FN TP,FP,TN,FN 分别表示对应的样例数,则四者相加总和为总样例数。
查准率 P P P 定义为 P = T P T P + F P , P=\frac{TP}{TP+FP}, P=TP+FPTP, 表示模型预测出来的好瓜中真正是好瓜的比例。
查全率 R R R 定义为 R = T P T P + F N , R=\frac{TP}{TP+FN}, R=TP+FNTP, 表示实际的所有好瓜中,被模型预测出来是好瓜的比例。
查准率与查全率是相互矛盾的。一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。
例如,若希望把所有好瓜都挑出来,则可以增加选瓜的数量来实现;而如果将所有西瓜选上,则所有的好瓜肯定也被选出来了,查全率 100%,但查准率就比较低。通常只有在一些简单的任务中,才可能使得两者都很高。
很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为"最可能"是正例的样本,排在最后的则是学习器认为"最不可能"是正例的样本。
按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率。以查准率为纵轴、查全率为横轴作图,就可以得到查准率-查全率曲线,简称"P-R"曲线,如图2.3所示。
P-R 图直观地显示出学习器在样本总体上的查全率、查准率。在进行比较时,若一个学习器的 P-R 曲线被另一个学习器的曲线完全"包住",则可认为后者的性能优于前者,如图2.3中的 A 和 C。
若出现 P-R 曲线相交,如图2.3中的 A 和B,难以一般性地断言两者优劣。然而,人们往往仍希望能把学习器 A 和 B分个高低,这时,一个比较合理的判据是 P-R 曲线下面积的大小,其在一定程度上表征了学习器在查准率和查全率取得"双高"的比例。但这个值不太容易估算,因此,人们设计了一些综合考量的性能度量。
"平衡点"(Break-Event Poine, BEP)就是这样一个度量,它是"查准率=查全率"时的取值,例如图2.3中,A 的 BEP 值是 0.8,B 的BEP 值小于 0.8,因此,可认为 A 优于 B。
但 BEP 还是过于简化了些,更常用的是 F 1 F1 F1 度量: F 1 = 2 × P × R P + R = 2 × T P 样例总数 + T P − T N F1=\frac{2\times P\times R}{P+R}=\frac{2\times TP}{样例总数+TP-TN} F1=P+R2×P×R=样例总数+TP−TN2×TP 实际上, F 1 F1 F1 是 P 和 R 的调和平均,即 1 F 1 = 1 2 ⋅ ( 1 P + 1 R ) . \frac{1}{F1}=\frac{1}{2}\cdot(\frac{1}{P}+\frac{1}{R}). F11=21⋅(P1+R1). 在一些应用中,我们对查准率和查重率的重视程度不同。例如在商品推荐时,为尽可能少打扰用户,因此查准率应该高些;而在逃犯检索系统中,避免漏掉,查全率应该高一些。
因此,为表达出对查全率/查准率的不同偏好,定义 F 1 F1 F1 度量的一般形式为 F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R , F_\beta=\frac{(1+\beta^2)\times P\times R}{(\beta^2\times P)+R}, Fβ=(β2×P)+R(1+β2)×P×R, 其中 β > 0 \beta>0 β>0 度量了查全率对查准率的相对重要性。 β = 1 \beta=1 β=1 时退化为标准的 F 1 F1 F1; β > 1 \beta>1 β>1 时查全率有更大影响; β < 1 \beta<1 β<1 时查准率有更大影响。
很多时候我们有多个二分类混淆矩阵,例如进行多次训练/测试;或是多个数据集上进行训练/测试,希望估计算法的"全局"性能;甚或是执行多分类任务等等,总之,我们希望在 n n n 个二分类混淆矩阵上综合考虑查准率与查全率。
一种直接的做法是先在各混淆矩阵上分别计算查准率和查全率,再计算平均值,这样就得到"宏查全率"、"宏查准率"以及"宏 F 1 F1 F1"(macro- F 1 F1 F1)。
还可以将各混淆矩阵的对应元素进行平均,得到 T P , F P , T N , F N TP, FP, TN, FN TP,FP,TN,FN 的均值,再基于这些均值计算出"微查全率"、"微查准率"以及"微 F 1 F1 F1"(micro- F 1 F1 F1)。
3.3 ROC 与 AUC & 3.4 代价敏感错误率与代价曲线
这两个小节内容实在难懂,我看周老师在 B 站上的课也没有讲解,就跳过了。
四、比较检验
有了试验评估方法和性能度量,看起来就能对学习器的性能进行评估比较了:先使用某种试验评估方法测得学习器的某个性能度量结果,然后对这些结果进行比较。
但怎么来做这个"比较"呢?是直接取得性能度量的值然后"比较大小"吗?实际上,机器学习中性能比较这件事远比我们想象的复杂得多。
这里面涉及几个重要因素:首先,我们希望比较的是泛化性能,然而通过实验评估方法我们获得的是测试集上的性能,两者的对比结果可能未必相同;
第二,测试集上的性能与测试集本身的选择有很大关系,即便使用相同大小的测试集,若包含的测试样例不同,测试结果也会不同;
第三,很多机器学习算法本身具有一定随机性,即便用相同的参数设置在同一个测试集上多次运行,其结果也会有不同。
那么,有没有适当的方法对学习器的性能进行比较呢?
统计假设检验(hypothesis test)为我们进行学习器性能比较提供了重要依据。基于假设检验结果我们可推断出,若在测试集上观察到学习器 A 比 B 好,则 A 的泛化性能是否在统计学意义上优于 B,以及这个结论的把握有多大。
下面介绍两种最基本的假设检验,然后介绍几种常用的机器学习性能比较方法。默认以错误率为性能度量,用 ϵ \epsilon ϵ 表示。
4.1 假设检验
假设检验中的"假设"是对学习器泛化错误率分布的某种判断或猜想,例如" ϵ = ϵ 0 \epsilon=\epsilon_0 ϵ=ϵ0"。现实任务中我们并不知道学习器的泛化错误率,只能获知其测试错误率。
泛化错误率与测试错误率未必相同,但直观上,两者接近的可能性应比较大,相差很远的可能性比较小。因此,可根据测试错误率估推出错误率的分布。
泛化错误率为 ϵ \epsilon ϵ 的学习器在一个样本上犯错的概率是 ϵ \epsilon ϵ;测试错误率 ϵ ^ \hat{\epsilon} ϵ^ 意味着在 m m m 个测试样本中恰有 ϵ ^ × m \hat{\epsilon}\times m ϵ^×m 个被误分类。
假定测试样本是从样本总体分布中独立采样而得,那么泛化错误率为 ϵ \epsilon ϵ 的学习器将其中 m ′ m' m′ 个样本误分类、其余样本全部分类正确的概率是 ϵ m ′ ( 1 − ϵ ) m − m ′ \epsilon^{m'}(1-\epsilon)^{m-m'} ϵm′(1−ϵ)m−m′;
由此可估算出恰将 ϵ ^ × m \hat{\epsilon}\times m ϵ^×m 个样本误分类的概率所下式所示,这也表达了在包含 m m m 个样本的测试集上,泛化错误率为 ϵ \epsilon ϵ 的学习器被测得测试错误率为 ϵ ^ \hat{\epsilon} ϵ^ 的概率: P ( ϵ ^ ; ϵ ) = C m ϵ ^ × m ϵ ϵ ^ × m ( 1 − ϵ ) m − ϵ ^ × m . P(\hat{\epsilon};\epsilon)=C_m^{\hat{\epsilon}\times m}\epsilon^{\hat{\epsilon}\times m}(1-\epsilon)^{m-\hat{\epsilon}\times m}. P(ϵ^;ϵ)=Cmϵ^×mϵϵ^×m(1−ϵ)m−ϵ^×m. 给定测试错误率,令 P P P 对 ϵ \epsilon ϵ 的偏导为零,可解得 ϵ = ϵ ^ \epsilon=\hat{\epsilon} ϵ=ϵ^,有 ϵ − ϵ ^ \epsilon-\hat{\epsilon} ϵ−ϵ^ 的绝对值增大时, P P P 减小。这符合二项(binomial)分布。
原书中上式表达组合数,写成了括号的形式。
我们可使用"二项检验"(binomial test)来对假设" ϵ ≤ ϵ 0 \epsilon \leq \epsilon_0 ϵ≤ϵ0" 进行检验。
在很多时候我们并非仅做一次留出法估计,而是通过多次重复留出法或是交叉验证法等进行多次训练/测试,这样会得到多个测试错误率,此时可使用" t t t 检验"( t t t-test)。
上面的两种方法都是关于单个学习器泛化性能的假设进行检验,而在现实任务中,更多时候我们需要对不同学习器的性能进行比较,下面介绍一些用于此类情况的假设检验方法。
假设检验涉及到数理统计的内容,之前学的时候就不扎实,现在更是难以理解。为快速入门,下面只简单介绍,以后有机会补起来。
4.2 交叉验证 t t t 检验
对两个学习器 A 和 B,若我们使用 k k k 折交叉验证法得到的测试错误率分别为 ϵ 1 A , ϵ 2 A , ⋯ , ϵ k A \epsilon_1^A,\epsilon_2^A,\cdots,\epsilon_k^A ϵ1A,ϵ2A,⋯,ϵkA 和 ϵ 1 B , ϵ 2 B , ⋯ , ϵ k B \epsilon_1^B,\epsilon_2^B,\cdots,\epsilon_k^B ϵ1B,ϵ2B,⋯,ϵkB,其中 ϵ i A \epsilon_i^A ϵiA 和 ϵ i B \epsilon_i^B ϵiB 是在相同的第 i i i 折训练/测试集上得到的结果,则可用 k k k 交叉验证"成对 t t t 检验"(paired t t t-tests)来进行比较检验。
这里的基本思想是若两个学习器的性能相同,则它们使用相同的训练/测试集得到的测试错误率应相同,即 ϵ i A = ϵ i B \epsilon_i^A=\epsilon_i^B ϵiA=ϵiB。
4.3 McNemar 检验
对于二分类问题,使用留出法不仅可估计出学习器 A 和 B 的测试错误率,还可以获得两学习器分类结果的差别,即两者都正确、都错误、一正确另一个错误的样本数,如"列联表"(contingency table)所示。
若我们做的假设是两学习器性能相同,则应有 e 01 = e 10 e_{01}=e_{10} e01=e10,那么变量 ∣ e 01 − e 10 ∣ |e_{01}-e_{10}| ∣e01−e10∣ 应当服从正态分布,且均值为 1,方差为 e 01 + e 10 e_{01}+e_{10} e01+e10。可利用卡方( χ 2 \chi^2 χ2)检验。
4.4 Friedman 检验与 Nemenyi 后续检验
交叉验证 t t t 检验和 McNemar 检验都是在一个数据集上比较两个算法的性能,而在很多时候,我们会在一组数据集上对多个算法进行比较。
当有多个算法参与比较时,一种做法是在每个数据集上分别列出两两比较的结果,而在两两比较时可使用前述方法;另一种方法更为直接,即使用基于算法排序的 Friedman 检验。
假定我们用 D 1 , D 2 , D 3 D_1, D_2, D_3 D1,D2,D3 和 D 4 D_4 D4 四个数据集对算法 A、B、C 进行比较。首先,使用留出法或交叉验证法得到每个算法在每个数据集上的测试结果,然后在每个数据集上根据测试性能由好到坏排序,并赋予序值 1 , 2 , ⋯ 1,2,\cdots 1,2,⋯;若算法的测试性能相同,则平分序值。可列出表2.5。
然后,使用 Friedman 检验来判断这些算法是否性能都相同。若相同,则它们的平均序值应当相同。若"所有算法的性能相同"这个假设被拒绝,则说明算法的性能显著不同。这时需进行"后续检验"(post-hoc test)来进一步区分算法,如 Nemenyi 后续检验。
上述检验比较可以直观地用 Friedman 检验图表示。例如根据表2.5的序值结果可绘制出图2.8。对每个算法,用一个圆点显示其平均序值,以圆点为中心的横线段表示临界值域的大小。
然后就可从图中观察,若两个算法的横线段有交叠,则说明这两个算法没有显著差别,否则即说明有显著差别。从图2.8可以看出,算法 A 和 B 没有显著差别,而算法 A 显著优于算法 C。
五、偏差与方差
对学习算法除了通过实验估计其泛化性能,人们往往还希望了解它"为什么"具有这样的性能。"偏差-方差分解"(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。
偏差-方差分解试图对学习算法的期望泛化错误率进行拆解。我们知道,算法在不同训练集上学得的结果很可能不同,即便这些训练集是来自同一个分布。
对测试样本 x \pmb{x} x,令 y D y_D yD 为 x \pmb{x} x 在数据集中的标记, y y y 为 x \pmb{x} x 的真实标记, f ( x ; D ) f(\pmb{x};D) f(x;D) 为训练集 D D D 上学得模型 f f f 在 x \pmb{x} x 的预测输出。
以回归任务为例,可求出学习算法的期望预测、使用样本数相同的不同训练集产生的方差、噪声、期望输出与真实标记的差别即偏差(bias)。
为便于讨论,假定噪声期望为零。通过简单的多项式展开合并,可对算法的期望泛化误差进行分解。最终可得到,泛化误差可分解为偏差、方差与噪声之和。
回顾这三者的定义:偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;
方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;
噪声则表达了在当前任务上任何学习算法所能达到的期望误差的下界,即刻画了学习问题本身的难度。
偏差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。
给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。
一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variance dilemma)。图2.9给出了一个示意图(先下后上的曲线表示泛化误差)。
给定学习任务,假定我们能控制学习算法的训练程度,则在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时偏差主导了泛化错误率;
随着训练程度的加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐主导了泛化错误率;
在训练程度充足后,学习器的拟合能力已经非常强,训练数据发生的轻微扰动都会导致学习器发生显著变化,若训练数据自身的、非全局的特性被学习器学到了,则将发生过拟合。