召回率(Recall),精确率(Precision),平均正确率
摘要
在训练YOLO v2的过程中,系统会显⽰出⼀些评价训练效果的值,如Recall,IoU等等。为了怕以后忘了,现在把⾃⼰对这⼏种度量⽅式的理解记录⼀下。
这⼀⽂章⾸先假设⼀个测试集,然后围绕这⼀测试集来介绍这⼏种度量⽅式的计算⽅法。
⼤雁与飞机
假设现在有这样⼀个测试集,测试集中的图⽚只由⼤雁和飞机两种图⽚组成,如下图所⽰:
假设你的分类系统最终的⽬的是:能取出测试集中所有飞机的图⽚,⽽不是⼤雁的图⽚。
现在做如下的定义:
True positives : 飞机的图⽚被正确的识别成了飞机。
True negatives: ⼤雁的图⽚没有被识别出来,系统正确地认为它们是⼤雁。
Fal positives: ⼤雁的图⽚被错误地识别成了飞机。
Fal negatives: 飞机的图⽚没有被识别出来,系统错误地认为它们是⼤雁。
假设你的分类系统使⽤了上述假设识别出了四个结果,如下图所⽰:
那么在识别出的这四张照⽚中:
gly是什么氨基酸True positives : 有三个,画绿⾊框的飞机。
Fal positives: 有⼀个,画红⾊框的⼤雁。
没被识别出来的六张图⽚中:
自古逢秋True negatives : 有四个,这四个⼤雁的图⽚,系统正确地没有把它们识别成飞机。
Fal negatives: 有两个,两个飞机没有被识别出来,系统错误地认为它们是⼤雁。
Precision 与 Recall
Precision其实就是在识别出来的图⽚中,True positives所占的⽐率:
其中的n代表的是(True positives + Fal positives),也就是系统⼀共识别出来多少照⽚。
在这⼀例⼦中,True positives为3,Fal positives为1,所以Precision值是 3/(3+1)=0.75。朋友妈妈的味道
意味着在识别出的结果中,飞机的图⽚占75%。
计算题三年级Recall 是被正确识别出来的飞机个数与测试集中所有飞机的个数的⽐值:
Recall的分母是(True positives + Fal negatives),这两个值的和,可以理解为⼀共有多少张飞机的照⽚。
在这⼀例⼦中,True positives为3,Fal negatives为2,那么Recall值是 3/(3+2)=0.6。
意味着在所有的飞机图⽚中,60%的飞机被正确的识别成飞机.。
调整阈值
你也可以通过调整阈值,来选择让系统识别出多少图⽚,进⽽改变Precision 或 Recall 的值。
在某种阈值的前提下(蓝⾊虚线),系统识别出了四张图⽚,如下图中所⽰:
分类系统认为⼤于阈值(蓝⾊虚线之上)的四个图⽚更像飞机。
有哪些科学小实验我们可以通过改变阈值(也可以看作上下移动蓝⾊的虚线),来选择让系统识别能出多少个图⽚,当然阈值的变化会导致Precision与Recall 值发⽣变化。⽐如,把蓝⾊虚线放到第⼀张图⽚下⾯,也就是说让系统只识别出最上⾯的那张飞机图⽚,那么Precision的值就是100%,⽽Recall的值则是20%。如果把蓝⾊虚线放到第⼆张图⽚下⾯,也就是说让系统只识别出最上⾯的前两张图⽚,那么Precision的值还是100%,⽽Recall的值则增长到是40%。
下图为不同阈值条件下,Precision与Recall的变化情况:
Precision-recall 曲线
如果你想评估⼀个分类器的性能,⼀个⽐较好的⽅法就是:观察当阈值变化时,Precision与Recall值的变化情况。如果⼀个分类器的性能⽐较好,那么它应该有如下的表现:被识别出的图⽚中飞机所占的⽐重⽐较⼤,并且在识别出⼤雁之前,尽可能多地正确识别出飞机,也就是让Recall值增长的同时保持Precision的值在⼀个很⾼的⽔平。⽽性能⽐较差的分类器可能会损失很多Precision值才能换来Recall值的提⾼。通常情况下,⽂章中都会使⽤Precision-recall曲线,来显⽰出分类器在Precision与Recall之间的权衡。
长征教育上图就是分类器的Precision-recall 曲线,在不损失精度的条件下它能达到40%Recall。⽽当Recall达到100%时,Precision 降低到50%。Approximated Average precision
相⽐较与曲线图,在某些时候还是⼀个具体的数值能更直观地表现出分类器的性能。通常情况下都是⽤ Average Precision来作为这⼀度量标准,它的公式为:
在这⼀积分中,其中p代表Precision ,r代表Recall,p是⼀个以r为参数的函数,That is equal to taking the area under the curve.
实际上这⼀积分极其接近于这⼀数值:对每⼀种阈值分别求(Precision值)乘以(Recall值的变化情况),再把所有阈值下求得的乘积值进⾏累加。公式如下:
在这⼀公式中,N代表测试集中所有图⽚的个数,P(k)表⽰在能识别出k个图⽚的时候Precision的值,⽽ Delta r(k) 则表⽰识别图⽚个数从k-1变化到k时(通过调整阈值)Recall值的变化情况。
在这⼀例⼦中,Approximated Average Precision的值
=(1 * (0.2-0)) + (1 * (0.4-0.2)) + (0.66 * (0.4-0.4)) + (0.75 * (0.6-0.4)) + (0.6 * (0.6-0.6)) + (0.66 * (0.8-0.6)) + (0.57 * (0.8-0.8)) + (0.5 * (0.8-0.8)) + (0.44 * (0.8-0.8)) + (0.5 * (1-0.8)) = 0.782.
=(1 * 0.2) + (1 * 0.2) + (0.66 * 0) + (0.75 * 0.2) + (0.6 * 0) + (0.66 * 0.2) + (0.57 * 0) + (0.5 * 0) + (0.44 * 0) + (0.5 * 0.2) = 0.782.
通过计算可以看到,那些Recall值没有变化的地⽅(红⾊数值),对增加Average Precision值没有贡献。
Interpolated average precision
不同于Approximated Average Precision,⼀些作者选择另⼀种度量性能的标准:Interpolated Average Precision。这⼀新的算法不再使⽤P(k),也就是说,不再使⽤当系统识别出k个图⽚的时候Precision的值与Recall变化值相乘。⽽是使⽤
也就是每次使⽤在所有阈值的Precision中,最⼤值的那个Precision值与Recall的变化值相乘。公式如下:
下图的图⽚是Approximated Average Precision 与 Interpolated Average Precision相⽐较。
需要注意的是,为了让特征更明显,图⽚中使⽤的参数与上⾯所说的例⼦⽆关。
很明显 Approximated Average Precision与精度曲线挨的很近,⽽使⽤Interpolated Average Precision算出的Average Precision值明显要⽐Approximated Average Precision的⽅法算出的要⾼。
⼀些很重要的⽂章都是⽤Interpolated Average Precision 作为度量⽅法,并且直接称算出的值为Avera
ge Precision 。PASCAL Visual Objects Challenge从2007年开始就是⽤这⼀度量制度,他们认为这⼀⽅法能有效地减少Precision-recall 曲线中的抖动。所以在⽐较⽂章中Average Precision 值的时候,最好先弄清楚它们使⽤的是那种度量⽅式。
IoU
IoU这⼀值,可以理解为系统预测出来的框与原来图⽚中标记的框的重合程度。
计算⽅法即检测结果Detection Result与 Ground Truth 的交集⽐上它们的并集,即为检测的准确率:
宏村门票如下图所⽰:
艺不压身蓝⾊的框是:GroundTruth
黄⾊的框是:DetectionResult
绿⾊的框是:DetectionResult ⋂ GroundTruth
红⾊的框是:DetectionResult ⋃ GroundTruth
要说的
最近⼀直在做相关推荐⽅⾯的研究与应⽤⼯作,召回率与准确率这两个概念偶尔会遇到,知道意思,但是有时候要很清晰地向同学介绍则有点转不过弯来。
召回率和准确率是数据挖掘中预测、互联⽹中的搜索引擎等经常涉及的两个概念和指标。
召回率:Recall,⼜称“查全率”——还是查全率好记,也更能体现其实质意义。
准确率:Precision,⼜称“精度”、“正确率”。
以检索为例,可以把搜索情况⽤下图表⽰:
如果我们希望:被检索到的内容越多越好,这是追求“查全率”,即A/(A+C),越⼤越好。
如果我们希望:检索到的⽂档中,真正想要的、也就是相关的越多越好,不相关的越少越好,这是追求“准确率”,即A/(A+B),越⼤越好。“召回率”与“准确率”虽然没有必然的关系(从上⾯公式中可以看到),在实际应⽤中,是相互制约的。要根据实际需求,找到⼀个平衡点。
往往难以迅速反应的是“召回率”。我想这与字⾯意思也有关系,从“召回”的字⾯意思不能直接看到其意义。“召回”在中⽂的意思是:把xx调回来。“召回率”对应的英⽂“recall”,recall除了有上⾯说到的“order sth to return”的意思之外,还有“remember”的意思。
Recall:the ability to remember sth. that you have learned or sth. that has happened in the past.
当我们问检索系统某⼀件事的所有细节时(输⼊检索query查询词),Recall指:检索系统能“回忆”起那些事的多少细节,通俗来讲就是“回忆的能⼒”。“能回忆起来的细节数” 除以 “系统知道这件事的所有细节”,就是“记忆率”,也就是recall——召回率。简单的,也可以理解为查全率。
不妨举:某池塘有1400条鲤鱼,300只虾,300只鳖。现在以捕鲤鱼为⽬的。撒⽹,逮着了700条鲤鱼,200只虾,100只鳖。那么,这些指标分别如下:
正确率 = 700 / (700 + 200 + 100) = 70%
召回率 = 700 / 1400 = 50%
F值 = 70% * 50% * 2 / (70% + 50%) = 58.3%
不妨看看如果把池⼦⾥的所有的鲤鱼、虾和鳖都,这些指标⼜有何变化:
正确率 = 1400 / (1400 + 300 + 300) = 70%
召回率 = 1400 / 1400 = 100%
F值 = 70% * 100% * 2 / (70% + 100%) = 82.35%
由此可见,正确率是评估捕获的成果中⽬标成果所占得⽐例;召回率,,就是从关注领域中,召回⽬标类别的⽐例;⽽F值,则是综合这⼆者指标的评估指标,⽤于综合反映整体的指标。
当然希望检索结果Precision越⾼越好,同时Recall也越⾼越好,但事实上这两者在某些情况下有⽭盾的。⽐如极端情况下,我们只搜索出了⼀个结果,且是准确的,那么Precision就是100%,但是Recall就很低;⽽如果我们把所有结果都返回,那么⽐如Recall是100%,但是Precision就会很低。因此在不同的场合中需要⾃⼰判断希望Precision⽐较⾼或是Recall⽐较⾼。如果是做实验研究,可以绘制Precision-Recall曲线来帮助分析。