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

发布时间:2026/7/21 16:12:34
文本分类模型评估:从混淆矩阵找到改进方向 上一课我们训练了一个 TF-IDF 逻辑回归 baseline。模型能跑起来只是第一步真正重要的是它错在哪里为什么错下一步怎么改。如果只看一个准确率我们很容易被表面分数骗到。文本分类尤其如此因为类别不平衡、标签模糊、文本表达复杂都会让单个指标变得不可靠。准确率为什么会骗人假设测试集中 90% 都是“正常文本”10% 是“风险文本”。如果模型全部预测“正常文本”准确率也能达到 90%但它完全找不出风险文本。更极端一点1000 个用户里 990 个不会退订负类、10 个会退订正类模型直接判所有人“不退订”准确率也有 99%但要跑的人一个都没抓住。这时候 accuracy 很高模型却没有业务价值。类别不均衡时准确率是最容易被骗的指标。混淆矩阵把错误拆成四类混淆矩阵能告诉我们真实类别和预测类别之间是怎么错的。二分类的情况下结果可以拆成四个格子预测负类预测正类真实负类TN排除了FP误报冤枉好人真实正类FN漏报放过坏人TP抓对了fromsklearn.metricsimportconfusion_matrix labelssorted(y_test.unique())cmconfusion_matrix(y_test,y_pred,labelslabels)print(cm)对角线上的数字越大越好说明预测正确。非对角线上的数字就是混淆。对于多分类矩阵会更大行通常是真实类别列通常是预测类别。从混淆矩阵导出的三个指标准确率AccuracyAccuracy T P T N T P T N F P F N \text{Accuracy} \frac{TP TN}{TP TN FP FN}AccuracyTPTNFPFNTPTN​也就是前面说的那个会骗人的指标。类别极度不均衡时不要单独看它。查准率PrecisionPrecision T P T P F P \text{Precision} \frac{TP}{TP FP}PrecisionTPFPTP​回答的是“模型说是的有多少真的是”。Precision 低意味着正常邮件被误判成垃圾邮件误伤严重。查全率RecallRecall T P T P F N \text{Recall} \frac{TP}{TP FN}RecallTPFNTP​回答的是“所有真的是的模型找到了多少”。Recall 低意味着医疗筛查里漏诊代价很高。Precision 和 Recall 的跷跷板这两个指标天然矛盾调高一个另一个往往往下掉。所有样本都判“是”Recall 等于 1正类全抓到了但 Precision 接近 0一锅端只判最有把握的样本是“是”Precision 等于 1但 Recall 接近 0太谨慎。F1 分数调和两者F 1 2 × Precision × Recall Precision Recall F_1 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} \text{Recall}}F1​2×PrecisionRecallPrecision×Recall​F1 只有在两者都高时才大任何一边塌了就拉不回来比单独看 Precision 或 Recall 更公允。先看 classification_reportclassification_report把上面这些指标一次算出来fromsklearn.metricsimportclassification_reportprint(classification_report(y_test,y_pred))报告里会看到指标含义precision预测成这个类的样本里有多少是真的recall这个类的真实样本里有多少被找出来f1-scoreprecision 和 recall 的综合support测试集中这个类有多少样本如果某个类别的 support 很少它的分数波动会很大不要过度解读。不同任务关注什么不同业务里错的代价不一样重点关注的指标也不同任务最关注的指标为什么垃圾邮件过滤Precision正常邮件被误删代价太高癌症筛查Recall宁可多检查不能漏掉一个内容推荐F1平衡推荐质量和覆盖率欺诈检测Recall漏掉一笔欺诈的损失远大于误报几笔所以要看每个类别的 precision、recall 和 F1尤其是你真正关心的那个类别。看混淆矩阵要问什么看混淆矩阵时不要只看热力图好不好看而是问几个问题哪两个类别最容易互相混淆有没有某个类别几乎总是被预测成别的类少数类是不是被模型忽略了错误是否集中在某些相似表达这些错误是模型问题还是标签本身不清楚。这些问题会直接指向下一步优化方向。把错分样本拿出来看只看指标还不够要看具体错分文本。importpandasaspd error_dfpd.DataFrame({text:X_test,true:y_test,pred:y_pred,})error_dferror_df[error_df[true]!error_df[pred]]print(error_df.head(20))错分样本通常会暴露很多问题现象可能原因文本太短信息不足标签本身模糊标注规则不清某类表达很多样数据覆盖不够领域词被切坏分词或词典问题否定词被删掉停用词表问题优化模型之前先把这些原因分清楚。用错分样本指导改进假设你发现“无法登录”和“登录成功但页面卡住”经常混淆。这可能说明标签边界不清楚分词没有保留关键短语训练数据里相关样本太少当前特征无法表达细微差别。对应的改进方式可能是调整标签定义加入自定义词典补充样本加入 bigram尝试更强的模型。评估不是为了批评模型而是为了告诉你下一步该改哪里。宏平均和加权平均classification_report里通常还有 macro avg 和 weighted avg。macro avg 是每个类别一视同仁地平均更关注少数类是否也表现不错。weighted avg 会按类别样本数加权大类别影响更大所以它更接近总体表现。如果类别不平衡建议重点看 macro F1 和关键类别的 recall。小结文本分类评估不能只看准确率。一套更可靠的检查顺序是classification_report - confusion_matrix - 错分样本 - 归因分析 - 有针对性地改数据、特征或模型类别不均衡时别单看 AccuracyPrecision 和 Recall 是跷跷板F1 是两者的调和。下一步我们会把文本分类流程封装起来让训练和预测更接近真实项目。在线阅读点击这里阅读博客原文原文地址https://bestsdz.xyz/posts/text-classification-evaluation-confusion-matrix/