请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答 回答被采纳积分+3

2回答

liuyubobobo 2021-01-26 00:37:05

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

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


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 回复 有任何疑惑可以回复我~
liuyubobobo 2020-07-04 17:39:24

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

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


0.00671141 是 1/149 的结果


==========


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

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


继续加油!:)

0 回复 有任何疑惑可以回复我~
  • 提问者 NTeam6 #1
    对,老师你本来是想cfm每行分别除以row_sums中的数,但是结果却是cfm每列除以row_sums中的数,是不是说明np.sum(cfm, axis=1)得到的是一个行向量?还是说python把一维向量默认为行向量?
    回复 有任何疑惑可以回复我~ 2020-07-04 18:20:16
  • liuyubobobo 回复 提问者 NTeam6 #2
    在 numpy 中,向量就是向量,就是一维的。如果有方向,只能是二维的。err_matrix = cfm / row_sums 是一个矩阵除以一个向量。numpy 中,一个矩阵除以一个向量,是按照行除。可以参考我在答案补充的截图。
    回复 有任何疑惑可以回复我~ 2020-07-05 06:02:39
  • ITMOCC #3
    老师,err_matrix = cfm / row_sums的本意不是想让cfm的每一行去除row_sums这一行对应的数吗?可您上面的实验结果不是这样啊。将arr的第i行与v的第i个数相除,得到的不应该是一个元素都为1的矩阵吗?您这个结果是arr的第i列与v的第i个数相除得到的结果。
    回复 有任何疑惑可以回复我~ 2021-01-20 11:18:16
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号