机器学习中的混淆矩阵是什么

让混淆矩阵不再令人困惑。

混淆矩阵是一种总结分类算法性能的技术。

如果每个类别中的观察值数量不相等,或者数据集中有两个以上的类别,单独的分类准确率可能会产生误导。

计算混淆矩阵可以更好地了解您的分类模型哪些地方做得对,以及它正在犯哪种类型的错误。

在这篇文章中,您将了解机器学习中使用的混淆矩阵。

阅读本文后,您将了解

  • 什么是混淆矩阵以及为什么需要使用它。
  • 如何从零开始计算两类分类问题的混淆矩阵。
  • 如何在Weka、Python和R中创建混淆矩阵。

通过我的新书《从零开始学习机器学习算法》启动您的项目,书中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

  • 2017年10月更新:修正了工作示例中的一个小错误(感谢Raktim)。
  • 2017年12月更新:修正了准确率计算中的一个小错误(感谢Robson Pastor Alexandre)
What is a Confusion Matrix in Machine Learning

机器学习中的混淆矩阵是什么
图片由Maximiliano Kolus提供,保留部分权利

分类准确率及其局限性

分类准确率是正确预测数与总预测数之比。

通常通过将结果乘以100来以百分比形式呈现。

分类准确率也可以通过反转值轻松转换为错误分类率或错误率,例如

分类准确率是一个很好的起点,但在实践中经常遇到问题。

分类准确率的主要问题在于它隐藏了您更好地了解分类模型性能所需的细节。您最有可能遇到此问题的两个示例是

  1. 当您的数据有超过两个类别时。如果有3个或更多类别,您可能会获得80%的分类准确率,但您不知道这是否是因为所有类别都预测得同样好,还是因为模型忽略了一两个类别。
  2. 当您的数据中类别数量不均匀时。您可能会获得90%或更高的准确率,但这并不是一个好分数,如果每100条记录中有90条属于一个类别,并且您可以通过始终预测最常见的类别值来达到这个分数。

分类准确率可以隐藏您诊断模型性能所需的细节。但幸运的是,我们可以通过使用混淆矩阵来揭示这些细节。

什么是混淆矩阵?

混淆矩阵是分类问题预测结果的摘要。

正确和不正确预测的数量以计数值汇总,并按每个类别细分。这是混淆矩阵的关键。

混淆矩阵显示了您的分类模型在进行预测时
的“困惑”方式。

它不仅能让您深入了解分类器正在犯的错误,更重要的是了解正在犯的错误的类型。

正是这种细分克服了单独使用分类准确率的局限性。

如何计算混淆矩阵

下面是计算混淆矩阵的过程。

  1. 您需要一个带有预期结果值的测试数据集或验证数据集。
  2. 对测试数据集中的每一行进行预测。
  3. 根据预期结果和预测计数
    1. 每个类别的正确预测数。
    2. 每个类别的不正确预测数,按预测的类别组织。

然后将这些数字组织成一个表格或矩阵,如下所示

  • 侧边为预期值:矩阵的每一行对应一个预测类别。
  • 顶部为预测值:矩阵的每一列对应一个实际类别。

然后将正确和不正确分类的计数填入表格。

一个类别的正确预测总数会进入该类别值的预期行和该类别值的预测列。

同样,一个类别的不正确预测总数会进入该类别值的预期行和该类别值的预测列。

在实践中,像这样的二元分类器会犯两种类型的错误:它可以错误地将违约个体分配给不违约类别,或者它可以错误地将不违约个体分配给违约类别。通常人们会感兴趣确定正在犯这两种错误中的哪一种。混淆矩阵[…]是显示此信息的便捷方式。

——第145页,《统计学习导论:R语言应用》,2014

这个矩阵可以用于2类问题,在那里它非常容易理解,但也可以通过向混淆矩阵添加更多的行和列,轻松应用于具有3个或更多类值的问题。

让我们通过一个例子具体说明如何创建混淆矩阵。

两类混淆矩阵案例研究

假设我们有一个两类分类问题,即预测照片中包含的是男性还是女性。

我们有一个包含10条记录的测试数据集,其中包含预期结果和分类算法的一组预测。

让我们开始计算这组预测的分类准确率。

该算法在10个预测中正确了7个,准确率为70%。

但是犯了什么类型的错误呢?

让我们把结果变成一个混淆矩阵。

首先,我们必须计算每个类别的正确预测数。

现在,我们可以计算每个类别的不正确预测数,按预测值组织。

我们现在可以将这些值排列成两类混淆矩阵。

我们可以从这个表格中学到很多东西。

  • 数据集中实际男性的总数是男性列中值的总和(3 + 2)
  • 数据集中实际女性的总数是女性列中值的总和(1 + 4)。
  • 正确的值组织在矩阵从左上到右下的对角线上(3 + 4)。
  • 将男性预测为女性的错误比将女性预测为男性的错误更多。

两类问题很特殊

