课程中混淆矩阵的转化出现问题
来源: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,我会发给你一个小红包:)
继续加油!:)
10 -
liuyubobobo
2020-07-04
现在 sklearn 升级,导致内部函数的一些计算结果有了细微的差别。我刚才想测试了一下,新版本的 sklearn 的row_sums 计算出来,第一个数字是 149
0.00671141 是 1/149 的结果
==========
err_matrix = cfm / row_sums 是一个矩阵除以一个向量。numpy 中,一个矩阵除以一个向量,是按照行除。可以参考如下实验:
继续加油!:)
092021-01-26
相似问题
回答 1
回答 3