准确率精确率召回率F1值ROC/AUC整理笔记

Posted 网络星空(luoc)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了准确率精确率召回率F1值ROC/AUC整理笔记相关的知识,希望对你有一定的参考价值。

文章目录


前言

案例代码https://github.com/2012Netsky/pytorch_cnn/blob/main/4_time_series_bikes.ipynb

对于分类问题,机器预测的和实际的还是会有所偏差,所以我们引入以下几个概念来评价分类器的优良。

一、TP、TN、FP、FN概念

首先有关TP、TN、FP、FN的概念。大体来看,TP与TN都是分对了情况,TP是正类,TN是负类。则推断出,FP是把错的分成了对的,而FN则是把对的分成了错的。

我的记忆方法:首先看第一个字母是T则代表分类正确,反之分类错误;然后看P,在T中则是正类,若在F中则实际为负类分成了正的。

【举例】以二分类为例(多分类问题类似 混淆矩阵用于计算一下评价指标) 一个班里有男女生,我们来进行分类,把女生看成正类,男生看成是负类。我们可以用混淆矩阵来描述TP、TN、FP、FN。

混淆矩阵
1相关(Relevant),正类无关(NonRelevant),负类
被检索到(Retrieved)True Positives(TP,正类判定为正类。即女生是女生)False Positives(FP,负类判定为正类,即“存伪”。男生判定为女生)
未被检索到(Not Retrieved)False Negatives(FN,正类判定为负类,即“去真”。女生判定为男生)True Negatives(TN,负类判定为负类。即男生判定为男生)

二、准确率、精确率(精准率)、召回率、F1值

1.准确率(Accuracy)

顾名思义,就是所有的预测正确(正类负类)的占总的比重。

2.精确率(Precision)查准率

即正确预测为正的占全部预测为正的比例。个人理解:真正正确的占所有预测为正的比例。

3.召回率(Recall)查全率

即正确预测为正的占全部实际为正的比例。个人理解:真正正确的占所有实际为正的比例。

4.F1值(H-mean值)

F1值为算数平均数除以几何平均数,且越大越好,将Precision和Recall的上述公式带入会发现,当F1值小时,True Positive相对增加,而false相对减少,即Precision和Recall都相对增加,即F1对Precision和Recall都进行了加权。


公式转化之后为:

三、ROC曲线、AUC值

1.ROC曲线

接收者操作特征曲线(receiver operating characteristic curve),是反映敏感性和特异性连续变量的综合指标,ROC曲线上每个点反映着对同一信号刺激的感受性 下图是ROC曲线例子。

  • 横坐标: 1-Specificity,伪正类率(False positive rate,FPR,FPR=FP/(FP+TN)),预测为正但实际为负的样本占所有负例样本的比例;
  • 纵坐标: Sensitivity,真正类率(True positive rate,TPR,TPR=TP/(TP+FN)),预测为正且实际为正的样本占所有正例样本的比例。

在一个二分类模型中,假设采用逻辑回归分类器,其给出针对每个实例为正类的概率,那么通过设定一个阈值如0.6,概率大于等于0.6的为正类,小于0.6的为负类。对应的就可以算出一组(FPR,TPR),在平面中得到对应坐标点。随着阈值的逐渐减小,越来越多的实例被划分为正类,但是这些正类中同样也掺杂着真正的负实例,即TPR和FPR会同时增大。阈值最大时,对应坐标点为(0,0),阈值最小时,对应坐标点(1,1)。

真正的理想情况,TPR应接近1,FPR接近0,即图中的(0,1)点。ROC曲线越靠拢(0,1)点,越偏离45度对角线越好。

2.AUC值

AUC (Area Under Curve) 被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。**又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围一般在0.5和1之间。**使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

从AUC判断分类器(预测模型)优劣的标准:

  • AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  • AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

一句话来说,AUC值越大的分类器,正确率越高。

四、AP/MAP/PR曲线

①首先介绍一下Recall(召回率/查全率)和Precision(精度/查准率):