在两类问题中,我们通常旨在区分具有特定结果的观测值与正常观测值。

例如疾病状态或事件与非疾病状态或非事件。

通过这种方式,我们可以将事件行指定为“正例”,将非事件行指定为“负例”。然后,我们可以将预测的事件列指定为“”,将非事件列指定为“”。

这给我们带来了

  • 真阳性”表示正确预测的事件值。
  • 假阳性”表示错误预测的事件值。
  • 真阴性”表示正确预测的非事件值。
  • 假阴性”表示错误预测的非事件值。

我们可以在混淆矩阵中总结如下

这有助于计算更高级的分类指标,如分类器的精确度、召回率、特异性和敏感性。

例如,分类准确率计算为真阳性 + 真阴性。

考虑有两个类别的情况。 […] 表格的第一行对应于预测为事件的样本。其中一些预测正确(真阳性,或 TP),而另一些则分类不准确(假阳性,或 FP)。同样,第二行包含预测的阴性,包括真阴性(TN)和假阴性(FN)。

——第256页,《应用预测建模》,2013

现在我们已经完成了一个简单的两类混淆矩阵案例研究,接下来让我们看看如何在现代机器学习工具中计算混淆矩阵。

混淆矩阵的代码示例

本节提供了一些使用顶级机器学习平台的混淆矩阵示例。

这些示例将为您提供一个背景,让您在实际使用真实数据和工具时了解混淆矩阵的用途。

Weka中的混淆矩阵示例

Weka机器学习工作台将在Explorer界面中估算模型技能时自动显示混淆矩阵。

下面是Weka Explorer界面训练Pima Indians糖尿病数据集上的k近邻算法后的屏幕截图。

混淆矩阵列在底部,您可以看到还提供了大量的分类统计数据。

混淆矩阵将字母 a 和 b 分配给类别值,并提供行中的预期类别值和每列的预测类别值(“classified as”)。

Weka Confusion Matrix and Classification Statistics

Weka混淆矩阵和分类统计

您可以在此处了解更多关于Weka机器学习工作台的信息

使用scikit-learn在Python中生成混淆矩阵的示例

Python中用于机器学习的scikit-learn库可以计算混淆矩阵。

给定一个预期值数组或列表以及机器学习模型的一系列预测,`confusion_matrix()`函数将计算混淆矩阵并以数组形式返回结果。然后您可以打印此数组并解释结果。

运行此示例会打印混淆矩阵数组,总结了人造的两类问题的结果。

了解更多关于scikit-learn API 文档中的 `confusion_matrix()` 函数

R语言caret包中的混淆矩阵示例

R语言中的caret库可以计算混淆矩阵。

给定一个预期值列表和机器学习模型的预测列表,`confusionMatrix()` 函数将计算一个混淆矩阵并以详细报告的形式返回结果。然后您可以打印此报告并解释结果。

运行此示例将计算混淆矩阵报告和相关统计数据并打印结果。

这份报告包含了大量信息,尤其是不乏混淆矩阵本身。

了解更多关于caret API文档中 `confusionMatrix()` 函数的信息 [PDF]。

进一步阅读

关于混淆矩阵的资料不多,但本节列出了一些您可能感兴趣的额外资源。

总结

在这篇文章中,您了解了机器学习中的混淆矩阵。

具体来说,您学习了

  • 分类准确率的局限性以及它何时会隐藏重要细节。
  • 混淆矩阵以及如何从零开始计算和解释结果。
  • 如何使用Weka、Python scikit-learn和R caret库计算混淆矩阵。

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

了解如何从零开始编写算法!

Machine Learning Algorithms From Scratch

没有库,只有 Python 代码。

...附带真实世界数据集的逐步教程

在我的新电子书中探索如何实现
从零开始实现机器学习算法

它涵盖了 18 个教程,包含 12 种顶级算法的所有代码,例如
线性回归、k-近邻、随机梯度下降等等……

最后,揭开
机器学习算法的神秘面纱

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

查看内容

