为什么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
我有 3 个问题:
1)
sklearn的混淆矩阵如下:
TN | FP
FN | TP
而当我在看网上资源时,我发现它是这样的:
TP | FP
FN | TN
我应该考虑哪一个?
2)
由于上面的 scikit learn 混淆矩阵与我在其他资源中找到的不同,在 multiclass 混淆矩阵中,结构是什么?我在这里查看 post:
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 所说:”(维基百科和其他参考资料可能对轴使用不同的约定)”
这是什么意思?构建混淆矩阵时,第一步是决定在哪里放置预测值和真实值(真实标签)。有两种可能:
- 将预测放入列,将真实标签放入行
- 将预测放入行,将真实标签放入列
完全主观决定您想走哪条路。从这张图
因此,根据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