Multi-class 多标签混淆矩阵与 Sklearn
Multi-class multi-label confusion matrix with Sklearn
我正在使用 classifier 的多class 多标签输出。 classes 的总数为 14,实例可以关联多个 classes。例如:
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 的混淆矩阵是否能够处理多标签 multi-class 数据。有人可以帮我吗?
您需要做的是生成多个二元混淆矩阵(因为本质上您拥有的是多个二元标签)
大致如下:
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)
现在您可以使用(版本 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
有一种方法可以创建二维(n+1 x n+1)矩阵形状的 Multi-Label 混淆矩阵 (MLCM)。
要安装“mlcm”并查看有关如何使用它的示例,请转到:https://pypi.org/project/mlcm/
MLCM 方法创建了一个混淆矩阵,类似于 multi-class (single-label) 混淆矩阵,显示了一个 class 相对于其他 class 的 FN 分布。每个multi-label数据实例的真实标签数量从0到n不等(即class个),每个multi-label数据实例的预测标签数量从零到 n 变化。为了克服这个问题(no-true-label and/or no-predicted-label),mlcm 方法在混淆矩阵中添加了一行和一列,因此它有 n+1 行和 n+1 列。 0到n-1行(和列)分别对应classes 0到n-1。最后一行对应于输入实例没有真实标签的情况。最后一列对应于 classifier 没有预测给定数据实例的任何 class 的情况。
请阅读以下论文以获取更多信息:
M. Heydarian、T. Doyle 和 R. Samavi,MLCM:Multi-Label 混淆矩阵,
IEEE 访问,2022 年 2 月,DOI:10.1109/ACCESS.2022.3151048
我正在使用 classifier 的多class 多标签输出。 classes 的总数为 14,实例可以关联多个 classes。例如:
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 的混淆矩阵是否能够处理多标签 multi-class 数据。有人可以帮我吗?
您需要做的是生成多个二元混淆矩阵(因为本质上您拥有的是多个二元标签)
大致如下:
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)
现在您可以使用(版本 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
有一种方法可以创建二维(n+1 x n+1)矩阵形状的 Multi-Label 混淆矩阵 (MLCM)。
要安装“mlcm”并查看有关如何使用它的示例,请转到:https://pypi.org/project/mlcm/
MLCM 方法创建了一个混淆矩阵,类似于 multi-class (single-label) 混淆矩阵,显示了一个 class 相对于其他 class 的 FN 分布。每个multi-label数据实例的真实标签数量从0到n不等(即class个),每个multi-label数据实例的预测标签数量从零到 n 变化。为了克服这个问题(no-true-label and/or no-predicted-label),mlcm 方法在混淆矩阵中添加了一行和一列,因此它有 n+1 行和 n+1 列。 0到n-1行(和列)分别对应classes 0到n-1。最后一行对应于输入实例没有真实标签的情况。最后一列对应于 classifier 没有预测给定数据实例的任何 class 的情况。
请阅读以下论文以获取更多信息:
M. Heydarian、T. Doyle 和 R. Samavi,MLCM:Multi-Label 混淆矩阵,
IEEE 访问,2022 年 2 月,DOI:10.1109/ACCESS.2022.3151048