以一张图片物体检测为例,检测算法框出N=1000个框,正确检测出物体A的框有k=50个,实际上图片中有M=100个物体A:

  • Recall = k / M

  • Precision = k / N

Recall和Precision之间是有关系的,如果大幅度增加检测框,比如增加100万个框,此时k↑,M→,N↑↑,那么召回率↑、精度↓
于是引入AP,来衡量测试集中某一个类的分类误差,并体现召回率和精度。

②那么接下来,怎么计算AP?

AP = SPR =PR AP #概念针对单个类

mAP = 平均AP针对所有类

总结

首先,需要区分四个概念:TP(True Positive,真阳性),TN(True Negative,真阴性),FP(False Positive,假阳性)以及FN(False Negetive,假阴性)。
举例:有10个人来检测糖尿病,其中1,3,5号有糖尿病,剩下的没有,即1,3,5号为正样本,2,4,6,7,8,9,10为负样本。
我们的糖尿病系统检测结果是,1,3,6号有糖尿病,剩下的没有。

TP:在这10个人中,1号和3号被检测为正样本,同时检测正确,因此TP就等于2;
TN:2,4,7,8,9,10号被检测为负样本,同时检测也是正确的,因此TN就是6
FP:6号病人,虽然被检测为正样本,但是检测结果是错的,因此FP是1 FN:5号病人,
虽然被检测为负样本,但是检测结果也是错的,FN就是1.

  1. 准确率(Accuracy)

准确率计算了预测正确的样本数,占总样本数的比例:
Accuracy = n_correct / n_total = (TP + TN) / (TP + TN + FP + FN)

局限性:
当两类样本数量很不均衡时,accuracy就不能很好的反映模型的性能了。比如,总样本中,负样本占95%,那么即使模型将所有样本都预测成负样本,accuracy还是可以高达95%。但是显然,这个模型是不具备正确区分两类样本的能力的。

  1. 精度(Precision)和召回(Recall)

考虑模型返回的前N个正样本,

精度计算了这N个返回的正样本中,预测正确的比例: Precision = TP / N = TP / (TP + FP) .
召回计算了这N个返回的正样本中预测正确的样本数,占真正总的正样本数的比例: Recall = TP / (TP + FN)
通常,为了使精度变高,模型会趋于保守,只有非常肯定某个样本是正样本时,才将其作为正样本输出,但是这样会使得很多相对不肯定的正样本被错误判断为负样本,从而降低召回。因此,精度和召回不能只考虑单一的一方面,这也就有了P-R曲线:
P-R曲线
综合考虑了精度与召回,其横轴是召回,纵轴是精度。通过调节阈值,大于该阈值的为正样本,小于该阈值的为负样本,使得召回可以从0,0.1,0.2一直取到1,计算出每个召回对应的精度,就可以画出一条曲线,称为P-R曲线。下图的b和c就是两个P-R曲线,可以看到,随着recall不断增加,precision是在下降的。
F1值是另一个综合考虑精度和召回的指标,其计算公式为: F1 = 2PR/(P+R),也就是精度和召回的调和平均值。

  1. ROC曲线

    ROC曲线全称Receiver Operating Characteristic Curve(受试者工作特征曲线)。其横坐标为FPR(False Positive Rate,假阳性率),纵坐标为TPR(True Positive Rate,真阳性率)。计算方法为:
    FPR = FP / (FP + TN) = FP / Neg,
    TPR = TP / (TP + FN) = TP / Pos = Recall.
    绘制ROC曲线的方法与P-R曲线类似,通过调节阈值,绘制出不同的FPR及其对应的TPR。
    AUC指的是ROC曲线下的面积大小,通过对ROC曲线进行积分,就可以计算得到AUC。AUC取之在0.5~1之间(如果小于0.5,把正负样本预测对调一下就行了),AUC越大,表明模型把真正的正样本排的越靠前,相应的性能就越好。

  2. ROC曲线和P-R曲线比较

