参考链接:
https://blog.csdn.net/forever__1234/article/details/88849854 代码实现
https://blog.csdn.net/qq_16540387/article/details/81912289
目录
1. precision(查准率)、recall(查全率)
对于二分类问题,可将样例 根据其真实类别与学习器预测类别的组合划分为:
- TP (True Positive): 预测为真,实际为真
- FP (False Positive): 预测为真,实际为假
- TN(True Negative): 预测为假,实际为假
- FN (False Negative):预测为假,实际为真
令 TP、FP、TN、FN分别表示其对应的样例数,则显然有 TP + FP + TN + FN = 样例总数
分类结果的 “混淆矩阵” 如下:
实际为真 T | 实际为假 F | |
---|---|---|
预测为正例 P | TP (预测为1,实际为1) | FP (预测为1,实际为0) |
预测为负例 N | FN (预测为0,实际为1) | TN (预测为0,实际为0) |
( 查 准 率 ) P r e c i s i o n = T P T P + F P ( 预 测 的 好 瓜 中 有 多 少 是 真 的 好 瓜 ) (查准率)Precision = \frac{TP}{TP + FP} \\ \\ \\ {\color{Purple}{(预测的好瓜中有多少是真的好瓜)}} (查准率)Precision=TP+FPTP(预测的好瓜中有多少是真的好瓜)
( 查 全 率 ) R e c a l l = T P T P + F N ( 所 有 真 正 的 好 瓜 中 有 多 少 被 真 的 挑 出 来 了 ) (查全率)Recall = \frac{TP}{TP + FN} \\ \\ \\ {\color{Purple}{(所有真正的好瓜中有多少被真的挑出来了)}} (查全率)Recall=TP+FNTP(所有真正的好瓜中有多少被真的挑出来了)
一般查准率越高查全率越低。
因为要想查准率高我们就得设置一个较高的阈值,
这里阈值指的是判断是否为正样本的阈值,比如判断是否为欺诈用户,一个判断标准是当月贷款的数目,把该属性的阈值设定的越高,过滤出的结果中为欺诈用户的可能性越高,
但是可能就会漏掉一些贷款量较低的欺诈用户,从而导致查全率较低。
应用场景
不同的场景下对于查准率和查全率的要求也是不一样。
比如推荐系统中比较倾向于高查准率低查全率,为了尽可能的不影响用户体验实现更精准推荐。
而抓捕逃犯的系统中更需要高的查全率,误抓也不能漏抓。
2. P-R曲线
一般来说,查准率高时,查全率往往偏低,而查全率高时,查准率往往偏低。通常只有在一些简单任务中,才可能使得查全率和查准率都很高。在很多情况,我们可以根据学习器的预测结果,得到对应预测的 confidence scores 得分(有多大的概率是正例),按照得分对样例进行排序,排在前面的是学习器认为”最可能“是正例的样本,排在最后的则是学习器认为“最不可能”是正例的样本。每次选择当前第 i ii 个样例的得分作为阈值 (1<=i<=样例个数) (1<= i <= 样例个数)(1<=i<=样例个数),计算当前预测的前 i ii 为正例的查全率和查准率。然后以查全率为横坐标,查准率为纵坐标作图,就得到了我们的查准率-查全率曲线: P-R曲线
在一个识别图片是否是车,这样一个二分类任务中,我们训练好了一个模型。假设测试样例有20个,用训练好模型测试可以得到如下测试结果: 其中 id (序号),confidence score (置信度、得分) 和 ground truth label (类别标签)
接下来对 confidence score 排序,得到:
然后我们开始计算P-R曲线值,将排序后的样例,从 i=0 到 i=20 遍历,每次将第 i个样例的 confidence scores 做为阈值,前 i 个预测为正例时,计算对应的 Precision 和 Recall。
例如,当 i=1 i = 1i=1 时,预测了一个做为正例,其余的都预测为反例,此时的阈值为 0.91。 此时的 TP=1 就是指第4张,FP=0,FN=5 为第2、9、16、7、20 的图片,TN=15为13,19,6,1,18,5,15,10,17,12,14,8,11,3。Precision = TP/(TP+FP) = 1/(1+0) = 0 ;Recall = TP/(TP+FN) = 1/(1+5)=1/6 。接着计算当 i=2 i = 2i=2 时,以此类推…
例如,使用训练好的模型得到所有测试样本的confidence score,每一类(如car)的confidence score保存到一个文件中。假设某一类有20个测试样本,每个的id,confidence score和ground truth label如下,右图是对confidence score排过序之后的:
上图比较直观,整个方框代表了整个数据集,然后我们选出置信度比较高的进行统计,用于测评模型的好坏。也就是说,圆圈内(true positives + false positives)是对应的就是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%。
如果没有那么明确场景,比如P和R需要哪一个更高,可以通过P-R曲线来选取一个双高的点。
对于不同的阈值下模型预测由不同的P和R,遍历所有可能的阈值,将对用的P和R画在二维坐标系上得到P-R曲线。
没有明确的场景时,如果要比较模型的好坏,比如图中的A,B,C模型,主要有下面的方法:
- P-R曲线包含的面积的大小,包含的面积越大表示模型效果越好。
- BEP度量,由于面积不好求,用“平衡点”(Break-Even-Point,简称BEP)来衡量,即P=R的点,谁大谁优。
- F1度量,F1度量是P-R的加权调和平均,并由一个参数β来决定P与R的相对重要性
β=1时即调和平均数。
3. ROC曲线与AUC
ROC 全称是“受试者工作特征”(Receiver Operating Characteristic)。ROC 曲线的面积就是 AUC(Area Under the Curve)。AUC用于衡量“二分类问题”机器学习算法性能(泛化能力)。
思想:和计算 P-R 曲线方法基本一致,只是这里计算的是 真正率(True Positive rate) 和 假正率(False Positive rate),以 FPR 为横轴,TPR 为纵轴,绘制的曲线就是 ROC 曲线,ROC 曲线下的面积,即为 AUC
ROC 曲线x轴表示的是假正率,y轴表示的是真正率。
ROC底部的面积被称为AUC。
ROC曲线用来衡量分类器的好坏,ROC曲线越是靠左上角,说明分类器越好;
AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常采用AUC评价分类性能的原因。
当数据集中正负样本数分布不均衡时P-R曲线比较常用
否则ROC曲线比较常用, 都是为了选出好的分类器
4.AP(平均精度)、mAP(平均精度均值)
4.1 AP
首先,AP也是对所有图片内的某一类来说的。
以PASCAL VOC CHALLENGE为基准,AP以2010年为界,前后有两种算法,现在书留的是第二种,第一种和第二种相似,简单介绍一下。
AP就是Precision-recall 曲线下面的面积,通常来说一个越好的分类器,AP值越高。
第一种算法
首先设定一组recall阈值,[0, 0.1, 0.2, …, 1]。然后对每个recall阈值从小到大取值,同时计算当取大于该recall阈值时top-n所对应的最大precision。这样,我们就计算出了11个precision。AP即为这11个precision的平均值。这种方法英文叫做11-point interpolated average precision。
第二种算法
该方法类似,新的计算方法假设这N个样本中有M个正例,那么我们会得到M个recall值(1/M, 2/M, …, M/M),对于每个recall值r,该recall阈值时top-n所对应的最大precision,然后对这M个precision值取平均即得到最后的AP值。
这是一张排过序的confidence score,如图所示top20中,1,2,6,7,11,16为正样本,从上往下,当top n 变化,precision也随之线性变化,当遇到正样本时,recall才变化,遇到负样本时,recall不变,当前最大precision也不变。
相应的Precision-Recall曲线(这条曲线是单调递减的)如下 :
4.2 mAP
mAP是多个类别AP的平均值。这个mean的意思是对每个类的AP再求平均,得到的就是mAP的值,mAP的大小一定在[0,1]区间,越大越好。该指标是目标检测算法中最重要的一个。
计算比较简单。C为类数目:
5. IoU(Intersection over Union)
IoU这一值,可以理解为系统预测出来的框与原来图片中标记的框的重合程度。 IoU是由预测的包围盒与地面真相包围盒之间的重叠区域(交集),除以它们之间的联合区域(并集),其中P代表预测框,gt代表真值框:
值得注意的是,IoU值超过0.5时,主观效果已经比较不错。
6. NMS(非极大值抑制)
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、B、C的重叠度,重叠度大于给定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。
需要注意的是:NMS一次处理一个类别,如果有N个类别,就需要执行N次。
eg:在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
7. 混淆矩阵 (Confusion Matrix)
混淆矩阵中的横轴是模型预测的类别数量统计,纵轴是数据真实标签的数量统计。
如有150个样本数据,预测为1,2,3类各为50个。分类结束后得到的混淆矩阵为:
每一行之和表示该类别的真实样本数量,每一列之和表示被预测为该类别的样本数量,第一行说明有43个属于第一类的样本被正确预测为了第一类,有两个属于第一类的样本被错误预测为了第二类。
对角线,表示模型预测和数据标签一致的数目,所以对角线之和除以测试集总数就是准确率。对角线上数字越大越好,在可视化结果中颜色越深,说明模型在该类的预测准确率越高。如果按行来看,每行不在对角线位置的就是错误预测的类别。总的来说,我们希望对角线越高越好,非对角线越低越好。
漏警概率(Missing Alarm)
MA = FN/(TP + FN) = 1–TP/T = 1-R;(R是查全率)
反映有多少个正例被漏判了
虚警概率(False Alarm)
FA = FP/(TP + FP) = 1–P;(P查准率)
反映被判为正例样本中,有多少个是负例。
8.BN
BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。