前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何「科学的比较」机器学习模型表现?

如何「科学的比较」机器学习模型表现?

作者头像
小莹莹
发布2018-04-24 11:18:14
2.3K0
发布2018-04-24 11:18:14
举报

最近在赶paper,码字的时间不多,也刚好借着这个机会践行“写少、少写,写好”。今天谈谈如何对比多个机器学习算法的性能,阅读本文需要基本的统计检验知识,比如明白假设检验中 P<0.05通常说明了统计学显著性差异。

0. 背景

对比多个机器学习的算法性能是研究中很重要的一步,举几个常见的场景:

  • 假设你开发了一个新的算法,那么希望在多个数据集上证明你的新算法是 state of the art(最牛逼的)。
  • 假设你找到了一个新的数据集,你想研究到底什么算法在这个数据集上表现最优。
  • 结合上面两个场景,你想知道你的新算法在什么数据集上表现最优。

1. 常见做法与风险

搞机器学习不懂数学和统计,估计大家或多或少都被这么吐槽过。其实从某个角度看这个观点也有道理,因为在很长的一段时间里机器学习算法的对比都是简单的走以下几个步骤:

  • 直接对比误分率(misclassification rate),也就是准确度。
  • 再好一点的可能对比 精确率(precision)和召回率(recall),或者算一下F1。
  • 在多做一点的可能会比较一下 ROC 曲线下的面积,也就是ROC_AUC。
  • 再严谨的可能会尝试做一下交叉验证(cross-validation)之后再对比。

大部分对比做到这个程度,其实也仁至义尽了,但这种方法有什么问题吗?

  • 无法得到可靠的对比结果,如果算法A在3个数据集上比较好,而B在5个数据集上表现好,如何证明谁更好?
  • 如果对比多个算法,两两对比效率低,准确度低,而且可能造成严重的统计偏差。试问,如果算法A比B好,B比C好,C比D好,那么是否A比D好?这种推论仅当其中每个过程都不可逆或者非常明显才可得。
  • 如果有多个数据集(>2)和多个算法(>2),对比不直观且不准确。

10种算法在4个数据集上的ACC/F1/ROC

以上图为例,我画出了10种算法在4个数据集上的表现,这是很难一眼看出那个算法更好的。而且往往没有那个算法可以包打天下。

1. 一些研究者的尝试

首先令人感到诧异的是,直到今天大部分的机器学习算法论文和书籍都还在用上面的简单做法。虽然往往能得到有效的结论,但一部分研究得到的结论其实站不住脚。

当然,机器学习研究者也进行了一系列尝试,比如下面的几篇论文:

  • Statistical Comparisons of Classifiers over Multiple Data Sets
  • An Extension on "Statistical Comparisons of Classifiers over Multiple Data Sets" for all Pairwise Comparisons
  • Time for a change: a tutorial for comparing multiple classifiers through Bayesian analysis (未发表)

大部分方法说白了,就是从统计学概念上延伸出去。统计学上,如果你想对比两个样本组是否来自于同一个分布,可以尝试做t-test,如果你想分析两个及以上样本之间的显著性检验,可以做方差分析(ANOVA),也叫做F-test。多样本之间的差异分析一般的步骤如下:

  • 使用某种显著性建议测试(如ANOVA)来分析你的多组样本之间是否存在明显不同。
  • 如果存在,那么使用post-hoc来确定到底是哪些样本间存在差异。
  • 确定了不同的两组后,在进行配对比较(pairwise analysis),分析的方法依赖于前面步骤中的做法。

举个简单的例子,A, B, C三人记录每天吃的鸡蛋数,连续记录十天,那么得到一个[3,10]的数据。此时你需要先使用某种显著性检测方法来分析ABC三人在每天吃蛋数上是否有明显的不同如果没有,那么分析可以到此为止。如果有,那么需要在用post-hoc手段来分析到底是A和B不同,还是B和C不同。找到不同的两个人以后,可以在分析A和B到底不同在哪里(如ANOVA可以对 进行分析)。

2. 不成熟的小建议

这个流程说来简单,但其实往往有不少麻烦的地方:

  • 进行多样本间的显著性测试往往要求:
    • 样本残差(residual)各自符合正态分布(normal distribution)。* 其实这个违反这个原则有时候也不碍事。
    • 数据独立性假设。
    • 样本之间的大小一致,比如很多算法无法检验A吃蛋10天的数据,B吃蛋3天的数据,和C吃蛋6天的数据。
  • 很多多样本的对比测试没有合适的Python实现,如果想要使用需要使用R或者SPSS。
  • 结果分析中存在各种各样的陷阱,比如 P = 0.051是否说明可以拒绝假设。

为了回避某些检验的强假设和要求,如等尺寸样本,我建议大家可以用下面这个框架来对比多个模型:

  1. 使用Kruskal–Wallis测试来确定你的多样本之间是否存在显著差异。若p>0.05,进行下一步。* 如果 p 接近0.05,也可以进行以下步骤。
  2. 使用Dunn's Test来确定哪些样本间存在差异,结果是一个n*n的矩阵,可以通过热力图可视化(如下图)。
  3. 针对两个样本,可以用Mann–Whitney U test 进行检测差异性。更直观的对比两个样本,也可以对中值(median)进行对比分析,因为这些算法都是建议在排序上的(Rank)。

这个框架的好处是这些统计学检测手段都是非参数的(non-parametric),假设相对较少且可以处理不同尺寸的样本对比。更重要的是,Python中的Scipy有 Kruskal–Wallis和Mann–Whitney U test的实现,而Dunn's test有开源工具包(Python Package Index)开发者是一位毛子大哥。使用这位大哥的工具包,还可以轻松的将Dunn's Test的结果可视化,下面是我的一个小例子(这个配色是我改的,毛子大哥用了红配绿实在难看),下图中可以发现随机森林(RF)和朴素贝叶斯之间结果有明显不同:

3. 写在最后

总体来说,更严谨的机器学习算法评估还是要学习统计的那一套,而不能仅仅对比一下准确率就认为真的有了效果提升。但这种现象的发生不是偶然,可以归结于:

  • 机器学习很难在大量数据上进行对比,因此样本数量有限导致统计学意义打了折扣。
  • 比较严谨的对比会导致很多水文发不出去,都是出来混口饭都互相理解。
  • 可能,大概,或许...只是因为做机器学习的人真的不太懂统计吧。

玩笑归玩笑,文中介绍的方法只是抛砖引玉,也并不适用于每个场景,但可以在你不知道如何对比的时候破局。建议在使用以上检验测试时先了解一下基本的应用场景和假设,并了解什么时候可以reject null hypothesis。文中的例子并不严谨,如果paper一切顺利的话,也会给大家附上链接和代码作为一个实例参考。

END.

来源:https://zhuanlan.zhihu.com/p/31203973

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PPV课数据科学社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0. 背景
  • 1. 常见做法与风险
  • 1. 一些研究者的尝试
  • 2. 不成熟的小建议
  • 3. 写在最后
相关产品与服务
灰盒安全测试
腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档