如下图,ac是ROC曲线,bd是P-R曲线,可以看到,ROC曲线的横纵坐标走势是相同的,而P-R曲线则是反着的。
不管是Precision,还是Recall,其实P-R曲线只考虑了正样本(预测对多少个正样本,以及找出来多少正样本),而ROC曲线即考虑了正样本(TPR,找出来多少正样本),也考虑到了负样本(找错了多少负样本)。当正负样本比例发生变化时,P-R曲线的形状会发生较大的变化,而ROC曲线则比较稳定。
因此,ROC曲线能够更加稳定的反映模型本身的好坏,适用于更多的场景。但是,当希望观测到特定数据集上的表现时,P-R曲线则可以更直观的反映其性能。

  1. COCO中的mAP

这个问题困扰我好久了,今天终于搞得差不多了。检测(或者实例分割)中的mAP,也就是mean Average Precision,其实跟二分类的AP很像。不同之处在于,检测结果不仅要给出bounding box,还要给出类别;第二,bounding box跟ground truth的框不可能完全重合,需要定义怎样算预测对了,怎样算预测错了。

AP, AP@X
我们用预测的框和gt的IoU(交并比)来衡量预测的正确性,设置一个阈值(比如0.5),如果IoU大于0.5,则认为这个框预测对了,作为正样本输出(True);否则,就是负样本(False)。
假设某一类一共有5个ground truth
object,我们预测出了10个框,将这些框按照置信度(检测网络一般每个框会输出一个置信度)排序,结果如下:

第一个框,预测正确,此时precision就是1,recall是1/5=0.2.
到第三个框,预测错误,此时precision是2/3=0.67,recall是2/5=0.4, 。。。
这样,我们可以得到一系列recall对应的precision,画出它的P-R曲线。这里又一个对precision进行修正的过程,也就是下图的绿色折线。将每个Recall
r对应的precision,修正为recall大于等于r时,能达到的最大的precision。

从recall=0,到recall=1,将这11个precision加起来求平均,就是这一类的average precision。

所有类的AP平均,得到的就是IoU阈值为0.5的AP,即AP@50。有的地方也把这个值称为mAP,需要看具体语境。

mAP 上面我们得到的是某一个IoU作为阈值的AP,也就是AP@X。以0.5作为起点,0.05步长,0.95终点,我们可以得到0.5,
0.55, 0.6, 。。。, 0.95一共10个值,将这10个值分别作为IoU阈值,就能得到AP@50, AP@55, 。。。,AP@95. mAP = (AP@50+AP@55+…+AP@95)/10 这个结果,对应的就是下表里的AP。 YOLOv3

一文让你彻底理解准确率,精准率,召回率,真正率,假正率,ROC/AUC

参考资料:https://zhuanlan.zhihu.com/p/46714763


 

ROC/AUC作为机器学习的评估指标非常重要,也是面试中经常出现的问题(80%都会问到)。其实,理解它并不是非常难,但是好多朋友都遇到了一个相同的问题,那就是:每次看书的时候都很明白,但回过头就忘了,经常容易将概念弄混。还有的朋友面试之前背下来了,但是一紧张大脑一片空白全忘了,导致回答的很差。

我在之前的面试过程中也遇到过类似的问题,我的面试经验是:一般笔试题遇到选择题基本都会考这个率,那个率,或者给一个场景让你选用哪个。面试过程中也被问过很多次,比如什么是AUC/ROC?横轴纵轴都代表什么?有什么优点?为什么要使用它?

我记得在我第一次回答的时候,我将准确率,精准率,召回率等概念混淆了,最后一团乱。回去以后我从头到尾梳理了一遍所有相关概念,后面的面试基本都回答地很好。现在想将自己的一些理解分享给大家,希望读完本篇可以彻底记住ROC/AUC的概念。

▌什么是性能度量?

我们都知道机器学习要建模,但是对于模型性能的好坏(即模型的泛化能力),我们并不知道是怎样的,很可能这个模型就是一个差的模型,泛化能力弱,对测试集不能很好的预测或分类。那么如何知道这个模型是好是坏呢?我们必须有个评判的标准。为了了解模型的泛化能力,我们需要用某个指标来衡量,这就是性能度量的意义。有了一个指标,我们就可以对比不同模型了,从而知道哪个模型相对好,那个模型相对差,并通过这个指标来进一步调参逐步优化我们的模型。

