混淆矩阵用confusion_matrix(y_true, y_pred)计算,行=真实类别、列=预测类别;classification_report可一次性获取准确率、召回率、f1等指标,并支持macro/micro平均;绘图需配合matplotlib/seaborn并手动设置类别标签。

混淆矩阵本身怎么算
直接用 confusion_matrix 函数就能拿到原始矩阵,它只关心预测值和真实值的逐样本比对,不自动算准确率、召回率这些衍生指标。
常见错误是传错参数顺序:必须是 confusion_matrix(y_true, y_pred),反了会得到转置矩阵,数值看起来“差不多”,但行列含义全乱——比如把真正例(TP)当成假正例(FP)。
- 二分类默认按标签升序排:[0, 1] → 第0行是真实为0的样本分布,第1行是真实为1的
- 多分类时,行索引 = 真实类别,列索引 = 预测类别,务必对照你的
classes参数或训练时的classes_属性确认顺序 - 如果用了
labels=[1, 0]手动指定,矩阵行列会按这个顺序重排,和默认行为不一致
准确率、召回率、F1这些怎么一次性拿到
别自己从混淆矩阵里扒数字再除,用 classification_report 最省事。它底层就是调 confusion_matrix + 各种公式,但帮你对齐了多分类下的每个类指标,还带宏平均/微平均。
注意它默认只输出字符串,想拿数值得设 output_dict=True,返回的是嵌套字典,例如 report['1']['f1-score'] 就是类别 '1' 的 F1 值。
- 二分类时,
pos_label参数决定哪个类算“正例”,影响召回率、精确率的计算基准 - 多分类下,
average='macro'是先算每类再平均,'micro'是先汇总 TP/FP/FN 再算,结果常不同,尤其当各类样本量差异大时 - 如果某类完全没被预测到,
classification_report会显示0.00和support=0,但不会报错
只想算某个指标,比如只想要召回率
用 recall_score 比从报告里抠更直接,也更可控。它和 precision_score、f1_score 这些函数接口一致,核心就三个参数:y_true、y_pred、average。
容易忽略的是 average 的取值影响极大:
-
average='binary':仅限二分类,强制把问题当正负两类处理 -
average='macro':每类召回率独立算,再简单平均,各类权重相同 -
average=None:返回每类的召回率数组,长度等于类别数,适合后续自定义加权 - 漏掉
average参数会报ValueError: Target is multiclass but average='binary'—— 这是因为默认值是'binary',遇到多分类就炸
混淆矩阵可视化要不要自己画
Scikit-learn 不提供绘图功能,confusion_matrix 只返回 numpy.ndarray。想画热力图得接 matplotlib 或 seaborn。
关键不是“能不能画”,而是“怎么标对轴”。常见坑是把 plt.imshow(cm) 直接扔进去,结果横纵轴都是数字索引,看不出哪行对应哪个真实类。
- 务必用
xticks和yticks显式设置类别标签,例如plt.xticks(range(len(classes)), classes) - 二分类时,习惯把真实正例放下面(矩阵最后一行),但
confusion_matrix默认第一行是标签最小值,得看你的标签类型(str 还是 int)和排序 - 如果模型输出的是概率,别忘了用
np.argmax(y_proba, axis=1)转成硬预测,confusion_matrix不接受概率输入
classification_report + confusion_matrix 组合就够了;真要深挖某类表现,再切到 recall_score(..., average=None) 拿数组细看。类别顺序和 average 模式这两点,比公式本身更容易出错。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











