在做分类任务时一般会想到使用正确率Accuracy指标,这是相当符合直觉的一个指标。就类似于我们人类做选择题一样,不管是ABCD四选一还是ABC三选一,总之数一下题目的数量,再数一下答对的题目的数量,最后后者比前者算出正确率,然后按正确率越高越好的原则做出判断即可。但在做分类任务时,由于数据集呈现出来不同的特点,因此单纯考察正确率就显得不太公平。比如一张卷子提前知道了70%的题是将A选项作为正确答案的,那即使什么都不会的人参考,只要全选A也能得70分,这样正确率的评估效果就大打折扣了。

为了寻找在不同数据集下能相对公平评判模型效果,像精确率Precision、召回率RecallF1分数、AUCROC曲线下面积这的指标也常常被用于分类任务。本文中将做一下简单的梳理。

基础分类指标

分类任务可以分为二分类和多分类,对于多分类任务,对每个类别也可以看作为”是该类“与”不是该类“的二分类任务。因此在下面讨论基础分类指标时,均以二分类作为基准来讨论。记号如下:

  • True Positive (TP): 把正样本成功预测为正。
  • True Negative (TN):把负样本成功预测为负。
  • False Positive (FP):把负样本错误地预测为正。
  • False Negative (FN):把正样本错误的预测为负。

精确率 Precision

计算公式是: \[ Precision = \frac{TP}{TP+FP} \] 表达的含义就是我觉得真的的事情里面有多大的比例是实际上是真的。

召回率 Recall

计算公式是: \[ Recall = \frac{TP}{TP+FN} \] 表达的含义是所有真实的事情中,有多大的比例是我认为是真实的。

在模型能力不变的前提下,精确率Precision和召回率Recall实际是矛盾的。因为如果我想要提高精确率,那么我就会变得谨慎,判断事情真假时如果我没有很高的把握,我就不会认为它是真的。这种策略下,精确率确实可以提高。但是反过来,召回率就会下降,因为太过保守会错失一些原本可以预测对的事情。

精确率和召回率存在Trade-off,对现实任务来说,精确率和召回率可能不是同等重要的,那就存在根据业务做取舍的需求。比如门禁系统的人脸识别任务,如果召回率不高,那么后果可能就是需要更多帧去识别这个人究竟是不是业主,给人的体验就是系统比较慢而已;但如果是准确率不高,后果就可能是把无关的人识别成业主了,给人的体验就是整个系统不可靠!因此在这种场景下,准确率是比召回率重要得多的。但反过来说,如果同样是人脸识别任务,但是目标是去寻找失联人员,那宁可吃点亏多排查几个地点,也不能放过可能相似的线索,这时候召回率又会比准确率重要得多。

F1分数

计算公式: \[ F1\ Score = 2 * \frac{Precision*Recall}{Precision+Recall} \] F1分数实际是准确率和召回率的调和平均值,可以用于更平衡地总结模型性能。

如果我们将Precision, Recall按公式展开,可以得到: \[ F1\ Score=\frac{TP}{TP+\frac{1}{2}(FP+FN)} \]

正确率 Accuracy

计算公式: \[ Accuracy = \frac{TP+TN}{TP+FP+FN+TN} \] 这个好理解,就是分类问题做对的比例。

AUC ROC曲线下面积

这是比较复杂的概念之一,它不像上面3个指标那么直观。我们首先来看一下什么是ROC曲线。

ROC曲线

ROC曲线(Receiver Operating Characteristics,受试者工作特征曲线)。ROC曲线的横轴是伪阳性率(False Positive Rate, FPR),纵轴是是真阳性率(True Positive Rate, TPR)。

  • 伪阳性率(FPR):判定为正例却不是真正例的概率,即真负例中判为正例的概率
  • 真阳性率(TPR):判定为正例也是真正例的概率,即真正例中判为正例的概率(也即正例召回率)

可以发现,前面说到的召回率实际对应这里的真阳性率,准确率实际是1-伪阳性率(伪阳性是判定为真的实际却不是真的概率)。在不同场景下,准确率可以和召回率做取舍,那通过调整阈值,可以获得模型对应的一系列FPR和TPR的值。将这一系列值绘制到图上,就形成了ROC曲线。

AUC 曲线下面积

