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

筛选指定标签生成混淆矩阵仅显对角线值,存在误分类代码有误吗?

混淆矩阵仅显示对角线数值的问题排查

问题描述

已知数据中有45条误分类记录,但针对指定标签子集生成的混淆矩阵仅对角线有数值,其余位置全为0。

代码实现

import pandas as pd
from sklearn.metrics import confusion_matrix
    
confusion_df = pd.read_csv("./confusion_data.csv")
confusion_df.head() # 该数据包含所有测试样本的真实标签和预测标签
    
selected_labels = [14, 30, 57, 79, 83, 98, 101, 105, 137, 163]
    
# 筛选仅保留选中标签的行
filtered_df = confusion_df[(confusion_df['True'].isin(selected_labels))]
filtered_df = filtered_df.reset_index(drop=True)

# 生成混淆矩阵
confusion_mat = confusion_matrix(filtered_df['True'], filtered_df['Predicted'], labels=selected_labels)

生成的混淆矩阵

array([[1602,    0,    0,    0,    0,    0,    0,    0,    0,    0],
       [   0, 1601,    0,    0,    0,    0,    0,    0,    0,    0],
       [   0,    0, 1601,    0,    0,    0,    0,    0,    0,    0],
       [   0,    0,    0, 1597,    0,    0,    0,    0,    0,    0],
       [   0,    0,    0,    0, 1601,    0,    0,    0,    0,    0],
       [   0,    0,    0,    0,    0, 1600,    0,    0,    0,    0],
       [   0,    0,    0,    0,    0,    0, 1596,    0,    0,    0],
       [   0,    0,    0,    0,    0,    0,    0, 1599,    0,    0],
       [   0,    0,    0,    0,    0,    0,    0,    0, 1569,    0],
       [   0,    0,    0,    0,    0,    0,    0,    0,    0, 1602]],
      dtype=int64)

问题原因与修复

你的代码存在关键逻辑漏洞:筛选数据时只过滤了真实标签属于选中子集的行,但没有考虑预测标签可能落在选中子集之外的情况。那些误分类的样本,大概率是真实标签在selected_labels里,但预测标签不在这个列表中——这类样本被保留后,生成混淆矩阵时因labels参数指定仅统计选中标签,跨子集的误分类会被直接忽略,不会出现在矩阵的非对角线位置。

修复方案

有两种思路可选:

  1. 统计选中标签内部的误分类
    调整筛选逻辑,保留真实标签和预测标签都在选中子集内的行,这样矩阵会展示子集内部的误分类情况:

    filtered_df = confusion_df[(confusion_df['True'].isin(selected_labels)) & (confusion_df['Predicted'].isin(selected_labels))]
    
  2. 统计所有涉及选中标签的误分类
    如果需要看到选中标签被误分到其他标签的情况,先获取所有相关标签(选中子集+预测出的其他标签),再生成混淆矩阵:

    # 获取真实标签在选中子集的样本中,所有出现过的真实和预测标签
    relevant_labels = sorted(set(filtered_df['True'].unique()).union(set(filtered_df['Predicted'].unique())))
    confusion_mat = confusion_matrix(filtered_df['True'], filtered_df['Predicted'], labels=relevant_labels)
    

验证步骤

先运行以下代码确认误分类样本的具体分布,再选择对应修复方式:

# 统计真实标签在子集内,但预测标签在子集外的样本数
misclassified_outside = filtered_df[(~filtered_df['Predicted'].isin(selected_labels))]
print(f"误分到子集外的样本数:{len(misclassified_outside)}")

# 统计真实和预测标签都在子集内的误分类样本数
misclassified_inside = filtered_df[(filtered_df['True'] != filtered_df['Predicted']) & (filtered_df['Predicted'].isin(selected_labels))]
print(f"子集内部的误分类样本数:{len(misclassified_inside)}")

内容的提问来源于stack exchange,提问作者Bella_18

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:33:38