文本分类模型评估:从混淆矩阵找到改进方向

学会用 classification_report、confusion_matrix 和错分样本分析文本分类模型,不只看准确率。

学习路线:文本分类项目(35~42) · 第 40 课
第 40 课文本分类预测结果进入混淆矩阵,帮助定位哪些类别最容易被模型混淆。
Learning Path

文本分类项目(35~42)

重新拆解中文文本分类链路,从编码清洗、分词、向量化、评估、保存一路做到演示页面。

学完本阶段你能做到:从一份原始中文文本出发,独立完成清洗、分词、向量化、训练、评估、保存和演示页面,并能解释每个环节为什么这么做。

推荐读法:如果已经吃透第 19-20 课,可按薄弱环节跳读;否则建议顺序阅读。

查看完整阶段 · 8 篇
Lesson Guide

这一课怎么学

先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。

本节你会学到

  • 说清楚「文本分类模型评估:从混淆矩阵找到改进方向」解决的核心问题
  • 知道它在「文本分类项目(35~42)」中的位置
  • 把 混淆矩阵、分类与回归、过拟合 这些关键词联系起来

前置知识

  • 建议先读完上一篇:训练中文文本分类 baseline:TF-IDF + 逻辑回归
  • 能区分输入、输出、数据和模型目标。

概念回顾

  • 【混淆矩阵】准确率只给总分,混淆矩阵能告诉你模型到底把哪一类看错成了哪一类。 前面或后面会反复用到它。
  • 【分类与回归】判断邮件是不是垃圾邮件是分类,预测房价是多少是回归。 前面或后面会反复用到它。
  • 【过拟合】过拟合就像背答案,训练题都会了,但真正考试时不一定会。 前面或后面会反复用到它。
  • 【机器学习】机器学习的重点不是手写所有规则,而是准备数据、定义目标,让模型自己找到可复用的模式。 前面或后面会反复用到它。

核心概念

常见误区

  • 不要只记定义,要追问它解决了什么问题。
  • 不要只看一个指标,要结合任务目标判断模型是否真的有用。

课后练习

  • 用 3 句话向一个零基础朋友解释「文本分类模型评估:从混淆矩阵找到改进方向」。
  • 打开概念库里的「混淆矩阵」,补一遍它和本文的关系。
  • 读下一课「保存与加载文本分类模型:让预测可以复用」前,先写下你认为它会解决的问题。

自检练习与参考答案

1. 这个环节的输入和输出分别是什么?

项目文要先说清数据流。输入通常是原始数据或上一步结果,输出必须能被下一步稳定复用。

2. 如果训练和预测效果对不上,优先排查哪件事?

优先排查预处理是否一致,例如分词、TF-IDF 词表、标签映射、标准化器是否沿用训练阶段的同一套对象。

3. 为什么项目文章不能只看最终分数?

因为真实项目还要看数据质量、错误样本、部署入口、复用方式和失败边界。

下一步建议读「保存与加载文本分类模型:让预测可以复用」。

上一课我们训练了一个 TF-IDF + 逻辑回归 baseline。模型能跑起来只是第一步,真正重要的是:它错在哪里,为什么错,下一步怎么改

如果只看一个准确率,我们很容易被表面分数骗到。文本分类尤其如此,因为类别不平衡、标签模糊、文本表达复杂,都会让单个指标变得不可靠。

第 40 课视频 · 文本分类模型评估:从混淆矩阵找到改进方向

先看 classification_report

最常用的第一步是:

from sklearn.metrics import classification_report

print(classification_report(y_test, y_pred))

报告里会看到:

指标 含义
precision 预测成这个类的样本里,有多少是真的
recall 这个类的真实样本里,有多少被找出来
f1-score precision 和 recall 的综合
support 测试集中这个类有多少样本

如果某个类别的 support 很少,它的分数波动会很大,不要过度解读。

准确率为什么会骗人

假设测试集中 90% 都是“正常文本”,10% 是“风险文本”。

如果模型全部预测“正常文本”,准确率也能达到 90%。但它完全找不出风险文本。

这时候 accuracy 很高,模型却没有业务价值。

所以要看每个类别的 precision、recall 和 F1,尤其是你真正关心的类别。

混淆矩阵是什么

混淆矩阵能告诉我们:真实类别和预测类别之间是怎么错的。

from sklearn.metrics import confusion_matrix

labels = sorted(y_test.unique())
cm = confusion_matrix(y_test, y_pred, labels=labels)
print(cm)

如果是二分类,可以理解为:

预测负类 预测正类
真实负类 TN FP
真实正类 FN TP

对于多分类,矩阵会更大。行通常是真实类别,列通常是预测类别。

对角线上的数字越大越好,说明预测正确。非对角线上的数字就是混淆。

看混淆矩阵要问什么

看混淆矩阵时,不要只看热力图好不好看,而是问几个问题:

  1. 哪两个类别最容易互相混淆;
  2. 有没有某个类别几乎总是被预测成别的类;
  3. 少数类是不是被模型忽略了;
  4. 错误是否集中在某些相似表达;
  5. 这些错误是模型问题,还是标签本身不清楚。

这些问题会直接指向下一步优化方向。

把错分样本拿出来看

只看指标还不够,要看具体错分文本。

error_df = pd.DataFrame({
    "text": X_test,
    "true": y_test,
    "pred": y_pred,
})

error_df = error_df[error_df["true"] != error_df["pred"]]
print(error_df.head(20))

错分样本通常会暴露很多问题:

现象 可能原因
文本太短 信息不足
标签本身模糊 标注规则不清
某类表达很多样 数据覆盖不够
领域词被切坏 分词或词典问题
否定词被删掉 停用词表问题

优化模型之前,先把这些原因分清楚。

用错分样本指导改进

假设你发现“无法登录”和“登录成功但页面卡住”经常混淆。

这可能说明:

  1. 标签边界不清楚;
  2. 分词没有保留关键短语;
  3. 训练数据里相关样本太少;
  4. 当前特征无法表达细微差别。

对应的改进方式可能是:

  1. 调整标签定义;
  2. 加入自定义词典;
  3. 补充样本;
  4. 加入 bigram;
  5. 尝试更强的模型。

评估不是为了批评模型,而是为了告诉你下一步该改哪里。

宏平均和加权平均

classification_report 里通常还有 macro avg 和 weighted avg。

macro avg 是每个类别一视同仁地平均。它更关注少数类是否也表现不错。

weighted avg 会按类别样本数加权。大类别影响更大,所以它更接近总体表现。

如果类别不平衡,建议重点看 macro F1 和关键类别的 recall。

这一课先记住

文本分类评估不能只看准确率。

一套更可靠的检查顺序是:

classification_report
  -> confusion_matrix
  -> 错分样本
  -> 归因分析
  -> 有针对性地改数据、特征或模型

下一步,我们会把文本分类流程封装起来,让训练和预测更接近真实项目。

Discussion

留言讨论