准确率(Accuracy), 精确率(Precision), 召回率(Recall)

       对于分类问题而言,一个模型训练好了之后需要判断模型的性能好坏,常用的评价指标有这些:Accuracy(准确率),Precision(精确率,又叫查准率),Recall(召回率,又叫查全率)

先以最简单也是最常见的二分类为例说明:

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

Accuracry: 表示预测正确,即预测正确的结果占总样本的百分比  ----分类正确的样本个数/总样本数

这个例子中:

准确率(Accuracy):对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。也就是损失函数是0-1损失时测试数据集上的准确率

A = (20(正确识别为女生)+50(未挑选的50人,被认为正确识别为男生)) / 100(总样本数) = 70%

精确率(Precision):预测正确的结果占总样本的百分比

P = 20(正确识别为女生) / (20(正确识别为女生)+30(男生被错误识别为女生的)) = 40%

召回率(Recall):在所有被预测为正的样本中实际为应该被检测为正的概率

R = 20(正确识别为女生) / (20(总样本集中需要被识别为女生的人数)) = 100%

另一个例子:

讨论accuracy是不是合理的?对于一个分类模型来说,你判断的准的多的话,肯定很好,但是设想下面这样一个问题:

我要识别一个人是不是感染了某种病,这个识别可以转换成二分类问题,即判断:是否有病。

  现在找来了1000个人进行分类,其中有1个人是有病的。假如我判断所有的人都没有发病,那么accuracy是多少?99.9%!这看上去超级高,但是有意义吗?并没有。

  另一方面,在是否有病的二分类问题中,我的目标其实是找出有病的人,但是accuracy包含了正确找出的有病的人,和正确找出的没病的人。如果我只想要看这个分类器正确找出有病的人的能力怎么样怎么办呢?accuracy是没办法满足的。

    所以可以总结一下。1. accuracy实际上是不管我的分类目标的,accuracy只计算每一类分类正确的数量然后加总计算百分比。2. 对于类别极不均衡问题,就会给人以分类效果很好的错觉,但其实分类器可能一点用也没有。

    反过来说,accuracy适合什么样的情况呢?1. 不需要具体筛选出来某一类的分类问题,比如我想区分红色和绿色,我没有特别的偏好,就是希望红色和绿色都能分对,那就可以。而不是我就想选出全部的绿色、我只关心选出来的绿色准不准。2. 类别是均衡的,不会红色10个点,绿色10000个点。那么多少算均衡呢?其实这个没有绝对的指标,我个人认为可以按照这个标准判断:如果把所有样本都划为多的那一类,不超过80%(或者任何你的觉得分类器还行的心理阈值,90%,70%等等)

 好了,接下来说,对于那个检测是否有病的例子(有分类目标;类别不均衡),应该用什么指标呢?应该用Precision, Recall, F-Score。在讲解这三个概念之前,需要明确下面几个概念

对于每一个分类问题,模型训练结束之后进行测试,会出现如下四种情况:

 

以FP为例,本来没病的,一检测是阳性,那可不就是假阳性嘛,false positive。

Precision:针对预测结果而言,在所有被预测为正的样本中实际为正的概率: 

              Precision= TP/(TP+FP)

Recall:针对原样本而言,表示在实际为正的样本中被预测为正样本的概率

              Recall =TP/(TP+FN)

Accuracry:准确率表示预测正确,即预测正确的结果占总样本的百分比

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

   可以发现,precision和recall的分子都是TP,即正确识别出的目标类别。从这一点我们就可以看出,这两个指标是用在有目标类别上的,都是围着正确识别出的目标类别转的。

   在检测是否有病的问题中,如果分类器简单粗暴的说大家都没病,那TP其实是0,那么precision和recall都是0,这样问题就会一下子暴露出来。

   precision的分母是所有检测出来positive的,即TP + FP, 衡量的是一个分类器挑出来的东西中,是我们要的东西的比例。在检测是否有病的问题中,就是你挑出来了病人,但是是不是有好多不是病人也被你认为是病人?如果是的话,precision分数就会很低。

   recall的分母是所有事实上是positive的,即TP + FN , 衡量的是一个分类器挑出来的我们想要的东西占实际上所有我们想要的东西的比例。在检测是否有病的问题中,就是你挑出来了病人,但是一共我有好多病人,是不是都给你涵盖了,你有没有放过好多其实是病人的人?如果是的话,recall分数就会很低。

可以发现,precison和recall压根都没用到TN,即实际上没病、检测出来也没病的人,因为这个问题中,我们根本不关心没病的人。从另一种程度上,这是Precision和recall对于我们部分数据的未利用和忽略,相比之下,accuracy是用到了全部的数据,其实

下面举一些分类器检测性能的例子,来看不同的recall和precision。

还是之前的检测是否有病问题,10000人里有10个人有病,

1、我的一号分类器检测出来50个人有病,其中包含了这10个真正有病的人,那么recall = 10/10=100%, precision = 10/50=20%。

2、 我的二号分类器检测出来的50个人里没有包含任何真正有病的人呢?recall =precision =0.

3、我的三号分类器检测出来了5个人,这5个人都是有病,recall =5/10=50%, precison =5/5=100%.

4、我的四号分类器检测出来10个人,5个人有病,5个人没病,recall=precision=50%

我该选择哪一个分类器呢?

具体情况具体看待,如果这是很严重的疾病,必须早发现早治疗,并且误检之后再次检测的成本也不大,那我们倾向于不放过任何一个有病的人,即recall尽可能大的情况下选择precision最大的。同样适用于导弹检测、信用卡欺诈检测和任何非常严重最好一次都不要发生的事情。

那如果是垃圾邮件呢?我个人认为,如果把重要邮件误检测为垃圾邮件的代价可能会很大,因此我宁愿放过一些垃圾邮件也不愿意误把重要邮件当成垃圾邮件,因此precision要尽可能高,recall可以低一点。同样适用于任何有漏网之鱼没那么严重,但如果错当成了鱼就不好的事情,比如法律上的疑罪从无。

参考文章:https://blog.csdn.net/u014380165/article/details/77493978 

     https://zhuanlan.zhihu.com/p/45485198 

     https://zhuanlan.zhihu.com/p/37246394

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值