You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

绘制混淆矩阵时为何要翻转坐标索引?

为什么绘制混淆矩阵时要用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]
     [1, 0]]
    
    对应2个真实0预测0的样本、1个真实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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:54:16