【问题标题】:How do I interpret this 10*10 confusion matrix?我如何解释这个 10*10 的混淆矩阵?
【发布时间】:2020-08-06 21:34:04
【问题描述】:

我在混淆矩阵下面有 10 个 Y 类别。如何计算类别 A、D 和 E 的准确率,并找到每个类别的 TP、TM、FP、FN?

    A    B   C   D   E   F   G   H   I   J
   [41,  0,  0,  2,  1,  0,  0,  0,  0,  4],
   [ 1,  0,  0,  0,  4,  0,  0,  0,  0,  2],
   [ 3,  0, 12,  0,  1,  0,  0,  0,  0,  0],
   [ 0,  0,  0, 51, 10,  0,  0,  0,  0,  0],
   [ 1,  0,  0,  3, 78,  0,  0,  0,  0,  5],
   [ 1,  0,  0,  0,  0,  0,  0,  0,  0,  3],
   [ 4,  0,  0,  0,  2,  0,  5,  0,  0,  4],
   [ 0,  0,  1,  1,  3,  0,  0,  2,  0,  1],
   [ 4,  0,  0,  0,  1,  0,  0,  0,  0,  0],
   [10,  0,  0,  5, 15,  0,  0,  0,  0, 24]

感谢您的帮助!

【问题讨论】:

    标签: python-3.x confusion-matrix


    【解决方案1】:

    可视化您的混淆矩阵 h2>
    X = [[41, 0, 0, 2, 1, 0, 0, 0, 0, 4],
     [1, 0, 0, 0, 4, 0, 0, 0, 0, 2],
     [3, 0, 12, 0, 1, 0, 0, 0, 0, 0],
     [0, 0, 0, 51, 10, 0, 0, 0, 0, 0],
     [1, 0, 0, 3, 78, 0, 0, 0, 0, 5],
     [1, 0, 0, 0, 0, 0, 0, 0, 0, 3],
     [4, 0, 0, 0, 2, 0, 5, 0, 0, 4],
     [0, 0, 1, 1, 3, 0, 0, 2, 0, 1],
     [4, 0, 0, 0, 1, 0, 0, 0, 0, 0],
     [10, 0, 0, 5, 15, 0, 0, 0, 0, 24]]
    
    cm = pd.DataFrame(X, columns=list("ABCDEFGHIJ"), index=list("ABCDEFGHIJ")) 
    
    print(cm)
    

    输出:

        A  B   C   D   E  F  G  H  I   J
    A  41  0   0   2   1  0  0  0  0   4
    B   1  0   0   0   4  0  0  0  0   2
    C   3  0  12   0   1  0  0  0  0   0
    D   0  0   0  51  10  0  0  0  0   0
    E   1  0   0   3  78  0  0  0  0   5
    F   1  0   0   0   0  0  0  0  0   3
    G   4  0   0   0   2  0  5  0  0   4
    H   0  0   1   1   3  0  0  2  0   1
    I   4  0   0   0   1  0  0  0  0   0
    J  10  0   0   5  15  0  0  0  0  24
    

    读取混淆矩阵如下:行是实际标签,列是预测的标签。一个完美的模型将具有对角线混乱矩阵,因为它将正确预测一直预测! Read more on confusion matrices.

    在这里,您可以读取您的模型有时是错误的。它预测A 987654326答案实际上是J但它特别适用于类别G:在它预测的五次,它总是对的!

    类别准确性 h2> 在计算您预测的次数时,可以获得类别准确性,其中您预测的一切次数:
    >>> cm["A"]["A"] / cm.sum(axis=0)["A"]                                                                                                               
    0.6307692307692307
    
    >>> cm["D"]["D"] / cm.sum(axis=0)["D"]                                                                                                               
    0.8225806451612904
    
    >>> cm["E"]["E"] / cm.sum(axis=0)["E"]                                                                                                               
    0.6782608695652174
    

    tp,tn,fp,fn为每个 h2>

    这些措施通常在二进制分类设置中进行意义,但对于给定类别,您可以想象在一个vs-all(认为类别与所有REST)设置中,它们看起来像二进制文件,从而计算这些措施。

    利用this answer,您可以使用以下内容获取每个类别的所有TP,TN,FP,FN值:

    FP = cm.sum(axis=0) - np.diag(cm)   
    FN = cm.sum(axis=1) - np.diag(cm) 
    TP = pd.Series(np.diag(cm), index=list("ABCDEFGHIJ"))
    TN = np.matrix(cm).sum() - (FP + FN + TP)  
    
    现在,fp for category A是:
    >>> FP["A"]
    24  #  you can verify, it's the sum of all values except diagonal element
    

    相同的逻辑适用于所有其他措施。

    【讨论】:

    • 谢谢@arnaud,我会挖掘上面的内容! span>
    • 我认为tn的公式应该是tn = np.matrix(cm).sum() - (fp + fn + tp):) span>
    • btw,您是否有关于如何评估MultiBel混淆矩阵的任何建议? span>
    • 你是什么意思“评估”?计算它?基于预测和地面真相?您可以利用Sklearn是:scikit-learn.org/stable/modules/generated/… span>
    【解决方案2】:

    要添加到另一个答案,真阳性和假阳性以及其他指标仅在二项式响应的上下文中才有意义。这个维基百科页面更详细地概述了这一点:

    Precision and Recall

    在上述情况下,您不一定能计算总体 TP 或 FP 率,但您可以计算 False 'A' 和 True 'A' 等等,如上面的答案中所述。

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 2014-06-11
      • 2017-11-03
      • 2020-07-06
      • 2014-04-19
      • 2019-08-05
      • 2021-02-13
      • 2019-09-19
      • 2017-03-03
      相关资源
      最近更新 更多