为什么scikit学习混淆矩阵是反转的?

Why scikit learn confusion matrix is reversed?

提问人:John Sall 提问时间:5/10/2019 更新时间:6/23/2020 访问量:6917

问:

我有 3 个问题:

1)

sklearn 的混淆矩阵如下:

TN | FP
FN | TP

当我查看在线资源时,我发现它是这样的:

TP | FP
FN | TN

我应该考虑哪一个?

2)

由于上面用于 scikit learn 的混淆矩阵与我在其他 rescources 中发现的混淆矩阵不同,因此在多类混淆矩阵中,结构是什么?我在这里看这篇文章: Scikit-learn:如何获得真阳性、真阴性、假阳性和假阴性 在那篇帖子中,@lucidv01d发布了一张图表来了解多类的类别。该类别在 scikit Learn 中是否相同?

3)

如何计算多类的准确性?例如,我有这个混淆矩阵:

[[27  6  0 16]
 [ 5 18  0 21]
 [ 1  3  6  9]
 [ 0  0  0 48]]

在我在问题 2 中提到的同一篇文章中,他写了这个等式:

整体精度

ACC = (TP+TN)/(TP+FP+FN+TN)

但这不就是二进制吗?我的意思是,我应该用什么类替换 TP?

scikit-learn 文本分类 混淆矩阵 性能测量

评论


答:

8赞 secretive 5/11/2019 #1

sklearn 之所以显示他们的混淆矩阵,比如

TN | FP
FN | TP

这是因为在他们的代码中,他们认为 0 是负类,1 是正类。 Sklearn 总是认为较小的数字为负数,较大的数字为正数。我所说的数字是指类值(0 或 1)。顺序取决于数据集和类。

精度将是对角线元素的总和除以所有元素的总和。

评论

0赞 SpinUp __ A Davis 6/21/2022
读完这篇文章后,我仍然不明白为什么他们不直接翻转混淆矩阵来匹配其他约定,但是当您考虑超过 2 个类的问题时,sklearn 的显示方式是有道理的
5赞 Emmet B 5/11/2019 #2

正如 sklearn 指南所说:“(维基百科和其他参考资料可能会对轴使用不同的约定)”

这是什么意思?在构建混淆矩阵时,第一步是决定将预测值和实际值(真实标签)放在何处。有两种可能性:

  • 将预测值放在列上,将真正的 Labes 放在行上
  • 将预测值放在行上,将真正的 Labes 放在列上

决定你想走哪条路是完全主观的。从这张图片中可以Sklearn's Confusion Matrix清楚地看出,scikit-learn 的约定是将预测放在列上,把真正的标签放在行上。

因此,根据 scikit-learns 约定,这意味着:

  • 第一列包含负面预测(TN 和 FN)
  • 第二列包含正预测(TP 和 FP)
  • 第一行包含否定标签(TN 和 FP)
  • 第二行包含阳性标签(TP 和 FN)
  • 对角线包含正确预测的标签数。

根据这些信息,我认为您将能够解决问题的第 1 部分和第 2 部分。

对于第 3 部分,您只需将对角线中的值求和,然后除以所有元素的总和,这将是

(27 + 18 + 6 + 48) / (27 + 18 + 6 + 48 + 6 + 16 + 5 + 21 + 1 + 3 + 9)

或者你可以只使用 score() 函数。

评论

0赞 John Sall 5/11/2019
但是我们这里有 3 列,第 3 行也发生了什么?
0赞 Emmet B 5/11/2019
@JohnSall你指的是这个数字还是别的什么?
0赞 Emmet B 5/12/2019
图中有三行三列。
3赞 Wojciech Moszczyński 6/23/2020 #3
  • scikit-learn 约定是将预测值放在列中,将实际值放在行中

  • scikit-learn 约定是默认将 0 表示负类(顶部),将 1 表示正类(底部)。可以使用 labels = [1,0] 更改顺序。 您可以通过这种方式计算整体精度

    M = np.array([[27, 6, 0, 16], [5, 18,0,21],[1,3,6,9],[0,0,0,48]])

    M

enter image description here

对角线总和

w = M.diagonal()
w.sum()

99

矩阵之和

M.sum()

160

ACC = w.sum()/M.sum()
ACC

0.61875