机器学习指标(Precision、Recall、mAP、F1 Score等)

以下文章摘录自:

《机器学习观止——核心原理与实践》

京东: https://item.jd.com/13166960.html

当当:http://product.dangdang.com/29218274.html

(由于博客系统问题,部分公式、图片和格式有可能存在显示问题,请参阅原书了解详情)

————————————————

版权声明:本文为CSDN博主「林学森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/xuesen_lin/

 

 

1.1        Precision、recall和mAP (mean  Average  Precision)

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

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

对应的公式是:

其中Q是指查询的次数。

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

 

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

l  True Positive (TP)

预测值为1,实际值也为1,检测正确

l  False Positive (FP)

预测值为1,但实际值为0,检测错误

l  True Negative (TN)

预测值为0,实际值也为0,检测正确

l  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%。可见光从这两个值来看,这个导弹防御器的表现似乎已经非常不错了。但事实真的如此吗?毋庸置疑导弹攻击是非常致命的,所以即便是只有一次的失误,也是让人无法接受的。

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

boolean isRealMissile()

{

  return false;//管它是真是假,一律当假的处理。提前下班。。。

}

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

此时:

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。范例如下:

Index

Confidence Score

Ground Truth Label

5

0.98

1

4

0.95

1

2

0.89

0

1

0.82

1

3

0.78

1

6

0.67

0

上表已经按照Confidence Score进行了排序,Index指的是参与分类的图片编号。

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

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

在上述的循环过程中,我们实际上得到的是所谓的precision-recall function。如果以recall为横坐标,precision为纵坐标绘制出curve,那么将得到类似如下的图形:

机器学习指标(Precision、Recall、mAP、F1 Score等)_第1张图片

图  Precision-recall curve

 

关于PRC曲线,我们后续小节还会有进一步的介绍。

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

1.2        F1 Score

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

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

另外,我们还可以由此引申出 ,如下所示:

 

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

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

很简单,就是为了解决当precision和recall出现冲突时的“难以抉择”的情况。比如当我们遇到类似下面这样的场景时:

模型

Recall

precision

模型1

0.6

0.8

模型2

0.8

0.6

究竟是模型1更好,还是模型2更佳呢?

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

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

1.3        Confusion Matrix

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

下面我们结合一个实际的混淆矩阵来做下释义。如下所示:

                precision     recall   f1-score     support

         体育       0.99      0.99      0.99      1000

         财经       0.96      0.99      0.97      1000

         房产       1.00      1.00      1.00      1000

         家居       0.95      0.91      0.93      1000

         教育       0.95      0.89      0.92      1000

         科技       0.94      0.97      0.95      1000

         时尚       0.95      0.97      0.96      1000

         时政       0.94      0.94      0.94      1000

         游戏       0.97      0.96      0.97      1000

         娱乐       0.95      0.98      0.97      1000

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

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

此时就可以用到混淆矩阵了。

如下所示:

Confusion Matrix...

[[991   0   0   0   2   1   0   4   1   1]

 [  0 992   0   0   2   1   0   5   0   0]

 [  0   1 996   0   1   1   0   0   0   1]

 [  0  14   0 912   7  15   9  29   3  11]

 [  2   9   0  12 892  22  18  21  10  14]

 [  0   0   0  10   1 968   4   3  12   2]

 [  1   0   0   9   4   4 971   0   2   9]

 [  1  16   0   4  18  12   1 941   1   6]

 [  2   4   1   5   4   5  10   1 962   6]

 [  1   0   1   6   4   3   5   0   1 979]]

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

表格  Confusion matrix的行列释义

 

 

预测类别

 

 

类别1

类别2

类别3

类别4

实际归属类别

类别1

 

 

 

 

类别2

 

 

 

 

类别3

 

 

 

 

类别4

 

 

 

 

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

所以通过confusion matrix,我们不仅可以计算出true positive、true negative、false positive、false negative四个数值,而且还能进一步挖掘出预测结果中准确或者不准确的地方具体有哪些。这给我们至少带来了如下一些好处:

l  更有针对性的调整模型参数

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

l  更有针对性的分析数据集问题

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

1.4        ROC

ROC,即receiver operating characteristic curve通常直译为接收器操作特性曲线或者受试者工作特征曲线。

大家先来看一下ROC实际“长什么样子”,如下图所示:

机器学习指标(Precision、Recall、mAP、F1 Score等)_第2张图片

图  ROC曲线

 

从图中可以清晰地看到,ROC的横纵坐标分别是1-Specificity和Sensitivity。这两个指标又是什么呢?简单地说,它们分别代表的是False Positive Rate和True Positive Rate。

根据前面的学习:

l  True Positive (TP)

预测值为1,实际值也为1,检测正确

l  False Positive (FP)

预测值为1,但实际值为0,检测错误

l  True Negative (TN)

预测值为0,实际值也为0,检测正确

l  False Negative (FN)

预测值为0,实际值为1,检测错误

 

所以:

FPR =  

TPR =  

 

另外,True Negative Rate的计算公式是:

TNR = 

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

1-TNR

= 1- 

= FPR

这就是上图中横坐标1-specificity的由来了。

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

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

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

机器学习指标(Precision、Recall、mAP、F1 Score等)_第3张图片

图  ROC曲线的产生过程示意

 

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

1.5        AUC

除了ROC曲线外,AUC也是一个常用的模型评估手段,它是“Area Under Curve”的英文缩写。从字面意思上来解读,AUC是指曲线所组成的面积,那么是什么样的曲线呢?

其实就是前一小节讲解的ROC曲线。

机器学习指标(Precision、Recall、mAP、F1 Score等)_第4张图片

图  AUC范例

 

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

l  AUC = 1时

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

l  0.5 < AUC < 1时

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

l  AUC = 0.5时

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

l  AUC < 0.5

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

 

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

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

l  直接计算面积大小

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

我们知道,ROC曲线的绘制与阈值的设定有关。换句话说,大家最终得到的曲线由于“采样”数量的限制通常不是“平滑”的,它呈现出一个个阶梯形状。如下图所示:

机器学习指标(Precision、Recall、mAP、F1 Score等)_第5张图片

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

 

所以我们计算得到的AUC准确性就和阈值的设置有较大关联性了。

l  根据Wilcoxon-Mann-Witney Test来计算

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

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

 

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

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

它的具体参数定义如下所示:

机器学习指标(Precision、Recall、mAP、F1 Score等)_第6张图片

 

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

对于ROC的上述特征,业界已经做过不少研究和实验了,如Tom Fawcett在《An introduction to ROC analysis》论文中所描述的:

机器学习指标(Precision、Recall、mAP、F1 Score等)_第7张图片

图  ROC和PR曲线对比

 

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

 

你可能感兴趣的:(人工智能与机器学习)