为什么scikit学习混淆矩阵是颠倒的?

Why scikit learn confusion matrix is reversed?

我有 3 个问题:

1)

sklearn的混淆矩阵如下:

TN | FP
FN | TP

而当我在看网上资源时,我发现它是这样的:

TP | FP
FN | TN

我应该考虑哪一个?

2)

由于上面的 scikit learn 混淆矩阵与我在其他资源中找到的不同,在 multiclass 混淆矩阵中,结构是什么?我在这里查看 post: 在那个 post 中,@lucidv01d post 制作了一张图表来理解 multiclass 的类别。 scikit 学习中的那个类别是否相同?

3)

如何计算 multiclass 的准确度?例如,我有这个混淆矩阵:

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

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

总体准确度

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

但这不只是针对二进制的吗?我的意思是,class 我用什么替换 TP?

sklearn之所以显示他们的混淆矩阵像

TN | FP
FN | TP

这样是因为在他们的代码中,他们认为 0 是负数 class,1 是正数 class。 sklearn 始终将较小的数字视为负数,将较大的数字视为正数。我所说的数字是指 class 值(0 或 1)。顺序取决于您的数据集和 class.

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

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

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

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

完全主观决定您想走哪条路。从这张图 explained in here 可以清楚地看出 scikit-learn 的约定是将预测放在列上,将真实标签放在行上。

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

  • 第一列包含负预测(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() 函数。

  • scikit-learn 约定是将预测放在列中,将实际值放在行中

  • scikit-learn 约定默认将 0 表示为负值 class(顶部),将 1 表示为正值 class(底部)。可以使用 labels = [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