经验误差与过拟合
通常我们把分类错误的样本数占样本总数的比例称为错误率 (error rate),即若 m m m 个样本中有 a a a 个样本分类错误,则错误率 E = a m E = \dfrac{a}{m} E = m a 。相应地 1 − a m 1 - \dfrac{a}{m} 1 − m a 称为精度 (accuracy)。
更一般地,我们把学习器的实际预测输出与样本的真实输出之间的差异称为误差 (error),学习器在训练集上的误差称为训练误差 (training error)或经验误差 (empirical error),在新样本上的误差称为泛化误差 (generalization error)。
显然我们希望得到泛化误差小的学习器,但是我们无法直接得到泛化误差,实际能做的努力是努力使经验误差最小化。然而经验误差很小、在训练集上表现很好的学习器,在多数情况下泛化能力都并不好。
我们实际希望的,是在新样本上能表现得很好的学习器。为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的「普遍规律」,这样才能在遇到新样本时做出正确的判别。然而当学习器把训练样本学得「太好了」时,很可能将训练样本自身一些特点当作了所有潜在样本都会具有的一般性质,这就会导致泛化性能下降,这种现象称为过拟合 (overfitting)。
与之相对的是欠拟合 (underfitting),即模型在训练集上的表现就很差,这种情况下模型的泛化能力也会很差。
有多种因素可能导致过拟合,其中最常见的情况是由于学习能力过于强大,以至于把训练样本所包含的不太一般的特性都学到了;而欠拟合则通常是由于学习能力低下而造成的。
欠拟合比较容易克服,例如在决策树学习中扩展分支、在神经网络学习中增加训练轮数等。而过拟合则很麻烦,实际上过拟合是机器学习面临的关键障碍,是无法彻底避免的,我们所能做的只是缓解,或者说减小其风险。
评估方法
通常,我们可通过实验测试来对学习器的泛化误差进行评估并进而做出选择。为此需使用一个测试集 (testing set)来测试学习器对新样本的判别能力,然后以测试集上的「测试误差」(testing error)作为泛化误差的近似。
通常我们假设测试样本也是从样本真实分布中独立同分布采样而得。但需注意的是,测试集应该尽可能与训练集互斥 ,即测试样本尽量不在训练集中出现、未在训练过程中使用过。
我们只有一个包含 m m m 个样例的数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } D = \left\lbrace (\bm{x}_1, y_1),\, (\bm{x}_2, y_2),\, \cdots,\, (\bm{x}_m, y_m) \right\rbrace D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } ,既要训练,又要测试,就需要对 D D D 进行适当的处理,从中产生训练集 S S S 和测试集 T T T 。下面是几种常见的做法。
留出法
留出法 (hold-out)直接将数据集 D D D 划分为两个互斥的集合,其中一个集合作为训练集 S S S ,另一个作为测试集 T T T 。即 D = S ∪ T , S ∩ T = ∅ D = S \cup T,\, S \cap T = \empty D = S ∪ T , S ∩ 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 比较小,评估结果可能不够稳定准确;但若令测试集 T T T 多包含一些样本,则训练集 S S S 和 D D D 差别更大了,被评估的模型与用 D D D 训练出的模型相比可能有较大的差别,从而降低了评估结果的保真性 (fidelity)。
这个问题没有完美的解决方案,常见做法是将大约 2 3 ∽ 4 5 \dfrac{2}{3} \backsim \dfrac{4}{5} 3 2 ∽ 5 4 的样本用于训练,剩余样本用于测试。
交叉验证法
交叉验证法 (cross validation)先将数据集 D D D 划分为 k k k 个大小相似的互斥子集,即 D = D 1 ∪ D 2 ∪ ⋯ ∪ D k , D i ∩ D j = ∅ D = D_1 \cup D_2 \cup \cdots \cup D_k, D_i \cap D_j = \empty D = D 1 ∪ D 2 ∪ ⋯ ∪ D k , D i ∩ D j = ∅ 。每个子集 D i D_i D i 都尽可能保持数据分布的一致性,即采用分层采样。然后每次用 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 = 10 k = 10 k = 10 ,此时成为 10 折交叉验证 。
与留出法类似,划分为 k k k 个子集同样存在多种划分方式。为减小因样本划分不同而引入的差别,k k k 折交叉验证通常要随机使用不同的划分 p p p 次,最终评估结果是这 p p p 次 k k k 折交叉验证结果的均值。常使用的有「10 次 10 折交叉验证」,这与「100 次留出法」都是进行了 100 次训练/测试。
令 k k k 为数据集 D D D 中包含的样本数量,就得到了交叉验证发的一个特例——留一法 (leave-one-out, LOO)。显然留一法不受随机样本划分方式的影响。但留一法的重要缺陷就是,当数据集比较大时,训练大量模型的计算开销可能是难以忍受的。
自助法
我们希望评估的是用 D D D 训练出的模型,但在前两个方法中,都保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比 D D D 小,这必然会引入一些因训练样本规模不同而导致的估计偏差。
自助法 (bootstrapping)是一种通过自助采样技术来评估学习器泛化误差的方法。给定包含 m m m 个样本的数据集 D D D ,我们对它进行 m m m 次有放回的随机采样,得到了 m m m 个样本的自助采样集 D ′ D' D ′ 。显然,由于是有放回采样,D ′ D' D ′ 中有的样本可能重复出现,而有的样本则根本不出现。
可以进行一个简单的估计,样本在 m m m 次采样中始终不被采到的概率是 ( 1 − 1 m ) m \left(1 - \dfrac{1}{m}\right)^m ( 1 − m 1 ) m ,取极限得到 lim m → ∞ ( 1 − 1 m ) m = 1 e ≈ 0.368 \lim\limits_{m \to \infty} \left(1 - \dfrac{1}{m}\right)^m = \dfrac{1}{\e} \approx 0.368 m → ∞ lim ( 1 − m 1 ) m = e 1 ≈ 0.368 ,即约有 36.8 % 36.8\% 36.8% 的样本不会出现在自助采样集中。
于是我们可将 D ′ D' D ′ 用作训练集,D \ D ′ D\backslash D' D \ D ′ 用作测试集。这样实际评估的模型与期望评估的模型都使用 m m m 个训练样本,而我们仍有数据总量约 1 3 \dfrac{1}{3} 3 1 的、没在训练集中出现的样本用于测试。这样的测试结果,亦称为包外估计 (out-of-bag estimate)。
自助法在数据集较小、难以有效划分训练/测试集 时很有用。但由于自助法产生的数据集改变了初始数据集的分布,这会引出估计偏差,因此在数据集足够大时,留出法和交叉验证法更常用。
调参与最终模型
大多数学习算法都有些参数 (parameter)需要设定,参数配置不同,学得模型的性能往往有显著差别。因此,在进行模型评估与选择时,除了要对适用学习算法进行选择,还需对算法参数进行设定,这就是通常所说的参数调节 或简称调参 (parameter tuning)。
调参似乎与算法选择并没什么本质区别:对每种参数配置训练出模型,然后把对应最好的模型的参数作为结果。但实际上,调参与算法选择是有区别的。
学习算法的很多参数都是在实数范围内取值,因此对每种参数的配置都训练出模型是不可行的。现实中常用的做法是对每个参数选定一个范围和变化步长,例如在 [ 0 , 0.2 ] [0, 0.2] [ 0 , 0.2 ] 范围内以 0.05 0.05 0.05 为步长,则实际需要评估的候选参数只要 5 5 5 个,最终是从这 5 5 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 = \left\lbrace (\bm{x}_1, y_1), (\bm{x}_2, y_2), \ldots, (\bm{x}_m, y_m) \right\rbrace D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } ,其中 y i y_i y i 是示例 x i \bm{x}_i x i 的真实标记。要评估学习器 f f f 的性能,就是要把学习器预测结果 f ( x ) f(\bm{x}) f ( x ) 与真实标记 y y y 进行比较。
回归任务最常用的性能度量是均方误差 (mean squared error):
E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 \boxed{E(f; D) = \dfrac{1}{m} \sum_{i=1}^{m} \left(f(\bm{x}_i) - y_i\right)^2}
E ( f ; D ) = m 1 i = 1 ∑ m ( f ( x i ) − y i ) 2
更一般的,对于数据分布 D \mathcal{D} D 和概率密度函数 p p p ,均方误差可描述为
E ( f ; D ) = ∫ x ∼ D ( f ( x ) − y ) 2 p ( x ) d x E(f; \mathcal{D}) = \int_{\bm{x} \sim \mathcal{D}} \left(f(\bm{x}) - y\right)^2 p(\bm{x}) \d \bm{x}
E ( f ; D ) = ∫ x ∼ D ( f ( x ) − y ) 2 p ( x ) d x
错误率与精度
错误率 是分类错误的样本数占样本总数的比例 ,精度 则是分类正确的样本数占样本总数的比例 。
对样例集 D D D ,分类错误率 定义为
E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ≠ y i ) \boxed{E(f; D) = \dfrac{1}{m} \sum_{i=1}^{m} \mathbb{I}\left(f(\bm{x}_i) \ne y_i\right)}
E ( f ; D ) = m 1 i = 1 ∑ m I ( f ( x i ) = y i )
精度 则定义为
acc ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) = y i ) = 1 − E ( f ; D ) \boxed{ \begin{aligned}
\operatorname{acc}(f; D) &= \dfrac{1}{m} \sum_{i=1}^{m} \mathbb{I}\left(f(\bm{x}_i) = y_i\right) \\
&= 1 - E(f; D)
\end{aligned}}
acc ( f ; D ) = m 1 i = 1 ∑ m I ( f ( x i ) = y i ) = 1 − E ( f ; D )
更一般的,对于数据分布 D \mathcal{D} D 和概率密度函数 p p p ,错误率和精度可描述为
E ( f ; D ) = ∫ x ∼ D I ( f ( x ) ≠ y ) p ( x ) d x acc ( f ; D ) = 1 − E ( f ; D ) \begin{aligned}
E(f; \mathcal{D}) &= \int_{\bm{x} \sim \mathcal{D}} \mathbb{I}\left(f(\bm{x}) \ne y\right) p(\bm{x}) \d \bm{x} \\
\operatorname{acc}(f; \mathcal{D}) &= 1 - E(f; \mathcal{D})
\end{aligned}
E ( f ; D ) acc ( f ; D ) = ∫ x ∼ D I ( f ( x ) = y ) p ( x ) d x = 1 − E ( f ; D )
查准率、查全率与 F 1 F_1 F 1
以西瓜问题为例,错误率衡量的是「有多少比例的瓜被判别错误」。但如果我们关心的是「挑出的西瓜中有多少比例是好瓜」或「所有好瓜中有多少比例被挑了出来」,就需要其他的性能度量。
类似的需求在信息检索、Web 搜索等应用中经常出现。例如在信息检索中,我们经常会关心「检索出的信息中有多少比例是用户感兴趣的」「用户感兴趣的信息中有多少被检索出来了」。查准率 (precision, 准确率 )与查全率 (recall, 召回率 )是更为适用于此类需求的性能度量。
对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(true positive)、假正例(false positive)、真反例(true negative)、假反例 false negative)四种情形。分别令为 T P , F P , T N , F N TP, FP, TN, FN TP , FP , TN , FN ,分类结果的混淆矩阵 (confusion matrix)如下:
真实情况
预测正例
预测反例
正例
T P TP TP (真正例)
F N FN FN (假反例)
反例
F P FP FP (假正例)
T N TN TN (真反例)
则查准率 P P P 与查全率 R R R 分别定义为:
{ P = T P T P + F P R = T P T P + F N \left\lbrace\begin{aligned}
P &= \dfrac{TP}{TP + FP} \\
R &= \dfrac{TP}{TP + FN}
\end{aligned}\right.
⎩ ⎨ ⎧ P R = TP + FP TP = TP + FN TP
查准率和查全率是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。
例如,若希望将好瓜尽可能多地选出来,则可通过增加选瓜的数量来实现,如果将所有西瓜都选上,那么所有的好瓜也必然都被选上了,但这样查准率就会较低;若希望选出的瓜中好瓜比例尽可能高,则可只挑选最有把握的瓜,但这样就难免会漏掉不少好瓜,使得查全率较低。
通常只有在一些简单任务中,才可能使查全率和查准率都很高。
在很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为「最可能」是正例的样本,排在最后的则是学习器认为「最不可能」是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率。以查准率为纵轴、查全率为横轴作图,就得到了「查准率-查全率曲线」,简称 P-R 曲线 ,显示该曲线的图称为 P-R 图 。
在上图中,显然有学习器 A 的性能优于学习器 C(因为 C 被 A 完全「包住」)。但是对于 A 与 B 则难以进行断言,一般只能在具体的查准率或查全率条件下进行比较。
但很多情况下仍然希望将二者分个胜负,一个合理的判据就是比较其 P-R 曲线下面积的大小。但这个不太容易估算。
平衡点 (break-even point, BEP)是 P-R 曲线上查准率等于查全率的点,是一个综合考虑查准率和查全率的性能度量。基于 BEP 比较,可认为 A 优于 B。
BEP 仍然过于简化了,更常用的是 F 1 F_1 F 1 度量 。
F 1 F_1 F 1 是基于查准率与查全率的调和平均(harmonic mean)定义的:
1 F 1 = 1 2 ( 1 P + 1 R ) \dfrac{1}{F_1} = \dfrac{1}{2} \left( \dfrac{1}{P} + \dfrac{1}{R} \right)
F 1 1 = 2 1 ( P 1 + R 1 )
即
F 1 = 2 × P × R P + R = 2 × T P 样例总数 + T P − T N \begin{aligned}
F_1 &= \dfrac{2 \times P \times R}{P + R} \\
&= \dfrac{2 \times TP}{\text{样例总数} + TP - TN}
\end{aligned}
F 1 = P + R 2 × P × R = 样例总数 + TP − TN 2 × TP
F β F_{\beta} F β 是加权调和平均:
F β = 1 1 + β 2 ( 1 P + β 2 R ) F_{\beta} = \dfrac{1}{1 + \beta^2} \left( \dfrac{1}{P} + \dfrac{\beta^2}{R} \right)
F β = 1 + β 2 1 ( P 1 + R β 2 )
即
F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R F_{\beta} = \dfrac{(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 β F_{\beta} F β 退化为标准 F 1 F_1 F 1 ;β > 1 \beta > 1 β > 1 时查全率有更大影响;β < 1 \beta < 1 β < 1 时查准率有更大影响。
与算术平均 P + R 2 \dfrac{P + R}{2} 2 P + R 与几何平均 P × R \sqrt{P \times R} P × R 相比,调和平均更重视较小值。
很多时候我们有多个二分类混淆矩阵,例如进行多次训练/测试,每次都能得到一个混淆矩阵,抑或是在多个数据集上进行训练/测试,希望估计算法的全局性能等。总之我们希望在 n n n 个二分类混淆矩阵上综合考察查准率和查全率。
一种直接的做法是先在各混淆矩阵上分别计算出查准率和查全率,记为 ( P 1 , R 1 ) , ( P 2 , R 2 ) , ⋯ , ( P n , R n ) (P_1, R_1),\, (P_2, R_2),\, \cdots,\, (P_n, R_n) ( P 1 , R 1 ) , ( P 2 , R 2 ) , ⋯ , ( P n , R n ) ,再计算平均值,就得到了宏查全率 (macro-P P P )、宏查准率 (macro-R R R )和相应的宏 F 1 F_1 F 1 (macro-F 1 F_1 F 1 ):
{ macro- P = 1 n ∑ i = 1 n P i macro- R = 1 n ∑ i = 1 n R i macro- F 1 = 2 × macro- P × macro- R macro- P + macro- R \left\lbrace\begin{aligned}
\text{macro-}P &= \dfrac{1}{n} \sum_{i=1}^{n} P_i \\
\text{macro-}R &= \dfrac{1}{n} \sum_{i=1}^{n} R_i \\
\text{macro-}F_1 &= \dfrac{2 \times \text{macro-}P \times \text{macro-}R}{\text{macro-}P + \text{macro-}R}
\end{aligned}\right.
⎩ ⎨ ⎧ macro- P macro- R macro- F 1 = n 1 i = 1 ∑ n P i = n 1 i = 1 ∑ n R i = macro- P + macro- R 2 × macro- P × macro- R
另一种做法是先将各混淆矩阵的对应元素进行平均,得到 T P , F P , T N , F N TP, FP, TN, FN TP , FP , TN , FN 的平均值,记为 T P ‾ , F P ‾ , T N ‾ , F N ‾ \overline{TP}, \overline{FP}, \overline{TN}, \overline{FN} TP , FP , TN , FN ,再计算查准率和查全率,就得到了微查全率 (micro-P P P )、微查准率 (micro-R R R )和相应的微 F 1 F_1 F 1 (micro-F 1 F_1 F 1 ):
{ micro- P = T P ‾ T P ‾ + F P ‾ micro- R = T P ‾ T P ‾ + F N ‾ micro- F 1 = 2 × micro- P × micro- R micro- P + micro- R \left\lbrace\begin{aligned}
\text{micro-}P &= \dfrac{\overline{TP}}{\overline{TP} + \overline{FP}} \\
\text{micro-}R &= \dfrac{\overline{TP}}{\overline{TP} + \overline{FN}} \\
\text{micro-}F_1 &= \dfrac{2 \times \text{micro-}P \times \text{micro-}R}{\text{micro-}P + \text{micro-}R}
\end{aligned}\right.
⎩ ⎨ ⎧ micro- P micro- R micro- F 1 = TP + FP TP = TP + FN TP = micro- P + micro- R 2 × micro- P × micro- R
ROC 与 AUC
很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值 (threshold)进行比较,若大于阈值则分为正类,否则反类。这样分类过程就相当于在这个排序中以某个「截断点」(cut point)将样本分为两部分,前一部分判作正例,后一部分判作反例。
在不同的应用任务中,我们可根据任务需求来采用不同的截断点,例如若我们更重视「查准率」,则可选择排序中靠前的位置进行截断;若更重视「查全率」,则可选择靠后的位置进行截断。
因此排序本身的质量好坏,体现了综合考虑学习器在不同任务下的「期望泛化性能」的好坏,或者说,「一般情况下 」泛化性能的好坏。ROC 曲线则是从这个角度出发来研究学习器泛化性能的有力工具。
ROC 全称是受试者工作特征 (receiver operating characteristic)曲线。与 P-R 曲线类似,我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要量的值,分别以它们为横纵坐标作图,就得到了 ROC 曲线。
ROC 曲线的横轴是假正例率 (false positive rate, FPR),纵轴是真正例率 (true positive rate, TPR),分别定义为
{ FPR = F P F P + T N TPR = T P T P + F N \left\lbrace\begin{aligned}
\text{FPR} &= \dfrac{FP}{FP + TN} \\
\text{TPR} &= \dfrac{TP}{TP + FN}
\end{aligned}\right.
⎩ ⎨ ⎧ FPR TPR = FP + TN FP = TP + FN TP
进行学习器的比较时,与 P-R 图类似,若一个学习器的 ROC 曲线被另一个学习器的曲线完全包住,可断言后者的性能优于前者。
若两个学习器的 ROC 曲线发生交叉,难以一般性断言两者孰优孰劣,若一定要进行比较,一个合理的判据是比较 ROC 曲线下的面积 ,即 AUC (Area Under ROC Curve)。
假定 ROC 曲线是由坐标为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } \left\lbrace (x_1, y_1), (x_2, y_2), \cdots, (x_m, y_m) \right\rbrace { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } 的点按序连接而成(x 1 = 0 , x m = 1 x_1 = 0, x_m = 1 x 1 = 0 , x m = 1 ),AUC 可估算为
AUC = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ⋅ ( y i + y i + 1 ) \text{AUC} = \dfrac{1}{2} \sum_{i=1}^{m-1} (x_{i+1} - x_i) \cdot (y_i + y_{i+1})
AUC = 2 1 i = 1 ∑ m − 1 ( x i + 1 − x i ) ⋅ ( y i + y i + 1 )
形式化地看,AUC 考虑的是样本预测的排序质量,与排序误差有紧密联系。
给定 m + m^{+} m + 个正例和 m − m^{-} m − 个反例,令 D + D^{+} D + 和 D − D^- D − 分别表示正、反例集合,则排序损失 (loss)定义为
ℓ rank = 1 m + m − ∑ x + ∈ D + ∑ x − ∈ D − ( I ( f ( x + ) < f ( x − ) ) + 1 2 I ( f ( x + ) = f ( x − ) ) ) \ell_{\text{rank}} = \dfrac{1}{m^{+}m^{-}} \sum_{\bm{x}^{+} \in D^{+}} \sum_{\bm{x}^{-} \in D^{-}} \left( \mathbb{I}\left(f(\bm{x}^{+}) < f(\bm{x}^{-})\right) + \dfrac{1}{2} \mathbb{I}\left(f(\bm{x}^{+}) = f(\bm{x}^{-})\right) \right)
ℓ rank = m + m − 1 x + ∈ D + ∑ x − ∈ D − ∑ ( I ( f ( x + ) < f ( x − ) ) + 2 1 I ( f ( x + ) = f ( x − ) ) )
上式的含义是:考虑每一对正、反例,若正例的预测值小于反例,则记一个「罚分」;若相等,则记半个「罚分」。显然 ℓ rank \ell_{\text{rank}} ℓ rank 对应的是 ROC 曲线之上的面积:若一个正例在 ROC 曲线上对应标记点的坐标为 ( x , y ) (x, y) ( x , y ) ,则 x x x 恰是排序在其之前的反例所占的比例,即假正例率,因此有
AUC = 1 − ℓ rank \text{AUC} = 1 - \ell_{\text{rank}}
AUC = 1 − ℓ rank
代价敏感错误率与代价曲线
在很多应用中,不同的错误分类所造成的损失是不同的。例如在医学诊断中,将一个健康人诊断为患病(假正例)与将一个患病的人诊断为健康(假反例)所造成的后果是不同的。为权衡不同类型错误所造成的不同损失,可为错误赋予非均等代价 (unequal cost)。
以二分类任务为例,可根据任务的领域知识设定一个代价矩阵 (cost matrix),如下表所示,其中 cost i j \text{cost}_{ij} cost ij 表示将第 i i i 类样本预测为第 j j j 类样本的代价。一般来说,cost i i = 0 \text{cost}_{ii} = 0 cost ii = 0 ,即正确分类的代价为零。
真实类别
预测类别(第 0 0 0 类)
预测类别(第 1 1 1 类)
第 0 0 0 类
0 0 0
cost 01 \text{cost}_{01} cost 01
第 1 1 1 类
cost 10 \text{cost}_{10} cost 10
0 0 0
若将第 0 0 0 类判别为第 1 1 1 类所造成的损失更大,则 cost 01 > cost 10 \text{cost}_{01} > \text{cost}_{10} cost 01 > cost 10 。损失程度相差越大,cost 01 \text{cost}_{01} cost 01 与 cost 10 \text{cost}_{10} cost 10 的差别越大。
前面介绍的一些性能度量大都隐式地假设了均等代价。例如上面对「错误率」的定义 E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ≠ y i ) E(f; D) = \dfrac{1}{m} \displaystyle \sum_{i=1}^{m} \mathbb{I}\left(f(\bm{x}_i) \ne y_i\right) E ( f ; D ) = m 1 i = 1 ∑ m I ( f ( x i ) = y i ) ,直接计算了错误次数,并没有考虑不同错误会造成不同后果。
在非均等代价下,我们所希望的不再是最小化错误次数,而是希望最小化总体代价 (total cost)。
若将上表中第 0 0 0 类作为正类、第 1 1 1 类作为反类,令 D + , D − D^{+}, D^{-} D + , D − 分别代表样例集 D D D 的正例子集和反例子集,则代价敏感 (cost-sensitive)错误率定义为
E ( f ; D ; cost ) = 1 m ( ∑ x i ∈ D + I ( f ( x i ) ≠ y i ) × cost 01 + ∑ x i ∈ D − I ( f ( x i ) ≠ y i ) × cost 10 ) E(f; D; \text{cost}) = \dfrac{1}{m} \left( \sum_{\bm{x}_i \in D^{+}} \mathbb{I}\left(f(\bm{x}_i) \ne y_i\right) \times \text{cost}_{01} + \sum_{\bm{x}_i \in D^{-}} \mathbb{I}\left(f(\bm{x}_i) \ne y_i\right) \times \text{cost}_{10} \right)
E ( f ; D ; cost ) = m 1 ( x i ∈ D + ∑ I ( f ( x i ) = y i ) × cost 01 + x i ∈ D − ∑ I ( f ( x i ) = y i ) × cost 10 )
类似地可以给出基于分布定义的「代价敏感错误率」,以及其他一些性能度量如「精度的代价敏感版本」。
若令 cost i j \text{cost}_{ij} cost ij 中的 i , j i, j i , j 取值不限于 0 , 1 0, 1 0 , 1 ,则可定义出多分类任务的代价敏感性能度量。
在非均等代价下,ROC 曲线不能直接反映出学习器的期望总体代价,而代价曲线 (cost curve)则可达到该目的。
代价曲线图的横轴是取值为 [ 0 , 1 ] [0, 1] [ 0 , 1 ] 的正例概率代价
P ( + ) cost = p × cost 01 p × cost 01 + ( 1 − p ) × cost 10 P(+)\text{cost} = \dfrac{p \times \text{cost}_{01}}{p \times \text{cost}_{01} + (1 - p) \times \text{cost}_{10}}
P ( + ) cost = p × cost 01 + ( 1 − p ) × cost 10 p × cost 01
其中 p p p 是样例为正例的概率;纵轴是取值为 [ 0 , 1 ] [0, 1] [ 0 , 1 ] 的归一化代价
cost norm = FNR × p × cost 01 + FPR × ( 1 − p ) × cost 10 p × cost 01 + ( 1 − p ) × cost 10 \text{cost}_{\text{norm}} = \dfrac{\text{FNR} \times p \times \text{cost}_{01} + \text{FPR} \times (1 - p) \times \text{cost}_{10}}{p \times \text{cost}_{01} + (1 - p) \times \text{cost}_{10}}
cost norm = p × cost 01 + ( 1 − p ) × cost 10 FNR × p × cost 01 + FPR × ( 1 − p ) × cost 10
其中 FPR \text{FPR} FPR 是上面定义的「假正例率」;FNR \text{FNR} FNR 是「假反例率」,定义为 1 − TPR 1 - \text{TPR} 1 − TPR 。
ROC 曲线上每一点对应了代价平面上的一条线段,设 ROC 曲线上点的坐标为 ( TPR , FPR ) (\text{TPR}, \text{FPR}) ( TPR , FPR ) ,则可相应计算出 FNR \text{FNR} FNR ,然后在代价平面上绘制一条从 ( 0 , FPR ) (0, \text{FPR}) ( 0 , FPR ) 到 ( 1 , FNR ) (1, \text{FNR}) ( 1 , FNR ) 的线段,线段下的面积即表示了该条件下的期望总体代价。
如此将 ROC 曲线上的每个点转化为代价平面上的一条线段,然后取所有线段的下界,圈成的面积即为在所有条件下学习器的期望总体代价,如下图所示:
比较检验
在某种度量下取得评估结果后,是否可以直接比较以评判优劣?
答案是不可以,因为:
测试性能并不等于泛化性能
测试性能随着测试集的变化而变化
很多机器学习算法本身有一定的随机性
因此,直接选取相应评估方法在相应度量下比大小的方法不可取。
统计假设检验 (hypothesis test)为学习器性能比较提供了重要依据,基于其结果我们可以推断出若在测试集上观察到学习器 A A A 比 B B B 好,则 A A A 的泛化性能是否在统计意义上优于 B B B ,以及这个结论的把握有多大。
我们先介绍两种最基本的假设检验,然后介绍几种常用的机器学习性能比较方法。
为便于讨论,本节默认以错误率为性能度量,用 ϵ \epsilon ϵ 表示。
二项检验
假设检验中的「假设」是对学习器泛化错误率分布的某种判断或猜想,例如 ϵ = ϵ 0 \epsilon = \epsilon_0 ϵ = ϵ 0 。
现实任务中我们并不知道学习器的泛化错误率,只能获知其测试错误率 ϵ ^ \hat{\epsilon} ϵ ^ 。泛化错误率与测试错误率未必相同,但直观上,二者接近的可能性应比较大,相差很远的可能性比较小。因此,可根据测试错误率估推出泛化错误率的分布。
泛化错误率 为 ϵ \epsilon ϵ 的学习器在一个样本上犯错的概率是 ϵ \epsilon ϵ ;而测试错误率 ϵ ^ \hat{\epsilon} ϵ ^ 意味着在 m m m 个测试样本中恰有 ϵ ^ × m \hat{\epsilon} \times m ϵ ^ × m 个被误分类。
假定测试样本是从样本总体分布中独立采样而得,那么该学习器将其中 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 ( ϵ ^ ; ϵ ) = ( m ϵ ^ × m ) ϵ ϵ ^ × m ( 1 − ϵ ) ( 1 − ϵ ^ ) × m P(\hat{\epsilon}; \epsilon) = \dbinom{m}{\hat{\epsilon} \times m} \epsilon^{\hat{\epsilon} \times m} (1-\epsilon)^{(1-\hat{\epsilon})\times m}
P ( ϵ ^ ; ϵ ) = ( ϵ ^ × m m ) ϵ ϵ ^ × m ( 1 − ϵ ) ( 1 − ϵ ^ ) × m
给定测试率,则解 ∂ P ( ϵ ^ ; ϵ ) ∂ ϵ = 0 \dfrac{\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 distribution)。
考虑假设「ϵ ⩽ ϵ 0 \epsilon \le \epsilon_0 ϵ ⩽ ϵ 0 」,我们可使用二项检验 (binomial test)来对这一假设进行检验。则在 1 − α 1 - \alpha 1 − α 的概率内所能观测到的最大测试率如下所示
ϵ ˉ = max ϵ s.t. ∑ i = ϵ 0 × m + 1 m ( m i ) ϵ i ( 1 − ϵ ) m − i < α \bar{\epsilon} = \max \epsilon\quad \text{s.t.}\quad \sum_{i=\epsilon_0 \times m + 1}^{m} \dbinom{m}{i} \epsilon^i (1-\epsilon)^{m-i} < \alpha
ϵ ˉ = max ϵ s.t. i = ϵ 0 × m + 1 ∑ m ( i m ) ϵ i ( 1 − ϵ ) m − i < α
上式中的 s.t. \text{s.t.} s.t. 即 subject to (such that),表示「使左边式子在右边条件满足时成立」,可译为「使得」。
这里的 1 − α 1-\alpha 1 − α 反映了结论的置信度 (confidence)。
此时若测试错误率 ϵ ^ \hat{\epsilon} ϵ ^ 小于临界值 ϵ ˉ \bar{\epsilon} ϵ ˉ ,则根据二项检验可得出结论:在 α \alpha α 的显著度下,假设「ϵ ⩽ ϵ 0 \epsilon \le \epsilon_0 ϵ ⩽ ϵ 0 」不能被拒绝,即能以 1 − α 1 - \alpha 1 − α 的置信度认为,学习器的泛化错误率不大于 ϵ 0 \epsilon_0 ϵ 0 ;否则该假设可被拒绝,即在 α \alpha α 的显著度下可认为学习器的泛化错误率大于 ϵ 0 \epsilon_0 ϵ 0 。
t 检验
在很多时候我们并非仅做一次留出法估计,而是通过多次重复留出法或是交叉验证法等进行多次训练/测试,这样会得到多个测试错误率,此时可使用「t t t 检验」(t t t -test)。
假定我们得到了 k k k 个测试错误率 ϵ ^ 1 , ϵ ^ 2 , ⋯ , ϵ ^ k \hat{\epsilon}_1, \hat{\epsilon}_2, \cdots, \hat{\epsilon}_k ϵ ^ 1 , ϵ ^ 2 , ⋯ , ϵ ^ k ,则平均测试错误率 μ \mu μ 和方差 σ 2 \sigma^2 σ 2 为
{ μ = 1 k ∑ i = 1 k ϵ ^ i σ 2 = 1 k − 1 ∑ i = 1 k ( ϵ ^ i − μ ) 2 \left\lbrace\begin{aligned}
\mu &= \dfrac{1}{k} \sum_{i=1}^{k} \hat{\epsilon}_i \\
\sigma^2 &= \dfrac{1}{k-1} \sum_{i=1}^{k} (\hat{\epsilon}_i - \mu)^2
\end{aligned}\right.
⎩ ⎨ ⎧ μ σ 2 = k 1 i = 1 ∑ k ϵ ^ i = k − 1 1 i = 1 ∑ k ( ϵ ^ i − μ ) 2
考虑这 k k k 个测试错误率可看作泛化错误率 ϵ 0 \epsilon_0 ϵ 0 的独立采样,则变量
τ t = k ( μ − ϵ 0 ) σ \tau_t = \dfrac{\sqrt{k}(\mu - \epsilon_0)}{\sigma}
τ t = σ k ( μ − ϵ 0 )
服从自由度为 k − 1 k-1 k − 1 的 t t t 分布,如下图所示
对假设「μ = ϵ 0 \mu = \epsilon_0 μ = ϵ 0 」和显著度 α \alpha α ,我们可计算出当测试错误率均值为 ϵ 0 \epsilon_0 ϵ 0 时,在 1 − α 1 - \alpha 1 − α 概率内能观测到的最大测试率,即临界值。
这里考虑双边假设 (two-tailed hypothesis),如上图所示,两边阴影面积各有 α 2 \dfrac{\alpha}{2} 2 α 的面积。假定阴影部分范围分别为 [ − ∞ , t − α / 2 ] , [ t α / 2 , ∞ ] [-\infty , t_{-\alpha / 2}],\, [t_{\alpha / 2}, \infty ] [ − ∞ , t − α /2 ] , [ t α /2 , ∞ ] 。
若平均错误率 μ \mu μ 与 ϵ 0 \epsilon_0 ϵ 0 之差 ∣ μ − ϵ 0 ∣ |\mu - \epsilon_0| ∣ μ − ϵ 0 ∣ 位于临界值范围 [ t − α / 2 , t α / 2 ] [t_{- \alpha / 2}, t_{\alpha / 2}] [ t − α /2 , t α /2 ] 内,则不能拒绝假设「μ = ϵ 0 \mu = \epsilon_0 μ = ϵ 0 」,即可认为泛化错误率为 ϵ 0 \epsilon_0 ϵ 0 ,置信度为 1 − α 1 - \alpha 1 − α ;否则可拒绝该假设,即在该显著度下可认为泛化错误率与 ϵ 0 \epsilon_0 ϵ 0 有显著不同。
上面介绍的两种方法都是对关于单个学习器泛化性能的假设进行检验,而在现实任务中,更多时候我们需对不同学习器的性能进行比较。
两学习器比较
交叉验证 t t t 检验(基于成对 t t t 检验)
McNemar 检验(基于列联表,卡方检验)
多学习器比较
Friedman + Nemenyi
Friedman 检验(基于序值,F 检验;判断「是否都相同」)
Nemenyi 后续检验(基于序值,进一步判断两两差别)
交叉验证 t t t 检验
对两个学习器,若 k k k 折交叉验证得到的错误率分别为 ϵ ^ 1 A , ϵ ^ 2 A , ⋯ , ϵ ^ k A \hat{\epsilon}^A_1, \hat{\epsilon}^A_2, \cdots, \hat{\epsilon}^A_k ϵ ^ 1 A , ϵ ^ 2 A , ⋯ , ϵ ^ k A 和 ϵ ^ 1 B , ϵ ^ 2 B , ⋯ , ϵ ^ k B \hat{\epsilon}^B_1, \hat{\epsilon}^B_2, \cdots, \hat{\epsilon}^B_k ϵ ^ 1 B , ϵ ^ 2 B , ⋯ , ϵ ^ k B ,可用 k k k 折交叉验证「成对 t t t 检验」(paired t t t -test)进行比较检验。
基本思想是,若两学习器性能相同,则它们使用相同的训练/测试集得到的测试错误率应相同,即 ϵ i A = ϵ i B \epsilon^A_i = \epsilon^B_i ϵ i A = ϵ i B 。
先对每对结果求差,Δ i = ϵ i A − ϵ i B \Delta_i = \epsilon^A_i - \epsilon^B_i Δ i = ϵ i A − ϵ i B ,若两个学习器性能相同,则差值均值应为零。因此可根据差值 Δ 1 , ⋯ , Δ n \Delta_1, \cdots, \Delta_n Δ 1 , ⋯ , Δ n 来对「学习器 A A A 与 B B B 性能相同」这个假设做 t t t 检验。
假设检验的前提是测试错误率为泛化错误率的独立采样,然而由于样本有限,使用交叉验证导致训练集重叠,测试错误率并不独立,从而过高估计假设成立的概率,为缓解这一问题,可采用「5 × 2 5 \times 2 5 × 2 交叉验证」法。
所谓「5 × 2 5 \times 2 5 × 2 交叉验证」,就是做 5 次 2 折交叉验证,每次 2 折交叉验证之前将数据打乱,使得五次交叉验证中的数据划分不重复。
对两个学习器 A , B A, B A , B ,第 i i i 次 2 折交叉验证将产生两对测试错误率,我们对它们分别求差,得到 Δ i 1 , Δ i 2 \Delta_i^1, \Delta_i^2 Δ i 1 , Δ i 2 。
为缓解测试数据错误率的非独立性,仅计算第一次 2 折交叉验证结果的平均值 μ = 0.5 ( Δ 1 1 + Δ 1 2 ) \mu = 0.5(\Delta_1^1 + \Delta_1^2) μ = 0.5 ( Δ 1 1 + Δ 1 2 ) ,但对每次 2 折实验的结果都计算出其方差 σ i = ( Δ i 1 − Δ i 1 + Δ i 2 2 ) 2 + ( Δ i 2 − Δ i 1 + Δ i 2 2 ) 2 \sigma_i = \left( \Delta_i^1 - \frac{\Delta_i^1 + \Delta_i^2}{2} \right)^2 + \left( \Delta_i^2 - \frac{\Delta_i^1 + \Delta_i^2}{2} \right)^2 σ i = ( Δ i 1 − 2 Δ i 1 + Δ i 2 ) 2 + ( Δ i 2 − 2 Δ i 1 + Δ i 2 ) 2 。
则变量
τ t = μ 0.2 ∑ i = 1 5 σ i 2 \tau_t = \dfrac{\mu}{\sqrt{0.2 \sum\limits_{i=1}^{5} \sigma_i^2}}
τ t = 0.2 i = 1 ∑ 5 σ i 2 μ
服从自由度为 5 的 t t t 分布。
McNemar 检验
对于二分类问题,留出法不仅可以估计出学习器 A A A 和 B B B 的测试错误率,还能获得两学习器分类结果的差别,如下面的「列联表」(contingency table)所示:
算法 B B B \ 算法 A A A
正确
错误
正确
e 00 e_{00} e 00
e 01 e_{01} e 01
错误
e 10 e_{10} e 10
e 11 e_{11} e 11
假设两学习器性能相同,则有 e 01 = e 10 e_{01} = e_{10} e 01 = e 10 ,那么变量 ∣ e 01 − e 10 ∣ \lvert e_{01} - e_{10}\rvert ∣ e 01 − e 10 ∣ 应服从正态分布,且均值为 1 1 1 ,方差为 e 01 + e 10 e_{01} + e_{10} e 01 + e 10 ,因此变量
τ χ 2 = ( ∣ e 01 − e 10 ∣ − 1 ) 2 e 01 + e 10 \tau_{\chi^2} = \dfrac{(|e_{01} - e_{10}| - 1)^2}{e_{01} + e_{10}}
τ χ 2 = e 01 + e 10 ( ∣ e 01 − e 10 ∣ − 1 ) 2
服从自由度为 1 的 χ 2 \chi^2 χ 2 分布,即标准正态分布变量的平方。
给定显著度 α \alpha α ,当以上变量值小于临界值 χ 2 \chi^2 χ 2 时,不能拒绝该假设,即认为两学习器的性能没有显著差别;否则拒绝假设,认为两者性能有显著差别,且平均错误率较小的那个学习器性能较优。
Freidman 检验
交叉验证 t 检验 和 McNemar 检验都是在一个数据集上比较两个算法的性能,而在很多时候,我们会在一组数据集上对多不算法进行比较。
当有多个算法参与比较时,一种做法是在每个数据集上分别列出两两比较的结果,而在两两比较时可使用前述方法;另一种方法更为直接,即使用基于算法排序的 Friedman 检验。
假定我们用 D 1 , D 2 , D 3 , D 4 D_1, D_2, D_3, D_4 D 1 , D 2 , D 3 , D 4 四个数据集对算法 A , B , C A, B, C A , B , C 进行比较。
首先使用留出法或交叉验证法得到每个算法在每个数据集上的测试结果,然后在每个数据集上根据性能由好到坏排序,并赋序值 1 , 2 , ⋯ 1, 2, \cdots 1 , 2 , ⋯ ;若若算法性能相同则平分序值,继而得到每个算法的平均序值 r i r_i r i 。
例如
数据集
算法 A A A
算法 B B B
算法 C C C
D 1 D_1 D 1
1
2
3
D 2 D_2 D 2
1
2.5
2.5
D 3 D_3 D 3
1
2
3
D 4 D_4 D 4
1
2
3
平均序值
1
2.125
2.875
然后由平均序值进行 Freidman 检验来判断这些算法是否性能相同。若相同,则它们的平均序值应相同。
假定我们在 N N N 个数据集上比较 k k k 个算法,令 r i r_i r i 表示第 i i i 个算法的平均序值,为简化讨论,暂不考虑平分序值的情况。则 r i r_i r i 服从正态分布,其均值和方差分别为 k + 1 2 \dfrac{k+1}{2} 2 k + 1 和 k 2 − 1 12 \dfrac{k^2 - 1}{12} 12 k 2 − 1 。
变量
τ χ 2 = k − 1 k ⋅ 12 N k 2 − 1 ∑ i = 1 k ( r i − k + 1 2 ) 2 = 12 N k ( k + 1 ) ( ∑ i = 1 k r i 2 − k ( k + 1 ) 2 4 ) \begin{aligned}
\tau_{\chi^2} &= \dfrac{k - 1}{k} \cdot \dfrac{12N}{k^2 - 1} \sum_{i=1}^{k} \left( r_i - \dfrac{k+1}{2} \right)^2\\
&= \dfrac{12N}{k(k+1)}\left( \sum_{i=1}^{k}r_i^2 - \dfrac{k(k+1)^2}{4} \right)
\end{aligned}
τ χ 2 = k k − 1 ⋅ k 2 − 1 12 N i = 1 ∑ k ( r i − 2 k + 1 ) 2 = k ( k + 1 ) 12 N ( i = 1 ∑ k r i 2 − 4 k ( k + 1 ) 2 )
在 k , N k, N k , N 都较大时,服从自由度为 k − 1 k-1 k − 1 的 χ 2 \chi^2 χ 2 分布。
补充
按书上的内容,上述这样的「原始 Freidman 检验」过于保守,现在通常使用变量
τ F = ( N − 1 ) τ χ 2 N ( k − 1 ) − τ χ 2 \tau_F = \dfrac{(N-1)\tau_{\chi^2}}{N(k-1)-\tau_{\chi^2}}
τ F = N ( k − 1 ) − τ χ 2 ( N − 1 ) τ χ 2
τ F \tau_F τ F 服从自由度为 k − 1 k-1 k − 1 和 ( k − 1 ) ( N − 1 ) (k-1)(N-1) ( k − 1 ) ( N − 1 ) 的 F F F 分布。
Nemenyi 后续检验
若「所有算法的性能相同」这个假设被拒绝,说明算法的性能显著不同,这时需进行后续检验 (post-hoc test)来进一步区分各算法。
Nemenyi 检验计算平均序值差别的临界阈值
C D = q α k ( k + 1 ) 6 N CD = q_{\alpha} \sqrt{\dfrac{k(k+1)}{6N}}
C D = q α 6 N k ( k + 1 )
如果两个算法的平均序值之差超出了临界阈值 C D CD C D ,则以相应的置信度拒绝「两个算法性能相同」这一假设。
根据上面的序值结果可以绘制如下的 Freidman 检验图,其中横轴为平均序值,每个算法圆点为其平均序值,线段为临界阈值的大小:
若两个算法有交叠(A , B A, B A , B ),则说明没有显著差别;否则有显著差别(A , C A, C A , C ),算法 A A A 明显优于算法 C C C 。
偏差与方差
偏差-方差分解
对学习算法除了通过实验估计其泛化性能,人们往往还希望了解它「为什么」具有这样的性能。「偏差-方差分解」(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。
偏差-方差分解试图对学习算法的期望泛化错误率进行拆解。我们知道,算法在不同训练集上学得的结果很可能不同,即便这些训练集是来自同一个分布。
对于测试样本 x \bm{x} x ,令 y D y_D y D 为 x \bm{x} x 在数据集中的标记,y y y 为 x \bm{x} x 的真实标记(有可能出现噪声使得 y D ≠ y y_D \ne y y D = y ),f ( x ; D ) f(\bm{x}; D) f ( x ; D ) 为训练集 D D D 上学得模型 f f f 在 x \bm{x} x 上的预测输出。
对回归任务,泛化误差可分解为
E ( f ; D ) = bias 2 ( x ) + var ( x ) + ε 2 E(f; D) = \operatorname{bias}^2(\bm{x}) + \operatorname{var}(\bm{x}) + \varepsilon^2
E ( f ; D ) = bias 2 ( x ) + var ( x ) + ε 2
其中,使用样本数相同的不同训练集产生的方差为
var ( x ) = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] \operatorname{var}(\bm{x}) = \mathbb{E}_D \left[ \left( f(\bm{x}; D) - \bar{f}(\bm{x}) \right)^2 \right]
var ( x ) = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ]
其中学习算法的期望预测为
f ˉ ( x ) = E D [ f ( x ; D ) ] \bar{f}(\bm{x}) = \mathbb{E}_D \left[ f(\bm{x}; D) \right]
f ˉ ( x ) = E D [ f ( x ; D ) ]
噪声为
ε 2 = E D [ ( y D − y ) 2 ] \varepsilon^2 = \mathbb{E}_D \left[ \left( y_D - y \right)^2 \right]
ε 2 = E D [ ( y D − y ) 2 ]
期望输出与真实标记的差别称为偏差 (bias),即
bias 2 ( x ) = ( f ˉ ( x ) − y ) 2 \operatorname{bias}^2(\bm{x}) = \left( \bar{f}(\bm{x}) - y \right)^2
bias 2 ( x ) = ( f ˉ ( x ) − y ) 2
过程
为了便于讨论,假设噪声期望为零,即 E D [ y D − y ] = 0 \mathbb{E}_D[y_D - y] = 0 E D [ y D − y ] = 0 ,则
E ( f ; D ) = E D [ ( f ( x ; D ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) + f ˉ ( x ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y D ) 2 ] = + E D [ 2 ( f ( x ; D ) − f ˉ ( x ) ) ( f ˉ ( x ) − y D ) ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y + y − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y ) 2 ] = + E D [ ( y − y D ) 2 ] + 2 E D [ ( f ˉ ( x ) − y ) ( f ˉ ( y − y D ) ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + ( f ˉ ( x ) − y ) 2 + E D [ ( y D − y ) 2 ] = var ( x ) + bias 2 ( x ) + ε 2 \begin{aligned}
E(f; D) &= \mathbb{E}_D \left[(f(\bm{x}; D) - y_D)^2\right]\\
&= \mathbb{E}_D \left[(f(\bm{x}; D) - \bar{f}(\bm{x}) + \bar{f}(\bm{x}) - y_D)^2\right]\\
&= \mathbb{E}_D\left[\left(f(\bm{x}; D) - \bar{f}(\bm{x})\right)^2\right] + \mathbb{E}_D\left[\left(\bar{f}(\bm{x}) - y_D\right)^2\right] \\
&\phantom{=}+ \mathbb{E}_D\left[2\left(f(\bm{x}; D) - \bar{f}(\bm{x})\right)\left(\bar{f}(\bm{x}) - y_D\right)\right]\\
&= \mathbb{E}_D\left[\left(f(\bm{x}; D) - \bar{f}(\bm{x})\right)^2\right] + \mathbb{E}_D\left[\left(\bar{f}(\bm{x}) - y_D\right)^2\right] \\
&= \mathbb{E}_D\left[\left(f(\bm{x}; D) - \bar{f}(\bm{x})\right)^2\right] + \mathbb{E}_D\left[\left(\bar{f}(\bm{x}) - y + y - y_D\right)^2\right] \\
&= \mathbb{E}_D\left[\left(f(\bm{x}; D) - \bar{f}(\bm{x})\right)^2\right] + \mathbb{E}_D\left[\left(\bar{f}(\bm{x}) - y\right)^2\right] \\
&\phantom{=} + \mathbb{E}_D\left[\left(y - y_D\right)^2\right] + 2\mathbb{E}_D\left[\left(\bar{f}(\bm{x}) - y\right)\left(\bar{f}(y - y_D\right)\right] \\
&= \mathbb{E}_D\left[\left(f(\bm{x}; D) - \bar{f}(\bm{x})\right)^2\right] + \left(\bar{f}(\bm{x}) - y\right)^2 + \mathbb{E}_D\left[\left(y_D - y\right)^2\right] \\
&= \operatorname{var}(\bm{x}) + \operatorname{bias}^2(\bm{x}) + \varepsilon^2
\end{aligned}
E ( f ; D ) = E D [ ( f ( x ; D ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) + f ˉ ( x ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y D ) 2 ] = + E D [ 2 ( f ( x ; D ) − f ˉ ( x ) ) ( f ˉ ( x ) − y D ) ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y + y − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y ) 2 ] = + E D [ ( y − y D ) 2 ] + 2 E D [ ( f ˉ ( x ) − y ) ( f ˉ ( y − y D ) ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + ( f ˉ ( x ) − y ) 2 + E D [ ( y D − y ) 2 ] = var ( x ) + bias 2 ( x ) + ε 2
也就是说,泛化误差可分解为偏差、方差和噪声之和 。
偏差、方差、噪声的含义:
偏差 度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力 。
方差 度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响 。
噪声 则表达了当前任务上任何学习算法所能达到的期望泛化误差下界,即刻画了学习问题本身的难度 。
泛化性能 是由学习算法的能力 (偏差)、数据的充分性 (方差)以及学习任务本身的难度 (噪声)共同决定。
给定学习任务,为了取得好的泛化性能,需要使偏差小(充分拟合数据)而且方差较小(减少数据扰动产生的影响)。
偏差-方差窘境
一般来说,偏差与方差是有冲突的,这成为「偏差-方差窘境」(bias-variance dilemma)。
如图所示是一个示意图:
加入我们能控制算法的训练程度:
在训练不足 时,学习器拟合能力不强 ,训练数据的扰动不足以使学习器的拟合能力产生显著变化,此时偏差 主导泛化错误率;
随着训练程度加深 ,学习器拟合能力逐渐增强 ,方差 逐渐主导泛化错误率;
训练充足 后,学习器拟合能力非常强 ,训练数据的轻微扰动都会导致学习器的显著变化,若训练数据自身非全局特性被学到则会发生过拟合,方差 主导。
总结
评估方法 :获得测试结果。
性能度量 :评估性能优劣。
比较检验 :判断实质差别。