具有Sklearn的多级多标签混淆矩阵



我正在使用分类器的多级多标签输出。类的总数为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的混淆矩阵是否能够处理多标签多类数据。有人可以帮我吗?

现在您可以使用(版本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

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

沿着:

的线条
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)

有一种方法可以创建一个以二维(n 1 by n 1)矩阵形状的多标签混淆矩阵(MLCM)。安装&quot" mlcm"并查看有关如何使用它的一个示例,请访问:https://pypi.org/project/mlcm/MLCM方法创建了一个混淆矩阵,该矩阵类似于多类(单标签)混淆矩阵,显示了一个类别从一个类中的FN在其他类中的分布。多标签数据的每个实例的真实标签数量从零到N(即类的数量),并且每个多标签数据的每个实例的预测标签数量从零到n不等。为了克服此问题(无标记和/或无预测的标签),MLCM方法将一行和一列添加到混淆矩阵中,因此它具有N 1行和N 1列。行(和列)0至n-1分别对应于0级至n-1。最后一行对应于输入实例没有真正标签的情况。最后一列对应于分类器无法预测给定数据实例的任何类的情况。
请阅读以下论文以获取更多信息:M. Heydarian,T。Doyle和R. Samavi,MLCM:多标签混乱矩阵,IEEE Access,2022年2月,DOI:10.1109/Access.2022.3151048

相关内容

  • 没有找到相关文章

最新更新