如何获取决策树模型各类标签准确率及整体准确率
解决Top5类别标签的分类别准确率与整体准确率计算问题
嘿,我来帮你搞定这个问题!咱们先理清楚核心逻辑:你需要的每个类别准确率,本质是该类别中真实标签出现在模型Top5预测结果里的样本数,除以该类别的总样本数;而整体准确率可以基于分类别的结果推导出来,下面是具体的实现步骤和代码示例:
1. 先获取模型输出的Top5类别标签
首先你得从决策树模型里拿到每个样本的Top5预测类别(而不是默认的Top1),可以通过预测概率来提取:
# 假设clf是你训练好的决策树分类器 probs = clf.predict_proba(X_train) # 获取每个样本对应所有类别的概率 # 提取概率最高的Top5类别索引(argsort后取最后5个,再反转成从高到低) top5_indices = probs.argsort(axis=1)[:, -5:][:, ::-1] # 把索引转换成对应的类别标签(clf.classes_是模型训练时的类别列表) top5_labels = clf.classes_[top5_indices]
2. 统计每个类别的正确预测数与总样本数
接下来遍历所有样本,针对每个类别统计:该类别一共有多少样本,其中有多少样本的真实标签出现在模型的Top5预测里:
from collections import defaultdict # 真实标签集合 y_true = Y_train # 用字典存储每个类别的统计数据:正确数、总样本数 class_stats = defaultdict(lambda: {'correct': 0, 'total': 0}) for true_label, pred_top5 in zip(y_true, top5_labels): # 累加该类别的总样本数 class_stats[true_label]['total'] += 1 # 如果真实标签在Top5预测里,正确数+1 if true_label in pred_top5: class_stats[true_label]['correct'] += 1
3. 计算每个类别的准确率
有了统计数据,直接计算每个类别的准确率就很简单了:
# 生成每个类别的准确率字典 class_accuracy = { cls: stats['correct'] / stats['total'] for cls, stats in class_stats.items() } # 打印结果 print("每个类别Top5准确率:") for cls, acc in class_accuracy.items(): print(f"类别 {cls}: {acc:.4f}")
4. 基于分类别结果计算整体准确率
这里有两种常用的计算方式,你可以根据需求选择:
方式1:总正确样本数 / 总样本数
这是最直接的Top5整体准确率,反映所有样本中真实标签在Top5里的比例:
total_correct = sum(stats['correct'] for stats in class_stats.values()) total_samples = sum(stats['total'] for stats in class_stats.values()) overall_acc = total_correct / total_samples print(f"\n整体Top5准确率(总正确数/总样本数):{overall_acc:.4f}")
方式2:加权平均准确率
如果你的数据集存在类别不平衡(比如某些类别样本特别多),加权平均会更合理——用每个类别的样本占比作为权重,乘以该类别的准确率后求和:
weighted_overall_acc = sum( acc * (class_stats[cls]['total'] / total_samples) for cls, acc in class_accuracy.items() ) print(f"加权平均整体Top5准确率:{weighted_overall_acc:.4f}")
补充说明
- 如果你之前用
accuracy_score()得到的是Top1准确率,和这里的Top5准确率逻辑完全不同,所以需要自定义计算 - 分类别准确率可以帮你快速定位模型对哪些类别识别能力强,哪些弱,方便后续优化模型
内容的提问来源于stack exchange,提问作者Code_99
相关产品推荐
相关产品推荐

