-
2021-03-19 14:59:41
指标
Precision查准率。
Recall查全率。
mAP和IOU以及置信度阈值关系
TP: IoU>0.5的检测框数量(同一Ground Truth只计算一次)
FP: IoU<=0.5的检测框,或者是检测到同一个GT的多余检测框的数量增加置信度阈值,我们会对预测值更有信心,即增加了查准率。但这样会降低查全率。(High Precision, Low Recall)
减小置信度阈值,则模型放过的真例就变少,查全率就增加。(Low Precision, High Recall)
进而得到PR曲线上不同的点PR曲线:设置不通的阈值(score)可以得到不同的(P,R)点,将这些点连接起来就是PR曲线
PR曲线中的P代表的是precision(精准率),R代表的是recall(召回率),其代表的是精准率与召回率的关系,一般情况下,将recall设置为横坐标,precision设置为纵坐标。PR曲线下围成的面积即AP,所有类别AP平均值即Map
如果其中一个学习器的PR曲线A完全包住另一个学习器B的PR曲线,则可断言A的性能优于B。但是A和B发生交叉,那性能该如何判断呢?我们可以根据曲线下方的面积大小来进行比较,但更常用的是平衡点F1。平衡点(BEP)是P=R时的取值(斜率为1),F1值越大,我们可以认为该学习器的性能较好。F1的计算如下所示:F1 = 2 * P * R /( P + R )- 非VOC2007的算法:对于某类下全部的真实目标,将IOU>=0.5 的作为检测出来的目标,取不同的confidence 阈值计算对应的precision 和recall,对于每个recall,取其对应的最大precision,对这些precision 求平均即为该类的AP 值。所有类的AP 值求平均即为mAP。
- 在评测时,COCO评估了在不同的交并比(IoU)[0.5:0.05:0.95]共10个IoU下的AP,并且在最后以这些阈值下的AP平均作为结果,记为mAP@[.5, .95]。而在Pascal VOC中,检测结果只评测了IOU在0.5这个阈值下的AP值。
因此相比VOC而言,COCO数据集的评测会更加全面:不仅评估到物体检测模型的分类能力,同时也能体现出检测模型的定位能力。因此在IoU较大如0.8时,预测框必须和真实的框具有很大的重叠比才能被视为正确。
要计算mAP必须先绘出各类别PR曲线,计算出AP。而如何采样PR曲线,VOC采用过两种不同方法。参见:The PASCAL Visual Object Classes Challenge 2012 (VOC2012) Development Kit
- 在VOC2010以前,只需要选取当Recall >= 0, 0.1, 0.2, …, 1共11个点时的Precision最大值,然后AP就是这11个Precision的平均值
- 在VOC2010及以后,需要针对每一个不同的Recall值(包括0和1),选取其大于等于这些Recall值时的Precision最大值,然后计算PR曲线下面积作为AP值。
mAP计算示例:假设,对于Aeroplane类别,我们网络有以下输出(BB表示BoundingBox序号,IoU>0.5时GT=1):
BB | confidence | GT
BB1 | 0.9 | 1
BB2 | 0.9 | 1
BB1 | 0.8 | 1
BB3 | 0.7 | 0
BB4 | 0.7 | 0
BB5 | 0.7 | 1
BB6 | 0.7 | 0
BB7 | 0.7 | 0
BB8 | 0.7 | 1
BB9 | 0.7 | 1因此,我们有 TP=5 (BB1, BB2, BB5, BB8, BB9), FP=5 (重复检测到的BB1也算FP)。除了表里检测到的5个GT以外,我们还有2个GT没被检测到,因此: FN = 2. 这时我们就可以按照Confidence的顺序给出各处的PR值,如下:
rank=1 precision=1.00 and recall=0.14(recall = TP / (TP+FN) , 到rank=1 时,预测到的TP= 1 , 针对假设,GT有7个,因此recall = 1/7 = 0.14)
rank=2 precision=1.00 and recall=0.29
rank=3 precision=0.66 and recall=0.29
rank=4 precision=0.50 and recall=0.29
rank=5 precision=0.40 and recall=0.29
rank=6 precision=0.50 and recall=0.43
rank=7 precision=0.43 and recall=0.43
rank=8 precision=0.38 and recall=0.43
rank=9 precision=0.44 and recall=0.57
rank=10 precision=0.50 and recall=0.71对于上述PR值,如果我们采用:
- VOC2010之前的方法,我们选取Recall >= 0, 0.1, …, 1的11处Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0。此时Aeroplane类别的 AP = 5.5 / 11 = 0.5
- VOC2010及以后的方法,对于Recall >= 0, 0.14, 0.29, 0.43, 0.57, 0.71, 1,我们选取此时Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0。此时Aeroplane类别的 AP = (0.14-0)*1 + (0.29-0.14)*1 + (0.43-0.29)*0.5 + (0.57-0.43)*0.5 + (0.71-0.57)*0.5 + (1-0.71)*0 = 0.5
mAP就是对每一个类别都计算出AP然后再计算AP平均值就好了
参考资料
https://www.zhihu.com/question/53405779
https://blog.csdn.net/guzhao9901/article/details/107961184
https://www.zhihu.com/question/53405779/answer/419532990更多相关内容 -
main_roc_python_AUC_PR曲线_ROC曲线_
2021-09-29 02:59:13通过给定的数据样本绘制ROC曲线和PR曲线,并计算AUC -
yolo画pr曲线图.zip
2020-04-29 13:13:07可以画yolo算法的pr曲线图 并计算精确率里面包括四个文件 分别对用python不同版本 python2 和python3 我自己用是好用的 有问题可以留言交流 -
matlab绘制曲线代码-VOCcode:它用于绘制和计算PR曲线/LOSS曲线/AP/mAP并将数据存储为.mat以供进一步使用
2021-06-01 23:21:02PR 曲线/LOSS 曲线/AP/mAP 并将数据存储为 .mat 以供进一步使用请在您的模型文件夹中克隆存储库 # Make sure to clone with --recursive git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git ... -
multiROC:在多类分类中计算和可视化ROC和PR曲线
2021-02-10 10:36:07跨多类分类计算和可视化ROC和PR曲线 接收器工作特性(ROC)和精度召回率(PR)是在各个领域比较二进制分类器的一种广泛使用的方法。 然而,许多现实世界中的问题被设计为多个类别(例如,癌症的肿瘤,淋巴结和转移... -
显著性检测PR曲线
2018-06-08 10:34:18显著性检测中画PR曲线的代码,需要自己生成的显著图和Ground Truth。 -
用于yolo计算mAP和PR曲线使用
2018-10-19 13:23:10用于yolo计算mAP和PR曲线使用,里面有4个python文件,分为python2和python3版本 -
AUC PR曲线 学习曲线
2021-04-23 15:19:42AUC(Area Under Curve)被定义为ROC曲线下的面积。我们往往使用AUC值作为模型的评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。 其中,ROC...AUC(Area Under Curve)被定义为ROC曲线下的面积。我们往往使用AUC值作为模型的评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。
其中,ROC曲线全称为受试者工作特征曲线 (receiver operating characteristic curve),它是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(敏感性)为纵坐标,假阳性率(1-特异性)为横坐标绘制的曲线。
AUC就是衡量学习器优劣的一种性能指标。从定义可知,AUC可通过对ROC曲线下各部分的面积求和而得。
ROC曲线的意义
(1)主要作用
1.ROC曲线能很容易的查出任意阈值对学习器的泛化性能影响。
2.有助于选择最佳的阈值。ROC曲线越靠近左上角,模型的准确性就越高。最靠近左上角的ROC曲线上的点是分类错误最少的最好阈值,其假正例和假反例总数最少。
3.可以对不同的学习器比较性能。将各个学习器的ROC曲线绘制到同一坐标中,直观地鉴别优劣,靠近左上角的ROC曲所代表的学习器准确性最高。
(2)优点
-
该方法简单、直观、通过图示可观察分析学习器的准确性,并可用肉眼作出判断。ROC曲线将真正例率和假正例率以图示方法结合在一起,可准确反映某种学习器真正例率和假正例率的关系,是检测准确性的综合代表。
-
ROC曲线不固定阈值,允许中间状态的存在,利于使用者结合专业知识,权衡漏诊与误诊的影响,选择一个更加的阈值作为诊断参考值。
AUC
如果两条ROC曲线没有相交,我们可以根据哪条曲线最靠近左上角哪条曲线代表的学习器性能就最好。但是,实际任务中,情况很复杂,如果两条ROC曲线发生了交叉,则很难一般性地断言谁优谁劣。在很多实际应用中,我们往往希望把学习器性能分出个高低来。在此引入AUC面积。
在进行学习器的比较时,若一个学习器的ROC曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者;若两个学习器的ROC曲线发生交叉,则难以一般性的断言两者孰优孰劣。此时如果一定要进行比较,则比较合理的判断依据是比较ROC曲线下的面积,即AUC(Area Under ROC Curve)。
AUC面积的意义
AUC是衡量二分类模型优劣的一种评价指标,表示预测的正例排在负例前面的概率。
有效性不同的模型的 ROC 曲线图示
from xgboost.sklearn import XGBClassifier from sklearn.metrics import roc_curve, auc from sklearn.model_selection import train_test_split from sklearn.ensemble import BaggingClassifier, AdaBoostClassifier, GradientBoostingClassifier,RandomForestClassifier X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3) def plot_roc(): clf_bagging = BaggingClassifier() clf_ada = AdaBoostClassifier() clf_gbdt = GradientBoostingClassifier() clf_rf = RandomForestClassifier() clf_xgb = XGBClassifier() clfs = [clf_bagging, clf_ada, clf_gbdt, clf_rf,clf_xgb] names = ['Bagging', 'AdaBoost', 'GBDT', 'RandomForest','XGBC'] prbs_1 = [] for clf in clfs: clf.fit(X_train, Y_train) pre = clf.predict(X_test) y_prb_1 = clf.predict_proba(X_test)[:, 1] prbs_1.append(y_prb_1) for index, value in enumerate(prbs_1): fpr, tpr, thresholds = roc_curve(Y_test, value) roc_auc = auc(fpr, tpr) plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.plot(fpr, tpr, label='{0}_AUC = {1:.5f}'.format(names[index], roc_auc)) plt.title('ROC曲线') plt.xlim([-0.05, 1.05]) plt.ylim([-0.05, 1.05]) plt.legend(loc='lower right') plt.plot([0, 1], [0, 1], 'r--') plt.ylabel('命中率') plt.xlabel('误判率') plt.show() plot_roc()
K-S曲线
转载自https://www.cnblogs.com/gczr/p/10354646.html
KS曲线是用来衡量分类型模型准确度的工具。KS曲线与ROC曲线非常的类似。其指标的计算方法与混淆矩阵、ROC基本一致。它只是用另一种方式呈现分类模型的准确性。KS值是KS图中两条线之间最大的距离,其能反映出分类器的划分能力。
一句话概括版本:
KS曲线是两条线,其横轴是阈值,纵轴是TPR与FPR。两条曲线之间之间相距最远的地方对应的阈值,就是最能划分模型的阈值。
KS值是MAX(TPR - FPR),即两曲线相距最远的距离。
KS(Kolmogorov-Smirnov)评价指标,通过衡量好坏样本累计分布之间的差值,来评估模型的风险区分能力。
KS、AUC、PR曲线对比:
1)ks和AUC一样,都是利用TPR、FPR两个指标来评价模型的整体训练效果。
2)不同之处在于,ks取的是TPR和FPR差值的最大值,能够找到一个最优的阈值;AUC只评价了模型的整体训练效果,并没有指出如何划分类别让预估的效果达到最好,就是没有找到好的切分阈值。
3)与PR曲线相比,AUC和KS受样本不均衡的影响较小,而PR受其影响较大。(详看P-R曲线及与ROC曲线区别)
KS的曲线图走势大概如下:
ks值<0.2,一般认为模型没有区分能力。
ks值[0.2,0.3],模型具有一定区分能力,勉强可以接受
ks值[0.3,0.5],模型具有较强的区分能力。
ks值大于0.75,往往表示模型有异常。
二、直观理解KS
1)如何直观的理解ks呢?
参考上述ks曲线图,可以这样理解,随着阈值从大逐渐的变小,TPR的提升速度高于FPR的提升速度,直到一个临界阈值threshold,之后TPR提升速度低于FPR,这个临界threshold便是最佳阈值。在前期TPR越快提升,模型效果越好;反之,FPR越快提升,模型效果就越差。
P-R曲线及与ROC曲线区别
https://www.cnblogs.com/gczr/p/10137063.html
P-R曲线刻画查准率和查全率之间的关系,查准率指的是在所有预测为正例的数据中,真正例所占的比例,查全率是指预测为真正例的数据占所有正例数据的比例。
即:查准率P=TP/(TP + FP) 查全率=TP/(TP+FN)
查准率和查全率是一对矛盾的度量,一般来说,查准率高时,查全率往往偏低,查全率高时,查准率往往偏低,例如,若希望将好瓜尽可能多选出来,则可通过增加选瓜的数量来实现,如果希望将所有的西瓜都选上,那么所有的好瓜必然都被选上了,但这样查准率就会较低;若希望选出的瓜中好瓜比例尽可能高,则可只挑选最有把握的瓜,但这样就难免会漏掉不少好瓜,使得查全率较低。在很多情况下,我们可以根据学习器的预测结果对样例进行排序,排在前面的是学习器认为最可能是正例的样本,排在后面的是学习器认为最不可能是正例的样本,按此顺序逐个把样本作为正例进行预测,则每次可计算当前的查全率和查准率,以查准率为y轴,以查全率为x轴,可以画出下面的P-R曲线。
如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住,则可断言后者的性能优于前者,例如上面的A和B优于学习器C,但是A和B的性能无法直接判断,但我们往往仍希望把学习器A和学习器B进行一个比较,我们可以根据曲线下方的面积大小来进行比较,但更常用的是平衡点或者是F1值。平衡点(BEP)是查准率=查全率时的取值,如果这个值较大,则说明学习器的性能较好。而F1 = 2 * P * R /( P + R ),同样,F1值越大,我们可以认为该学习器的性能较好。
联合建模(BJ)P-R曲线
参数:
y_true:array, shape = [n_samples]:真实标签。如果标签不是{-1,1}或{0,1},那么pos_label应该显式给出。
probas_pred:array, shape = [n_samples] :正类的预测概率或决策函数
pos_label:int or str, default=None:正类标签。当pos_label=None时,如果y_true为{- 1,1}或{0,1},则pos_label设置为1,否则将报错。返回值:
precision:array, shape = [n_thresholds + 1]:精度,最后一个元素是1。
recall:array, shape = [n_thresholds + 1]:召回率,最后一个是0
thresholds:array, shape = [n_thresholds <= len(np.unique(probas_pred))]:用于计算精度和召回率的决策函数的阈值例子:
import numpy as np from sklearn.metrics import precision_recall_curve y_true = np.array([0, 0, 1, 1]) y_scores = np.array([0.1, 0.4, 0.35, 0.8]) precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
如何选择呢?
- 在很多实际问题中,正负样本数量往往很不均衡。比如,计算广告领域经常涉及转化率模型,正样本的数量往往是负样本数量的1/1000,甚至1/10000。若选择不同的测试集,P-R曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多,被广泛用于排序、推荐、广告等领域。
- 但需要注意的是,选择P-R曲线还是ROC曲线是因实际问题而异的,如果研究者希望更多地看到模型在特定数据集上的表现,P-R曲线则能够更直观地反映其性能。
- PR曲线比ROC曲线更加关注正样本,而ROC则兼顾了两者。
- AUC越大,反映出正样本的预测结果更加靠前。(推荐的样本更能符合用户的喜好)
- 当正负样本比例失调时,比如正样本1个,负样本100个,则ROC曲线变化不大,此时用PR曲线更加能反映出分类器性能的好坏。这个时候指的是两个分类器,因为只有一个正样本,所以在画auc的时候变化可能不太大;但是在画PR曲线的时候,因为要召回这一个正样本,看哪个分类器同时召回了更少的负样本,差的分类器就会召回更多的负样本,这样precision必然大幅下降,这样分类器性能对比就出来了。
学习曲线
import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import learning_curve # 用sklearn的learning_curve得到training_score和cv_score,使用matplotlib画出learning curve def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, n_jobs=1, train_sizes=np.linspace(.05, 1., 20), verbose=0): """ 画出data在某模型上的learning curve. 参数解释 ---------- estimator : 你用的分类器。 title : 表格的标题。 X : 输入的feature,numpy类型 y : 输入的target vector ylim : tuple格式的(ymin, ymax), 设定图像中纵坐标的最低点和最高点 cv : 做cross-validation的时候,数据分成的份数,其中一份作为cv集,其余n-1份作为training(默认为3份) n_jobs : 并行的的任务数(默认1) """ train_sizes, train_scores, test_scores = learning_curve( estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes) train_scores_mean = np.mean(train_scores, axis=1) train_scores_std = np.std(train_scores, axis=1) test_scores_mean = np.mean(test_scores, axis=1) test_scores_std = np.std(test_scores, axis=1) plt.grid() plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha=0.1, color="r") plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1, color="g") plt.plot(train_sizes, train_scores_mean, 'o-', color="r", label="Training score") plt.plot(train_sizes, test_scores_mean, 'o-', color="g", label="Cross-validation score") plt.legend(loc="best") return plt plot_learning_curve(LR, u"学习曲线",x, y)
-
-
再理解下ROC曲线和PR曲线 | 丕子
2021-04-24 00:33:25分类、检索中的评价指标很多,Precision、Recall、Accuracy、F1、ROC、PR Curve......一、历史wiki上说,ROC曲线最先在二战中分析雷达信号,用来检测敌军。诱因是珍珠港事件;由于比较有用,慢慢用到了心理学、医学...大家都发表下对着俩曲线的理解吧。
分类、检索中的评价指标很多,Precision、Recall、Accuracy、F1、ROC、PR Curve......
一、历史
wiki上说,ROC曲线最先在二战中分析雷达信号,用来检测敌军。诱因是珍珠港事件;由于比较有用,慢慢用到了心理学、医学中的一些检测等应用,慢慢用到了机器学习、数据挖掘等领域中来了,用来评判分类、检测结果的好坏。
百科:ROC曲线指受试者工作特征曲线(receiver operating characteristic curve), 是反映敏感性和特异性连续变量的综合指标,是用构图法揭示敏感性和特异性的相互关系,它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性,再以敏感性为纵坐标、(1-特异性)为横坐标绘制成曲线,曲线下面积越大,诊断准确性越高。在ROC曲线上,最靠近坐标图左上方的点为敏感性和特异性均较高的临界值。
二、原理
这里就拿最经典的二分类(0、1)问题讨论吧,分类器分类之后,往往会得到对每个样本是哪一类的一个估计,像是LR模型就会将这个估计规范化到【0,1】,根据这个估计,你选择一个阈值p_0,就可以将分类结果映射到0,1了;分类效果好不好跟真实的label比比就行了。
所以你手里有decision和label两个向量,用来做分类结果的评估。
要看ROC的原理,总离不开上面这个表格,ROC绘制的就是在不同的阈值p_0下,TPR和FPR的点图。所以ROC曲线的点是由不同的p_0所造成的。所以你绘图的时候,就用不同的p_0采点就行。
Precision-Recall曲线,这个东西应该是来源于信息检索中对相关性的评价吧,precision就是你检索出来的结果中,相关的比率;recall就是你检索出来的结果中,相关的结果占数据库中所有相关结果的比率;所以PR曲线要是绘制的话,也是对cutoff进行遍历,这样也得到了不同的precision和recall的点。例如你选择了一个cutoff,从而根据cutoff判别分类的结果1或0。1就是检索返回的结果,0就是没有返回的结果。
数据库里有500条记录,其中50个是相关的(正样本),你通过一个cutoff,返回了75个1,其中只有45个是真正相关的;
那么在这个cutoff对应下的recall=45/50=0.9,precision=45/75=0.6。坐标就是(0.9,0.6),在这里绘制一个点吧。
可以看出TPR和Recall的形式是一样的,就是查全率了,FPR就是保证这样的查全率你所要付出的代价,就是把多少负样本也分成了正的了。
上面是我的理解,不知道对不对。
三、AUC的计算
为了更好的衡量ROC所表达结果的好坏,Area Under Curve(AUC)被提了出来,简单来说就是曲线右下角部分占正方形格子的面积比例;那么计算这个东西其实就很简单了,根据reference的paper,有很多很多计算方法,这里推荐一种近似采样的方法:采样。
你的分类器能够将正例排在负例前面的概率是多少,也就是采样中正例的decision>负例的decision的概率。
1
2
3
4
5
6auc sample(neg.decision,1000,replace=T))
## or
aucs sample(neg.decision,1000,replace=T)))
auc2
其实这个可以等价于对于不规则图形的面积的采样估计了。谁能给推导一下?
四、ROC中最优的p_0的计算
简单理解下的话,保证TPR同时代价FPR要尽量的小,是不是可以建立max(TPR+(1-FPR))的模型,然后选p_0呢?
paper中有更加详细的方法。谁给详细介绍下?
五、ROC和PR曲线之间的关系和不同
当正负样本差距不大的情况下,ROC和PR的趋势是差不多的,但是当负样本很多的时候,两者就截然不同了,ROC效果依然看似很好,但是PR上反映效果一般,还需要继续努力啊。解释起来也简单,假设就1个正例,100个负例,那么基本上TPR可能一直维持在100左右,然后突然降到0.
ROC and precision-recall curves under class skew. (a) ROC curves, 1:1; (b) precision-recall curves, 1:1; (c) ROC curves, 1:10 and (d) precisionrecall
六、具体例子和代码
(1)数据集
用的libsvm的那个270个样本的数据集,用LR模型做了一下:
0.688312721844616 1
0.461679176682519 0
0.405016268379421 1
0.693999977303342 0
0.391868684948981 0
0.526391961908057 0
0.570470938139219 1
0.708771207269333 1
0.700976655664182 1
0.713584109310541 1
0.545180177320974 0
0.646156295395112 0
0.347580513944893 0
0.391577777998607 1
....
(2)ROC曲线和PR曲线
R语言的ROCR绘制的图形:
代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16library(ROCR)
a=read.table("toy.txt")
a
pred
perf
auc.tmp
auc
auc
plot(perf,colorize=TRUE,lwd=5,xlab="FPR",ylab="TPR", main=paste("AUC=",auc*100,"%"))
grid(5, 5, lwd = 1)
lines(par()$usr[1:2], par()$usr[3:4], lty=2, lwd=2, col="grey")
自己写代码绘制图像和估算AUC的值,AUC和ROCR包计算的还是很接近的:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37a
a
label
decision
ngrids
TPR
FPR
p0
for(i in 1:ngrids)
{
p0[i]
pred_label p0[i])
TPR[i]
FPR[i]
}
## compute AUC
pos.decision
neg.decision
auc sample(neg.decision,1000,replace=T))
## or
aucs sample(neg.decision,1000,replace=T)))
auc2
plot(FPR, TPR, col=4,lwd=5, type="l", main=paste("AUC=",auc2*100,"%"))
grid(5, 5, lwd = 1)
points(c(0,1), c(0,1), type="l", lty=2, lwd=2, col="grey")
##
cut.op
PR曲线:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
a
a
label
decision
ngrids
P
R
p0
A
for(i in 0:ngrids)
{
p0[i]
pred_label p0[i])
R[i]
P[i]
A[i]
}
plot(R, P, col=4,lwd=5, type="l",xlab="Recall",ylab="Precision", main="PR Curve")
grid(5, 5, lwd = 1)
accuracy
七、Reference
[1]Tom Fawcett:An introduction to ROC analysis
[2]Jesse Davis,Mark Goadrich:The Relationship Between Precision-Recall and ROC Curves
[3]https://en.wikipedia.org/wiki/Receiver_operating_characteristic
[4]http://baike.baidu.com/view/42249.htm
-
PR曲线与ROC曲线
2021-03-18 20:07:49PR曲线概念 PR曲线中的P代表的是precision(精准率),R代表的是recall(召回率),其代表的是精准率与召回率的关系,一般情况下,将recall设置为横坐标,precision设置为纵坐标。 PR曲线功能说明 一条PR曲线要对应...PR曲线概念
PR曲线中的P代表的是
precision(精准率)
,R代表的是recall(召回率)
,其代表的是精准率与召回率的关系,一般情况下,将recall设置为横坐标,precision设置为纵坐标。
P-R曲线怎么画?
在机器学习中,分类器往往输出的不是类别标号,而是属于某个类别的概率值,根据分类器的预测结果从大到小对样例进行排序,排在前面的是学习器认为最可能是正例的样本,排在后面的是学习器认为最不可能是正例的样本,可以选取不同的阈值或者按此顺序逐个把样本作为正例进行预测,则每次可计算当前的P、R值,以P为y轴,以R为x轴,可以画出P-R曲线。
- 绘制:选取不同的confidence置信度阈值,可以在PR坐标系上得到不同的点,连接这些点即可获得PR曲线
- 用途:用来评估模型性能。Precision值和Recall值越大越好,所以PR曲线越往右上角凸越好。
举例:
Inst#是样本序号,图中有20个样本。Class是ground truth 标签,p是positive样本(正例),n当然就是negative(负例) score是我的分类器对于该样本属于正例的可能性的打分。因为一般模型输出的不是0,1的标注,而是小数,相当于置信度。
然后设置一个从高到低的阈值T,大于等于阈值T的被我正式标注为正例,小于阈值T的被我正式标注为负例。
显然,我设置n个阈值,我就能得到n种标注结果,评判我的模型好不好使。
如上图:真实情况 正例p 反例n 各有10个。0.9作为阈值(大于等于0.9为正例,小于0.9为反例),此时TP=1,FP=0,FN=9,故P=1,R=0.1。
用0.8作为阈值,此时TP=2,FP=0,FN=8,P=1, R=0.2。
用0.7作为阈值,此时TP=2,FP=1,FN=7,P=0.67,R=0.2。
用0.6作为阈值,此时TP=3,FP=1,FN=6,P=0.75,R=0.3。
以此类推。。。
最后得到一系列P、R值序列,就画出P-R曲线(示意图,不对应上面数据):P-R曲线解析
显然,P-R 曲线越靠近右上角性能越好。如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住,则可断言后者的性能优于前者,例如上面的A和B优于学习器C。但是A和B的性能无法直接判断,我们可以根据曲线下方的面积大小来进行比较,但更常用的是
平衡点
或者是F1-score
。平衡点(BEP)是P=R时的取值,如果这个值较大,则说明学习器的性能较好。
F1 = 2 * P * R /( P + R ),F1-score综合考虑了P值和R值,是精准率和召回率的调和平均值, 同样,F1值越大,我们可以认为该学习器的性能较好。
ROC曲线
在ROC曲线中,横轴是假正例率(FPR),纵轴是真正例率(TPR)。
(1)真正类率(True Postive Rate),代表分类器预测的正类中实际正实例占所有正实例的比例。
(2)负正类率(False Postive Rate),代表分类器预测的正类中实际负实例占所有负实例的比例。
我们可以发现:TPR=Recall。ROC曲线也需要相应的阈值才可以进行绘制,原理同上的PR曲线。
用0.9作为阈值,此时TP=1,FP=0,FN=9,TN=10,故TPR=0.1,FPR=0。
用0.8作为阈值,此时TP=2,FP=0,FN=8,TN=10,故TPR=0.2,FPR=0。
用0.7作为阈值,此时TP=2,FP=1,FN=8,TN=9,故TPR=0.2,FPR=0.1。
用0.6作为阈值,此时TP=3,FP=1,FN=7,TN=9,故TPR=0.3,FPR=0.1。
以此类推。。。
最后的ROC曲线如下图:
ROC曲线图中的四个点
第一个点:(0,1),即FPR=0, TPR=1,这意味着FN=0,并且FP=0。这是完美的分类器,它将所有的样本都正确分类。
第二个点:(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。
第三个点:(0,0),即FPR=TPR=0,即FP=TP=0,可以发现该分类器预测所有的样本都为负样本(negative)。
第四个点:(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,ROC曲线越接近左上角,该分类器的性能越好。一个对比:
AUC
这里补充一下AUC的简单介绍。
AUC (Area under Curve):ROC曲线下的面积,介于0.1和1之间,作为数值可以直观的评价分类器的好坏,值越大越好。
AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值PR曲线和ROC曲线的关系
PR曲线和ROC曲线都能评价分类器的性能。如果分类器a的PR曲线或ROC曲线包围了分类器b对应的曲线,那么分类器a的性能好于分类器b的性能。
PR曲线和ROC曲线有什么联系和不同:
相同点:
首先从定义上PR曲线的R值是等于ROC曲线中的TPR值。
都是用来评价分类器的性能的。
不同点:
ROC曲线是单调的而PR曲线不是(根据它能更方便调参),可以用AUC的值得大小来评价分类器的好坏(是否可以用PR曲线围成面积大小来评价呢?)。
正负样本的分布失衡的时候,ROC曲线保持不变,而PR曲线会产生很大的变化。
(a)(b)分别是正反例相等的时候的ROC曲线和PR曲线
(c)(d)分别是十倍反例一倍正例的ROC曲线和PR曲线
可以看出,在正负失衡的情况下,从ROC曲线看分类器的表现仍然较好(图c),然而从PR曲线来看,分类器就表现的很差。
事实情况是分类器确实表现的不好(分析过程见知乎 qian lv 的回答),是ROC曲线欺骗了我们。参考(感谢)
https://blog.csdn.net/teminusign/article/details/51982877
https://www.jianshu.com/p/ac46cb7e6f87
https://www.zhihu.com/question/30643044/answer/64151574?from=profile_answer_card
http://www.fullstackdevel.com/computer-tec/data-mining-machine-learning/501.html -
ROC曲线与PR曲线对比
2021-03-11 11:21:361.ROC曲线 TPR=TPP=TPTP+FNTPR = \frac{TP}{P} = \frac{TP}{TP + FN}TPR=PTP=TP+FNTP FPR=FPN=FPFP+TNFPR = \frac{FP}{N} = \frac{FP}{FP + TN}FPR=NFP=FP+TNFP ROC曲线的纵坐标为TPR,真正率,其实也是召回... -
Python多分类问题pr曲线绘制(含代码)
2021-10-26 09:02:59研究了三天的多分类pr曲线问题终于在昨天晚上凌晨一点绘制成功了!! 现将所学所感记录一下,一来怕自己会忘可以温故一下,二来希望能给同样有疑惑的铁子们一些启迪! 下图为我画的pr曲线,因为准确度超过了97%,... -
PR曲线与ROC曲线绘制
2021-10-31 21:35:31介绍ROC和PR前先介绍混淆矩阵便于理解。 - 预测值 正 预测值 负 真实值 正 TP FN 真实值 负 FP TN TP(True Positive): 被判定为正样本,实际也为正样本 FN(False Negative):伪阴性 ,被判定为负样本,... -
【Python】绘制PR曲线
2021-01-12 15:50:12基于此,可以绘制PR曲线,python绘制PR曲线比较方便。 首先,可以使用precision_recall_curve函数得到 #选择测试数据 import pandas as pd df = pd.read_csv('file_name.csv') X = df[df.columns[:-1]] y = df[df.... -
yolov5如何生成pr曲线
2022-04-05 22:54:24用的YOLOv5-5.0版本,训练完以后有一个自动生成的pr曲线,但是太粗糙了,不能用在论文里。 有没有什么方法可以画一个比较好看的pr曲线图,最好是可以将横纵坐标数据导出来,自己用其他的软件画 -
YOLOv4 绘制PR曲线
2021-03-23 21:32:02YOLOv4 绘制PR曲线简述YOLOv4 自带mAP检测代码第三方库 简述 最近做的一项工作就是交通目标的识别,我用的是YOLOv4基于Darknet的那一版,其中最重要的评价一项目标检测,但是我试过YOLOv4自带的map和网上常用的绘制... -
图像检索评价指标:PR曲线的计算与绘制
2022-03-21 22:27:06# @brief : 如何绘制PR曲线 # @author : liupc # @date : 2021/8/2 import numpy as np from tqdm import tqdm import matplotlib.pyplot as plt #计算汉明距离。有几位不同,距离就为几。 def CalcHammingDist... -
绘制PR曲线
2020-07-29 22:48:52open(cls + '_pr.pkl','rb') inf = cPickle.load(fr) fr.close() x=inf['rec'] y=inf['prec'] fig = plt.figure(1, dpi=160) ax = fig.add_subplot(1,1,1) ax.plot(x, y, label='PR') #ax.plot(result['Avg Recall']... -
Python计算PR曲线绘制:二分类PR曲线绘制、多分类PR曲线绘制、平均PR值计算
2021-09-21 10:11:34Python计算PR曲线绘制:二分类PR曲线绘制、多分类PR曲线绘制、平均PR值计算 目录 Python计算PR曲线绘制:二分类PR曲线绘制、多分类PR曲线绘制、平均PR值计算 #二分类的平均AP(Average precision)值计算 #二... -
利用Python中的numpy包实现PR曲线和ROC曲线的计算
2020-12-15 11:57:07闲来无事,边理解PR曲线和ROC曲线,边写了一下计算两个指标的代码。在 python 环境下,sklearn里有现成的函数计算ROC曲线坐标点,这里为了深入理解这两个指标,写代码的时候只用到numpy包。事实证明,实践是检验真理... -
PR曲线、ROC曲线、AUC、AP简单梳理
2021-08-28 22:05:48是不是对一堆PR曲线、ROC曲线、AUC、AP傻傻分不清楚?是不是学完就忘忘了又学?希望这篇文章能帮你梳理清楚一坨乱麻。 1、混淆矩阵 每次在重温理解AUC、PR曲线、ROC曲线的时候,第一步就是在纸上画出来这个混淆矩阵... -
最全PR曲线、ROC曲线以及AUC计算公式详解
2021-04-19 10:44:00评价指标系列PR曲线查准率和查全率PR曲线绘制ROC曲线TPR,FPR插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释... -
mmdetection 绘制PR曲线
2022-04-22 06:10:28参考:https://github.com/xuhuasheng/mmdetection_plot_pr_curve 适用于COCO数据集 import os import mmcv import numpy as np import matplotlib.pyplot as plt from pycocotools.coco import COCO from ... -
PR曲线详解
2020-08-13 08:54:38目录PR曲线概念precision(精准率)和recall(召回率)PR曲线功能说明 PR曲线概念 PR曲线中的P代表的是precision(精准率),R代表的是recall(召回率),其代表的是精准率与召回率的关系,一般情况下,将recall设置... -
终于搞懂了PR曲线
2021-08-29 20:46:25图中的PR曲线很奇怪, 左边从1突然变到0. PR源码分析 为了搞清楚这个问题, 对源码进行了分析. 如下所示为上图对应的代码: from sklearn.metrics import precision_recall_curve import matplotlib.pyplot as plt ... -
一文读懂精准率、召回率、pr曲线、roc曲线
2021-03-15 11:42:48模型有各种各样的评测标准,比如 准确率、精确率、召回率、pr曲线、F1、roc曲线、roc_auc等,每种都有各自的优缺点,下面一一进行讨论。 无论哪种评测标准,都是根据预测正负例的情况,和真实正负例的情况进行比较来... -
关于Mask R-CNN 画PR曲线
2021-12-07 21:43:17最近太多人问我如何绘制PR曲线了,我又很少及时看到你们的消息,在这里跟大家道个歉,我直接把代码贴出来,你们看着改参数就好。 ################ 导入相关包 ##################### import os import sys import ... -
ROC曲线和PR曲线的区别及相应的应用场景
2021-07-10 21:00:44ROC曲线和PR曲线都是用来衡量分类器分类性能的好坏的标准 ROC曲线和PR曲线的区别 ROC曲线 关于ROC曲线的具体含义详见我之前的博文:ROC曲线的含义以及画法 ROC曲线所在的二维坐标轴空间的横轴为FPR,纵轴为TPR; ... -
ROC曲线和PR曲线
2019-08-03 22:32:49一 ROC曲线 1. 什么是ROC曲线? 2. 曲线的性质 ...三 ROC曲线和PR曲线的适用场景 1. ROC适用 2. PR适用 总结: ROC 曲线可以用来评价分类器的效果好坏, 其横轴表示假警报率(聚焦于负例), 纵轴... -
yolov4 绘制pr曲线
2021-08-02 11:38:08@yolov4绘制PR曲线 1.使用官方文件生成results文件 ./darknet detector valid cfg/my_data.data cfg/my_yolov4-1.cfg my_yolov4-1_best.weights .data .cfg为训练文件 生成结果为: 文件内容: 2008_005191 0.191751...