当然,对于分类和回归两类监督学习,分别有各自的评判标准。本篇我们主要讨论与分类相关的一些指标,因为AUC/ROC就是用于分类的性能度量标准。

 

▌混淆矩阵,准确率,精准率,召回率

1. 混淆矩阵

在介绍各个率之前,先来介绍一下混淆矩阵。如果我们用的是个二分类的模型,那么把预测情况与实际情况的所有结果两两混合,结果就会出现以下4种情况,就组成了混淆矩阵。

技术图片

由于1和0是数字,阅读性不好,所以我们分别用P和N表示1和0两种结果。变换之后为PP,PN,NP,NN,阅读性也很差,我并不能轻易地看出来预测的正确性与否。因此,为了能够更清楚地分辨各种预测情况是否正确,我们将其中一个符号修改为T和F,以便于分辨出结果。

P(Positive):代表1

N(Negative):代表0

T(True):代表预测正确

F(False):代表错误

按照上面的字符表示重新分配矩阵,混淆矩阵就变成了下面这样:

技术图片

将这种表示方法总结如下,可分为两部分:

技术图片

 

因此对于这种表示方法可以这么简单的理解:先看 ①预测结果(P/N),再根据②实际表现对比预测结果,给出判断结果(T/F)。按这个顺序理解,这四种情况就很好记住了。

 

TP:预测为1,预测正确,即实际1

FP:预测为1,预测错误,即实际0

FN:预测为0,预测错确,即实际1

TN:预测为0,预测正确即,实际0

 

2. 准确率

既然是个分类指标,我们可以很自然的想到准确率,准确率的定义是预测正确的结果占总样本的百分比,其公式如下:

准确率=(TP+TN)/(TP+TN+FP+FN)

技术图片

虽然准确率可以判断总的正确率,但是在样本不平衡的情况下,并不能作为很好的指标来衡量结果。举个简单的例子,比如在一个总样本中,正样本占90%,负样本占10%,样本是严重不平衡的。对于这种情况,我们只需要将全部样本预测为正样本即可得到90%的高准确率,但实际上我们并没有很用心的分类,只是随便无脑一分而已。这就说明了:由于样本不平衡的问题,导致了得到的高准确率结果含有很大的水分。即如果样本不平衡,准确率就会失效。

正因为如此,也就衍生出了其它两种指标:精准率和召回率。

 

3. 精准率

精准率(Precision)又叫查准率,它是针对预测结果而言的,它的含义是在所有被预测为正的样本中实际为正的样本的概率,意思就是在预测为正样本的结果中,我们有多少把握可以预测正确,其公式如下:

精准率=TP/(TP+FP)

技术图片

精准率和准确率看上去有些类似,但是完全不同的两个概念。精准率代表对正样本结果中的预测准确程度,而准确率则代表整体的预测准确程度,既包括正样本,也包括负样本。

 

4. 召回率

召回率(Recall)又叫查全率,它是针对原样本而言的,它的含义是在实际为正的样本中被预测为正样本的概率,其公式如下:

精准率=TP/(TP+FN)

技术图片

 

召回率的应用场景:比如拿网贷违约率为例,相对好用户,我们更关心坏用户,不能错放过任何一个坏用户。因为如果我们过多的将坏用户当成好用户,这样后续可能发生的违约金额会远超过好用户偿还的借贷利息金额,造成严重偿失。召回率越高,代表实际坏用户被预测出来的概率越高,它的含义类似:宁可错杀一千,绝不放过一个。

 

5. 精准率和召回率的关系,F1分数

通过上面的公式,我们发现:精准率和召回率的分子是相同,都是TP,但分母是不同的,一个是(TP+FP),一个是(TP+FN)。两者的关系可以用一个P-R图来展示:

技术图片

 

如何理解P-R(查准率-查全率)这条曲线?

