Return tp, tn, fn, fp 基于每个输入元素
Return tp, tn, fn, fp based on each input element
我有一个 csv 文件,其中包含与 ID 关联的真实标签和预测标签 (4 类)。 csv 文件如下所示:
task_id,labels_true,labels_pred
76017-126511-18,2,2
76017-126512-18,0,3
76017-126513-18,2,2
76018-126511-18,2,2
76018-126512-18,2,2
76018-126513-18,2,1
76019-126511-18,2,2
76019-126512-18,1,0
我正在使用来自 sklearn.metrics
的混淆矩阵
y_true = df["labels_true"]
y_pred = df["labels_pred"]
cnf_matrix = confusion_matrix(y_true, y_pred, labels=[0,1,2,3])
它return是一个数组如下:
[[ 554 1 28 0]
[ 15 1375 43 0]
[ 42 476 2263 0]
[ 0 0 0 0]]
我的目标是 return 一个列表,其中每个元素 ID 与相应的 tp、tn、fp、fn 值相关联,如下所示:
task_id,labels_true,labels_pred, cm
76017-126511-18,2,2, tp
76017-126513-18,2,2, tp
76018-126511-18,2,2, tp
这是一个多重 class 混淆矩阵。 True/False 正数用于二进制 class 化问题。
您可以做的是将您的标签编码为二进制值,例如(classes 1,2,3 编码为 1)并重新计算混淆矩阵。
TL;DR:对于多class个案例,这是不可能。
如前所述,真阳性 (TP)、真阴性 (TN)、假阳性 (FP) 和假阴性 (FN) 的概念来自二进制 class化设置;它们确实可以用于多 class class 化,如图 所示,但在这种情况下,概念 不是 的直接扩展二进制情况,让你在这里问的实际上是不可能的。
在多class class化中,所有这些概念都是per class定义和计算的。这使得任何将样本唯一标识为属于这些类别(TP、FP、TN、FN)中的一个类别的努力都是不可能的。
让我们用一些例子来证明这一点,使用你的案例(4 classes [0, 1, 2, 3]
)。
先取一个错误的class化样本,例如:
True label: 0
Predicted label: 3
- 从class
0
的观点(POV)来看,这是一个假阴性(FN):预测不是0
,应该是
- 从 class
1
的 POV 来看,这是一个真阴性:它 不是 1
,它有 正确地被class确定为不1
- 从 class
2
的 POV 来看,这又是一个真阴性 (TN):它是 不是 2
,并且它已 正确地 被 class 确定为未 2
- 从 class
3
的 POV 来看,这是一个误报 (FP):它被错误地 class 化为 3
而不是
类似的是正确的class化,比如说
True label: 2
Predicted label: 2
- 从class
0
的视角来看,这是一个真阴性(TN):它是不是0
,而且它是否正确class确定为未0
- 从class
1
的视角来看,这是一个真阴性(TN):它是不是1
,而且它正确地被class确定为不1
- 从 class
2
的 POV 来看,这是一个真阳性 (TP)
- 从class
3
的视角来看,这是一个真阴性(TN):它是不是3
,而且它是否正确class确定为未3
鉴于此说明,应该清楚您所问的实际上 在多 class 情况下是不可能的。
我有一个 csv 文件,其中包含与 ID 关联的真实标签和预测标签 (4 类)。 csv 文件如下所示:
task_id,labels_true,labels_pred
76017-126511-18,2,2
76017-126512-18,0,3
76017-126513-18,2,2
76018-126511-18,2,2
76018-126512-18,2,2
76018-126513-18,2,1
76019-126511-18,2,2
76019-126512-18,1,0
我正在使用来自 sklearn.metrics
y_true = df["labels_true"]
y_pred = df["labels_pred"]
cnf_matrix = confusion_matrix(y_true, y_pred, labels=[0,1,2,3])
它return是一个数组如下:
[[ 554 1 28 0]
[ 15 1375 43 0]
[ 42 476 2263 0]
[ 0 0 0 0]]
我的目标是 return 一个列表,其中每个元素 ID 与相应的 tp、tn、fp、fn 值相关联,如下所示:
task_id,labels_true,labels_pred, cm
76017-126511-18,2,2, tp
76017-126513-18,2,2, tp
76018-126511-18,2,2, tp
这是一个多重 class 混淆矩阵。 True/False 正数用于二进制 class 化问题。 您可以做的是将您的标签编码为二进制值,例如(classes 1,2,3 编码为 1)并重新计算混淆矩阵。
TL;DR:对于多class个案例,这是不可能。
如前所述,真阳性 (TP)、真阴性 (TN)、假阳性 (FP) 和假阴性 (FN) 的概念来自二进制 class化设置;它们确实可以用于多 class class 化,如图
在多class class化中,所有这些概念都是per class定义和计算的。这使得任何将样本唯一标识为属于这些类别(TP、FP、TN、FN)中的一个类别的努力都是不可能的。
让我们用一些例子来证明这一点,使用你的案例(4 classes [0, 1, 2, 3]
)。
先取一个错误的class化样本,例如:
True label: 0
Predicted label: 3
- 从class
0
的观点(POV)来看,这是一个假阴性(FN):预测不是0
,应该是 - 从 class
1
的 POV 来看,这是一个真阴性:它 不是1
,它有 正确地被class确定为不1
- 从 class
2
的 POV 来看,这又是一个真阴性 (TN):它是 不是2
,并且它已 正确地 被 class 确定为未2
- 从 class
3
的 POV 来看,这是一个误报 (FP):它被错误地 class 化为3
而不是
类似的是正确的class化,比如说
True label: 2
Predicted label: 2
- 从class
0
的视角来看,这是一个真阴性(TN):它是不是0
,而且它是否正确class确定为未0
- 从class
1
的视角来看,这是一个真阴性(TN):它是不是1
,而且它正确地被class确定为不1
- 从 class
2
的 POV 来看,这是一个真阳性 (TP) - 从class
3
的视角来看,这是一个真阴性(TN):它是不是3
,而且它是否正确class确定为未3
鉴于此说明,应该清楚您所问的实际上 在多 class 情况下是不可能的。