题目:Friedman test以及后续检验Nemenyi test和Bonferroni-Dunn test

在做算法对比时,往往需要对实验结果进行统计检验。Friedman test是一种常用的检验,用来比较k个算法在N个数据集上的整体表现性能。但Friedman test只能给出k个算法的性能之间是否存在差异的结论,如果存在差异,还需要进行“后续检验”(post-hoc test),以得出哪些算法的性能之间存在统计上的差异,常用的后续检验方法包括Nemenyi test和Bonferroni-Dunn test。

Nemenyi test适用于对比k个算法相互之间的性能(when all classifiers are compared to each other),而Bonferroni-Dunn test适用于将某个算法与其余k-1个算法对比(when all classifiers are compared with a control classifier),二者都是将各个算法平均排名之差与某域值(critical difference, CD)对比,若大于该域值则说明平均排名高的算法统计上优于平均排名低的算法,反之则二者统计上没有差异。

这个域值CD的计算方式如下:

                                                     CD = q_{\alpha} \sqrt{\frac{k(k+1)}{6N}}

其中,k为参加对比的算法个数,N为数据集个数,常用的q_{\alpha}值可通过下表查得,其中表(a)对应Nemenyi test,表(b)对应Bonferroni-Dunn test,#classifiers为算法个数k:

这里重点想谈的是这种统计检验方法存在的问题,注意到由上面公式计算出来的q_{\alpha}一般都大于1,这意味着什么呢?如果在所有数据集上,你所提出的算法一直排名第一,几个对比算法分别一直排名第二、第三、第四……,很明显你所提出的算法优于所有对比算法(就好像你每次考试都是班级第一,肯定比每次都考班级第二的同学优秀,每次考试则对应这里的一个数据集);但是,你所提出的算法与一直排名第二的算法平均排名之差只有1,会小于q_{\alpha},表示二者没有显著差别,这明显有悖于常理。也就是说,这种统计检验方法不仅要求你自己的算法在每个数据集上的排名要靠前,还要求其它对比算法在每个数据集上的排名随机的比较差,这样才能保证对比算法的平均排名都比较低,进而保证你自己的算法与对比算法的平均排名之差大于域值CD。

为了直观起见,我们来计算一下q_{\alpha},看看当数据集个数N大概取多少个时CD值才会小于1。一般来说,论文中对比算法选4到5个,加上我们自己所提的算法k的取值就是5或6,我们计算\alpha=0.05时的CD值,即查表时看q_{0.05}那一行。

k=5时:

对于Nemenyi test来说,至少要当N=38时,

                                                CD=2.728\sqrt{\frac{5 \times 6}{6 \times 38}}\approx 0.9895<1

也就是说至少要在38个数据集上做实验才能避免我说的那种悖论;

对于Bonferroni-Dunn test来说,至少要当N=32时,

                                            CD = 2.498\sqrt{\frac{5 \times 6}{6 \times 32}}\approx 0.9874<1

也就是说至少要在32个数据集上做实验才能避免我说的那种悖论;

k=6时:

对于Nemenyi test来说,至少要当N=57时,

                                           CD=2.850\sqrt{\frac{6 \times 7}{6 \times 57}}\approx 0.9987<1

也就是说至少要在57个数据集上做实验才能避免我说的那种悖论;

对于Bonferroni-Dunn test来说,至少要当N=47时,

                                           CD = 2.576\sqrt{\frac{6 \times 7}{6 \times 47}}\approx 0.9941<1

也就是说至少要在47个数据集上做实验才能避免我说的那种悖论;这里提的悖论指经过统计检验得出每次考第一的同学与每次考第二的同学没有差别的结论,因为从常理角度来看应该是每次考第一的同学比每次考第二的同学要优秀。

但实际上,一般论文中我们也就在10个到20个数据集上做实验而已(也有些文章甚至会仅在5个左右数据集上做实验),那么可以计算如下(Bonferroni-Dunn test更符合我们的应用场景,即对比我们的算法与所选的对比算法之间的关系):

k=5时,对于Bonferroni-Dunn test来说,

                                     N=10:~CD = 2.498\sqrt{\frac{5 \times 6}{6 \times 10}}\approx1.766

                                    N=20:~CD = 2.498\sqrt{\frac{5 \times 6}{6 \times 20}}\approx1.249

k=6时,对于Bonferroni-Dunn test来说,

                                   N=10:~CD = 2.576\sqrt{\frac{6 \times 7}{6 \times 10}}\approx 2.155

                                   N=20:~CD = 2.576\sqrt{\frac{6 \times 7}{6 \times 20}}\approx 1.524

可以看出,当只使用10个数据集时,这个排名之差的域值CD要求还是挺严格的;尤其是k=6N=10时,即使你的算法一直排名第1,对比算法必须平均排名大于3.155=1+2.155才表示你的算法统计上优于对比算法,而此时一共也只有k=6个算法而已啊。

针对Friedman test联合后续检验的以上这种缺陷,我感觉Wilcoxon signed rank test其实更合适于做统计检验用来对比两两之间的性能,在Matlab中可以直接调用signrank函数实现,具体就不谈了,可以查阅signrank的使用方法和以下参考文献。

参考文献(以上所有理论细节均在此文献中):

Janez Demsar,  Statistical Comparisons of Classifiers over Multiple Data Sets, In: JMLR, 2006, 7(1), 1-30.

链接:https://www.jmlr.org/papers/volume7/demsar06a/demsar06a.pdf

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