混淆矩阵默认按标签升序排列而非输入顺序,需显式传入labels参数;f1分数需根据二分类或多分类场景正确设置average参数,否则结果错误或报错。

直接用 confusion_matrix 和 f1_score 就能算,但结果对不上预期?大概率是标签顺序、平均方式或二分类/多分类场景没对齐。
混淆矩阵的输出顺序容易搞反
confusion_matrix 默认按 np.unique(y_true) 的升序排列类别,不是你训练时传入的顺序,也不是模型预测的原始类别名。比如真实标签是 ['cat', 'dog', 'bird'],但 np.unique 排序后变成 ['bird', 'cat', 'dog'],矩阵第一行就对应 bird 而非 cat。
实操建议:
- 显式传入
labels参数,如confusion_matrix(y_true, y_pred, labels=['cat', 'dog', 'bird']) - 配合
display_labels(scikit-learn ≥ 1.0)传给ConfusionMatrixDisplay,避免可视化错位 - 检查
y_true和y_pred是否都是字符串、整数或一致编码——混用会导致unique结果意外变化
F1分数的 average 参数决定结果含义
f1_score 默认是 average='binary',只适用于二分类;如果直接拿它算多分类,会报错 ValueError: Target is multiclass but average='binary'。而设成 'macro'、'micro' 或 'weighted',数值差异可能很大。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
实操建议:
- 二分类:保持默认,或明确写
average='binary';正类标签用pos_label指定(如pos_label='spam') - 多分类:优先看业务需求——关注每个类平等重要选
macro,关注整体样本分布选weighted,关注全局 TP/FN/FP 总和选micro - 想看每个类的 F1?去掉
average参数,返回数组,再用classification_report更直观
预测值和真实值必须严格对齐维度与类型
常见错误现象:ValueError: Found array with dim 3. Expected 或 <code>inconsistent numbers of samples,通常是因为 y_pred 是概率输出(如 model.predict_proba)而非硬分类结果。
实操建议:
- 确认
y_pred是一维数组,不是二维概率矩阵——该用model.predict(),不是model.predict_proba() - 若模型输出是 one-hot 编码,先用
np.argmax(y_pred, axis=1)转成类别索引 - 确保
y_true和y_pred长度相等,且无 NaN 或空值(sklearn不自动跳过) - 类别数不一致(如训练集有 3 类,测试集只出现 2 类)会触发警告,矩阵维度可能异常——用
labels显式声明全量类别可规避
最易被忽略的是:混淆矩阵本身不归一化,而 f1_score 对类别不平衡极度敏感。如果你的数据里 95% 是负样本,micro F1 可能虚高,此时必须结合矩阵里的具体 FP/FN 值看问题出在哪一类——不能只盯一个数字。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










