准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure

https://blog.csdn.net/hxg2006/article/details/79649154

1、准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measur

机器学习(ML),自然语言处理(NLP),信息检索(IR)等领域,评估(Evaluation)是一个必要的 工作,而其评价指标往往有如下几点:准确率(Accuracy),精确率(Precision),召回率(Recall)和F1-Measure。(注: 相对来说,IR 的 ground truth 很多时候是一个 Ordered List, 而不是一个 Bool 类型的 Unordered Collection,在都找到的情况下,排在第三名还是第四名损失并不是很大,而排在第一名和第一百名,虽然都是“找到了”,但是意义是不一样的,因此 更多可能适用于 MAP 之类评估指标。)

本文将简单介绍其中几个概念。中文中这几个评价指标翻译各有不同,所以一般情况下推荐使用英文。

现在我先假定一个具体场景作为例子。

假如某个班级有男生80人,女生20人,共计100人.目标是找出所有女生.
现在某人挑选出50个人,其中20人是女生,另外还错误的把30个男生也当作女生挑选出来了.
作为评估者的你需要来评估(evaluation)下他的工作

首先我们可以计算准确率(accuracy),其定义是: 对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。也就是损失函数是0-1损失时测试数据集上的准确率[1].

这样说听起来有点抽象,简单说就是,前面的场景中,实际情况是那个班级有男的和女的两类,某人(也就是定义中所说的分类器)他又把班级中的人分为男女两类。accuracy需要得到的是此君分正确的人总人数的比例。很容易,我们可以得到:他把其中70(20女+50男)人判定正确了,而总人数是100人,所以它的accuracy就是70 %(70 / 100).

由准确率,我们的确可以在一些场合,从某种意义上得到一个分类器是否有效,但它并不总是能有效的评价一个分类器的工作。举个例子,google抓取了argcv 100个页面,而它索引中共有10,000,000个页面,随机抽一个页面,分类下,这是不是argcv的页面呢?如果以accuracy来判断我的工作,那我会把所有的页面都判断为"不是argcv的页面",因为我这样效率非常高(return false,一句话),而accuracy已经到了99.999%(9,999,900/10,000,000),完爆其它很多分类器辛辛苦苦算的值,而我这个算法显然不是需求期待的,那怎么解决呢?这就是precision,recall和f1-measure出场的时间了.

在说precision,recall和f1-measure之前,我们需要先需要定义TP,FN,FP,TN四种分类情况.
按照前面例子,我们需要从一个班级中的人中寻找所有女生,如果把这个任务当成一个分类器的话,那么女生就是我们需要的,而男生不是,所以我们称女生为"正类",而男生为"负类".

  相关(Relevant),正类 无关(NonRelevant),负类
被检索到(Retrieved) true positives(TP 正类判定为正类,例子中就是正确的判定"这位是女生") false positives(FP 负类判定为正类,"存伪",例子中就是分明是男生却判断为女生,当下伪娘横行,这个错常有人犯)
未被检索到(Not Retrieved) false negatives(FN 正类判定为负类,"去真",例子中就是,分明是女生,这哥们却判断为男生--梁山伯同学犯的错就是这个) true negatives(TN 负类判定为负类,也就是一个男生被判断为男生,像我这样的纯爷们一准儿就会在此处)

通过这张表,我们可以很容易得到这几个值:
TP=20
FP=30
FN=0
TN=50

精确率(precision)的公式是,它计算的是所有"正确被检索的item(TP)"占所有"实际被检索到的(TP+FP)"的比例.

在例子中就是希望知道此君得到的所有人中,正确的人(也就是女生)占有的比例.所以其precision也就是40%(20女生/(20女生+30误判为女生的男生)).

召回率(recall)的公式是,它计算的是所有"正确被检索的item(TP)"占所有"应该检索到的item(TP+FN)"的比例。

在例子中就是希望知道此君得到的女生占本班中所有女生的比例,所以其recall也就是100%(20女生/(20女生+ 0 误判为男生的女生))

F1值就是精确值和召回率的调和均值,也就是

调整下也就是

例子中 F1-measure 也就是约为 57.143%().

需要说明的是,有人[2]列了这样个公式

将F-measure一般化.

F1-measure认为精确率和召回率的权重是一样的,但有些场景下,我们可能认为精确率会更加重要,调整参数a,使用Fa-measure可以帮助我们更好的evaluate结果.

话虽然很多,其实实现非常轻松,点击此处可以看到我的一个简单的实现.

References

