课程中混淆矩阵的转化出现问题

来源:10-9 多分类问题中的混淆矩阵

NTeam6

2020-07-04

您在本课将混淆矩阵转化成百分数的过程中,直接用混淆矩阵cfm除以每行的和向量row_sums。结果好像不对。
如第5行0列的数为1,该行的和为152,那么1/152=0.0065789474,您表格中却是0.00671141。
试了一下,要将row_sums转化成列向量,应该除以row_sums.reshape(-1, 1),才能得到正确结果,但是用np.sum(,axis=1)得到的本来就应该是列向量,不知道为啥还要再转换一下。
图片描述
图片描述

写回答

2回答

liuyubobobo

2021-01-26

半年以后,我终于理解这个问题了。。。

抱歉,之前我的回答没有看明白你的问题;你是正确的。


confusion matrix 中的每一个元素 C(i, j),描述的是:一个实际类别为 i,被预测成了类别 j 的数量。


我们的 err_matrix 希望得到,一个实际类别为 i,被预测成了类别 j 的概率,所以,应该用每一个 C(i, j),除以一行的总数。row_sums(i) 存储的是第 i 行的总数。所以,我们应该用 confusion matrix 的第 i 行元素,去除以 row_sums 中的第 i 个数字,而不是 row_sums 中的所有数字。所以,需要把 row_sums 转换成列向量,就正确了。


值得一提的是,如果我们使用 cfm 直接除以 row_sums,得到的结果 err(i, j),其实是对 j 类别的预测中,预测成 i 的概率。所以,当 i != j 的时候,它也反映了一种错误率。


他们的区别其实是精准率和召回率的概念,在多分类问题上的体现。所以,如果数据不是特别特殊,很难看出来。我就中招了。。。


这两个 err_matrix 都有意义,在实际使用中,可以都看一看,或者根据自己的需求,看一下更关注那一种错误。


抱歉!如果愿意可以加我微信:liuyubobobo,我会发给你一个小红包:)


继续加油!:)

1
0

liuyubobobo

2020-07-04

现在 sklearn 升级,导致内部函数的一些计算结果有了细微的差别。我刚才想测试了一下,新版本的 sklearn 的row_sums 计算出来,第一个数字是 149

//img.mukewang.com/szimg/5f004e2f0948384807490117.jpg


0.00671141 是 1/149 的结果


==========


err_matrix = cfm / row_sums 是一个矩阵除以一个向量。numpy 中,一个矩阵除以一个向量,是按照行除。可以参考如下实验:

//img1.sycdn.imooc.com/szimg/5f00fcaa09f08c3212280324.jpg


继续加油!:)

0
9
liuyubobobo
回复
ITMOCC
没错。
2021-01-26
共9条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5839 学习 · 2437 问题

查看课程