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

12

我有3个问题:

1)

sklearn的混淆矩阵如下:

TN | FP
FN | TP

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

TP | FP
FN | TN

我应该考虑哪一个?

2)

由于scikit learn中上述混淆矩阵与我在其他资源中找到的不同,在多类混淆矩阵中,结构会是什么样子?我查看了这个帖子: Scikit-learn: How to obtain True Positive, True Negative, False Positive and False Negative 在那篇文章中,@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?

3个回答

8
sklearn之所以将混淆矩阵呈现为以下形式:
TN | FP
FN | TP

这是因为在他们的代码中,0被视为负类,1被视为正类。sklearn始终将较小的数字视为负数,较大的数字视为正数。通过数字,我指的是类值(0或1)。顺序取决于您的数据集和类别。

准确度将是对角线元素之和除以所有元素之和。对角线元素是正确预测的数量。


阅读完这篇文章后,我仍然不明白为什么他们不会只是翻转混淆矩阵以匹配其他约定,但当你考虑到涉及超过2个类别的问题时,sklearn的显示方式是有意义的。 - SpinUp __ A Davis

5
正如sklearn指南所说:"(维基百科和其他参考文献可能使用不同的轴约定)" 这是什么意思?在构建混淆矩阵时,第一步是决定将预测值和真实值(真实标签)放在哪里。有两种可能性:
- 把预测值放在列上,把真实标签放在行上 - 把预测值放在行上,把真实标签放在列上
完全是主观的决定你想走哪条路。从这张图片Sklearn's Confusion Matrix解释见此处, 很明显scikit-learn的惯例是把预测值放在列上,真实标签放在行上。
因此,根据scikit-learn的惯例,它的意思是:
  • 第一列包含负预测(TN和FN)
  • 第二列包含正预测(TP和FP)
  • 第一行包含负标签(TN和FP)
  • 第二行包含正标签(TP和FN)
  • 对角线包含正确预测的标签数量。

根据这些信息,我认为您可以解决问题的第一部分和第二部分。

对于第三部分,您只需将对角线上的值相加,然后将其除以所有元素的总和,计算如下:

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

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


但是我们这里有3列,第三行发生了什么? - John Sall
@JohnSall,您是在指那个图还是其他什么? - Emmet B
图中有三行三列。 - Emmet B

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接