混淆矩阵和F1分数必须一起用,单看F1易误判模型在不平衡数据上的真实表现;混淆矩阵能暴露F1掩盖的漏检(如把癌症患者判为健康),而sklearn.metrics.ConfusionMatrixDisplay可快速绘制带数字标签的热力图,支持中文、自定义类别顺序与字体调整,且需确保y_true与y_pred顺序一致、类别对齐,F1的average参数(macro/micro/weighted)决定统计口径,二分类时须明确pos_label,验证集F1高但线上漏检严重往往因正类召回率低却被加权平均掩盖,务必结合classification_report查recall、precision、support三指标。

直接看结果:混淆矩阵和F1分数必须一起用,单看F1容易误判模型在不平衡数据上的真实表现;混淆矩阵能暴露F1掩盖的漏检(如把癌症患者判为健康)。
怎么快速画出带数字标签的混淆矩阵
别手写热力图——sklearn.metrics.ConfusionMatrixDisplay 是最省事的选择,它自动对齐类别、支持中文标签、可直接调用 plot() 渲染。关键点是传入 y_true 和 y_pred 时,确保两者顺序一致且未被 shuffle 过;若用了 train_test_split,记得设 shuffle=False 或保存原始索引。
常见错误:ConfusionMatrixDisplay.from_predictions(y_test, y_pred) 报错“y_true and y_pred have different lengths”,大概率是预测时用了整个数据集但 y_test 只取了部分样本,检查是否误将 model.predict(X) 用于全量 X 而非仅 X_test。
- 类别顺序默认按 sorted(unique(y_true)) 排,若想自定义(如 ['negative', 'positive']),传入
display_labels=['negative', 'positive'] - 数字标签默认显示整数,若需百分比,在
plot()后加ax.text()手动覆盖,或改用plt.matshow()+plt.xticks()组合 - 多分类时矩阵可能太密,用
plt.rcParams['font.size'] = 8缩小字体再plt.tight_layout()
F1分数该用 macro、micro 还是 weighted
f1_score 的 average 参数不是风格选项,而是统计口径选择,直接影响数值含义:
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
macro:先对每个类算 F1,再简单平均——对少数类敏感,适合关注各类均衡性能(如医疗多病种识别) -
micro:先汇总所有类的 TP/FP/FN,再算全局 F1——等价于准确率(accuracy),适合样本总量大、关注整体预测质量的场景(如广告点击预估) -
weighted:按各类样本数加权平均——最贴近业务实际影响,尤其当测试集分布接近线上流量时推荐
坑点:二分类默认 average='binary',此时 pos_label 必须明确指定(如 pos_label=1 或 pos_label='malignant'),否则可能把负类当正类算 F1,结果完全反向。
为什么验证集上 F1 高但线上漏检严重
典型症状:混淆矩阵里“负→正”(假阳)少,但“正→负”(假阴)多,而 f1_score(average='macro') 因正类 F1 拉低整体值,你却只看了 average='weighted' 的高分,忽略了正类召回率(Recall)本身已跌破 0.4。
必须查的三个指标(用 classification_report 一行输出):
-
recall(真正率):正样本里被找出来的比例,医疗/风控场景常要求 >0.9 -
precision(精确率):所有标为正的预测里,真为正的比例,推荐系统常更看重这个 -
support:各类样本数,一眼看出测试集是否失衡(如正类仅 37 个,F1=0.85 也没意义)
若 recall 持续偏低,优先检查特征是否缺失强判别信号(如肿瘤影像中没提取边缘纹理特征),而非调参。
混淆矩阵右下角那个“正→负”的数字,永远比 F1 分数多一层现实重量——它对应一个具体的人、一笔损失、一次服务中断。别跳过它直接报 F1。

















