accuracy_score计算的是整体正确率,即预测正确的样本占总样本的比例,不涉及宏平均或微平均;它在类别不平衡时会掩盖少数类性能问题,适用于类别均衡场景,不适用于欺诈检测等少数类关键任务。

直接用 accuracy_score 就行,但得注意它默认是“宏平均”还是“微平均”——其实都不是,它就是整体正确率,不加权也不分层。
为什么 accuracy_score 不等于各分类准确率的平均?
很多人误以为 accuracy_score(y_true, y_pred) 是对每个类单独算准确率再平均。不是的:它只统计所有样本中预测正确的比例,即 (y_true == y_pred).sum() / len(y_true)。这在类别不平衡时会掩盖小类的失败。
- 如果测试集有 90 个类别 A 样本(全预测对)和 10 个类别 B 样本(全预测错),
accuracy_score会返回 0.9 —— 看似很高,但 B 类完全失效 - 想看每类表现,得用
classification_report或手动计算混淆矩阵 -
accuracy_score没有average参数,这点和f1_score、precision_score不同
什么时候该用 accuracy_score,什么时候不该?
它适合类别大致均衡、且业务目标就是“整体判对多少”的场景,比如标准手写数字识别(MNIST)。一旦出现明显倾斜(如医疗诊断中罕见病占比 0.1%),单看这个值容易误导。
- ✅ 适合:图像多分类基准测试、教学演示、快速初筛
- ❌ 不适合:欺诈检测、故障预警、少数类关键任务
- ⚠️ 替代方案:配合
confusion_matrix查看漏报/误报,或用balanced_accuracy_score(自动对每类准确率等权平均)
实操中容易踩的坑
最常出问题的是标签格式和预测输出不匹配,尤其用 predict_proba 后忘了取 argmax。
- 输入必须是 1D 数组:
y_true和y_pred都不能是二维(比如 shape=(n, 1)),否则报ValueError: Found array with dim 2 - 如果模型输出概率(如
clf.predict_proba(X_test)),必须显式转成预测类别:y_pred = clf.predict(X_test)或y_pred = np.argmax(y_proba, axis=1) - 确保
y_true和y_pred的标签编码一致:都用LabelEncoder处理过,或都保持原始字符串(scikit-learn 支持字符串标签,但必须两端统一) - 别把训练集准确率当泛化能力指标——一定要在
X_test/y_test上算
真正麻烦的从来不是调用函数,而是搞清你到底想评估什么;准确率数字好看,不代表模型在你关心的类别上靠谱。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











