分类报告解读
分类报告解读
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,可以调整分类阈值或使用代价敏感学习
- 查看混淆矩阵(
分类报告解读(第二部分)
- 如何画混淆矩阵(Confusion Matrix)
- 彻底搞懂
macro avg和weighted avg的区别
✅ 第一部分:画混淆矩阵(看模型到底把哪些数字搞混了)
🎯 为什么需要混淆矩阵?
classification_report告诉你“3 的 recall 低”,但不知道它被错分成了什么- 混淆矩阵能告诉你:真实的 3,有多少被当成了 5?多少被当成了 8?
💻 代码:
metrics.ConfusionMatrixDisplay.from_predictions(y_test, y_pred) #打印混淆矩阵
🔍 如何读这张图?
- 横轴(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!
✅ 最后建议
- 先画混淆矩阵 → 找出具体哪些数字容易混淆(比如 3↔8, 7↔1)
- 根据业务需求选择指标:
- 如果所有数字同等重要 → 看
macro avg - 如果只是想整体准确 → 看
accuracy或weighted avg
- 如果所有数字同等重要 → 看


浙公网安备 33010602011771号