前言
当我们提出一种算法,需要知道我们的算法和现在已有的算法相比,性能是否更优的时候,就需要用到模型性能评估的方法。本篇博客介绍一种模型性能评估的方法:Friedman 检验与 Nemenyi 后续检验。
该方法的特点是:可以进行多个算法的比较。下面看看具体的使用:
具体使用
1. 计算序值
假定我们用
D1?、
D2? 、
D3? 和
D4? 四个数据集对算法
A、
B、
C 进行比较。首先需要得到每个算法在每个数据集上的测试结果,可以是准确率,也可以是均方误差,然后在每个数据上根据测试性能的好坏进行排序,并赋予序值 1,2,…。如果算法的测试性能相同,则评分排名。比如,在
D1? 和
D3? 上,
A 最好、
B 次之,
C 最差,而在
D2? 上
A 最好、
B 和
C 性能相同,…,则可以列出如下表所示的序值表,对每一列的序值进行求平均,得到平均序值。
2. Friedman 检验
然后,使用 Friedman 检验来判断这些算法是否性能相同。如果相同,则他们的平均序值应该相等。
假定我们在
N 个数据集上比较
k 个算法,令
ri? 表示第
i 个算法的平均序值。为简化讨论,暂时不考虑平分序值的情况,则
ri? 服从正态分布,其均值和方差分别为
(k+1)/2 和
(k2?1)/12。变量
τχ2?=kk?1??k2?112N?i=1∑k?(ri??2k+1?)2=k(k+1)12N?(i=1∑k?ri2??4k(k+1)2?)
在
k 和
N 都较大时,服从自由度为
k?1 的
χ2 分布。
然后,上述的这样的 “原始 Friedman 检验” 过于保守,现在通常使用变量
τF?=N(k?1)?τχ2?(N?1)τχ2??
其中,
τF? 服从自由度为
k?1 和
(k?1)(N?1) 的
F 分布。常用的临界值可以见下表。
另外也可以通过 R 语言计算得到 F 检验的临界值:
1 | > qf(1- alpha, k-1, (k-1)(N-1)) |
若 “所有算法的性能相同” 这个假设被拒绝,则说明算法的性能显著不同。
3. Nemenyi 后续检验
这个时候就需要使用 “后续检验”(post-hoc test)来进一步区分算法。常用的算法是 Nemenyi 后续检验。
Nemenyi 检验计算出平均序值差别的临界值域
CD=qα?6Nk(k+1)?
α=0.05 和
0.1 时常用的
qα? 值。
若两个算法的平均序值之差超出了临界值域
CD ,则以相应的置信度拒绝 “两个算法性能相同” 这一假设。
若表中没有自己想要的数值,可以用 R 语言计算:
1 2 3 | qtukey(1- alpha, k, Inf) # 比如: qtukey(1-0.01,13,Inf)/sqrt(2) |
4. Friedman 检验图
上述检验比较可以直观地用 Friedman 检验图显示。如下图所示,横轴是平均序值,纵轴是每个算法、对于每一个算法,用一个圆点显示其平均序值,以圆点为中心的横线段表示临界值域的大小。
观察图,若两个算法的横线段有交叠,说明两个算法没有显著的差别。
下图是之前自己做的一个 Friedman 检验图,可以看出 CNN-FCL, XGB 是显著优于 DTC, LOG, ELM, ABC, QDA 等算法的。