[1] 李航. 统计学习方法[M]. 北京:清华大学出版社,2012.
[2] 准确率(Precision)、召回率(Recall)以及综合评价指标(F1-Measure )

==================================================

自己理解 + 我老师的说法就是,准确率就是找得对,召回率就是找得全。

大概就是你问问一个模型,这堆东西是不是某个类的时候,准确率就是 它说是,这东西就确实是的概率吧,召回率就是, 它说是,但它漏说了(1-召回率)这么多

==================================================

在信息检索、分类体系中,有一系列的指标,搞清楚这些指标对于评价检索和分类性能非常重要,因此最近根据网友的博客做了一个汇总。

准确率、召回率、F1

信息检索、分类、识别、翻译等领域两个最基本指标是召回率(Recall Rate)准确率(Precision Rate),召回率也叫查全率,准确率也叫查准率,概念公式:

             召回率(Recall)      =  系统检索到的相关文件 / 系统所有相关的文件总数

             准确率(Precision) =  系统检索到的相关文件 / 系统所有检索到的文件总数

图示表示如下:


  A:             (搜到的也想要的)
B:检索到的,但是不相关的          (搜到的但没用的)
C:未检索到的,但却是相关的        (没搜到,然而实际上想要的)
D:未检索到的,也不相关的          (没搜到也没用的)

 

注意:准确率和召回率是互相影响的,理想情况下肯定是做到两者都高,但是一般情况下准确率高、召回率就低,召回率低、准确率高,当然如果两者都低,那是什么地方出问题了。一般情况,用不同的阀值,统计出一组不同阀值下的精确率和召回率,如下图:

 

 

如果是做搜索,那就是保证召回的情况下提升准确率;如果做疾病监测、反垃圾,则是保准确率的条件下,提升召回。

所以,在两者都要求高的情况下,可以用F1来衡量。

  1. F1 =  * P * R / (P + R)  

 

公式基本上就是这样,但是如何算图1中的A、B、C、D呢?这需要人工标注,人工标注数据需要较多时间且枯燥,如果仅仅是做实验可以用用现成的语料。当然,还有一个办法,找个一个比较成熟的算法作为基准,用该算法的结果作为样本来进行比照,这个方法也有点问题,如果有现成的很好的算法,就不用再研究了。

 

AP和mAP(mean Average Precision)

mAP是为解决P,R,F-measure的单点值局限性的。为了得到 一个能够反映全局性能的指标,可以看考察下图,其中两条曲线(方块点与圆点)分布对应了两个检索系统的准确率-召回率曲线

 

可以看出,虽然两个系统的性能曲线有所交叠但是以圆点标示的系统的性能在绝大多数情况下要远好于用方块标示的系统。

从中我们可以 发现一点,如果一个系统的性能较好,其曲线应当尽可能的向上突出。

更加具体的,曲线与坐标轴之间的面积应当越大。

最理想的系统, 其包含的面积应当是1,而所有系统的包含的面积都应当大于0。这就是用以评价信息检索系统的最常用性能指标,平均准确率mAP其规范的定义如下:(其中P,R分别为准确率与召回率)

ROC和AUC

ROC和AUC是评价分类器的指标,上面第一个图的ABCD仍然使用,只是需要稍微变换。



回到ROC上来,ROC的全名叫做Receiver Operating Characteristic。

ROC关注两个指标

   True Positive Rate ( TPR )  = TP / [ TP + FN] ,TPR代表能将正例分对的概率

   False Positive Rate( FPR ) = FP / [ FP + TN] ,FPR代表将负例错分为正例的概率

在ROC 空间中,每个点的横坐标是FPR,纵坐标是TPR,这也就描绘了分类器在TP(真正的正例)和FP(错误的正例)间的trade-off。ROC的主要分析工具是一个画在ROC空间的曲线——ROC curve。我们知道,对于二值分类问题,实例的值往往是连续值,我们通过设定一个阈值,将实例分类到正类或者负类(比如大于阈值划分为正类)。因此我们可以变化阈值,根据不同的阈值进行分类,根据分类结果计算得到ROC空间中相应的点,连接这些点就形成ROC curve。ROC curve经过(0,0)(1,1),实际上(0, 0)和(1, 1)连线形成的ROC curve实际上代表的是一个随机分类器。一般情况下,这个曲线都应该处于(0, 0)和(1, 1)连线的上方。如图所示。


用ROC curve来表示分类器的performance很直观好用。可是,人们总是希望能有一个数值来标志分类器的好坏。

于是Area Under roc Curve(AUC)就出现了。顾名思义,AUC的值就是处于ROC curve下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的Performance。

AUC计算工具:

http://mark.goadrich.com/programs/AUC/

P/R和ROC是两个不同的评价指标和计算方式,一般情况下,检索用前者,分类、识别等用后者。

参考链接:

http://www.vanjor.org/blog/2010/11/recall-precision/

http://bubblexc.com/y2011/148/

http://wenku.baidu.com/view/ef91f011cc7931b765ce15ec.html


:Recall,又称“查全率”——还是查全率好记,也更能体现其实质意义。
准确率


“召回率”与“准确率”虽然没有必然的关系(从上面公式中可以看到),在实际应用中,是相互制约的。要根据实际需求,找到一个平衡点。
当我们问检索系统某一件事的所有细节时(输入检索query查询词),Recall指:检索系统能“回忆”起那些事的多少细节,通俗来讲就是“回忆的能力”。“能回忆起来的细节数” 除以 “系统知道这件事的所有细节”,就是“记忆率”,也就是recall——召回率。简单的,也可以理解为查全率。

2、【机器学习理论】第6部分 准确率Accuracy,精确度Precision,召回率Recall,F-Score



准确率召回率是用于信息检索和统计学分类领域的两个度量值,用于评价结果的质量,在机器学习中对于数据进行预测的过程中,同样的使用这些指标来评价预测的结果的质量。

准确率是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率

召回率是指检索出的相关文档数和文档库中的所有的相关文档数的比率,衡量的是检索系统的查全率。 
       1. 正确率 = 正确识别的个体总数 / 识别出的个体总数 
       2. 召回率 = 正确识别的个体总数 / 测试集中存在的个体总数 
       3. F值 = 正确率 * 召回率 * 2 / (正确率 + 召回率) (F 值即为正确率和召回率的调和平均值)

预测值与实际值之间的差异: 
这里写图片描述


假设原始样本中有两类,其中:

1:总共有 P个类别为1的样本,假设类别1为正例。

2:总共有N个类别为0 的样本,假设类别0为负例。

经过分类后:

3:有 TP个类别为1 的样本被系统正确判定为类别1,FN 个类别为1 的样本被系统误判定为类别 0,显然有P=TP+FN;

4:有 FP 个类别为0 的样本被系统误判断定为类别1,TN 个类别为0 的样本被系统正确判为类别 0,显然有N=FP+TN;


精确度(Precision): 
P = TP/(TP+FP) ; 反映了被分类器判定的正例中真正的正例样本的比重。

准确率(Accuracy) 
A = (TP + TN)/(P+N) = (TP + TN)/(TP + FN + FP + TN); 反映了分类器统对整个样本的判定能力——能将正的判定为正,负的判定为负 。

召回率(Recall),也称为 True Positive Rate: 
R = TP/(TP+FN) = 1 - FN/T; 反映了被正确判定的正例占总的正例的比重 。

F-measure or balanced F-score 
F = 2 * 召回率 * 准确率/ (召回率+准确率);这就是传统上通常说的F1 measure。



3、图像分割评价标准 代码 (Image segmentation evaluation metrics code)

图像分割评价标准 代码 (Image segmentation evaluation metrics code)

分享图像分割中用到的多种评价标准的代码,方便使用。若有问题还望各位提醒指正。

强烈建议参考如下两篇文章

Performance measure characterization for evaluating neuroimage segmentation algorithms

Metrics for evaluating 3D medical imagesegmentation: analysis, selection, and tool

main function (输入图像SEG 和 GT 分别为算法分割结果图像、分割金标准图像。对于多类分割的图像,需要先取出SEG和GT中对应的各类,然后使用下述函数单独计算该类。):

[plain]  view plain  copy
  1. % test all segmentation metric functions  
  2. SEG = imread('0.png');  
  3. GT = imread('1.png');  
  4.   
  5. % binarize  
  6. SEG = im2bw(SEG, 0.1);  
  7. GT = im2bw(GT, 0.1);  
  8.   
  9. dr = Dice_Ratio(SEG, GT)  
  10. hd = Hausdorff_Dist(SEG, GT)  
  11. jaccard = Jaccard_Index(SEG, GT)  
  12. apd = Avg_PerpenDist(SEG, GT)  
  13. confm_index = ConformityCoefficient(SEG, GT)  
  14. precision = Precision(SEG, GT)  
  15. recall = Recall(SEG, GT)  

Dice_Ratio:

[plain]  view plain  copy
  1. function dr = Dice_Ratio(SEG, GT)  
  2.     % SEG, GT are the binary segmentation and ground truth areas, respectively.  
  3.     % dice ratio  
  4.     dr = 2*double(sum(uint8(SEG(:) & GT(:)))) / double(sum(uint8(SEG(:))) + sum(uint8(GT(:))));  
  5. end  