对《机器学习中的混淆矩阵是什么》的159条回复

  1. Vinay 2016年11月18日晚上9:42 #

    很好的例子。我有两个一维数组:一个是预测的,另一个是预期的。这不是一个二元分类问题,而是一个五类分类问题。如何计算混淆矩阵以及真阳性、真阴性、假阳性和假阴性。

    • Jason Brownlee 2016年11月19日上午8:47 #

      Vinay你好,你可以从上面的例子中进行推断。

    • Avinash 2018年11月3日上午3:16 #

      嘿 Vinay,你找到解决问题的方法了吗?我现在正面临类似的问题。

    • zinash 2024年4月11日上午2:33 #

      你好,这个解释对我很有帮助。我的问题是,Weka和Python的混淆矩阵预测值和实际值的位置是否不同?

  2. Shai 2017年3月19日下午7:19 #

    不错,解释得很好。

  3. Ananya Mohapatra 2017年3月31日下午9:45 #

    你好先生,
    我们可以使用K折交叉验证在多类别神经网络程序中实现混淆矩阵吗?

    • Jason Brownlee 2017年4月1日上午5:55 #

      是的,但是您的每次交叉验证折叠都会有一个矩阵。

      对于训练/测试分割来说,这将是更好的方法。

  4. pakperchum 2017年5月3日下午2:56 #

    使用MATLAB的分类学习器应用程序,我获得了混淆矩阵,我能以图像形式显示分类结果吗?如何操作?请指导

  5. shafaq 2017年5月3日下午2:58 #

    使用Weka和Tanagra,朴素贝叶斯分类会产生混淆矩阵。我如何以图像形式而不是混淆矩阵来显示分类结果?
    请指导

  6. Shafaq 2017年5月6日下午3:40 #

    以“Lena”噪声图像为基础,应用噪声检测特征,然后将特征矩阵作为训练集。现在我想以图像(Lena)的形式获得输出,但Tanagra和Weka通过朴素贝叶斯分类显示混淆矩阵或ROC曲线(可以显示散点图)。请帮忙

  7. cc 2017年5月8日下午8:50 #

    如何在一张表中为 n 张图像编写混淆矩阵

    • Jason Brownlee 2017年5月9日上午7:41 #

      您有每个类别的一行/列,而不是每个输入(例如,每个图像)的一行/列。

  8. Giorgos 2017年5月20日上午7:11 #

    你好,Jason,我有一个3类和4类问题,我已经制作了它们的混淆矩阵,但是我无法理解哪个单元格代表真阳性、假阳性、假阴性,在二元分类问题中更容易理解,你能帮我吗?

  9. Amanze Chibuike 2017年5月28日上午7:16 #

    我需要一个用于欺诈检测的数学模型。

  10. Nathan 2017年6月20日上午2:37 #

    Jason Brownlee。回答很差劲

    • Jason Brownlee 2017年6月20日上午6:40 #

      Nathan,哪个回答,怎么说?

      • Anthony The Koala 2018年2月11日下午8:52 #

        尊敬的Jason博士,
        我完全同意你的看法。这个网站上的资源就像“骨架”。你需要自己去应用模型。混淆矩阵的一般概念在“2类混淆矩阵案例研究”中进行了总结,特别是该部分末尾的表格。从该部分的开头开始。

        由于这是一个两类混淆矩阵,因此您将有“欺诈”/“非欺诈”行和列,而不是“男性”/“女性”行和列。

        http://web.stanford.edu/~rjohari/teaching/notes/226_lecture8_prediction.pdf页面上谈到了欺诈检测和垃圾邮件检测。它是不是研究的精髓?我无法评论,但可以说,不要指望网页/博客上会有所有细节的详尽讨论。

        此外,尽管我有杰森布朗利博士的《从零开始的机器学习》一书,但我总是从这个网页上寻找灵感。

        来自激动人心的贝尔菲尔德的安东尼

  11. ALTAFF 2017年7月8日下午2:11 #

    很好的解释

  12. Sai 2017年7月18日上午5:25 #

    你好!谢谢你的精彩帖子!
    不过我有一个疑问……对于两类问题,你讨论假阳性等时,假阳性难道不应该在矩阵中真阳性的下方吗?

  13. elahe 2017年8月16日下午4:53 #

    你好
    混淆矩阵是否仅针对名义变量定义?

  14. Andre 2017年9月5日上午9:38 #

    回归分析中是否有类似于混淆矩阵的东西?
    那里也有偏差。

  15. Chandana 2017年9月25日下午9:01 #

    你好,
    我希望尽快收到回复。我们如何计算多标签多类分类情况的混淆矩阵?请给一个例子。
    据我了解
    如果
    y_pred = [1,1,0,0] 且 y_true = [0,0,1,1];则混淆矩阵为

    C1 C2 C3 C4
    C1 0 0 0 0
    C2 0 0 0 0
    C3 1 1 0 0
    C4 1 1 0 0

    这正确吗?如果正确,为什么这是计算它的正确方法(因为我们不知道类别4是与类别1混淆还是与类别2混淆,类别3的情况也一样)?

  16. Raktim 2017年10月21日下午11:52 #

    布朗利博士,您好,
    在您给出的混淆矩阵中,假阳性和假阴性颠倒了。看到那个混淆矩阵我真的很困惑。事件被错误地预测为非事件应该是假阴性,而另一方面,非事件被错误地预测为事件应该是假阳性。这是我从以下参考文献中学到的。

    期待您的解释。

    参考:http://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/
    YouTube视频:https://www.youtube.com/watch?v=4Xw19NpQCGA
    维基百科:https://en.wikipedia.org/wiki/Confusion_matrix

  17. Raktim 2017年10月23日上午12:14 #

    尊敬的布朗利博士,

    “我们可以将此概括为如下混淆矩阵:”

    在上面这行之后,表格仍然存在,并且以相反的方式显示FP和FN。

    此致,
    Raktim

  18. Raktim 2017年10月26日上午12:23 #

    尊敬的先生,

    请您看一下,因为维基百科写反了?所以您的表格不匹配。

    https://drive.google.com/open?id=0B8RkeH8XSyArWldzdjFGYW1teTA

  19. Robson Pastor Alexandre 2017年12月6日上午1:59 #

    准确率的公式有误。
    它是
    准确率 = 7 / 10 * 100

    而不是
    准确率 = 7 / 100 * 100

  20. Vishnu Priya 2018年1月28日下午10:04 #

    你好!您能解释一下如何为多类别混淆矩阵(如3*3阶或更高阶)找到参数吗?

    • Jason Brownlee 2018年1月29日上午8:16 #

      抱歉,您说为混淆矩阵寻找参数是什么意思?

  21. Jemz 2018年2月21日下午1:00 #

    您能解释一下为什么混淆矩阵在评估模型分类方面比其他方法更好,特别是对于朴素贝叶斯。谢谢

    • Jason Brownlee 2018年2月22日上午11:14 #

      它可能没有更好或更差,只是另一种评估模型技能的方式。

  22. alvi 2018年2月21日下午1:19 #

    您能解释一下为什么混淆矩阵对于评估模型是好的或推荐的吗?

    • Jason Brownlee 2018年2月22日上午11:15 #

      它可以帮助您了解模型在进行预测时所犯的错误类型。例如,类别A大部分被预测为类别B而不是类别C。

  23. Mukrimah 2018年3月13日下午1:02 #

    Jason Brownlee 先生您好

    您是否有用于多类别计算混淆矩阵的源代码示例(java)?
    假设我有4个类别(dos、normal、worms、shellcode),然后我想创建一个混淆矩阵,其中对角线通常是真阳性值。每个类别(dos)的准确率 = 预测为dos / 实际为dos,依此类推,然后总准确率 = 所有对角线(真阳性值)/ 总实例数。

  24. Krishnaprasad Challuru 2018年3月17日下午10:48 #

    概念解释得很好,但在示例中计算错误。

    敏感度应为 = TPR = TP/(TP+FN) = 3/(3+2) = 0.6,
    特异度应为 = TNR = TN/(TN+FP) = 4/(4+1) = 0.8。

    然而,敏感度被错误地计算为0.06667,特异度被错误地计算为0.75。

    • Jason Brownlee 2018年3月18日上午6:04 #

      我不认为R语言的实现有错误。

      • Luc G 2019年1月30日下午5:56 #

        如果“事件”为1,则应为

        敏感度 = TPR = TP/(TP+FN) = 3/(3+1) = 0.75 且
        特异度 = TNR = TN/(TN+FP) = 4/(4+2) = 0.06667

        困惑之处在于R代码中的“‘Positive’ Class : 0”。“事件”应在命令中指定

        results <- confusionMatrix(data=predicted, reference=expected, positive='1')

        在Python中,您可以使用此代码来查找要放入上述公式中的值

        tn, fp, fn, tp = confusion_matrix(expected, predicted).ravel()
        (tn, fp, fn, tp)

  25. Nipa 2018年3月23日下午5:43 #

    你好!我正在处理一个二元分类问题,但是我得到的混淆矩阵是这样的:
    [12, 0, 0],
    [ 1, 16, 0],
    [ 0, 7, 0]
    我不明白7是什么意思?你能解释一下吗?
    注:应该是
    [13, 0],
    [0, 23]

  26. Nipa 2018年3月26日下午4:26 #

    实际上代码没有bug。代码在其他数据集上运行良好。

    所以我将数据集的目标向量从2改为3,现在效果更好了,但问题依然存在。

    现在它看起来像这样
    [[17, 0, 0, 0],
    [ 0, 12, 0, 0],
    [ 0, 0, 8, 0],
    [ 0, 0, 0, 2]]
    是不是因为人工神经网络无法将这2个值(第4行)与任何其他类别关联起来?

  27. iamai 2018年5月31日上午6:24 #

    有一个拼写错误

    如果
    被分类为女性的男性:2
    被分类为男性的女性:1

    混淆矩阵怎么会是
    男性 女性
    男性 3 1
    女性 2 4

    更正
    被分类为女性的男性:1
    被分类为男性的女性:2

    • Jason Brownlee 2018年5月31日上午6:31 #

      我相信它是正确的,记住列是实际值,行是预测值。

      • Lindsay Peters 2018年7月18日下午2:27 #

        Weka似乎恰恰相反。如果您对Iris教程数据进行简单的J48分类,您将得到以下结果:
        a b c <-- 分类为
        49 1 0 | a = Iris-setosa
        0 47 3 | b = Iris-versicolor
        0 2 48 | c = Iris-virginica
        我们知道每种类型实际上有50个。所以对于Weka的混淆矩阵,实际计数是行中条目之和,而不是列。所以我仍然很困惑!

        • Jason Brownlee 2018年7月18日下午2:49 #

          如果矩阵转置,其含义是相同的。关键在于解释所犯错误的类型。

          这有帮助吗?

          • Lindsay Peters 2018年7月20日上午10:41 #

            是的,这有帮助,谢谢。它证实了对于Weka混淆矩阵,列是预测值,行是实际值——与您使用的定义相反,正如您所指出的那样。我没有意识到这两种格式都很常用。

  28. hafez amad 2018年6月7日下午10:08 #

    谢谢你,伙计!简单明了的解释

  29. Ibrar hussain 2018年7月18日下午4:37 #

    我正在使用Weka工具并应用DecisionTable模型,得到了以下混淆矩阵

    请将其标记为TP、TN、FP和FN

    请帮助我

  30. Bilal Süt 2018年8月2日下午11:16 #

    谢谢您的网站,我是一名实习生,我的上级给我布置了一些关于机器学习和人工智能的任务,您的网站帮了我大忙,非常感谢Jason

  31. Varad Pimpalkhute 2018年9月26日下午9:18 #

    你好,混淆矩阵可以用于大量图像数据集吗?

    • Jason Brownlee 2018年9月27日上午6:00 #

      混淆矩阵总结的是类别输出,而不是图像。

      它可以用于二元或多类分类问题。

  32. S.Khan 2018年11月18日上午3:11 #

    嗨,先生

    很棒的信息

    先生,有没有机器学习方法可以分析调查结果?

    • Jason Brownlee 2018年11月18日上午6:43 #

      是的,关于数据的问题,然后使用数据和模型来回答。

  33. srivalli 2018年11月28日上午5:04 #

    非常好的文档,对于创建测试用例真的很有用。

  34. Doaa Mohammed 2018年12月24日上午12:55 #

    您好,我需要帮助……我正在使用Weka和UCI的垃圾邮件数据集,并使用了一个元分类器,即堆叠分类器;它给出了60.59%的准确率,但问题是真阳性TP和假阳性都是0。
    这意味着什么?

    • Jason Brownlee 2018年12月24日上午5:30 #

      也许尝试其他方法?
      也许尝试在建模之前转换数据?
      也许尝试算法的其他配置?

  35. Anam 2019年3月7日上午3:24 #

    亲爱的Jason,感谢您提供的信息丰富的文章。我有一个疑问,在给定的混淆矩阵中,FP单元格中的0值是否可以接受?

    [[ 8 9]
    [ 0 15]]

    提前感谢。

    • Jason Brownlee 2019年3月7日上午6:56 #

      这取决于您项目的目标。

      • Baraka 2020年10月19日下午4:16 #

        请问我有一个问题,我运行了一个分类问题的代码
        我在训练和测试数据中都发现了良好的准确率
        我使用了混淆矩阵,但混淆矩阵中分类的数量比我的数据集的数量少
        我的问题是为什么?我应该在混淆矩阵中找到我的样本数量,然后确定实际值和预测值,请回复我,我很困惑
        为了知道您的分类结果,我们使用什么?

        • Jason Brownlee 2020年10月20日上午6:22 #

          干得好!

          混淆矩阵中的总计数将与测试集中的总行数匹配。如果情况并非如此,请确保您在两种情况下都计数正确。

  36. pRANGYA 2019年3月29日上午1:25 #

    嗨,Jason,

    如果您能解释一下 `confusionMatrix()` 的以下参数,那将非常棒。

    准确率 : 0.7
    95% 置信区间 : (0.3475, 0.9333)
    无信息率 : 0.6
    P值 [准确率 > 无信息率] : 0.3823

    Kappa : 0.4
    Mcnemar’s 检验 P值 : 1.0000

    敏感度 : 0.6667
    特异度 : 0.7500
    正向预测值 : 0.8000
    负向预测值 : 0.6000
    流行率 : 0.6000
    检测率 : 0.4000
    检测流行率 : 0.5000
    平衡准确率 : 0.7083

    “正例”类别 : 0

  37. himagaran 2019年4月26日上午2:59 #

    你好,如何将weka结果中显示的混淆矩阵信息可视化,是否可以像python那样生成图表?

    • Jason Brownlee 2019年4月26日上午8:36 #

      Weka将生成一个ASCII混淆矩阵,您可以将其复制粘贴到您的文档中。

  38. Aniket 2019年6月15日下午12:57 #

    你好,
    混淆矩阵中的计数器是什么?

    • Jason Brownlee 2019年6月16日上午7:08 #

      它们是每个类别中样本的计数。

      这有帮助吗?

  39. Elshrif 2019年7月7日下午3:11 #

    你好,
    如果数据集包含正面和负面评论。我们能否在使用情感分类算法处理数据集后,使用混淆矩阵识别假正面评论率、假负面评论率、真实正面评论率和真实负面评论率?

    • Jason Brownlee 2019年7月8日上午8:38 #

      是的,您可以训练一个模型来将给定评论分类为真实或虚假——无论这意味着什么。

  40. subhash 2019年8月20日下午3:02 #

    我们可以将混淆矩阵中的正类从0改为1吗?

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

      当然,您可以按照自己喜欢的方式呈现数据。

  41. Mike Kelly 2019年11月12日下午1:28 #

    似乎在矩阵中,预测值与参考值在行和列中的表示方式没有标准。caret文档和维基百科将参考值放在列中,而许多博客则显示相反。我想只要知道库在做什么,这就不重要了。但在您的文章中,您指出

    侧边为预期值:矩阵的每一行对应一个预测类别。
    顶部为预测值:矩阵的每一列对应一个实际类别。

    这正确吗?难道不应该说

    侧边为预期值:矩阵的每一行对应一个实际类别。
    顶部为预测值:矩阵的每一列对应一个预测类别。

    • Jason Brownlee 2019年11月12日下午2:08 #

      是的,我见过这两种方式,也有非常愤怒的人争论双方。只要有标签,我就觉得可以。

  42. rahul 2019年12月7日下午11:41 #

    先生您好,感谢您如此精彩的解释。
    但我对精确率和召回率之间有一个疑问。
    您能用一个通用的例子向我解释一下吗?

  43. PRADEEP PANICKER 2020年2月15日下午6:29 #

    混淆矩阵的解释——做得太简单了!!!太棒了!!!极好!!!

    非常感谢——因为这是理解后续模型性能的基础。

    请问您是否有关于模型性能的类似文献??

  44. Rick Garibay 2020年2月19日上午9:03 #

    好文章,谢谢。

    在Python混淆矩阵示例中,您传入预期数组,然后传入预测数组

    results = confusion_matrix(expected, predicted)

    当我查看矩阵中的结果时,它似乎是错误的,因为我期望以下内容是基于我在脑海中手动计算每个桶的结果:

    [TP , FP]
    [FN, TN]

    [[3 2]
    [1 4]]

    但是,我按原样运行了您的代码,并得到了与您相同的结果。

    [[4 2]
    [1 3]]

    这对我来说没有意义,因为查看数据集,显然有3个TP,2个FP;1个FN和4个TN。

    所以,我尝试将参数翻转为

    results = confusion_matrix(predicted, expected)

    现在我得到了我期望的结果。

    混淆矩阵的表示是否有不同的约定?谢谢。

  45. HSA 2020年2月25日下午11:58 #

    我绘制了一个分类模型在不平衡数据集上的混淆矩阵,偏差是零标签,我得到了这张图:

    https://files.fm/u/nynwed55

    然后我绘制了同一个模型在不平衡数据集上的结果,偏差标签为1,我得到了这张图:

    https://files.fm/u/ghqxhkx3

    之后,我在平衡数据集上绘制了它

    https://files.fm/u/v26g5mbs

    我注意到模型倾向于很好地分类偏差标签,否则它分类不佳。这是好事还是有问题?

  46. HSA 2020年2月26日下午10:09 #

    好的,我有第一个数据集,其标签不平衡(0表示中性,1表示仇恨),0标签的数量远大于1标签,混淆矩阵在第一个链接中,深色部分是0被分类为0的部分,这意味着模型在数据集中具有偏差(更多)的标签上表现良好,当我测试1多于0标签的数据集时,深色部分也在第二个链接中的1标签中。
    第三个链接是平衡数据集
    现在模型的性能可以接受吗,还是有什么问题?

  47. ARUN KUMAR SHARMA 2020年3月11日上午1:48 #

    混淆矩阵解释得非常好。我有一个疑问,需要您的专家帮助。我通过XGboost模型进行了二元预测,当我获得混淆矩阵时,我得到MacNemar检验p<0.05。我应该如何解释它?它是否表明算法开始时的第一个模型和算法停止时的最后一个模型之间存在显著差异?如果不是这样,那么它实际上在说明什么,如果是,请分享学术参考文献。我从R语言的caret包中获得了混淆矩阵。

    • Jason Brownlee 2020年3月11日上午5:25 #

      p<0.05 表明样本均值之间的差异可能是真实存在的。

  48. Jana 2020年4月17日上午6:47 #

    嗨,Jason,

    感谢这篇精彩的帖子。
    请澄清我的疑问。我已经绘制了属于单个受试者两个类别的测试数据的混淆矩阵。我想知道,如果有多个受试者,我是否需要分别为他们每个人绘制混淆矩阵?
    在一篇期刊论文中,如果我需要展示一个代表所有受试者(n=15)的单一混淆矩阵,我应该怎么做?
    恳请在这方面帮助我。
    提前感谢。

    • Jason Brownlee 2020年4月17日上午7:45 #

      谢谢!

      混淆矩阵用于比较预测类别和预期类别的频率。

      如果“subject”指的是课程,那么是的。

      • Jana 2020年4月17日 下午7:33 #

        亲爱的Jason博士,

        感谢您的迅速回复!
        我说的“subject”是指研究中的个体/参与者。我有两个类别。
        我的问题是,我应该如何绘制一个代表所有参与者的混淆矩阵?
        希望我现在已经把问题说清楚了。
        提前感谢。

        • Jason Brownlee 2020年4月18日 上午5:46 #

          或许可以不分参与者,将所有结果合并在一起。

          • Jana 2020年4月18日 上午6:25 #

            非常感谢,Jason博士。

          • Jason Brownlee 2020年4月18日 上午6:42 #

            不客气。

  49. Schrodinger 2020年4月21日 上午1:21 #

    你好 Jason,

    我有一个关于TP、FP、FN、TN的问题。它只能通过二元分类(真或假)来定义,还是也可以在多类别分类中定义?

    • Jason Brownlee 2020年4月21日 上午6:00 #

      通常是这样,但你也可以将多个类别定义为“正”和“负”以推广这个想法。

      • Schrodinger 2020年4月21日 下午7:38 #

        这到底是什么意思?您能再详细说明一下吗?谢谢。

        • Jason Brownlee 2020年4月22日 上午5:54 #

          抱歉,我没有一个实际的例子。也许我会在这个主题上写一个教程。

  50. Mitesh 2020年4月21日 下午9:45 #

    我在哪里可以找到 confusionmatrix() 函数的代码??R语言中一步一步的代码..??

  51. shivanof 2020年4月28日 上午8:45 #

    你好,先生,
    如果我没有获得混淆矩阵的总数(我用了1000张图片进行分类),但在混淆矩阵结果中我只得到大约300个(TP、TN、FP和FN),这是什么问题?
    原因是什么?
    谢谢

    • Jason Brownlee 2020年4月28日 下午1:23 #

      混淆矩阵中的总预测数必须与模型所做的总预测数匹配。

      如果数字不匹配,可能是您的代码中存在错误。

      • shivanof 2020年5月1日 上午9:37 #

        如果我们把数据集分成(训练集和验证集),
        混淆矩阵的输出取决于验证集吗?还是什么?
        谢谢先生。

        • Jason Brownlee 2020年5月1日 下午2:02 #

          正确。混淆矩阵是根据在训练期间未使用的保留集进行的预测计算得出的。

          • Mark 2021年5月24日 上午12:56 #

            你好,我们是否只取最后一个 epoch 的验证集上的预测来构建混淆矩阵?

          • Jason Brownlee 2021年5月24日 上午5:46 #

            如果你愿意,你可以。

  52. aaqib 2020年5月3日 下午4:13 #

    是否可以绘制单类别混淆矩阵???

  53. Ale 2020年5月27日 上午6:16 #

    你好 Jason,

    希望你能帮我解开这个疑惑

    我有一个9个类别的多类别问题,当我使用逻辑回归时,准确率是0.3。从混淆矩阵上看,预测器分类似乎不错,但它在选择哪个邻居时遇到困难(例如,当实际值为第3类时,它预测为第2、3或4类),其他9个类也一样。我认为准确率对于我的问题来说太严格了,这就是我得到如此低分的原因。你认为我应该使用其他指标吗?那些惩罚不那么严重的指标,或者你有什么建议?

    请告诉我我是否表达不清楚。

    感谢你的帮助!

  54. ysohbi 2020年7月13日 上午3:52 #

    你好 Jason,

    假设预测值既不是男性也不是女性,而只是“静默”。

    在这种情况下,它是一个 FN(假阴性)。

    您如何在预测列表(不是1也不是0)中表示这个事实。

    谢谢!

    亚辛

    附:在多类别情况下也可能出现此问题。

    • Jason Brownlee 2020年7月13日 上午6:07 #

      这将是一个三分类问题:男性、女性、未知。

  55. Bindhu J S 2020年8月21日 上午4:32 #

    您能帮我一下吗?我生成了一幅卫星图像的混淆矩阵,其中错误分类的像素数量在其他一些类别中完全相同…这可能发生吗?

  56. Kevin 2020年11月10日 上午2:38 #

    亲爱的Jason博士,在进行10折分层交叉验证进行二元分类后,我们通常会生成混淆矩阵。那么,将所有10个混淆矩阵合并为一个混淆矩阵进行报告,而不是像我在Kaggle笔记本中广泛看到的那样独立生成一个混淆矩阵,是最佳实践吗?

    如果最好将所有10个混淆矩阵合并,我们应该计算这四个指标(真阴性、真阳性、假阴性和假阳性)的平均值,而不是将它们求和吗?这种组合背后的理念是什么?另外,您能提供一个关于Python编码的提示,如何从confusion_matrix()方法中获取这10个混淆矩阵的平均值?谢谢。

    • Jason Brownlee 2020年11月10日 上午6:46 #

      交叉验证和混淆矩阵不兼容。

      您要么使用交叉验证来估计模型在未见数据上的性能,要么使用训练/测试分割和混淆矩阵。

  57. Cemiloglu 2020年12月2日 上午8:24 #

    您好,先生,首先非常感谢您出色的解释。我想问您,Python中是否有 caret 库?因为我需要计算特异性和敏感性。请帮帮我。

  58. Mustafa 2020年12月16日 上午1:36 #

    您好,先生。
    我有一个包含7个类别的图像分类(37000张训练图像和2800张测试图像)。我如何获取关于哪些图像因混淆矩阵的结果而被错误预测的信息?例如:

    图像ID – — 预测类别 —- 真实类别
    1.jpg———– 类别A—————类别B。

    有办法做到这一点吗?

    • Jason Brownlee 2020年12月16日 上午7:52 #

      手动进行预测并检查预测不正确的结果。混淆矩阵帮不上忙。

  59. Nisarg Patel 2021年2月20日 上午7:26 #

    请告诉我混淆矩阵在哪些两种不同场景下适用和不适用。

    • Jason Brownlee 2021年2月20日 上午7:50 #

      为什么?

      听起来像是一个家庭作业问题……

  60. Nisarg Patel 2021年2月20日 上午10:38 #

    是的,我找不到混淆矩阵的缺点。

    • Jason Brownlee 2021年2月20日 下午1:17 #

      它不能用于总结多次运行,例如K折交叉验证。

      当类别超过5-10个时,它变得难以阅读。

  61. fereshteh 2021年2月27日 上午2:10 #

    尊敬的Jason博士
    混淆矩阵是否只在执行测试数据时形成?

    • Jason Brownlee 2021年2月27日 上午6:06 #

      您可以在任何数据集上计算混淆矩阵,最常见的是测试集。

      • Mark 2021年5月23日 下午10:30 #

        您好,关于@feereshteh的问题——是在训练的最后一个epoch中,我们调用验证部分(并在验证中设置一个“if语句”来检查是否是最后一个epoch,然后保存预测值和期望值)来创建混淆矩阵,还是保存训练的最终模型并再次将所有数据集输入其中更好?您是否有关于TensorFlow或PyTorch中多类别分类神经网络训练的相关链接?
        谢谢

        • Jason Brownlee 2021年5月24日 上午5:46 #

          结果相同,无所谓。

          我更喜欢保存模型,然后稍后加载并评估。

  62. Bonface 2021年3月27日 下午6:22 #

    你好。
    我正在使用Weka构建我的模型,但我一直得到一个大的混淆矩阵(41×41),而我只想要一个2×2的矩阵。有没有办法使用weka将矩阵缩小到2×2?
    如果您能帮忙,不胜感激。

    • Jason Brownlee 2021年3月29日 上午6:01 #

      如果您的数据中有2个类别,您将得到一个2×2的混淆矩阵。

      • Bonface 2021年4月2日 上午3:38 #

        所以基本上,混淆矩阵的大小是根据数据中类别的数量决定的?

  63. Bonface 2021年4月5日 下午10:24 #

    非常感谢。您真的帮了我很大的忙,我之前一直在为这个问题苦恼。

  64. loryn 2021年5月23日 上午3:34 #

    尊敬的先生,
    希望您能尽快回答我。我想组合多类别混淆矩阵的结果
    我的问题

    恶性1 恶性2 恶性3 恶性4 良性
    53 5 2 3 0
    7 38 5 0 1
    4 6 54 2 11
    0 0 3 42 5
    0 3 8 3 444

    我想要显示的结果是

    良性 恶性
    444 17
    14 219

    • Jason Brownlee 2021年5月23日 上午5:25 #

      或许可以将所有“malin”相加?
      或许可以更改数据集中您的类别标签?

  65. Francisco Galdos 2021年8月4日 上午2:57 #

    你好,

    我有一个分类器,其中我为低于某个概率值的预测编码了一个“未分类”类别。然而,参考数据中没有任何该类别的实例。在计算混淆矩阵时,我应该只基于返回值的预测(即未标记为未分类的预测)进行计算,还是应该将未分类类别包含在混淆矩阵中?

    感谢您的帮助!

    • Jason Brownlee 2021年8月4日 上午5:17 #

      难题。我想这取决于您以及您选择如何评估模型/向利益相关者展示性能。

  66. Jomy 2021年10月5日 下午4:10 #

    当我查看Weka中的混淆矩阵时,我理解的是

    矩阵的每一行对应一个实际类别。
    矩阵的每一列对应一个预测类别。

    请澄清。

    • Adrian Tam
      Adrian Tam 2021年10月6日 上午10:28 #

      你是对的。

  67. javeria 2021年10月27日 上午12:05 #

    您好,贾森先生,希望您一切顺利。

    我阅读了有关机器学习初始阶段的推荐文件,这对于理解初始概念非常有帮助。

    我有一个关于PLS-DA模型的问题。在PLS-DA模型中,我们从ROC曲线中获得哪些信息?我真的不完全理解ROC曲线的概念,请告诉我一下。

    我期待您的回复。

    提前感谢。

  68. rey 2022年7月8日 上午6:05 #

    感谢这篇文章。
    使用混淆矩阵计算分类模型性能可能存在什么问题?

发表评论

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