如何计算麦克尼马尔检验以比较两个机器学习分类器

选择一个 统计假设检验 是解释机器学习结果的一个具有挑战性的开放性问题。

在他的广受引用的 1998 年论文中,Thomas Dietterich 推荐在那些训练多个分类器模型副本成本高昂或不切实际的情况下使用麦克尼马尔检验。

这描述了深度学习模型的当前状况,这些模型体积庞大,在大型数据集上进行训练和评估,通常需要数天甚至数周才能训练好一个模型。

在本教程中,您将了解如何使用麦克尼马尔统计假设检验来比较单个测试数据集上的机器学习分类器模型。

完成本教程后,您将了解:

  • 建议对训练成本高昂的模型使用麦克尼马尔检验,这非常适合大型深度学习模型。
  • 如何将两个分类器的预测结果转换为列联表,以及该表如何用于计算麦克尼马尔检验的统计量。
  • 如何在 Python 中计算麦克尼马尔检验并解释和报告结果。

快速开始您的项目,阅读我的新书《机器学习统计学》,其中包括分步教程以及所有示例的Python源代码文件。

让我们开始吧。

How to Calculate McNemar's Test for Two Machine Learning Classifiers

如何计算两个机器学习分类器的麦克尼马尔检验
照片作者:Mark Kao,部分权利保留。

教程概述

本教程分为五个部分;它们是:

  1. 深度学习的统计假设检验
  2. 列联表
  3. 麦克尼马尔检验统计量
  4. 解释分类器的麦克尼马尔检验
  5. Python 中的麦克尼马尔检验

需要机器学习统计学方面的帮助吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

深度学习的统计假设检验

在他的重要且被广泛引用的 1998 年关于使用统计假设检验来比较分类器的论文“近似统计检验用于比较监督分类学习算法”中,Thomas Dietterich 推荐使用麦克尼马尔检验。

具体来说,该检验建议用于那些被比较的算法只能被评估一次的情况,例如在单个测试集上,而不是通过重采样技术(如 k 折交叉验证)进行重复评估。

对于只能执行一次的算法,麦克尼马尔检验是唯一具有可接受的 I 类错误的检验。

— “近似统计检验用于比较监督分类学习算法”,1998。

具体来说,Dietterich 的研究关注的是对不同统计假设检验的评估,其中一些检验基于重采样方法的结果。该研究关注的是较低的 I 类错误,即统计检验报告了一个实际上不存在的效应(假阳性)。

能够根据单个测试集比较模型的统计检验是现代机器学习,特别是深度学习领域的一个重要考虑因素。

深度学习模型通常很大,并且处理非常大的数据集。这两个因素加在一起可能意味着在快速的现代硬件上训练模型需要数天甚至数周。

这使得重采样方法在比较模型时无法实用,并表明需要使用一种可以在单个测试数据集上评估训练模型结果的检验。

麦克尼马尔检验可能是评估这些大型且训练缓慢的深度学习模型的合适检验。

列联表

麦克尼马尔检验基于一个列联表进行操作。

在我们深入探讨该检验之前,让我们花点时间了解如何计算两个分类器的列联表。

一个 列联表 是对两个分类变量的制表或计数。在麦克尼马尔检验的情况下,我们感兴趣的是二元变量(正确/不正确或是/否)对于对照组和处理组或两种情况。这被称为 2x2 列联表。

列联表乍一看可能不直观。让我们通过一个具体例子来说明。

假设我们有两个训练好的分类器。每个分类器对测试数据集中的 10 个示例中的每个示例进行二元类别预测。对预测进行评估并确定是正确还是不正确。

然后,我们可以像这样将这些结果总结在一个表中:

我们可以看到,分类器 1 正确预测了 6 个,准确率为 60%,分类器 2 在测试集上正确预测了 5 个,准确率为 50%。

现在可以将该表简化为列联表。

列联表依赖于这样一个事实:两个分类器都在完全相同的训练数据上进行训练,并在完全相同的测试数据集实例上进行评估。

列联表具有以下结构:

