前言
当我们提出一种算法,需要知道我们的算法和现在已有的算法相比,性能是否更优的时候,就需要用到模型性能评估的方法。本篇博客介绍一种模型性能评估的方法:Friedman 检验与 Nemenyi 后续检验。
该方法的特点是:可以进行多个算法的比较。下面看看具体的使用:
具体使用
1. 计算序值
假定我们用 D 1 D_1D1、D 2 D_2D2 、D 3 D_3D3 和 D 4 D_4D4 四个数据集对算法 A AA、B BB、C CC 进行比较。首先需要得到每个算法在每个数据集上的测试结果,可以是准确率,也可以是均方误差,然后在每个数据上根据测试性能的好坏进行排序,并赋予序值 1,2,…。如果算法的测试性能相同,则评分排名。比如,在 D 1 D_1D1 和 D 3 D_3D3 上,A AA 最好、B BB 次之,C CC 最差,而在 D 2 D_2D2 上 A AA 最好、B BB 和 C CC 性能相同,…,则可以列出如下表所示的序值表,对每一列的序值进行求平均,得到平均序值。
2. Friedman 检验
然后,使用 Friedman 检验来判断这些算法是否性能相同。如果相同,则他们的平均序值应该相等。
假定我们在 N NN 个数据集上比较 k kk 个算法,令 r i r_iri 表示第 i ii 个算法的平均序值。为简化讨论,暂时不考虑平分序值的情况,则 r i r_iri 服从正态分布,其均值和方差分别为 ( k + 1 ) / 2 (k+1)/2(k+1)/2 和 ( k 2 − 1 ) / 12 (k^2-1)/12(k2−1)/12。变量
τ χ 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 ) \tau_{\chi^2} = \frac{k-1}{k}\cdot\frac{12N}{k^2-1}\sum_{i=1}^k{(r_i - \frac{k+1}{2}})^2 = \frac{12N}{k(k+1)}(\sum_{i=1}^k r_i^2 - \frac{k(k+1)^2}{4})τχ2=kk−1⋅k2−112Ni=1∑k(ri−2k+1)2=k(k+1)12N(i=1∑kri2−4k(k+1)2)
在 k kk 和 N NN 都较大时,服从自由度为 k − 1 k-1k−1 的 χ 2 \chi^2χ2 分布。
然后,上述的这样的 “原始 Friedman 检验” 过于保守,现在通常使用变量
τ F = ( N − 1 ) τ χ 2 N ( k − 1 ) − τ χ 2 \tau_F = \frac{(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-1k−1 和 ( k − 1 ) ( N − 1 ) (k-1)(N-1)(k−1)(N−1) 的 F FF 分布。常用的临界值可以见下表。
另外也可以通过 R 语言计算得到 F 检验的临界值:
> qf(1- alpha, k-1, (k-1)(N-1))
若 “所有算法的性能相同” 这个假设被拒绝,则说明算法的性能显著不同。
3. Nemenyi 后续检验
这个时候就需要使用 “后续检验”(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)
下表给出了 α = 0.05 \alpha = 0.05α=0.05 和 0.1 0.10.1 时常用的 q α q_\alphaqα 值。
若两个算法的平均序值之差超出了临界值域 C D CDCD ,则以相应的置信度拒绝 “两个算法性能相同” 这一假设。

若表中没有自己想要的数值,可以用 R 语言计算:
qtukey(1- alpha, k, Inf)/sqrt(2)
# 比如:
qtukey(1-0.01,13,Inf)/sqrt(2)
4. Friedman 检验图
上述检验比较可以直观地用 Friedman 检验图显示。如下图所示,横轴是平均序值,纵轴是每个算法、对于每一个算法,用一个圆点显示其平均序值,以圆点为中心的横线段表示临界值域的大小。
观察图,若两个算法的横线段有交叠,说明两个算法没有显著的差别。
下图是之前自己做的一个 Friedman 检验图,可以看出 CNN-FCL, XGB 是显著优于 DTC, LOG, ELM, ABC, QDA 等算法的。