第3章
机器学习模型的度量指标

如何度量和评估一个机器学习模型的优劣呢?目前业界有很多种度量指标,例如召回率(Recall)、精确率(Precision)、mAP、ROC等,它们之间有什么区别?针对不同的业务场景又应该如何选择呢?

这些都是本章所要回答的问题。

3.1 Precision、Recall和mAP

计算机领域有很多评估识别结果精度的方式,mAP(mean Average Precision)就是其中应用非常广泛的一种。它的计算过程并不复杂,引用Wikipedia上的描述:

“Mean average precision for a set of queries is the mean of the average precision scores for each query.”

对应的公式是:

其中,Q是指查询的次数。

Wikipedia上的释义虽然是针对信息检索提出来的,但同样可以被机器学习领域用于评估预测精度。在mAP公式中,涉及AveP(q)的计算过程。如果要理解后者,首先需明白3个指标:准确率(Accuracy)、召回率(Recall)和精确率(Precision)。

不论是针对哪种场景,二分类模型的检测结果都有如下4种可能性。

(1)True Positive(TP):预测值为1,实际值也为1,检测正确。

(2)False Positive(FP):预测值为1,但实际值为0,检测错误。

(3)True Negative(TN):预测值为0,实际值也为0,检测正确。

(4)False Negative(FN):预测值为0,实际值为1,检测错误。

Accuracy和Precision都很好理解,它们指的是

Accuracy=(TP+TN)/(TP+FP+TN+FN)

Precision=TP/(TP+FP)

但是仅有这两个指标是不够的。举个实际的例子就很好理解了:我们知道“导弹攻击信号”有可能是真实的,也可能是模拟出来的。现在假设100次中真正的导弹攻击事件是3次,同时某导弹攻击防御器成功检测出了其中的两次。那么可以得出:

TP=2

TN=97

FP=0

FN=1

所以Accuracy=99%,而Precision=2/2=100%。可见仅从这两个值来看,这个导弹防御器的表现似乎已经非常不错了。但事实真的如此吗?毋庸置疑,导弹攻击是非常致命的,所以即便只有一次失误,也是让人无法接受的。

或者我们再换一种思路——如果程序员为了偷懒,写了一个类似下面的导弹攻击检测器:

那么针对上面这一模型的评估结果如何呢?

此时:

TP=0

TN=97

FP=0

FN=3

因而Accuracy=97%。也就是说,即便什么都不做,系统也可以达到很高的准确率,这显然不是我们希望看到的结果。

这也是引入Recall的原因之一,它的定义如下。

Recall=TP/(TP+FN)

而上述两种情况因为Recall值分别为66.6%及0,终于得到了相对公正的评价。

理解了Precision和Recall后,接下来就可以进一步分析平均精确率(Average Precision)了。对于一个多标签图像分类系统来说,每一个预测分类(例如小猫)都可以得到它们的置信值(Confidence Score),以及对应的真值标签(Ground Truth Label),范例如表3-1所示。

表3-1 分类范例

表3-1已经按照置信值进行了排序,Index指的是参与分类的图片编号。

假设我们认为列表中的Top-2是Positive的,那么对照真值标签不难发现TP=2,同理也可以计算得出TP等其他值,并最终得到Top-2情况下的Recall和其对应的Precision。

再假设我们认为列表中的Top-3是Positive的,那么同样,最终也能得到这种情况下的Recall和其对应的Precision。如此循环直到Top-N,此时Recall的值一定为1。

在上述循环过程中,实际上得到的是所谓的精确率召回函数(Precision-Recall Function)。如果以Recall为横坐标,以Precision为纵坐标绘制出曲线,那么将得到类似如图3-1所示的图形。

关于PRC,后续还会有进一步的介绍。

Average Precision简单来说就是针对每个Recall对应的Precision求均值得来的。因为是多标签分类的任务,所以还可以对所有分类情况做AP,然后取均值,最终得到mean Average Precision(mAP)。

图3-1 Precision-Recall曲线

3.2 F1 Score

F1 Score又称为平衡F分类,其与Precision和Recall都有关系——准确地说,它兼顾了后两者,是它们的一种加权平均。

具体而言,F1 Score的公式如下。

另外,还可以由此引申出Fβ,如下。

不难看出,F1是上述公式的特例,其他常用的还有F2F0.5等。

那么人们提出F1 Score的意义是什么呢?

很简单,就是为了解决当Precision和Recall出现冲突时的“难以抉择”的情况。比如,当我们遇到类似表3-2这样的场景时,究竟是模型1更好,还是模型2更佳呢?

表3-2 模型比较

此时Fβ就可以发挥作用了——F1认为Recall和Precision的权重是一样的,而F2则认为前者比后者重要(成反比),等等。

F分数目前被应用于多个机器学习算法领域,是一个相当通用的衡量指标,在后续多个章节中还会再看到它的身影。

3.3 混淆矩阵

混淆矩阵(Confusion Matrix),又称为可能性表格或是错误矩阵,是一种用来呈现算法性能效果的特定矩阵。