有的朋友疑惑:这条曲线是根据什么变化的?为什么是这个形状的曲线?其实这要从排序型模型说起。拿逻辑回归举例,逻辑回归的输出是一个0到1之间的概率数字,因此,如果我们想要根据这个概率判断用户好坏的话,我们就必须定义一个阈值。通常来讲,逻辑回归的概率越大说明越接近1,也就可以说他是坏用户的可能性更大。比如,我们定义了阈值为0.5,即概率小于0.5的我们都认为是好用户,而大于0.5都认为是坏用户。因此,对于阈值为0.5的情况下,我们可以得到相应的一对查准率和查全率。

但问题是:这个阈值是我们随便定义的,我们并不知道这个阈值是否符合我们的要求。因此,为了找到一个最合适的阈值满足我们的要求,我们就必须遍历0到1之间所有的阈值,而每个阈值下都对应着一对查准率和查全率,从而我们就得到了这条曲线。

有的朋友又问了:如何找到最好的阈值点呢?首先,需要说明的是我们对于这两个指标的要求:我们希望查准率和查全率同时都非常高。但实际上这两个指标是一对矛盾体,无法做到双高。图中明显看到,如果其中一个非常高,另一个肯定会非常低。选取合适的阈值点要根据实际需求,比如我们想要高的查全率,那么我们就会牺牲一些查准率,在保证查全率最高的情况下,查准率也不那么低。

F1分数

但通常,如果想要找到二者之间的一个平衡点,我们就需要一个新的指标:F1分数。F1分数同时考虑了查准率和查全率,让二者同时达到最高,取一个平衡。F1分数的公式为 = 2*查准率*查全率 / (查准率 + 查全率)。我们在图中看到的平衡点就是F1分数得来的结果。

 

▌ROC/AUC的概念

 

1. 灵敏度,特异度,真正率,假正率

在正式介绍ROC/AUC之前,我们还要再介绍两个指标,这两个指标的选择也正是ROC和AUC可以无视样本不平衡的原因。这两个指标分别是:灵敏度和(1-特异度),也叫做真正率(TPR)和假正率(FPR)。

灵敏度(Sensitivity) = TP/(TP+FN)

特异度(Specificity) = TN/(FP+TN)

 

  • 其实我们可以发现灵敏度和召回率是一模一样的,只是名字换了而已。
  • 由于我们比较关心正样本,所以需要查看有多少负样本被错误地预测为正样本,所以使用(1-特异度),而不是特异度。

 

真正率(TPR) = 灵敏度 = TP/(TP+FN)

假正率(FPR) = 1- 特异度 = FP/(FP+TN)

 

下面是真正率和假正率的示意,我们发现TPR和FPR分别是基于实际表现1和0出发的,也就是说它们分别在实际的正样本和负样本中来观察相关概率问题。正因为如此,所以无论样本是否平衡,都不会被影响。还是拿之前的例子,总样本中,90%是正样本,10%是负样本。我们知道用准确率是有水分的,但是用TPR和FPR不一样。这里,TPR只关注90%正样本中有多少是被真正覆盖的,而与那10%毫无关系,同理,FPR只关注10%负样本中有多少是被错误覆盖的,也与那90%毫无关系,所以可以看出:如果我们从实际表现的各个结果角度出发,就可以避免样本不平衡的问题了,这也是为什么选用TPR和FPR作为ROC/AUC的指标的原因。

技术图片

 

或者我们也可以从另一个角度考虑:条件概率。我们假设X为预测值,Y为真实值。那么就可以将这些指标按条件概率表示:

精准率 = P(Y=1 | X=1)

召回率 = 灵敏度 = P(X=1 | Y=1)

特异度 = P(X=0 | Y=0)

 

从上面三个公式看到:如果我们先以实际结果为条件(召回率,特异度),那么就只需考虑一种样本,而先以预测值为条件(精准率),那么我们需要同时考虑正样本和负样本。所以先以实际结果为条件的指标都不受样本不平衡的影响,相反以预测结果为条件的就会受到影响。

 

2. ROC(接受者操作特征曲线)

