Keras中多分类任务的准确率计算方法及定义困惑
多分类任务中两种准确率计算的差异解析
核心结论
- Keras的
keras.metrics.Accuracy()计算的是样本级准确率,这是多分类任务中最常用的准确率定义:正确分类的样本数 / 总样本数。 - 第二种基于
(TP+TN)/(TP+TN+FP+FN)的计算方式,是将多分类拆解为多个二分类后的总体二元判断准确率,这种方式在多分类任务中几乎不适用,因为它错误地将每个样本的非真实类别判断都纳入了有效评估指标。
具体案例分析
1. Keras样本级准确率计算
你的案例中,4个样本里3个被正确分类,对应代码与结果:
m = keras.metrics.Accuracy() accuracy = m(yt, yp).numpy() # 结果为0.75
这个结果的本质是:正确样本数 / 总样本数 = 3/4 = 0.75,完全符合多分类任务中对准确率的常规理解——我们核心关心的是每个样本是否被分到了正确的类别中。
2. 基于二元指标的总体准确率计算
当你将标签转为独热向量后,用TP、TN、FP、FN计算的准确率:
m11 = keras.metrics.TruePositives() m00 = keras.metrics.TrueNegatives() m01 = keras.metrics.FalsePositives() m10 = keras.metrics.FalseNegatives() TP = m11(yt, yp).numpy() # 3 TN = m00(yt, yp).numpy() # 15 FP = m01(yt, yp).numpy() # 1 FN = m10(yt, yp).numpy() # 1 accuracy = (TP + TN) / (TP + TN + FP + FN) # (3+15)/(3+15+1+1)=18/20=0.9
这个计算的是所有类别-样本二元判断的正确率:每个样本对应5个类别判断,4个样本共20个判断,其中18个判断“正确”(3个正确预测真实类别,15个正确排除非真实类别)。但在多分类任务中,这些“正确排除非真实类别”的判断没有实际价值——我们只需要确认样本是否属于它的真实类别,而非逐一验证它不属于其他类别。
3. 召回率与样本级准确率的巧合
你用TP/(TP+FN)计算得到0.75,和样本级准确率一致,原因在于:
- 这里的TP是样本真实类别被正确预测的数量(3个),FN是样本真实类别被错误预测的数量(1个)。
- TP+FN正好等于总样本数(4个),所以召回率=3/4=0.75,本质和样本级准确率是同一个指标——只是换了一种表述方式,把“正确分类的样本”等同于“真实类别的真阳性”,“错误分类的样本”等同于“真实类别的假阴性”。
总结
- 不要用第二种二元指标的方式计算多分类准确率,它不符合多分类任务的评估需求。
- Keras的
Accuracy()给出的是多分类任务中标准的样本级准确率,完全贴合实际业务场景的评估逻辑。
内容的提问来源于stack exchange,提问作者hgh
相关产品推荐
相关产品推荐

