Sklearn随机森林指标优异但混淆矩阵仅显示Class 0问题
Random Forest分类器混淆矩阵仅显示单类别问题排查
使用Scikit-learn的Random Forest分类器时,训练集上精度、召回率、F1值等多类别指标均达98%以上,但混淆矩阵仅显示Class 0的相关结果,训练数据集共677k条数据,包含3个目标类别(Class 0、1、2)。以下是针对性的排查和解决方法:
1. 确认训练集标签的类别完整性
首先验证训练集标签中是否实际包含三个类别的样本,避免因类别缺失导致混淆矩阵维度异常:
import numpy as np # 查看训练集存在的类别 print("训练集实际类别:", np.unique(y_train)) # 统计各类别样本数量 print("各类别样本数:", np.bincount(y_train))
如果输出显示仅存在Class 0,说明训练集标签存在数据缺失问题;若Class 1/2样本量极少,可能是数据极端不平衡导致后续可视化问题。
2. 显式指定混淆矩阵的类别范围
默认情况下confusion_matrix仅会根据真实标签和预测标签中出现的类别生成矩阵,若某个类别无预测结果,会被自动忽略。需显式指定所有目标类别,确保生成完整的3x3矩阵:
from sklearn.metrics import confusion_matrix import seaborn as sns import matplotlib.pyplot as plt # 生成混淆矩阵时指定全部3个类别 conf_matrix = confusion_matrix(y_train, y_train_pred, labels=[0, 1, 2]) class_labels = ['Class 0', 'Class 1', 'Class 2'] # 先打印原始矩阵数值,确认是否包含所有类别数据 print("混淆矩阵原始值:\n", conf_matrix) # 可视化调整 plt.figure(figsize=(8, 6)) sns.heatmap(conf_matrix, annot=True, fmt="d", cmap="Blues", xticklabels=class_labels, yticklabels=class_labels, annot_kws={"size": 12}) # 放大标注文字,避免小数值被遮挡 plt.xlabel('预测标签') plt.ylabel('真实标签') plt.title('混淆矩阵') plt.show()
3. 排查数据极端不平衡的显示问题
若Class 1/2的样本量远小于Class 0,混淆矩阵中这些类别的数值可能因量级差距过大,在热力图中被压缩至几乎不可见。此时通过打印原始矩阵数值,可确认这些类别是否真的有预测结果,而非完全缺失。
4. 验证多类别指标计算的有效性
虽然指标显示各类别均达98%以上,可再次验证指标计算的正确性,确保average=None参数确实返回了三个类别的结果:
from sklearn.metrics import precision_score, recall_score, f1_score precision = precision_score(y_train, y_train_pred, average=None) recall = recall_score(y_train, y_train_pred, average=None) f1 = f1_score(y_train, y_train_pred, average=None) print("各类别精度:", precision) print("各类别召回率:", recall) print("各类别F1值:", f1)
若输出包含三个数值,说明模型确实对三个类别都有预测结果,问题大概率出在混淆矩阵的生成或可视化环节。
内容的提问来源于stack exchange,提问作者Talal Ayyoub
相关产品推荐
相关产品推荐

