分类模型预测出现0类,混淆矩阵显示4类的原因及解决方法
混淆矩阵出现额外0类的原因及解决方法
问题原因
- 标签编码偏移:你的真实标签采用1-based编号(1、2、3),但模型输出的预测结果是0-based类别索引(0、1、2),两者存在固定偏移量1。模型的预测本质是正确的(0对应1、1对应2、2对应3),但编码不匹配导致混淆矩阵工具将预测中的0视为全新类别,最终显示4类。
- 混淆矩阵自动类别检测:像sklearn的
confusion_matrix这类工具,会自动收集真实标签和预测结果中所有出现的唯一值作为类别集合。当真实标签包含{1,2,3}、预测结果包含{0,1,2}时,会合并为{0,1,2,3}四个类别。
解决方法
1. 对齐标签编码(推荐)
统一真实标签和预测结果的编码规则,二选一即可:
- 将真实标签转为0-based:对训练集、测试集的标签执行减法操作,把1→0、2→1、3→2,与模型输出索引完全匹配:
trainY = trainY - 1 testY = testY - 1 - 将预测结果转为1-based:把模型输出的0、1、2加1,转为1、2、3,与原始真实标签对齐:
注意:训练集和测试集的标签编码逻辑必须一致,否则会导致训练/测试不匹配。y_prediction = y_prediction + 1
2. 绘制混淆矩阵时指定目标类别
若不想修改原始标签,可在生成混淆矩阵时手动指定labels参数,限定只统计你需要的3个类别:
from sklearn.metrics import confusion_matrix # 只统计1、2、3三类,忽略预测中的0 cm = confusion_matrix(testY, y_prediction, labels=[1, 2, 3])
3. 检查模型训练配置
确认模型输出层的类别数量设置为3,且训练时的标签编码与预测时一致。比如使用分类损失函数时,若输入整数标签,需确保标签是0-based索引,避免模型误判类别总数。
内容的提问来源于stack exchange,提问作者Colab4066
相关产品推荐
相关产品推荐

