目标:

1 了解Friedman test的基本原理以及使用实践;
2 了解Post-hoc Nimenyi test 的基本原理以及使用实践,包括结果的可视化。

Friedman test

作用: 简单来说, Friedman test就是一种基于排序的统计方法用来比较多个方法/模型在多份数据集/实验中的平均性能是否存在显著差异。

Null H0 hypothesis: 用于比较的多个方法性能相当;

假设现在有N粉数据集,K个模型, 这K个模型在N的数据集上的测试结果组成结果矩阵,尺寸: [N, K]。

Step 1: 计算序值矩阵以及每个模型对应的Rank值。
对于每份数据集, 将K个模型按照其性能升序进行排序后的索引值作为对应模型在该数据集上的序值。

例如,K=4个模型在第一份数据集上的Accuracy分别为0.6, 0.5, 0.9, 0.2, 则对应的序值向量为3,2,4,1。

注, 当有不止一个模型在同一个数据集上的Accuracy相同时,去平均即可,但要保证序值总和不变。 如,Accuracy分别为0.6, 0.5, 0.5, 0.2,则对应的序值向量为4,2.5, 2.5,1。

得到序值矩阵后就可以计算每个模型的Rank值了。
记第i个模型在第j个数据集上的序值为ranki,jrank_{i,j}ranki,j​, 则第i个模型的Rank为:
ri=1N∑j=1Nranki,jr_{i}=\frac{1}{N}\sum_{j=1}^{N}rank_{i,j}ri​=N1​∑j=1N​ranki,j​

Step 2: 计算相应的统计量
假设每个模型的Rank服从正态分布,则对应的卡方统计量为,
τX2=k−1k∑i=1k(ri−k+12)2/12Nk2−1=12Nk(k+1){∑i=1kri2−k(k+1)24}\tau_{X^{2}}=\frac{k-1}{k}\sum_{i=1}^{k}(r_{i} - \frac{k+1}{2})^{2}/{\frac{12N}{k^{2} - 1}}=\frac{12N}{k(k+1)}\{\sum_{i=1}^{k} r_{i}^{2} - \frac{k(k+1)^{2}}{4}\}τX2​=kk−1​∑i=1k​(ri​−2k+1​)2/k2−112N​=k(k+1)12N​{∑i=1k​ri2​−4k(k+1)2​}

另外还有其改进统计量
τF=(N−1)τX2N(k−1)−τX2\tau_{F}=\frac{(N-1)\tau_{X^{2}}}{N(k-1) - \tau_{X^{2}}}τF​=N(k−1)−τX2​(N−1)τX2​​

将算出来的统计量与临界检验值表进行比对,

实践

Python包Scipy的stats模块提供了Friedman test的API, 可直接调用。

Demo:
如下, data即为上面所说的NxK矩阵,
注意:friedmanchisquare的输入中,每个参数表示每个模型的多次(N=4)测量值
最终输出结果:
p_value < α=0.05\alpha=0.05α=0.05, 故拒绝H0假设, 换句话说,多个模型的测量结果之间有显著差异。

Post-hoc Nimenyi test

Friedman test只能用来确定多个模型的测量结果之间是否存在显著差异,却并不能知道任意两个模型之间是否存在差异,这正是Post-hoc Nimenyi test所要解决的。

Step 1, 首先计算所谓的临界值Critical Difference (CD)。
计算公式如下:
CD=qαk(k+1)6NCD=q_{\alpha} \sqrt{\frac{k(k+1)}{6N}}CD=qα​6Nk(k+1)​​
其中α\alphaα

CD的计算可直接调用

Orange.evaluation.compute_CD(avranks, num_exp, alpha=str(alpha))

Step 2,将两个算法的平均序值的差 (Average Rank Difference, ARD) 和 CD 进行比较,如果 ARD > CD,则两个算法的性能有明显差异

实践

Python包scikit_posthocs提供了用于Post-hoc Nimenyi test的API,可直接调用。

Demo:

最终输出结果:
可以看到输出为一个对称矩阵,表示不同模型的两两比较结果,

Post-hoc Nimenyi test结果可视化

这方面可供参考的资料非常少,刚开始好不容易找到一个, 结果发现虽然可以运行,但是图明显有错误。

最后发现Python包Orange3有Post-hoc Nimenyi test的可视化API。

Demo:
数据如下

names = list(methods_with_score.keys())
avranks = list(methods_with_score.values())‘’‘ cmpt Critical Difference (CD)’‘’
cd = Orange.evaluation.compute_CD(avranks, num_exp, alpha=str(alpha))
print('Critical difference (CD): {}'.format(cd))graph_ranks(avranks, names, cd=cd, width=6, textspace=1.5, filename=filename)

最终效果图如下,
可以看到: 从统计意义上讲模型3,4,5的结果是Comparable, 同时模型4,5,1的结果又是Comparable, 而模型1,3的结果差异非常显著。

References

1.Statistical comparisons of classifiers over multiple data sets
2. Distribution-free multiple comparisons
3. Python包orange3 API的官网介绍
4. https://blog.csdn.net/qq_38225713/article/details/103890338?utm_term=hoc%20post&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-0-103890338&spm=3001.4430

