提问人:John Sall 提问时间:5/10/2019 更新时间:6/23/2020 访问量:6917
为什么scikit学习混淆矩阵是反转的?
Why scikit learn confusion matrix is reversed?
问:
我有 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?
答:
sklearn 之所以显示他们的混淆矩阵,比如
TN | FP
FN | TP
这是因为在他们的代码中,他们认为 0 是负类,1 是正类。 Sklearn 总是认为较小的数字为负数,较大的数字为正数。我所说的数字是指类值(0 或 1)。顺序取决于数据集和类。
精度将是对角线元素的总和除以所有元素的总和。
评论
正如 sklearn 指南所说:“(维基百科和其他参考资料可能会对轴使用不同的约定)”
这是什么意思?在构建混淆矩阵时,第一步是决定将预测值和实际值(真实标签)放在何处。有两种可能性:
- 将预测值放在列上,将真正的 Labes 放在行上
- 将预测值放在行上,将真正的 Labes 放在列上
决定你想走哪条路是完全主观的。从这张图片中可以清楚地看出,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() 函数。
评论
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
对角线总和
w = M.diagonal()
w.sum()
99
矩阵之和
M.sum()
160
ACC = w.sum()/M.sum()
ACC
0.61875
评论