下面结合一个实际的混淆矩阵来解释其含义,如下。

这是一个文本分类器的范例,可以看到它包含体育、财经、房产等10个分类。上述的一系列数值描述了每一个分类的Precision、Recall等信息,它们为我们理解分类器的全局性能提供了关键输入。

如果还想细化分析每一种类别的实际分类结果呢?

此时就可以用到混淆矩阵了,如下所示。

上面所述的就是这个文本分类器的混淆矩阵评估结果。不难看出,它的行列数都是10,也就是一个n×n的矩阵。其中每一行都是一个真实的归属类别,因而每一行的数据总数表示该类别的数据实例的数目;而每一列则是真实类别被预测为该类的数目,如表3-3所示。

表3-3 混淆矩阵的行列释义

以前面的范例来讲,第一行对应的真实类别是“体育”,而预测结果中,“体育”(True Positive)的数量是991,其他被预测为“财经”“房产”“家居”“教育”的数量则分别为0、0、0和2。

所以通过混淆矩阵,不仅可以计算出True Positive、True Negative、False Positive、False Negative这4个数值,而且还能进一步挖掘出预测结果中准确或者不准确的地方具体有哪些。这给我们至少带来了如下一些好处。

(1)更有针对性地调整模型参数。

通过观察和分析每一种类别的实际预测结果,有助于“对症下药”改善分类器模型。

(2)更有针对性地分析数据集问题。

对于数据集不平衡(即每一类别的数据样本数量相差太大)的情况,单纯从Precision等指标很难看出来,而混淆矩阵则可以给出有效的指引。

3.4 ROC

ROC,即Receiver Operating Characteristic曲线,通常直译为接收器操作特性曲线或者受试者工作特征曲线。

先来看一下ROC实际“长什么样子”,如图3-2所示。

图3-2 ROC曲线

从图3-2中可以清晰地看到,ROC的横纵坐标分别是特异度(1-Specificity)和灵敏度(Sensitivity)。这两个指标又是什么呢?简单地说,它们分别代表的是假正例率(False Positive Rate,简称为FPR)和真正例率(True Positive Rate,简称为TPR)。

根据前面的内容:

(1)True Positive(TP):预测值为1,实际值也为1,检测正确。

(2)False Positive(FP):预测值为1,但实际值为0,检测错误。

(3)True Negative(TN):预测值为0,实际值也为0,检测正确。

(4)False Negative(FN):预测值为0,实际值为1,检测错误。

所以

另外,True Negative Rate(简称TNR)的计算公式是

TNR又被称为Specificity,而且不难推导出

这就是图3-2中横坐标1-Specificity的由来。

那么,ROC曲线是如何绘制出来的呢?

我们知道,某些分类器基于训练样本会产生一个预测概率,所以最终结果与一个设定的阈值有关——预测值与此阈值进行比较,若大于阈值会被分为正类,否则分为反类。

不同任务中,可以根据实际诉求来选择不同的阈值。通常情况下,如果更注重“查准率”,那么应该优先选择排序中靠前的位置进行截断;反之若更关心“查全率”,则建议选择靠后的位置进行截断。由此就产生了本节所讲述的ROC曲线,如图3-3所示。

图3-3 ROC曲线的产生过程示意

从ROC曲线的绘制过程,可以看出它可以用于评估分类器的性能好坏,而且理论上曲线距离左上角越近,则分类器效果越好。

3.5 AUC

除了ROC曲线外,AUC也是一个常用的模型评估手段,它是Area Under Curve的缩写。从字面意思来解读,AUC是指曲线所组成的面积,那么是什么样的曲线呢?其实就是3.4节讲解的ROC曲线,如图3-4所示。

图3-4 AUC范例

不难理解,AUC的值越大,那么被评估的分类器的分类效果理论上就越好。

(1)AUC=1时。

代表一个完美的分类器。采用这个预测模型时,不管设定什么阈值都能得出完美的预测结果。但是这种完美的分类器基本上不存在。

(2)0.5<AUC<1时。

预测结果比随机猜测要好。换句话说,如果妥善设定这个分类器的话,它是具备预测价值的。

(3)AUC=0.5时。

代表该模型的预测结果基本上和随机猜测一样(更直白一点儿,就是“瞎猜”的结果),此时模型并没有什么预测价值。

(4)AUC<0.5时。

代表该模型比随机猜测的结果还要糟糕,不过如果总是反预测而行,它还是优于随机猜测。

一般情况下,我们认为只有达到0.9以上的AUC才是一个准确性较高的分类器模型。

理解了AUC的定义后,再来讨论一下如何计算AUC的值。典型的实现方法有如下几种。

(1)直接计算面积大小。

这可能是大多数人想到的最直接的方法——因为AUC理论上就是ROC曲线下的面积大小。不过这个方法有什么缺陷呢?

我们知道,ROC曲线的绘制与阈值的设定有关。换句话说,最终得到的曲线由于“采样”数量的限制通常不是“平滑”的,它呈现出一个个阶梯形状,如图3-5所示。所以计算得到的AUC准确性和阈值的设置有较大关联性。

