前言
最近在准备kaggle的一个比赛的时候,看到里面的评判标准为:$MAP@5$,又到了我这个菜鸡的知识盲区了。因此不得不写下这篇博客来。记录一下。
MAP可以由三个部分来理解:P、AP、MAP。这些都是信息检索领域的概念。
信息检索、分类、识别、翻译等领域都可能用到这些指标
粗略了解
这张图是我们常见的用于解释准确率(P)和召回率(recall)的图像。
我们现在假设存在这么一个多标签图像分类问题。对于某一个标签(比如car),我们的模型可以对每张图得到该标签的概率。如果我们考虑图上的selected element为top-5,我们就会认为这top-5的元素为正例,而其余的元素为负例。[显然这样做的好处是我们可以有一个浮动的阈值来表示哪些数据是正例,哪些是反例,这与传统的0.5固定阈值不同]
具体例子
首先用训练好的模型得到所有测试样本的confidence score,每一类(如car)的confidence score保存到一个文件中(如comp1_cls_test_car.txt)。假设共有20个测试样本,每个的id,confidence score和ground truth label如下:
接下来对confidence score排序,得到:
然后计算precision和recall:
$Precision=\frac{true positive}{true positive+false positive}$和$Recall=\frac{true positive}{true positive+ false negative}$
我们选出top-5的结果
在这个例子中,true positives就是指第4和第2张图片,false positives就是指第13,19,6张图片。方框内圆圈外的元素(false negatives和true negatives)是相对于方框内的元素而言,在这个例子中,是指confidence score排在top-5之外的元素,即:
其中,false negatives是指第9,16,7,20张图片,true negatives是指第1,18,5,15,10,17,12,14,8,11,3张图片。
那么,这个例子中Precision=2/5=40%,意思是对于car这一类别,我们选定了5个样本,其中正确的有2个,即准确率为40%;Recall=2/6=30%,意思是在所有测试样本中,共有6个car,但是因为我们只召回了2个,所以召回率为30%。
实际多类别分类任务中,我们通常不满足只通过top-5来衡量一个模型的好坏,而是需要知道从top-1到top-N(N是所有测试样本个数,本文中为20)对应的precision和recall。显然随着我们选定的样本越来也多,recall一定会越来越高,而precision整体上会呈下降趋势。把recall当成横坐标,precision当成纵坐标,即可得到常用的precision-recall曲线。这个例子的precision-recall曲线如下:
接下来说说AP的计算,此处参考的是PASCAL VOC CHALLENGE的计算方法。首先设定一组阈值,[0, 0.1, 0.2, …, 1]。然后对于recall大于每一个阈值(比如recall>0.3),我们都会得到一个对应的最大precision。这样,我们就计算出了11个precision。AP即为这11个precision的平均值。这种方法英文叫做11-point interpolated average precision。
当然PASCAL VOC CHALLENGE自2010年后就换了另一种计算方法。新的计算方法假设这N个样本中有M个正例,那么我们会得到M个recall值(1/M, 2/M, …, M/M),对于每个recall值r,我们可以计算出对应(r’ > r)的最大precision,然后对这M个precision值取平均即得到最后的AP值。计算方法如下:
相应的Precision-Recall曲线(这条曲线是单调递减的)如下:
AP衡量的是学出来的模型在每个类别上的好坏,mAP衡量的是学出的模型在所有类别上的好坏,得到AP后mAP的计算就变得很简单了,就是取所有AP的平均值。
总结:
1.对多标签图像分类,基本策略可以是”one vs rest”——获取每个标签所属类的AP值,接着获取所有AP值得平均值(mAP)
2.对每一个类,获取Precision值和Recall值,绘制P-R曲线,获得AP值具体得计算AP方法:
(1)训练结束,获取打分排名(大——>小),取前N个
(2)计算1/R(M),…..,m/R(M)对应的最大Precision值 $P_1,…P_m$;
(3)$AP=sum(P1+P2+…+P_m)/m$
概念
True positive: 实际正例被认成正例(TP)
False positive:实例负例被认成正例(FP)
True negative:实例负例被认成负例(TN)
False negative: 实例正例被认成负例(FN)
查准率(Precision)召回率(Recall)
$Precision=\frac{TP}{TP+FP}$
$Recall=\frac{TP}{TP+FN}$
PRecision-recall 曲线
如果你想评估一个分类器的性能,一个比较好的方法就是:观察当阈值变化时,Precision与Recall值的变化情况。如果一个分类器的性能比较好,那么它应该有如下的表现:Recall值增长的同时保持Precision的值在一个很高的水平。
根据调节阈值得出这样的数据:
画出如下曲线
上图就是分类器的Precision-recall 曲线,在不损失精度的条件下它能达到40%Recall。而当Recall达到100%时,Precision 降低到50%。
P和R指标有的时候是矛盾的,那么有没有办法综合考虑他们呢?
综合评价指标(F-Measure)
最常见的方法应该就是F-Measure了,有些地方也叫做F-Score,其实都是一样的。
F-Measure是Precision和Recall加权调和平均:
当参数a=1时就是常见的F1了,
AP(Average Precision)
Approximated Average precision:
相比较与曲线图,在某些时候还是一个具体的数值能更直观地表现出分类器的性能。通常情况下都是用 Average Precision来作为这一度量标准.对每一种阈值分别求(Precision值)乘以(Recall值的变化情况),再把所有阈值下求得的乘积值进行累加,更加方便了我们的计算,公式如下:
在这一公式中,N代表测试集中所有图片的个数,P(k)表示在能识别出k个图片的时候Precision的值,而 $\delta r(k)$ 则表示识别图片个数从k-1变化到k时(通过调整阈值)Recall值的变化情况。(注意一些recall没有变化的地方delta为0)
Interpolated average precision:
不同于Approximated Average Precision,一些作者选择另一种度量性能的标准:Interpolated Average Precision。公式如下:
也就是每次使用在所有阈值的Precision中,最大值的那个Precision值与Recall的变化值相乘。
这张图看起来容易理解一点,但是图片中使用的参数与上面所说的例子无关。
很明显 Approximated Average Precision与精度曲线挨的很近,而使用Interpolated Average Precision算出的Average Precision值明显要比Approximated Average Precision的方法算出的要高。
一些很重要的文章都是用Interpolated Average Precision 作为度量方法,并且直接称算出的值为Average Precision 。PASCAL Visual Objects Challenge从2007年开始就是用这一度量制度,他们认为这一方法能有效地减少Precision-recall 曲线中的抖动。所以在比较文章中Average Precision 值的时候,最好先弄清楚它们使用的是那种度量方式。
MAP(Mean Average Precision)
平均正确率的值,对于分许多类的情况适用,例如YOLO,所以它只是在AP基础上求了平均,把每个类的AP求和再平均。
参考文献
1.【机器学习】查全率(Recall)/查准率(Precision)/F-Measure/AP(Average Precision)/MAP
2.评价指标——P,AP,MAP