ROC(Receiver Operating Characteristic)曲线,又称接受者操作特征曲线。该曲线最早应用于雷达信号检测领域,用于区分信号与噪声。后来人们将其用于评价模型的预测能力,ROC曲线是基于混淆矩阵得出的。

 

ROC曲线中的主要两个指标就是真正率和假正率,上面也解释了这么选择的好处所在。其中横坐标为假正率(FPR),纵坐标为真正率(TPR),下面就是一个标准的ROC曲线图。

技术图片

 

ROC曲线的阈值问题

与前面的P-R曲线类似,ROC曲线也是通过遍历所有阈值来绘制整条曲线的。如果我们不断的遍历所有阈值,预测的正样本和负样本是在不断变化的,相应的在ROC曲线图中也会沿着曲线滑动。

 

技术图片

 

如何判断ROC曲线的好坏?

改变阈值只是不断地改变预测的正负样本数,即TPR和FPR,但是曲线本身是不会变的。那么如何判断一个模型的ROC曲线是好的呢?这个还是要回归到我们的目的:FPR表示模型虚报的响应程度,而TPR表示模型预测响应的覆盖程度。我们所希望的当然是:虚报的越少越好,覆盖的越多越好。所以总结一下就是TPR越高,同时FPR越低(即ROC曲线越陡),那么模型的性能就越好。参考如下动态图进行理解。

技术图片

 

ROC曲线无视样本不平衡

前面已经对ROC曲线为什么可以无视样本不平衡做了解释,下面我们用动态图的形式再次展示一下它是如何工作的。我们发现:无论红蓝色样本比例如何改变,ROC曲线都没有影响。

技术图片

 

3. AUC(曲线下的面积)

为了计算 ROC 曲线上的点,我们可以使用不同的分类阈值多次评估逻辑回归模型,但这样做效率非常低。幸运的是,有一种基于排序的高效算法可以为我们提供此类信息,这种算法称为曲线下面积(Area Under Curve)。

 

比较有意思的是,如果我们连接对角线,它的面积正好是0.5。对角线的实际含义是:随机判断响应与不响应,正负样本覆盖率应该都是50%,表示随机效果。ROC曲线越陡越好,所以理想值就是1,一个正方形,而最差的随机判断都有0.5,所以一般AUC的值是介于0.5到1之间的。

 

AUC的一般判断标准

0.5 - 0.7:效果较低,但用于预测股票已经很不错了

0.7 - 0.85:效果一般

0.85 - 0.95:效果很好

0.95 - 1:效果非常好,但一般不太可能

 

AUC的物理意义

曲线下面积对所有可能的分类阈值的效果进行综合衡量。曲线下面积的一种解读方式是看作模型将某个随机正类别样本排列在某个随机负类别样本之上的概率。以下面的样本为例,逻辑回归预测从左到右以升序排列:

技术图片

 

▌ROC/AUC的Python实现

 

Python中我们可以调用sklearn机器学习库的metrics进行ROC和AUC的实现,简单的代码实现部分如下:

from sklearn import metrics
from sklearn.metrics import auc 
import numpy as np
y = np.array([1, 1, 2, 2])  
scores = np.array([0.1, 0.4, 0.35, 0.8])  
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
metrics.auc(fpr, tpr) 

0.75

 

以上就是所有关于ROC和AUC的讲解和实现,auc面积是0.75。如今的我再去面试,最希望面试官问我这个问题了,希望看过的朋友也可以彻底理解和记住ROC/AUC,以及各种指标率的概念。

 

以上是关于准确率精确率召回率F1值ROC/AUC整理笔记的主要内容,如果未能解决你的问题,请参考以下文章

机器学习分类问题指标——Accuracy,PrecisionRecallF1,P-R,ROC,AUC(以鸢尾花为例)

『NLP学习笔记』Sklearn计算准确率精确率召回率及F1 Score

一文让你彻底理解准确率,精准率,召回率,真正率,假正率,ROC/AUC

sklearn中计算准确率召回率精确度F1值

F1一ScOre和精确率成正比吗

混淆矩阵准确率精确率/查准率召回率/查全率F1值ROC曲线的AUC值