绘制混淆矩阵时为何要翻转坐标索引?
为什么绘制混淆矩阵时要用
plt.text(j, i)而非plt.text(i, j)? 核心原因是sklearn混淆矩阵的索引逻辑和matplotlib的坐标系统逻辑存在对应关系差异,具体拆解如下:
1. 混淆矩阵的索引定义
你对混淆矩阵的数值对应是完全正确的:
cm[i, j]代表真实类别为i,预测类别为j的样本数量:- (0,0): 真零值(真实标签0,预测结果0)
- (0,1): 假一值(真实标签0,预测结果1)
- (1,0): 假零值(真实标签1,预测结果0)
- (1,1): 真一值(真实标签1,预测结果1)
2. matplotlib的坐标映射逻辑
问题出在matshow()和plt.text()的坐标参数顺序不匹配:
ax.matshow(cm)会把矩阵的行索引i映射到图表的y轴(垂直方向,对应你标注的"True"标签),把矩阵的列索引j映射到图表的x轴(水平方向,对应你标注的"Predicted"标签)。- 而
plt.text(x, y, ...)的参数顺序是先x轴坐标,后y轴坐标——也就是说,要先传列索引j(对应x轴的预测类别),再传行索引i(对应y轴的真实类别),才能让cm[i,j]的数值精准对应到它应该在的单元格位置。
如果写成plt.text(i, j),相当于把x、y坐标搞反了:比如cm[0,1](真实0、预测1)会被放到x=0(预测0)、y=1(真实1)的单元格里,完全不符合混淆矩阵的含义。
用你的代码验证
拿你提供的示例数据:
true = [0,1,0],pred = [0,0,0]- 计算出的混淆矩阵
cm为:
对应2个真实0预测0的样本、1个真实1预测0的样本。[[2, 0] [1, 0]]
用plt.text(j, i)时:
- i=0,j=0:在x=0(预测0)、y=0(真实0)的位置写入2,位置正确。
- i=1,j=0:在x=0(预测0)、y=1(真实1)的位置写入1,位置正确。
如果改成plt.text(i, j),i=1,j=0时会把1写到x=1(预测1)、y=0(真实0)的位置,完全错位。
内容的提问来源于stack exchange,提问作者Avv
相关产品推荐
相关产品推荐

