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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:35:34