筛选指定标签生成混淆矩阵仅显对角线值,存在误分类代码有误吗?
混淆矩阵仅显示对角线数值的问题排查
问题描述
已知数据中有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参数指定仅统计选中标签,跨子集的误分类会被直接忽略,不会出现在矩阵的非对角线位置。
修复方案
有两种思路可选:
统计选中标签内部的误分类
调整筛选逻辑,保留真实标签和预测标签都在选中子集内的行,这样矩阵会展示子集内部的误分类情况:filtered_df = confusion_df[(confusion_df['True'].isin(selected_labels)) & (confusion_df['Predicted'].isin(selected_labels))]统计所有涉及选中标签的误分类
如果需要看到选中标签被误分到其他标签的情况,先获取所有相关标签(选中子集+预测出的其他标签),再生成混淆矩阵:# 获取真实标签在选中子集的样本中,所有出现过的真实和预测标签 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
相关产品推荐
相关产品推荐

