【问题标题】:How to understand a 4x4 confusion matrix?如何理解 4x4 混淆矩阵?
【发布时间】:2020-02-22 19:53:12
【问题描述】:

我正在使用 scikit 学习决策树将一组数据分类为四个类别之一。我一般是机器学习和编码的新手,并且正在尝试理解混淆矩阵。

所以当我使用 sci-kits 混淆矩阵时,我得到一个四乘四矩阵。我能够弄清楚这些列是对每个类别的预测(例如“预测 A,预测 B ...”)。但是,我对这些行代表什么感到困惑。此外,某些预测是否有可能不进入混淆矩阵。我发现某些列没有必要的总计数。这是为什么呢?

unique, counts = np.unique(classif_predict, return_counts=True)
print('Predicted:',dict(zip(unique, counts)))

_unique, _counts = np.unique(classif_test, return_counts=True)
print('Tested:',dict(zip(_unique, _counts)))


pd.DataFrame(
    confusion_matrix(classif_test, class_predict), 
    columns = ['AGN Predicted', 'BeXRB Predicted', 'HMXB Predicted', 'SNR Predicted']
)

我的输出如下所示:

Predicted: {'AGN': 7, 'BeXRB': 25, 'HMXB': 7, 'SNR': 2}
Tested: {'AGN': 10, 'BeXRB': 22, 'HMXB': 7, 'SNR': 2}
AGN Predicted       BeXRB Predicted     HMXB Predicted      SNR Predicted             
        3                  3                   4                  0
        2                 13                   6                  1
        0                  3                   4                  0
        0                  2                   0                  0
​```

【问题讨论】:

  • 这在 Cross Validated 上可能会更好。
  • 我在 Cross Validated 上将其标记为 Stack Exchange。你会在那里得到最好的答案。

标签: python scikit-learn confusion-matrix


【解决方案1】:

行表示已预测的类的实例(通过我们使用的算法),列表示已知真​​实值的实例。

行:预测值 列:实际值

在您的情况下,明白4 * 4矩阵表示您在预测的变量中有4个不同的值,即:AGN,BEXRB,HMXB,SNR。 更重要的是,值的正确分类将在从左上角到右下角的对角线上运行,所有其他值都被错误分类。

this is an example of a 4*4 matrix 请注意,绿色值是正确分类的值,红色是错误分类的值。

【讨论】:

    【解决方案2】:

    混淆矩阵将帮助您识别模型的哪些分类是正确的,哪些不是。只考虑两个类就更容易理解了。

    混淆矩阵的工作原理如下:

    在这个矩阵中,我们只有两个可能的类,“NO”和“YES”。列代表预测值,线条代表实际(真实)值。这个矩阵对评估模型的含义是:

    • 正确将 50 个样本分类为“否”。 (这些被称为真正的否定

    • 错误分类 5 个样本为“否”,而那些本应为“是”。 (这些被称为假阴性

    • 错误分类 10 个样本为“YES”,而那些本应为“NO”。 (这些被称为误报

    • 正确将 100 个样本分类为“是”。 (这些被称为True Positives

    为了检查每个类有多少预测,您必须对列中的值求和:该模型预测了 55 个“否”和 110 个“是”。

    要检查每个类中有多少真实样本,您必须对行中的值求和:样本确实是 60 个“否”和 105 个“是”。

    两种情况的总数都是 165,这是评估的样本总数。

    专门针对您的问题:

    当您制作 4x4 混淆矩阵时,逻辑的工作方式相同,每个“额外”类都会添加额外的行和列。在您的输出中,总和都可以:

    Predicted: {'AGN': 7, 'BeXRB': 25, 'HMXB': 7, 'SNR': 2}
    Tested: {'AGN': 10, 'BeXRB': 22, 'HMXB': 7, 'SNR': 2}
    

    假设“经过测试”是您的真正价值:

    • 这意味着您有 10 个“AGN”样本,但您的模型当时只分类了 7 个(显然只有 3 个正确)。
    • 您还有 22 个“BeXRB”样本,您的模型将 25 个分类为“BeXRB”(显然只有 13 个正确)。

    编辑:

    您的矩阵上的值与您的 PREDICTED 输出 (dict) 中的值不匹配,您可能会检查:(我添加了 SUM 列和行)

                 Pred AGN      Pred BeXRB          Pred HMXB        Pred SNR        SUM
    AGN True        3                 3               4                 0            10
    BeXRB True      2                13               6                 1            22
    HMXB True       0                 3               4                 0            7
    SNR True        0                 2               0                 0            2
    
    SUM:            5                21              14                 1
    

    根据您提供的信息量,我无法为您提供更多帮助,但您应该检查您的 classif_predict 数组。

    如果您使用的是 Jupyter Notebook,由于变量值的变化,以不同的顺序运行单元格可能会引发这种行为。如果是这种情况,请尝试按预期顺序再次运行。

    【讨论】:

    • 如果我的模型将 7 归类为 AGN,那么 AGN Predicted 列不应该总共有 7 个条目吗?
    • @ZacharyC 我错误地认为您的疑问与字典值有关,并且没有检查矩阵。确实值不匹配,但为了进一步帮助您,我需要查看其余代码和数据(预测和 true_value),以便尝试重现它。
    • 我曾经更改了一个变量名,但忘记在混淆矩阵中更正它,但现在它看起来不错。感谢大家的帮助
    猜你喜欢
    • 2018-09-18
    • 2017-11-03
    • 2014-06-11
    • 2020-07-06
    • 2018-11-20
    • 2017-02-25
    • 1970-01-01
    • 2017-03-20
    • 2015-12-17
    相关资源
    最近更新 更多