显著性测试(Friedman test, Post-hoc Nimenyi test以及可视化)相关推荐

  1. R语言使用party包中的ctree函数构建条件推理决策树的流程和步骤、条件推理决策树是传统决策树的一个重要变体、条件推理树的分裂是基于显著性测试而不是熵/纯度/同质性度量来选择分裂

    R语言使用party包中的ctree函数构建条件推理决策树的流程和步骤(Conditional inference trees).条件推理决策树是传统决策树的一个重要变体.条件推理树的分裂是基于显著性 ...

  2. 多个模型在测试集上的Accuracy以及AUC指标可视化对比实战

    多个模型在测试集上的Accuracy以及AUC指标可视化对比实战 目录 多个模型在测试集上的Accuracy以及AUC指标可视化对比实战 #仿真数据

  3. 显著性测试,p-value/p值

    p-value的意义就是当前模型要显著的好于别的模型, 先计算chi-square值,然后根据值去查卡方图,得到p-value值,大于0.05(经验值),则说明拒绝假设H0的概率小,H0成立.比如硬币 ...

  4. ios 8+ (xcode 6.0 +)应用程序Ad Hoc 发布前多设备测试流程详解

    我们开发的程序在经过simulator以及自己的iOS设备测试后,也基本完成应用程序了,这时候我们就可以把它发布出去了更更多的人去测试,我们可以在iOS平台使用ad hoc实现. 你在苹果购买的开发者 ...

  5. xcode4发布测试-打包(Archive)

    摘自:xcode4发布测试-打包 xcode4发布测试-打包(Archive),官方文档有误 转自"我os"的新浪博客,iOS程序发布测试4-打包(Archive)发布(share ...

  6. matlab 图像显著性检测ft_全局对比度的图像显著性检测算法

    点击上方蓝字关注我们 星标或者置顶[OpenCV学堂] 干货与教程第一时间送达! 显著性检测概念 显著性就是可以快速引起你注意的对象或者物体,在图像或者视频中显著性检测的结果往往是图像或者视频中对象, ...

  7. 全局对比度的图像显著性检测算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 显著性检测概念 显著性就是可以快速引起 ...

  8. Xcode教程 Xcode4发布测试 打包Archive操作

    Xcode教程 Xcode4发布测试 打包Archive操作是本文要介绍的内容,发布测试的最后一步打包(Archive),Xcode4帮助文档有比较详细介绍,但是居然是错的,这里说明一下. 1.设置& ...

  9. 如何避免让微服务测试成为研发团队最大的瓶颈?

    本文主要为大家介绍微服务测试:基于服务契约信息,降低云上微服务测试成本.该系列文章基于阿里云商业化产品 EDAS 的微服务实践,如果您的团队具备较强的微服务测试能力,那么希望我们在微服务测试方面的实践 ...

  10. R语言ggplot2可视化箱图(boxplot)并使用ggsignif添加分组显著性(significance)标签

    R语言ggplot2可视化箱图(boxplot)并使用ggsignif添加分组显著性(significance)标签 目录 R语言ggplot2可视化箱图(boxplot)并使用ggsignif添加显 ...

最新文章

  1. 【SSRS】入门篇(二) -- 建立数据源
  2. tensorflow函数API总结
  3. Django restfulframework 开发相关知识 整理
  4. python libnum库安装使用方法
  5. 快速排序的基本原理及实现
  6. disconf mysql_disconf浅入浅出(一)disconf简介以及disconf-web端使用
  7. 使用ueditor实现多图片上传案例
  8. 解决VS2013或2017中类似于:error C4996: 'scanf': This function or variable may be unsafe的问题
  9. CFileDialog常见用法
  10. 毕设日志——下一步计划2019.4.17
  11. 编程之美 第1章 游戏之乐——游戏中碰到的题目(九)
  12. android studio Statistic插件不显示
  13. IT项目经理如何学习
  14. 拉取maven项目如何跑起来
  15. 解决 Component inside <Transition> renders non-element root node that cannot be animated 问题
  16. The following tasks did not complete: first,Did you forget to signal async completion?问题
  17. bzoj5108 数据_【Luogu5108】仰望半月的夜空(后缀数组)
  18. python炫酷动画源代码_(数据科学学习手札85)Python+Kepler.gl轻松制作酷炫路径动画...
  19. 江西师范大学计算机专硕导师,江西师范大学研究生助研岗位聘任名单.doc
  20. 2022年全球市场液相色谱仪器总体规模、主要生产商、主要地区、产品和应用细分研究报告

热门文章

  1. [转]Using TRY...CATCH in Transact-SQL
  2. 使用 JQuery EasyUI
  3. C++命名空间和头文件的关系 例如已经使用了#includestring,为什么还要 using std::string?...
  4. gridview為什麼分頁後,GridView1_RowDataBound就運行不了
  5. Sublime Text一个小插件——SideBarEnhancements
  6. 十进制转换为二进制数、八进制数和十六进制
  7. win10鼠标右键拓展(使用vs Code打开)
  8. 二叉树最小结构(C++版本)
  9. 时间复杂度与空间复杂度小结
  10. 归并排序(链表结构)