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

最近在赶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. 一些研究者的尝试

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

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

大部分方法说白了,就是从统计学概念上延伸出去。统计学上,如果你想对比两个样本组是否来自于同一个分布,可以尝试做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是否说明可以拒绝假设。

为了回避某些检验的强假设和要求,如等尺寸样本,我建议大家可以用下面这个框架来对比多个模型:使用Kruskal–Wallis测试来确定你的多样本之间是否存在显著差异。若p>0.05,进行下一步。* 如果 p 接近0.05,也可以进行以下步骤。

使用Dunn's Test来确定哪些样本间存在差异,结果是一个n*n的矩阵,可以通过热力图可视化(如下图)。

针对两个样本,可以用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一切顺利的话,也会给大家附上链接和代码作为一个实例参考。

祝我好运 (手动滑稽) ʕ•ᴥ•ʔ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值