图3-5 实际的ROC曲线会呈现“阶梯状态”

(2)根据Wilcoxon-Mann-Witney Test来计算。

我们计算正样本分数大于负样本分数的概率就可以得到AUC。具体取N×MN为正样本数,M为负样本数)个正负样本二元组,比较分数后得到AUC,其时间复杂度为ON×M)。和上面计算面积的方法类似,样本数越多,则计算得到的AUC越准确。

(3)按照分数对样本进行排序并用排序(rank)来表示。

第三种方法与第二种方法有点儿相似,都是直接计算正样本分数大于负样本分数的概率,区别在于复杂度降低了。首先把所有样本按照分数来排序,然后依次用rank来表示它们。比如对于分数最大的样本,rank=nn=N+M),其次为n-1,n-2,以此类推。对于正样本中rank最大的样本(rank_max),有M-1个其他正样本比它的分数小,那么就有(rank_max-1)-(M-1)个负样本比它的分数小;其次为(rank_second-1)-(M-2)。因此最后得到正样本大于负样本的概率为

当然,业界已经有不少工具提供了计算AUC的便捷API,例如,下面是scikit-learn库中与AUC计算相关的一个接口原型。

sklearn.metrics.auc(x, y, reorder=False)

它的具体参数定义如图3-6所示。

图3-6 参数定义

最后,再来总结一下为什么要使用ROC和AUC,或者说它们的特别之处在哪里。简单来说,ROC有一个显著的优点,即当测试集中的正样本和负样本分布发生变化的时候,ROC曲线能够保持不变。由于实际的数据集中经常会出现类间的不平衡(Class Imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化,此时这一特性就能显示出其独特价值。

对于ROC的上述特征,业界已经做过不少研究和实验,如Tom Fawcett在“An introduction to ROC analysis”论文中给出图3-7所示曲线对比图。

图3-7 ROC和PR曲线对比

其中,图3-7(a)和图3-7(b)是分类器在原始测试集(此时正负样本分布平衡)上的预测结果,而图3-7(c)和图3-7(d)则是将测试集中的负样本数量增加到原来的10倍后,分类器的ROC和PR曲线的评估结果。从中可以清晰地看到,ROC曲线可以基本保持不变,而后者则出现了“剧变”。

3.6 PRC

PRC是精确率召回曲线(Precision Recall Curve)的缩写,顾名思义,它的横纵坐标自然就是Recall和Precision。事实上,前面几节讲解其他曲线时已经简单地提到过PRC。首先将分类结果按照分值进行排序,而后假设列表中的Top-2是Positive的,那么对照Ground Truth Label就可以得到TP值,最终得到Top-2情况下的Recall和其对应的Precision;同理,如果假设列表中的Top-3是Positive的,那么最终也可以得到这种情况下的Recall和其对应的Precision。如此循环直到Top-N,此时Recall的值一定为1。

在上述循环过程中,实际上得到的是所谓的Precision-Recall Function。如果以Recall为横坐标,以Precision为纵坐标绘制曲线,那么将得到类似如图3-8所示的图形。

图3-8 Precision-Recall曲线

3.4节中分析了ROC相对于PRC的优势,不过既然PRC能够获得广泛应用,那么自然也有自己的适用场景,如图3-9所示。

图3-9(a)和图3-9(b)分别表示在样本不均衡的条件下,分别通过ROC和PR空间来衡量两种算法的结果,从中不难看到后者更能反馈出算法间的差异性。

图3-9 PR曲线的适用场景

3.7 工业界使用的典型AI指标

除了前面几节所介绍的一些基础指标,工业界往往还会针对自己的AI产品制定其他指标。本节统一做下介绍,以帮助读者在实际项目中能够更“有的放矢”地开展机器学习的验证工作。

AI产品是我们将人工智能领域的技术成果与工业界诉求相结合所产生的“结晶”。根据国家《人工智能标准化白皮书》的描述,AI产品可以分为很多类,如表3-4所示。

表3-4 人工智能产品分类表

以NLP、语音识别等产品为例,业界主要采用如表3-5所示的一些指标来评估产品性能。

表3-5 AI产品的评估指标示例

错字率(Word Error Rate,WER)是指语音识别出结果后,为了纠正该结果所需要花费的增、删、改等操作的数量,典型公式如下。

WER=(S+D+I)/N×100%

其中,S代表替换,D代表删除,I表示插入,N则是单词数量总和。

当然,也有一些公司在评测过程中采用了错句率(Sentence Error Rate,SER)作为语音识别的参考标准。读者可以根据自己的实际项目诉求来选择合适的指标。

另外,上面所讲解的这些指标多数是从工程技术的角度来衡量一款AI产品,但这并不是全部——举个例子来讲,还可以从商业应用的角度来评估它的好坏。比如在很多公司广泛采用如下一些指标来评价产品的应用效果。

(1)Daily Active User,即日活跃用户数,与产品评价成正相关性。

(2)NPS:用户的净推荐值,也可以较好地反馈一款产品的用户满意度情况。