Hausdorff_Dist (得到hd 之后,还需要乘以像素的物理距离,才是真正的 Hausdorff 距离)(update: 对于三维体数据中该距离的计算,ITK方面给出的计算流程是:先将体数据匹配到同一物理空间,然后进行计算,这就要求两个体数据必须具备相同的物理参数。所以本代码不适用于三维体数据的计算。):

[plain]  view plain  copy
  1. function hd = Hausdorff_Dist(SEG, GT)  
  2.     % SEG, GT are the binary segmentation and ground truth areas, respectively.  
  3.     % erode element  
  4.     s = cat(3, [0 0 0 ; 0 1 0 ; 0 0 0], [0 1 0 ; 1 1 1 ; 0 1 0], [0 0 0 ; 0 1 0 ; 0 0 0]);  
  5.     % generate boundary  
  6.     Boundary_SEG = logical(SEG) & ~imerode(logical(SEG), s);  
  7.     Boundary_GT = logical(GT) & ~imerode(logical(GT), s);  
  8.     % distance to nearest boundary point  
  9.     Dist_SEG = bwdist(Boundary_SEG, 'euclidean');  
  10.     Dist_GT = bwdist(Boundary_GT, 'euclidean');  
  11.     % distance to another boundary  
  12.     min_S2G = sort(Dist_GT( Boundary_SEG(:) ), 'ascend');  
  13.     min_G2S = sort(Dist_SEG( Boundary_GT(:) ), 'ascend');  
  14.     % hausdorff distance  
  15.     hd = max(min_S2G(end), min_G2S(end));  
  16. end  

Jaccard_Index:

[plain]  view plain  copy
  1. function jaccard = Jaccard_Index(SEG, GT)  
  2.     % SEG, GT are the binary segmentation and ground truth areas, respectively.  
  3.     % jaccard index  
  4.     jaccard = double(sum(uint8(SEG(:) & GT(:)))) / double(sum(uint8(SEG(:) | GT(:))));  
  5. end  

Avg_PerpenDist (得到 apd 之后,还需要乘以像素的物理距离,才是真正的 apd 值):

[plain]  view plain  copy
  1. function apd = Avg_PerpenDist(SEG, GT)  
  2.     % SEG, GT are the binary segmentation and ground truth areas, respectively.  
  3.     % erode element  
  4.     s = cat(3, [0 0 0 ; 0 1 0 ; 0 0 0], [0 1 0 ; 1 1 1 ; 0 1 0], [0 0 0 ; 0 1 0 ; 0 0 0]);  
  5.     % generate boundary  
  6.     Boundary_SEG = logical(SEG) & ~imerode(logical(SEG), s);  
  7.     Boundary_GT = logical(GT) & ~imerode(logical(GT), s);  
  8.     % distance to nearest boundary point  
  9.     Dist_GT = bwdist(Boundary_GT, 'euclidean');  
  10.     % distance to another boundary  
  11.     min_S2G = Dist_GT( Boundary_SEG(:) );  
  12.     % average perpendicular distance from SEG to GT  
  13.     apd = sum(min_S2G(:)) / length(min_S2G(:));  
  14. end  

ConformityCoefficient:

[plain]  view plain  copy
  1. function confm_index = ConformityCoefficient(SEG, GT)  
  2.     % SEG, GT are the binary segmentation and ground truth areas, respectively.  
  3.     % dice ratio  
  4.     dr = 2*double(sum(uint8(SEG(:) & GT(:)))) / double(sum(uint8(SEG(:))) + sum(uint8(GT(:))));  
  5.     % conformity coefficient  
  6.     confm_index = (3*dr - 2) / dr;  
  7. end  

Precision:

[plain]  view plain  copy
  1. function precision = Precision(SEG, GT)  
  2.     % SEG, GT are the binary segmentation and ground truth areas, respectively.  
  3.     % precision  
  4.     precision = double(sum(uint8(SEG(:) & GT(:)))) / double(sum(uint8(SEG(:))));  
  5. end  

Recall:

[plain]  view plain  copy
  1. function recall = Recall(SEG, GT)  
  2.     % SEG, GT are the binary segmentation and ground truth areas, respectively.  
  3.     % recall  
  4.     recall = double(sum(uint8(SEG(:) & GT(:)))) / double(sum(uint8(GT(:))));  
  5. end  

关于precision 和 recall 的wikipedia补图:


你可能感兴趣的:(评价指标)