ROC曲线的面积就是AUC。如果FPR比较小时,实际意味着准确率比较高,那相应的对应召回率会比较低,即TPR会比较小。随着FPR的增大,TPR会逐渐上升,直到模型预测任何事情都为真,此时TPR为1。那一个直观的想法就是,如果在保证准确率比较高的情况下,召回率仍然不差的模型,这样的模型能力会比较强。将这个想法进行数学表达,就是ROC曲线下的面积AUC,AUC越大,就意味着模型在高准确率/召回率下能保持相对高的召回率/准确率,那这样的模型分类能力是相对更强的。

AUC判断分类器分类效果的标准

其实和分类任务的难度有关。但一般来说,AUC在0.5附近说明模型预测效果可能比随即猜测好不到哪去。如果AUC比0.5高,那就有可以应用的价值(实在很差也有当弱分类器集成的价值);如果AUC比0.5还低不少,那么很可能是训练的时候把标签搞反了。AUC越接近1,那分类效果就越好。

AUC和Accuracy的比较

当样本类别分布均衡时,Accuracy是更好的选择,因为它简单直观,看到正确率的值就可以很清晰地知道分类器对该问题的分类水平。

但当样本不平衡时,正确率被多数类所主导,Accuracy没办法很好地反映分类器在少数类样本上的表现。这时候ROC_AUC就能体现出不被类别不平衡问题影响的优势了。当类别不平衡且关注少数类预测效果时,AUC是更好的指标。

平均F1值计算

对于多分类问题,每个类别都能转化为1对其他类而转化为二分类问题,从而计算出一个F1值。然而最后可能只会报告数据集上的F1值,这其中就涉及到平均F1值的计算问题。从宏观来说,平均F1值可以分为Macro F1, Weighted F1和Micro F1(不常用)。

Macro F1

Macro F1遵循“众类平等”的原则,其计算也非常简单,就是直接对每个类的F1值求和之后计算平均值。计算公式如下。 \[ Macro\ F1 = \frac{\sum_{i=1}^{n}{ {F1\ Score}_{C_i} } }{n} \] 这种平均方式相当照顾小类别的指标,只要小类别的F1值过低很可能带动整个Macro F1值偏低。但值得注意的是,在深度学习中度量损失的单位是样本,一个有标签的样本输入进模型才能计算出一个损失值。那理所当然对于样本比较多的类,模型会因为要降低损失而对多数类进行优待,这样可以尽可能地降低损失,达到比较好的分类性能。但如果评估一个模型的标准是Macro F1时,这种为了降低损失而偏好多数类的特点可能会使模型分数不佳。因此,在数据集类别分布不平衡而且评估标准是Macro F1时,可以考虑对少数类进行加权,来增加模型对少数类样本的重视程度,从而让Macro F1更能反映模型的真实性能。

Weighted F1

Weighted F1是考虑了各类别样本数的F1值,按照评估集上各类别样本出现次数的比例为每个样本分配权重,计算公式如下。 \[ Weighted\ F1= \sum_{i=1}^{n}{ {Proportion}_{C_i} * {F1\ Score}_{C_i} } \] Weighted F1在算平均时考虑了各类别的样本数,因此算是一种比较公平的平均方式。一般没有特殊说明的情况下,报告的平均F1分数一般是指Weighted F1。

Micro F1

Micro F1是实际中很少出现的分数,比如sklearn.metrics.classification_report的功能只会报告accuracy, macro avgweighted avg,并不会报告所谓的Micro F1。因为Micro F1实际上是把所有分类的TP, FN, FP加起来,然后用所有类的和来求F1值进而得到的: \[ Micro\ F1 = \frac{\sum_{i=1}^n{TP_{C_i} } }{\sum_{i=1}^n{TP_{C_i} + \frac{1}{2}(FP_{Ci}+FN_{Ci})} } \] 这个计算的结果实际上等于正确率accuracy,Micro F1作为评价指标时,实际上与更容易理解的正确率是等效的。因此常常会直接使用正确率,而不是Micro F1。

参考资料

  1. Micro, Macro & Weighted Averages of F1 Score, Clearly Explained
  2. 分类模型评估指标——准确率、精准率、召回率、F1、ROC曲线、AUC曲线
  3. Understanding AUC - ROC Curve