9

我有3个问题:

1)

sklearn的混淆矩阵如下:

TN | FP
FN | TP

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

TP | FP
FN | TN

我应该考虑哪一个?

2)

由于上述 scikit learn 的混淆矩阵与我在其他资源中找到的不同,在多类混淆矩阵中,结构是什么?我在这里看这篇文章: 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?

4

3 回答 3

6

sklearn 显示其混淆矩阵的原因如下

TN | FP
FN | TP

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

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

于 2019-05-11T01:59:08.487 回答
5

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

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

  • 将预测放在列上,将真实标签放在行上
  • 将预测放在行上,将真实标签放在列上

决定你想走哪条路是完全主观的。从这里Sklearn 的混淆矩阵解释的这张图片中,很明显 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() 函数。

于 2019-05-11T09:26:13.693 回答
2
  • scikit-learn 的约定是将预测放在列中,将实际值放在行中

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

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

在此处输入图像描述

对角线之和

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

99

矩阵之和

M.sum()

160

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

0.61875

于 2020-06-22T18:52:34.673 回答