【问题标题】:Multi-class multi-label confusion matrix with Sklearn使用 Sklearn 的多类多标签混淆矩阵
【发布时间】:2019-05-22 00:28:15
【问题描述】:

我正在处理来自我的分类器的多类多标签输出。类的总数是 14,实例可以关联多个类。例如:

y_true = np.array([[0,0,1], [1,1,0],[0,1,0])
y_pred = np.array([[0,0,1], [1,0,1],[1,0,0])

我现在制作混淆矩阵的方式:

matrix = confusion_matrix(y_true.argmax(axis=1), y_pred.argmax(axis=1))
print(matrix)

输出如下:

[[ 79   0   0   0  66   0   0 151   1   8   0   0   0   0]
 [  4   0   0   0  11   0   0  27   0   0   0   0   0   0]
 [ 14   0   0   0  21   0   0  47   0   1   0   0   0   0]
 [  1   0   0   0   4   0   0  25   0   0   0   0   0   0]
 [ 18   0   0   0  50   0   0  63   0   3   0   0   0   0]
 [  4   0   0   0   3   0   0  19   0   0   0   0   0   0]
 [  2   0   0   0   3   0   0  11   0   2   0   0   0   0]
 [ 22   0   0   0  20   0   0 138   1   5   0   0   0   0]
 [ 12   0   0   0   9   0   0  38   0   1   0   0   0   0]
 [ 10   0   0   0   3   0   0  40   0   4   0   0   0   0]
 [  3   0   0   0   3   0   0  14   0   3   0   0   0   0]
 [  0   0   0   0   2   0   0   3   0   0   0   0   0   0]
 [  2   0   0   0  11   0   0  32   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   3   0   0   0   0   0   7]]

现在,我不确定 sklearn 的混淆矩阵是否能够处理多标签多类数据。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python scikit-learn confusion-matrix multilabel-classification


    【解决方案1】:

    现在您可以使用(0.21 版)sklearn.metrics.multilabel_confusion_matrix

    https://scikit-learn.org/stable/modules/generated/sklearn.metrics.multilabel_confusion_matrix.html

    我们尝试为每个示例预测两个标签

    import sklearn.metrics as skm
    y_true = np.array([
                    [0,0], [0,1], [1,1], [0,1], [0,1], [1,1]
                  ])
     y_pred = np.array([
                    [1,1], [0,1], [0,1], [1,0], [0,1], [1,1] 
                  ])
    
     cm = skm.multilabel_confusion_matrix(y_true, y_pred)
     print(cm)
     print( skm.classification_report(y_true,y_pred))
    

    标签的混淆矩阵:

    [[[2 2]
      [1 1]]
    
     [[0 1]
      [1 4]]]
    

    分类报告:

                  precision    recall  f1-score   support
    
             0       0.33      0.50      0.40         2
             1       0.80      0.80      0.80         5
    
    micro avg        0.62      0.71      0.67         7
    macro avg        0.57      0.65      0.60         7
    weighted avg     0.67      0.71      0.69         7
    samples avg      0.67      0.58      0.61         7
    

    【讨论】:

    • 你能告诉我哪些元素是 TP、TN、FP 和 FN。
    • @Foreever 在多标签混淆矩阵中,真负数为00,假负数为10,真正数为11,假正数为01。参考:scikit-learn.org/stable/modules/generated/…
    • 我的模型正在从 .predict 中剔除非二进制文件,例如[0.49996972、0.49996924、0.50002867]。我必须设置一个门槛吗?如果是这样,您是如何解决的?
    【解决方案2】:

    您需要做的是生成多个二进制混淆矩阵(因为本质上您拥有的是多个二进制标签)

    类似的东西:

    import numpy as np
    from sklearn.metrics import confusion_matrix
    
    y_true = np.array([[0,0,1], [1,1,0],[0,1,0]])
    y_pred = np.array([[0,0,1], [1,0,1],[1,0,0]])
    
    labels = ["A", "B", "C"]
    
    conf_mat_dict={}
    
    for label_col in range(len(labels)):
        y_true_label = y_true[:, label_col]
        y_pred_label = y_pred[:, label_col]
        conf_mat_dict[labels[label_col]] = confusion_matrix(y_pred=y_pred_label, y_true=y_true_label)
    
    
    for label, matrix in conf_mat_dict.items():
        print("Confusion matrix for label {}:".format(label))
        print(matrix)
    

    【讨论】:

    • 妈妈曾经告诉我不要在网上和陌生人说话。非常感谢你!
    猜你喜欢
    • 2020-01-22
    • 2021-11-11
    • 1970-01-01
    • 2018-11-06
    • 2014-10-19
    • 2018-07-30
    • 2020-10-24
    • 2013-10-14
    • 2019-03-01
    相关资源
    最近更新 更多