对于表中的第一个单元格,我们必须计算分类器 1 和分类器 2 都正确预测的测试实例总数。例如,第一个两个分类器都正确预测的实例是第 5 个实例。两个分类器都正确预测的实例总数为 4。

另一种更具程序性的思考方式是总结上面结果表中每个“是/否”的组合。

结果整理成列联表如下:

麦克尼马尔检验统计量

麦克尼马尔检验 是一种配对非参数或无分布假设检验。

它也不如其他一些统计假设检验直观。

麦克尼马尔检验检查两种情况之间的差异是否匹配。技术上,这被称为列联表的同质性(特别是边际同质性)。因此,麦克尼马尔检验是一种列联表的同质性检验。

该检验在医学领域被广泛用于比较治疗与对照的疗效。

在比较两个二元分类算法时,该检验评论的是两种模型是否以相同的方式(或不同方式)产生差异。它不评论一种模型是否比另一种模型更准确或更易出错。当我们查看统计量的计算方式时,这一点就很清楚了。

麦克尼马尔检验统计量计算如下:

其中,是/否 是分类器 1 正确且分类器 2 错误的测试实例数,否/是 是分类器 1 错误且分类器 2 正确的测试实例数。

此检验统计量的计算假设用于计算的列联表中的每个单元格的计数至少为 25。该检验统计量具有具有 1 个自由度的卡方分布。

我们可以看到,列联表中只有两个元素被使用,特别是“是/是”和“否/否”这两个单元格未用于计算检验统计量。因此,我们可以看到该统计量报告的是两种模型之间正确或错误的预测差异,而不是准确率或错误率。在对统计量发现的内容进行声明时,理解这一点很重要。

该检验的默认假设或零假设是两种情况在相同程度上存在差异。如果拒绝零假设,则表明有证据表明这两种情况以不同的方式存在差异,即差异存在偏差。

给定显著性水平的选择,该检验计算出的 p 值可以解释如下:

  • p > alpha:未能拒绝 H0,差异无显著性(例如,治疗无效)。
  • p <= alpha:拒绝 H0,差异显著(例如,治疗有效)。

解释分类器的麦克尼马尔检验

花点时间清楚地理解如何在两个机器学习分类器模型的背景下解释检验结果很重要。

麦克尼马尔检验统计量计算中使用的两个项捕获了两个模型所犯的错误。具体来说,是列联表中的“否/是”和“是/否”单元格。该检验检查这两个单元格中的计数是否存在显著差异。仅此而已。

如果这些单元格的计数相似,这表明两种模型犯错的比例非常相似,只是针对测试集中的不同实例。在这种情况下,检验结果将不显著,并且不会拒绝零假设。

在零假设下,两种算法应具有相同的错误率……

— “近似统计检验用于比较监督分类学习算法”,1998。

如果这些单元格的计数不相似,这表明两种模型不仅犯了不同的错误,而且实际上在测试集上的错误比例也不同。在这种情况下,检验结果将是显著的,并且我们将拒绝零假设。

因此,我们可能会拒绝零假设,转而支持两种算法在给定训练数据上进行训练时表现不同的假设。

— “近似统计检验用于比较监督分类学习算法”,1998。

我们可以总结如下:

  • 未能拒绝零假设:分类器在测试集上的错误比例相似。
  • 拒绝零假设:分类器在测试集上的错误比例不同。

在执行检验并发现显著结果后,报告效应统计量以量化发现可能很有用。例如,一个自然的选择了报告优势比,或列联表本身,尽管这两者都需要读者具备专业知识。

报告两个分类器在测试集上的错误差异可能很有用。在这种情况下,请谨慎您的声明,因为显著检验并未报告模型之间的错误差异,仅报告模型之间错误比例的相对差异。

最后,在麦克尼马尔检验的使用上,Dietterich 强调了两个必须考虑的重要局限性。它们是:

1. 训练集或模型变异性的测量不存在。

通常,模型行为会根据用于拟合模型的特定训练数据而变化。

这是由于模型与特定训练实例的交互以及学习过程中随机性的使用。使用重采样方法在多个不同的训练数据集上拟合模型并评估技能,可以测量模型的方差。

