分类报告解读

分类报告解读

print(metrics.classification_report(y_test, y_pred, digits=4))
输出:

>               precision    recall  f1-score   support
>
>           0     0.9870    1.0000    0.9935        76
>           1     0.9574    1.0000    0.9783        90
>           2     1.0000    0.9787    0.9892        94
>           3     0.9785    0.9192    0.9479        99
>           4     0.9897    0.9796    0.9846        98
>           5     0.9787    0.9684    0.9735        95
>           6     0.9891    1.0000    0.9945        91
>           7     0.9140    0.9884    0.9497        86
>           8     0.9481    0.9241    0.9359        79
>           9     0.9333    0.9231    0.9282        91
>
>    accuracy                         0.9677       899
>   macro avg     0.9676    0.9681    0.9675       899
>weighted avg     0.9683    0.9677    0.9677       899

📊 先看整体结构

列名 中文意思 作用
precision(精确率) “我说是这个类,有多准?” 防止误报(比如把 3 错认成 8)
recall(召回率) “真实的这个类,我找出了多少?” 防止漏报(比如真的 7 没认出来)
f1-score(F1分数) 精确率和召回率的“平衡分” 综合指标,越接近 1 越好
support(支持数) 真实标签中该类有多少个样本 告诉你这个类的数据量

🔍 逐类分析(挑几个重点看)

类别 0

  • precision = 0.9870:模型预测“是 0”的样本中,98.7% 真的是 0 → 几乎不乱判
  • recall = 1.0000:所有真实的 0,全部被找出来了 → 一个都没漏!
  • f1 = 0.9935:非常高,说明对 0 的识别非常稳

⚠️ 类别 3

  • precision = 0.9785:还不错,预测为 3 的基本靠谱
  • recall = 0.9192:但有约 8% 的真实 3 被漏掉了(可能被错认成 8 或 5)
  • → 这是模型相对弱的一环

⚠️ 类别 7

  • precision = 0.9140:偏低!说明有些不是 7 的被错判成 7 了
  • recall = 0.9884:但几乎所有的 7 都找到了
  • → 模型对 7 容易“误报”(比如把 1 或 9 当成 7)

类别 6

  • recall = 1.0000:所有 6 都找出来了
  • precision = 0.9891:也很高 → 几乎完美

📌 底部三行:全局指标

含义 解读
accuracy = 0.9677 整体准确率 899 个样本中,96.77% 分对了(约 29 个错)
macro avg 宏平均 对 10 个类别的 precision/recall/f1 简单平均(每个类权重相同)
→ 即使某类只有 10 个样本,也和有 100 个的类一样重要
weighted avg 加权平均 按每个类的 support(样本数)加权平均
→ 更反映实际表现,因为大类影响更大

✅ 你的 macro avg ≈ weighted avg ≈ accuracy,说明各类样本数量较均衡(每类 ~90 个),没有严重不平衡问题。


💡 为什么 F1 比 accuracy 更重要?

假设一个极端情况:

  • 数据集中 99% 是“0”,1% 是“1”
  • 模型直接把所有样本都预测为“0”
  • accuracy = 99%(看起来很好)
  • recall for class 1 = 0%(完全没识别出正例!)

→ 所以在医疗、金融、安全等场景,必须看 precision/recall/F1


✅ 总结该模型表现:

  • 整体很强:准确率 96.8%,多数类 F1 > 0.97
  • 最弱环节
    • 数字 3:容易漏判(recall 仅 91.9%)
    • 数字 7:容易误判(precision 仅 91.4%)
  • 建议
    • 查看混淆矩阵(confusion_matrix),看看 3 和 7 主要被错分成了哪些数字
    • 如果业务上不能接受漏掉 3,可以调整分类阈值或使用代价敏感学习

分类报告解读(第二部分)

  1. 如何画混淆矩阵(Confusion Matrix)
  2. 彻底搞懂 macro avgweighted avg 的区别

✅ 第一部分:画混淆矩阵(看模型到底把哪些数字搞混了)

🎯 为什么需要混淆矩阵?

  • classification_report 告诉你“3 的 recall 低”,但不知道它被错分成了什么
  • 混淆矩阵能告诉你:真实的 3,有多少被当成了 5?多少被当成了 8?

💻 代码:

metrics.ConfusionMatrixDisplay.from_predictions(y_test, y_pred) #打印混淆矩阵

img

🔍 如何读这张图?

  • 横轴(x):模型预测的类别
  • 纵轴(y)真实的类别
  • 对角线:预测正确的数量(越亮/越大越好)
  • 非对角线:分类错误的地方

举个例子:

  • 看第 3 行(真实 label=3)
  • 精确率(precision):91 / 99 ≈ 0.9192 → 和分类报告中类别 3 的召回率(0.9192)完全一致!
  • 召回率(recall):91 / (91 + 2) = 91/93 ≈ 0.9785 → 和分类报告完全匹配!
    ✅ 这样你就知道该重点优化哪些数字对了!

✅ 第二部分:macro avg vs weighted avg —— 彻底搞懂!

我们用一个小例子说明(假设只有 3 个类):

类别 precision recall support(真实样本数)
A 0.90 0.80 10
B 0.70 0.60 20
C 0.50 0.40 70

总样本 = 10 + 20 + 70 = 100


📌 1. macro avg(宏平均)

  • 计算方式:直接对每个类的指标算术平均不管每类有多少样本

  • 公式:

    macro precision = (0.90 + 0.70 + 0.50) / 3 = 0.70
    macro recall    = (0.80 + 0.60 + 0.40) / 3 = 0.60
    
  • 特点

    • 每个类“权重相等”
    • 适合关注少数类的场景(比如癌症检测:病人少但不能漏)

📌 2. weighted avg(加权平均)

  • 计算方式:按每个类的 support(样本数)加权平均

  • 公式:

    weighted precision = (0.90×10 + 0.70×20 + 0.50×70) / 100 = (9 + 14 + 35)/100 = 0.58
    weighted recall    = (0.80×10 + 0.60×20 + 0.40×70) / 100 = (8 + 12 + 28)/100 = 0.48
    
  • 特点

    • 大类影响更大
    • 更接近整体 accuracy,反映“大多数样本”的表现

🆚 对比总结:

指标 是否考虑类别不平衡? 适用场景
macro avg ❌ 不考虑(平等对待每类) 少数类很重要(如欺诈检测、罕见病诊断)
weighted avg ✅ 考虑(按样本数加权) 一般场景,或多数类更重要

💡 在你的手写数字任务中,每类样本差不多(~90 个),所以 macro avg ≈ weighted avg
但如果某类只有 5 个样本,macro avg 会高估它的影响,而 weighted avg 更真实。


🧪 小测试:哪种平均更合理?

假设你在做信用卡欺诈检测

  • 正常交易:99,900 笔
  • 欺诈交易:100 笔

模型把所有交易都判为“正常”:

  • accuracy = 99.9%(看起来很好)
  • fraud 类的 recall = 0%(完全没抓到坏人!)

→ 这时你应该看 macro avg 或直接看 fraud 类的 recall,而不是 weighted avg!


✅ 最后建议

  1. 先画混淆矩阵 → 找出具体哪些数字容易混淆(比如 3↔8, 7↔1)
  2. 根据业务需求选择指标
    • 如果所有数字同等重要 → 看 macro avg
    • 如果只是想整体准确 → 看 accuracyweighted avg

posted @ 2026-06-15 07:01  wangya216  阅读(20)  评论(0)    收藏  举报