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

时间:2019-05-10 12:57:35

标签: scikit-learn text-classification confusion-matrix performance-measuring

我有3个问题:

1)

sklearn的混淆矩阵如下:

TN | FP
FN | TP

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

TP | FP
FN | TN

我应该考虑哪个?

2)

由于上述scikit学习的混淆矩阵与我在其他解决方案中发现的混淆矩阵不同,因此在多类混淆矩阵中,结构将是什么?我在这里看这篇文章: Scikit-learn: How to obtain True Positive, True Negative, False Positive and False Negative 在该帖子中,@ lucidv01d发布了一个图表,以了解多类的类别。 scikit learning中的类别是否相同?

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 个答案:

答案 0 :(得分:1)

sklearn之所以显示出混乱矩阵的原因

TN | FP
FN | TP

之所以这样,是因为在他们的代码中,他们将0视为否定类,而将1视为肯定类。 sklearn始终认为较小的数字为负,较大的数字为正。用数字表示的是类值(0或1)。顺序取决于您的数据集和类。

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

答案 1 :(得分:1)

sklearn guide说:“(维基百科和其他参考文献可能对轴使用不同的约定)”

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

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

完全主观决定您要走的路。从Sklearn's Confusion Matrix中的here这张图片可以清楚地看出,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()函数。

答案 2 :(得分:1)

  • 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]] )

    M

enter image description here

对角线总和

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

99

矩阵总和

M.sum()

160

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

0.61875