如果变异性来源很小,则该检验是适用的。

因此,只有当我们认为这些变异性来源很小时,才应应用麦克尼马尔检验。

— “近似统计检验用于比较监督分类学习算法”,1998。

2. 模型比较不够直接

两种分类器在一个测试集上进行评估,并且测试集预计会比训练集小。

这与使用重采样方法进行假设检验不同,因为在评估过程中,几乎所有数据集(如果不是全部)都可作为测试集(从统计学角度来看,这会带来自身的问题)。

这为比较模型性能提供了更少的机会。它要求测试集充分代表该领域,通常意味着测试数据集很大。

Python 中的麦克尼马尔检验

可以使用 statsmodels 函数 mcnemar() 在 Python 中实现麦克尼马尔检验。

该函数将列联表作为参数,并返回计算出的检验统计量和 p 值。

根据数据的多少,有两种使用统计量的方法。

如果表格中用于计算检验统计量的单元格的计数小于 25,则使用该检验的修改版本,该版本使用二项分布计算精确的 p 值。这是该检验的默认用法。

或者,如果列联表中用于计算检验统计量的所有单元格的值都大于或等于 25,则可以使用标准计算方法。

我们可以计算上面描述的示例列联表的麦克尼马尔检验。此列联表在两个差异单元格中都具有较小的计数,因此必须使用精确方法。

完整的示例如下所示。

运行该示例将计算列联表上的统计量和 p 值,并打印结果。

我们可以看到,该检验强烈证实了两种情况之间的差异非常小。零假设未被拒绝。

由于我们使用该检验来比较分类器,因此我们声明两种模型之间的差异没有统计学上的显著性。

扩展

本节列出了一些您可能希望探索的扩展本教程的想法。

  • 查找一篇机器学习研究论文,其中使用了麦克尼马尔统计假设检验。
  • 更新代码示例,使列联表显示两种情况之间差异的显著差异。
  • 实现一个函数,该函数将根据提供的列联表使用正确版本的麦克尼马尔检验。

如果您探索了这些扩展中的任何一个,我很想知道。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

论文

API

文章

总结

在本教程中,您了解了如何使用麦克尼马尔检验统计假设检验来比较单个测试数据集上的机器学习分类器模型。

具体来说,你学到了:

  • 建议对训练成本高昂的模型使用麦克尼马尔检验,这非常适合大型深度学习模型。
  • 如何将两个分类器的预测结果转换为列联表,以及该表如何用于计算麦克尼马尔检验的统计量。
  • 如何在 Python 中计算麦克尼马尔检验并解释和报告结果。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

掌握机器学习统计学!

Statistical Methods for Machine Learning

培养对统计学的实用理解

...通过在 python 中编写代码

在我的新电子书中探索如何实现
机器学习的统计方法

它提供关于以下主题的自学教程
假设检验、相关性、非参数统计、重采样,以及更多...

探索如何将数据转化为知识

跳过学术理论。只看结果。

查看内容

99 条回复 关于 如何计算麦克尼马尔检验来比较两个机器学习分类器

  1. Elie Kawerk 2018年7月26日 下午5:56 #

    嗨,Jason,

    感谢这篇精彩的文章。有没有关于 5x2 CV + 配对 t 检验的实用 Python 文章即将发布?

    祝好,
    Elie

  2. Maryam Poortarigh 2018年7月27日 晚上11:30 #

    谢谢你,Jason。
    我从你那里学到了很多!

  3. Luke 2018年8月8日 上午2:23 #

    感谢这篇文章。我想问你关于 KxK 列联表(K>2),即非二元分类器?这个检验能应用到这种情况吗,或者这是一个限制,需要使用更通用的检验,如 Cochrane Q?

    • Jason Brownlee 2018年8月8日 上午6:22 #

      我相信这个检验不行。

      • Darya 2019年1月11日 上午9:59 #

        你能否将你的多类标签减少为“正确”/“不正确”,例如,将正确定义为正确标签在前 3 位,然后像你描述的那样使用麦克尼马尔检验?

        • Jason Brownlee 2019年1月12日 上午5:34 #

          也许可以,但不确定结果是否有效/合理。

  4. Erick 2019年5月28日 上午9:57 #

    首先,非常感谢 Jason 的文章。它对我帮助很大!此外,我想问你一个问题:

    使用 statsmodels 库,我能否将条件值 Alpha 更改为例如 0.1,并评估 p 值是否大于或小于此新的 Alpha 值来拒绝或不拒绝 H0?

    提前感谢您的回答!

    • Jason Brownlee 2019年5月28日 下午2:43 #

      你可以使用任何你想要的 alpha,它不是在 statamodels 库中编码的,它在我们的代码中。

  5. JOAO ANTONIO MARTINS 2019年5月30日 上午7:28 #

    麦克尼马尔检验只是用来比较 2 个机器学习分类器模型吗?还是可以用于比较 2 个以上的模型?

  6. Wonga 2019年6月29日 上午1:06 #

    你好 Jason,请帮忙。我如何从下面的混淆矩阵中找出 f11、f12、f21 和 f22?我知道在遥感领域,许多作者已将多类混淆矩阵简化为 2x2 矩阵,但我不知道如何做到。请看我的 R 代码。

    classes = c(“玉米”,”草”,”城市”,”裸土”,”水”,”森林”)
    Maize=c(130,13,12,0,0,12); Grass=c(40,4490,68,92,112,129); Urban=c(7,60,114,2,100,68)
    Bare_soil=c(0,51,0,11,0,0); Water=c(0,5,3,4,1474,0); Forest=c(50,156,350,0,51,2396)

    CM1 <- matrix(c(Maize, Grass, Urban, Bare_soil, Water, Forest), nrow = 6,
    ncol = 6, byrow=TRUE, dimnames=list(classes,classes) )

    Maize2=c(226,0,1,0,0,0); Grassland2=c(6,4870,4,1,0,1); Urban2=c(1,0,526,1,0,0)
    Bare_soil2=c(0,2,4,137,0,0); Water2=c(0,0,1,0,1691,0); Forest2=c(0,0,0,0,0,2528)

    CM2 <- matrix(c(Maize2, Grassland2, Urban2, Bare_soil2, Water2, Forest2), nrow = 6,
    ncol = 6, byrow=TRUE, dimnames=list(classes,classes) )

    我想从这些数据中找出 mcnemar 的 2x2 输入矩阵,以便对两个矩阵(模型预测)进行统计显著性检验。

    • Jason Brownlee 2019年6月29日 上午6:58 #

      抱歉,我无法为您调试代码,也许可以发布到 stackoverflow?

      我看不出您如何能将 n 类结果简化为 2x2 矩阵,除非您有多个成对矩阵。

  7. Chen Wang 2019年7月13日 上午7:32 #

    嗨 Jason,感谢这篇精彩的文章!它真的帮了我很多。

  8. Salomon 2019年8月8日 上午1:21 #

    你好 Jason,你真的知道如何清晰、简洁地解释。在我看到的解释麦克尼马尔检验的文章/视频中,你的最棒。非常感谢!

  9. zeinab 2019年8月15日 晚上11:31 #

    列联表中的数据是根据验证结果还是测试结果填写的?

  10. zeinab 2019年8月15日 晚上11:34 #

    当出现“未能拒绝 H0”时,我应该怎么做?

  11. zeinab 2019年8月16日 上午1:04 #

    哪种情况更好:“拒绝 H0”还是“未能拒绝 H0”?

  12. zeinab 2019年8月16日 上午4:47 #

    我从事回归问题。

    我尝试使用配对 t 检验(ttest_rel())来处理验证损失,结果是“未能拒绝 H0”。
    但是,当我使用配对 t 检验(ttest_rel())来处理验证相关系数时,结果是“拒绝 H0”。

    我应该使用哪个?验证损失还是验证相关系数?

  13. zeinab 2019年8月16日 下午12:29 #

    因此,如果两个模型的统计检验结果是“未能拒绝 H0”,我们就不能比较它们吗?

    • zeinab 2019年8月16日 下午12:44 #

      “拒绝 H0”是否意味着两模型之间的任何差异都归因于这两模型不同?

      • Jason Brownlee 2019年8月16日 下午2:13 #

        是的,但这是一个概率性的答案,而不是确定的。例如,仍然有 5% 的几率结果没有差异。

    • Jason Brownlee 2019年8月16日 下午2:12 #

      否。模型是进行比较的,而未能拒绝零假设表明结果之间没有统计学上的差异。

  14. zeinab 2019年8月16日 下午12:49 #

    我观察到两个准确率差异很大的模型给出了“拒绝H0”。

    然而,准确率结果差异很小的模型则给出“未能拒绝H0”。

    这是否意味着为了比较模型,它们必须在准确率结果上有很大的差异?

    • Jason Brownlee 2019年8月16日 下午2:13 #

      不,只是差异必须在统计学上显著。较小的差异可能需要大量的数据样本。

  15. zeinab 2019年8月16日 下午9:35 #

    是否有任何理由将 alpha 设置为 0.05?

    • Jason Brownlee 2019年8月17日 上午5:42 #

      是的,为了有 95% 的概率避免统计上的巧合。

  16. zeinab 2019年8月16日 下午9:45 #

    抱歉,但我对“拒绝H0”和“未能拒绝”感到困惑。哪一个意味着两个模型是不同的?

    • Jason Brownlee 2019年8月17日 上午5:43 #

      未能拒绝 H0 表明结果是相同的分布,没有差异。

      拒绝 H0 表明它们是不同的。

  17. zeinab 2019年8月16日 下午11:15 #

    当测试结果是:“未能拒绝”时,我应该再次运行一个模型,并使用不同的种子,直到结果变为“拒绝H0”以便比较两个模型吗?

  18. zeinab 2019年8月17日 下午5:08 #

    嗨,Jason,

    请检查以下陈述的正确性

    “为了比较两个回归器,它们必须具有相同的正态分布。”

  19. zeinab 2019年8月18日 上午12:31 #

    我需要比较多个回归模型。

    你能和我一起回顾一下执行此比较的步骤吗?
    1- 对每两个模型使用统计检验,如果结果是“未能拒绝”,则两个模型的性能相同。
    否则,如果结果是“拒绝H0”,则两个模型的性能不同。因此,我必须使用MSE来比较它们。

    • Jason Brownlee 2019年8月18日 上午6:46 #

      统计检验是对每个模型的MSE分数进行的。

      McNemar 检验不合适,请考虑修改的配对 t 检验。

  20. ntinos 2019年8月26日 上午1:35 #

    这篇帖子太棒了!干得好!!!
    简单的问题……假设有两个观察者将 100 张图像分类为 3 类:猫、狗、鹿。我们如何统计地比较两个观察者之间的一致性?……我猜 McNemar 可以用来分别(即每类)测试观察者的一致性,但整体一致性呢?

    • Jason Brownlee 2019年8月26日 上午6:21 #

      好问题。也许是卡方检验,或者两个离散分布之间的距离,也许是交叉熵得分?

      • ntinos 2019年8月27日 下午10:13 #

        我找到了答案,所以帮助社区。
        1. 对于分类变量(如给出的示例),Cohen's kappa 是合适的检验。
        2. 对于有序变量(例如,低、中、高),加权 kappa(Cohen's kappa 的变体)。
        3. 比较 2 个以上的观察者,Fleiss' kappa(适用于有序或分类变量)。

        https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5654219/

  21. anne xue 2019年11月20日 上午3:04 #

    你好 Jason,感谢这篇帖子。它是否适用于比较和选择回归器?你是否有关于回归任务的假设检验的帖子?谢谢

    • Jason Brownlee 2019年11月20日 上午6:20 #

      不,此测试仅用于分类。

      对于回归,您可以使用任何用于比较样本均值的检验。例如,学生 t 检验。

  22. Keerti Kulkarni 2020年1月23日 上午12:23 #

    如果给定列联表中 p 值总是 0,那意味着什么?

  23. Pep 2020年7月16日 上午4:53 #

    很棒的教程!!我只想问一下,如果未使用的一个单元格(正确/正确,不正确/不正确)为 0,是否需要精确检验。其余的总是大于 25

  24. Himanshu Chandra 2020年7月22日 下午11:37 #

    Jason 博士的解释非常棒!

    我有一个与业务相关的相关问题。设想一种情况,如下所示:在向客户展示新的分类算法/模型时,我要求他运行他现有的算法来处理 1000 个对象,并给我精确度、召回率以及“是”和“否”的指标。(他们的目标是获得高精确度)。
    然后,我使用了相同的 1000 个对象并运行了我的新算法。我发现精确度和召回率略优于旧算法。我还使用了您概述的 McNemar 检验,p 值小于 0.05,这让我有信心告诉客户新算法与旧算法不同。
    但是,我也可以说新算法在精确度和召回率方面比旧算法“更好”吗?由于只比较 2 个算法,这是一个有效声明吗?如果不是,我该如何构建 McNemar 检验或类似的检验,其中我可以使用精确度和召回率作为条目并得出其中一个在统计学上更好?

    • Jason Brownlee 2020年7月23日 上午6:14 #

      如果分数更好,并且测试表明它是真实的,那么是的。

      或者至少,您可以限定声明,说:很可能更好,或以 xxx 的显著性水平更好。

  25. Stefanie 2020年8月12日 上午2:45 #

    你好 Jason,

    感谢您的精彩帖子!我总能从中学习到很多。

    我有一个关于这篇帖子和您“机器学习中的随机性”帖子的疑问,例如这篇帖子:https://machinelearning.org.cn/evaluate-skill-deep-learning-models/

    我想在同一数据集上比较深度学习模型(由于随机初始化等原因而具有随机性)和 SVM 模型。为了获得显著的结果,我将如何实际进行此任务?

    除此之外,在研究这一点时,我发现了一篇论文,其中使用了 McNemar 检验来声称哪种方法最适合对农业景观进行分类

    https://doi.org/10.1016/j.rse.2011.11.020

  26. Drew P 2020年9月16日 上午7:53 #

    嗨,Jason,

    好帖子!

    我想请您澄清一下,在测试集上的每个样本上产生连续分数的 2 个以上技术的适当统计检验是什么?测试集预测不重复,分数也不呈正态分布。因此,条件是
    – 所有技术之间的配对样本
    – 数据不呈正态分布
    – 多重比较

    这是截断数据表的示例(我们假设值为 Dice 分数)

    测试集样例 | U-Net | FCNN | DenseNet | TiramisuNet
    1 | 0.2 | 0.7 | 0.1 | 0.9
    2 | 0.45 | 0.2 | 0.02 | 0.8
    3 | 0.0 | 1.0 | 0.5 | 0.6

    由于有 2 个以上技术进行比较,我们必须使用像 ANOVA 这样的方法来避免增加多重比较的错误。但是 ANOVA 不能用于非正态数据。

    • Jason Brownlee 2020年9月16日 下午12:14 #

      也许使用配对 t 检验来计算输出的均值或输出的平均误差。

  27. Drew P 2020年9月17日 上午4:47 #

    不幸的是,我认为不能使用配对 t 检验,因为正态性假设无效,并且 t 检验不适用于比较 2 个以上的组。

    • Jason Brownlee 2020年9月17日 上午6:52 #

      对于样本均值?好吧,试试 Wilcoxon 符号秩检验。
      https://machinelearning.org.cn/nonparametric-statistical-significance-tests-in-python/

      • Drew P 2020年9月17日 下午11:53 #

        是的,样本均值。问题是,我找不到 Wilcoxon 符号秩检验对于 2 个以上组的扩展(即,对于配对 t 检验,ANOVA 具有重复测量)。Kruskal-Wallis 检验最接近,但它不适用于配对样本,而我的情况就是如此。

        • Jason Brownlee 2020年9月18日 上午6:49 #

          多次使用配对检验,针对每对结果。这是一个非常常见的程序。

          • Drew P 2020年9月19日 上午12:38 #

            如果比较多个组,I 类错误会显著增加:https://en.wikipedia.org/wiki/Multiple_comparisons_problem

            这就是为什么不建议在比较 2 个以上组时使用配对检验(即,您不应该进行多次 t 检验或 Wilcoxon 符号秩检验,而应进行一次以上比较)。

          • Jason Brownlee 2020年9月19日 上午6:56 #

            是的,谢谢。

          • Drew P 2020年9月19日 下午1:44 #

            如果您有兴趣,我在一篇非常有用的论文中找到了一个解决方案:https://www.jmlr.org/papers/volume17/benavoli16a/benavoli16a.pdf

            解决方案:执行 omnibus Friedman 检验,然后进行 Wilcoxon 符号秩检验进行事后分析(alpha 水平必须调整以防止大的家族明智错误率)。

          • Jason Brownlee 2020年9月20日 上午6:38 #

            感谢分享。

  28. Drew P 2020年9月17日 下午11:55 #

    而且 Friedman 检验不是 Wilcoxon 符号秩检验的扩展(尽管它通常被认为是),它实际上是符号检验的扩展。

  29. Raquel 2021年1月6日 下午9:31 #

    你好,我想知道样本量在进行 McNemar 检验时是否重要。如果例如不一致(是/否,否/是)是 10 和 50,那么如果我们有一个 100 个样本的数据集,模型性能之间的差异将比我们有 1000 个样本的数据集时显得更显著。我说得对吗?或者样本量不重要?

    • Raquel 2021年1月6日 下午9:32 #

      PS:如果它确实重要,我该如何检查我获得的 McNemar 检验统计量是否显著,同时考虑到我的数据集的大小?

      • Jason Brownlee 2021年1月7日 上午6:17 #

        也许有统计功效的计算方法适合此检验,我建议查阅一本该主题的优秀教科书。

    • Jason Brownlee 2021年1月7日 上午6:17 #

      是的,它很重要,至少在每个单元格中都需要有一定数量的样本。我记得大约是 23 个。

  30. jaja 2021年1月14日 上午1:51 #

    嗨,Jason,

    我运行了两个分类器,MLP 和 RF,来对受感染和健康的油棕树进行分类。我如何使用统计分析以及适合分类的变量来选择这两个分类器中更显著的一个?

    变量 数据集 MLP RF

    1 训练 54.25 54.75
    测试 52.30 40.80
    2 训练 75.45 52.15
    测试 95.65 92.70
    3 训练 61.90 56.40
    测试 78.00 64.20
    4 训练 60.25 58.05
    测试 85.40 79.55
    5 训练 63.50 75.40
    测试 77.25 66.35
    6 训练 64.50 63.60
    测试 79.40 69.30

    谢谢

    • Jason Brownlee 2021年1月14日 上午6:14 #

      模型选择可能具有挑战性。

      抱歉,我尽量避免解读人们的结果。只有您才知道对您的项目而言哪个模型是好的。

      也许找到一个平衡点,最小化模型复杂性并最大化模型性能。

      • jaja 2021年1月14日 下午9:06 #

        感谢您的建议。

  31. FrozenKing 2021年5月3日 上午11:54 #

    感谢您的精彩帖子。我有一个问题。
    我使用了分层 5 折交叉验证来生成五个数据折叠,以在单个数据集上比较几个(N)深度学习模型。我现在无法更改交叉验证设置。在汇总了不同折叠的所有列联指标后进行成对 McNemar 检验,即 Cochran's Q 检验后进行 McNemar,是否有益?任何建议都将非常感谢。

  32. Laura 2021年5月7日 上午5:34 #

    嗨,Jason,

    非常感谢这篇精彩的文章!

    我可以问一下,什么统计方法适合比较两个在非常大的数据集上训练的多类算法吗?

    谢谢你!!

    • Jason Brownlee 2021年5月7日 上午6:32 #

      计算每个算法的一个指标,例如准确度,然后选择一个统计检验来比较这两个分数。上述检验可能适用。

  33. Lenni Justen 2021年7月14日 下午11:26 #

    你好 Jason,感谢这篇非常棒的文章。

    在我的场景中,我在略有不同的数据集(数据集 A 和数据集 B)上训练了两个模型,并在完全相同的数据集上对它们进行评估。

    您写道:“列联表依赖于这样一个事实:两个分类器都在完全相同的数据集上进行训练,并在完全相同的测试数据集实例上进行评估。”

    为什么会这样用于训练数据?我的目标是证明在数据集 A 上训练的模型比在数据集 B 上训练的模型表现更好/更差。McNemar 检验不适用于此吗?

    • Jason Brownlee 2021年7月15日 上午5:32 #

      只要每个模型都在同一个第三方数据集上进行预测,这应该没问题。

  34. Alon 2021年9月15日 上午1:36 #

    很棒的阅读,谢谢!
    是否有非分类变量的解决方案?
    例如,我的模型预测用户点击广告的概率,最后我知道用户是否点击了。
    所以,如果用户点击了,我可以认为预测概率更高的模型是正确的,而另一个是错误的。
    如果用户没有点击,那么情况正好相反——预测概率较低的模型是正确的,而另一个模型是错误的。
    然后我可以在比例上运行卡方检验。
    那会起作用吗?

    • Adrian Tam
      Adrian Tam 2021年9月15日 下午11:42 #

      我不同意您关于“正确”和“错误”的说法,因为这是一个概率。但我同意,如果您收集了足够多的样本,使用卡方应该能很好地衡量性能。

  35. Ajay 2022年1月11日 下午11:26 #

    你好,首先,很棒的帖子。

    我想在所有模型使用不同的训练数据集(约 200 个蛋白质)和不同的算法的情况下测试我的模型,但问题是我有一个非常小的测试数据集(约 20 个蛋白质)。我想仅在此测试数据集上比较每个模型的性能。我使用了 McNemar 检验,但在这篇帖子中我读到它要求模型在相同的数据集上进行训练,这是真的吗?如果是,您能建议一些统计检验,我可以在这个小测试数据集上用来比较我的模型与最先进的模型吗?

  36. TK 2022年2月5日 下午3:47 #

    McNemar 检验是否可以应用于多类/多标签问题,如果我们只考虑每个预测是正确/不正确?

    • Michael 2022年3月1日 上午1:12 #

      您是否解决了这个问题?我刚读完这篇文章和所有评论,我仍然有同样的问题。一位统计学家刚建议我这样做,但我不太确定。

  37. Michael 2022年3月1日 上午1:16 #

    我可以问一下,数据不是必须是配对的才能运行 McNemar 检验吗?

    另外,配对排列检验是否适用?在零假设下,每个测试示例的预测对被随机播放,使得分类器 A 的预测也可以作为分类器 B 的预测出现?

    我最近向一位统计学家提出了这个问题,但他们没有给我任何反馈,而是让我参考 McNemar 检验(在这种情况下,我必须根据正确与否将我的数据二元化),这正是我来到这里的原因。

  38. Arthur 2022年5月2日 上午7:06 #

    首先,非常棒的文章!
    我想知道 McNemar 检验是否可用于使用不同特征预测相同测试集中的相同二元结果的机器学习模型?例如,使用特征 a 的模型 x 与使用特征 b 的模型 y 在同一测试数据集上是否存在显著差异。

    提前感谢!

    • James Carmichael 2022年5月2日 上午9:23 #

      你好 Arthur……我看不出这个检验在这种情况下有什么不适用的理由。请继续进行,让我们知道您的发现。

      • Arthur 2022年5月3日 上午3:39 #

        你好 James

        您的意思是检验不应该使用(检验没有用),还是检验确实有用,并且您看不出它不适用的理由?

        谢谢你的澄清!

  39. Rafael 2023年8月1日 下午2:55 #

    对于那些想知道为什么提供的公式与 Python 中计算的值不匹配的人
    – exact=True 使用二项分布计算精确的 p 值
    – exact=False, correction=True 将使用 (|b – c| – 1)²/(b+c)。有关更多信息,请参阅维基百科
    – exact=False, correction=False 将使用提供的公式计算值:(b – c)²/(b+c)

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。