精华内容
下载资源
问答
  • 召回率
    千次阅读
    2021-02-09 09:57:04

    工业界往往会根据实际的业务场景拟定相应的业务指标。本文旨在一起学习比较经典的三大类评价指标,其中第一、二类主要用于分类场景、第三类主要用于回归预测场景,基本思路是从概念公式,到优缺点,再到具体应用(分类问题,本文以二分类为例)。

    1.准确率P、召回率R、F1 值

    定义 准确率(Precision):P=TP/(TP+FP)。通俗地讲,就是预测正确的正例数据占预测为正例数据的比例。

    召回率(Recall)也叫查全率,可以认为查得全不全:R=TP/(TP+FN)。通俗地讲,就是预测为正例的数据占实际为正例数据的比例

    F1值(F score):

    思考

    正如下图所示,F1的值同时受到P、R的影响,单纯地追求P、R的提升并没有太大作用。在实际业务工程中,结合正负样本比,的确是一件非常有挑战的事。

    图像展示

    下面附上源码

    importnumpy as npimportmatplotlib.pyplot as pltfrom mpl_toolkits.mplot3d importAxes3Dfrom matplotlib importcm

    fig=plt.figure()

    ax= fig.add_subplot(111,projection='3d')

    x= np.linspace(0,1,100)

    p,r= np.meshgrid(x,x) #meshgrid函数创建一个二维的坐标网络

    z = 2*p*r/(p+r)

    ax.plot_surface(x,y,z,rstride=4,cstride=4,cmap=cm.YlGnBu_r)

    ax.set_title('F1') #标题

    ax.set_xlabel('precision') #x轴标签

    ax.set_ylabel('recall') #y轴标签

    plt.show()

    2.ROC、AUC

    概念

    TPR=TP/(TP+FN)=TP/actual positives

    FPR=FP/(FP+TN)=FP/actual negatives

    ROC是由点(TPR,FPR)组成的曲线,AUC就是ROC的面积。AUC越大越好。

    一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting

    图像展示

    附上代码

    library(ROCR)

    p=c(0.5,0.6,0.55,0.4,0.7)

    y=c(1,1,0,0,1)

    pred=prediction(p, y)

    perf= performance(pred,"tpr","fpr")

    plot(perf,col="blue",lty=3, lwd=3,cex.lab=1.5, cex.axis=2, cex.main=1.5,main="ROC plot")

    python版本计算AUC

    from sklearn importmetricsdefaucfun(act,pred):

    fpr, tpr, thresholds= metrics.roc_curve(act, pred, pos_label=1)return metrics.auc(fpr, tpr)

    直接利用AUC优化分类任务(R语言版)

    下面是代码

    #生成训练数据

    set.seed(1999)

    x1= rnorm(1000)

    x2= rnorm(1000)

    z= 1 + 2*x1 + 3*x2

    pr= 1/(1+exp(-z))

    y= rbinom(1000,1,pr)#使用logloss作为训练目标函数

    df = data.frame(y=y,x1=x1,x2=x2)

    glm.fit=glm( y~x1+x2,data=df,family="binomial")#下面使用auc作为训练目标函数

    library(ROCR)

    CalAUC

    rocr.pred=prediction(pred,real)

    rocr.perf=performance(rocr.pred,'auc')

    as.numeric(rocr.perf@y.values)

    }#初始值

    beta0=c(1,1,1)

    loss

    z=beta[1]+beta[2]*x1+beta[3]*x2

    pred=1/(1+exp(-z))-CalAUC(y,pred)

    }

    res=optim(beta0,loss,method = "Nelder-Mead",control = list(maxit = 100))

    3.PRC、ROC比较

    AUC是ROC的积分(曲线下面积),是一个数值,一般认为越大越好,数值相对于曲线而言更容易当做调参的参照。

    PR曲线会面临一个问题,当需要获得更高recall时,model需要输出更多的样本,precision可能会伴随出现下降/不变/升高,得到的曲线会出现浮动差异(出现锯齿),无法像ROC一样保证单调性。

    在正负样本分布得极不均匀(highly skewed datasets)的情况下,PRC比ROC能更有效地反应分类器的好坏。

    4.mape平均绝对百分误差

    定义

    技巧

    在sklearn中,对于回归任务,一般都提供了mse损失函数(基于树的模型除外)。但有时我们会遇到sklearn中没有定义的损失函数,那么我们可以自定重写模型或者定义函数,下面以xgboost为模型,mape作为损失函数为例(grad、hess分别对应损失函数一阶导、二阶导)。

    代码

    importnumpy as npimportmatplotlib.pyplot as pltfrom mpl_toolkits.mplot3d importAxes3Dfrom matplotlib importcm

    fig=plt.figure()

    ax= fig.add_subplot(111,projection='3d')

    x= np.linspace(0,1,100)

    p,r= np.meshgrid(x,x) #meshgrid函数创建一个二维的坐标网络

    z = 2*p*r/(p+r)

    ax.plot_surface(x,y,z,rstride=4,cstride=4,cmap=cm.YlGnBu_r)

    ax.set_title('F1') #标题

    ax.set_xlabel('precision') #x轴标签

    ax.set_ylabel('recall') #y轴标签

    plt.show()

    更多相关内容
  • 准确率和召回率matlab代码SPBL_Pytorch PyTorch实施“用于临床皮肤病识别的自动平衡学习” 安装 该项目基于和。 并且我们在其中添加了不平衡的学习方法,并修改了一些代码以实现兼容性。 要求 Python 3.4以上 ...
  • 今天小编就为大家分享一篇Pytorch 计算误判率,计算准确率,计算召回率的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 语义精确度和召回率,用于评估不连贯的本体映射
  • 1、召回率:评价模型的完整性 预测样本中的预测正确的信息条数/总样本中所有的属于这类样本的信息条数 举例: 这里用鱼和虾举例 TP: 将鱼预测为鱼 FP: 将虾预测为鱼 FN: 将鱼预测虾 TN: 将虾预测为虾 召回率R = TP...
  • matplotlib.pyplot绘制决策树的准确率,召回率,ROC,特征重要性-附件资源
  • 计算微观和宏观平均:精度、召回率、F-score。 从混淆矩阵计算。 如果您有任何问题,请发表评论或给我发电子邮件。
  • 由于它不能区分生成图像的保真度和多样性,因此最近的论文介绍了精度和召回率指标的变体,以分别诊断这些属性。 在本文中,我们表明即使是最新版本的精度和召回率(Kynkäänniemi等,2019)指标也不可靠。 例如,...
  • 该函数将根据您的输入(实际和预测)返回结果(准确度、召回率、精度、F1、F2、F0.5)。 例如, 加载fisheriris X = 测量值; Y = 物种; Mdl = fitcknn(X,Y,'NumNeighbors',5,'Standardize',1); 预测Y = ...
  • 计算两幅图像的交叉率,精确率,召回率,可用于比较算法标记和手工标记的两幅二值化图像。
  • 准确率、精确率、召回率、F值

    千次阅读 2021-01-22 14:21:34
    准确:正确的数量除以总数量 准确(accuracy),是一个用来衡量分类器预测结果与真实结果差异的一个指标,越接近于1说明分类结果越准确。举个例子,比如现在有一个猫狗图片分类器对100张图片进行分类,分类结果...

    准确率:正确的数量除以总数量

    准确率(accuracy),是一个用来衡量分类器预测结果与真实结果差异的一个指标,越接近于1说明分类结果越准确。举个例子,比如现在有一个猫狗图片分类器对100张图片进行分类,分类结果显示有38张图片是猫,62张图片是狗,经与真实标签对比后发现,38张猫的图片中有20张是分类正确的,62张狗的图片中有57张是分类正确的,那么准确率是多少呢?显然就应该是 (20+57)/100=0.77 ,即分对的数量除以总的数量就这么简单,这也是准确率好理解的原因之一。

    同时可以发现,对于这100张图片来说,其真实标签为狗75张,猫25张。那么现在问题就来了,假如某分类器使坏,对于输入的任何让本其结果都输出为狗,那么从整个结果来看就是狗的照片全都分对,猫的照片全都分错,准去率为 75/100=0.75 。可是仔细想想这有意义吗?若是猫狗照片数量为10和90,你啥也不做,就这么一搞准确率就到 0.9了,岂不无法无天?那我们应该这么避免这种情况呢?那就要轮到精确率和召回率登场了。

    什么精确率(precision)与召回率(recall)呢?我们先用一个矩阵来把上面猫狗分类的结果给展示出来:

    怎么去读这张表呢?首先从这张表可知:数据集中有25张猫的图片,75张狗的图片;同时对于左图20这个值,其含义是将猫预测为猫的数量为20,同理5表示将猫预测为狗的数量,18表示将狗预测成猫的数量,57表示将狗预测为狗的数量。衍生开就是,如右图所示:

    • True Positive(TP):表示将正样本预测为正样本,即预测正确;
    • False Positive(FP):表示将负样本预测为正样本,即预测错误;
    • False Negative(FN):表示将正样本预测为负样本,即预测错误;
    • True Negative(TN):表示将负样本预测为负样本,即预测正确;

    图p0140这个矩阵就称为混淆矩阵(confusion matrix),同时我们可以得到如下计算公式分别为:准确率、精确率(查准率)、召回率、F值:

    精确率:预测对的正样本在整个预测为正样本中的比重  ;理解为:预测为正样本的所有样本中,预测对了的概率

    召回率:预测对的正样本在整个真实正样本中的比重 ;理解为:正样本的准确率,所有真实正样本中,预测对了的概率

    可以看到,精确率计算的是预测对的正样本在整个预测为正样本中的比重,而召回率计算的是预测对的正样本在整个真实正样本中的比重。因此一般来说,召回率越高也就意味着这个模型找寻正样本的能力越强。但值得注意的是,通常在实际任务中,并不明确哪一类是正样本哪一类又是负样本,所以每个类别,都可以计算其各项指标:

    P和R指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure(又称为F-Score)。

    F-score是Precision和Recall加权调和平均:

    当参数α=1时,就是最常见的F1,也即

    可知F1综合了P和R的结果,当F1较高时则能说明试验方法比较有效。

     对于上面的计算过程,也可以通过sklearn中的包来完成。

    from sklearn.metrics import classification_report,confusion_matrix
    y = [0]*25 + [1]*75
    y_pre =[0]*20+[1]*5+[0]*18+[1]*57
    print(confusion_matrix(y,y_pre))
    print(classification_report(y,y_pre,target_names=['cat','dog']))
    
    
    >>
    [[20  5]
     [18 57]]
                  precision    recall  f1-score   support
    
             cat       0.53      0.80      0.63        25
             dog       0.92      0.76      0.83        75

    此时,通过这三个指标,我们再来对比下面的极端情况:

    对于猫来说:精确率、召回率、F1分别为:0,0,0

    对于狗来说:精确率、召回率、F1分别为:0.75,1,0.86

    只用准确率:准确率为0.75

    还有一个问题就是,既然有了精确率和召回率那还搞了F1干啥?这当然也是为了避免一些极端情况。还是以上面的数据为例,试想一下假如某个分类器说对于猫的识别,它的召回率能做到1,那么这算是厉害还是不厉害呢?可能厉害也可能不厉害,厉害就是当猫狗所有类别都分类正确的情况下,但这是及其困难;还有一种作弊的方式就是将所有的样本都预测成猫,那么这样将会得到如下混淆矩阵:

    此时对于猫来说,其精确率、召回率、F1分别为:0.25,1,0.4

    总结就是,通过引入精确率,召回率能够明显的解决只用准确率的不足之处,同时加入F-score能够解决召回率和精确率的不足之处。

    3.NLP中的精确率、召回率和F-score

     

    可以发现,重合部分就是正确部分;因此,对于分词结果1来说,精确率和召回率均为0,因为没有重合部分。而对于分词结果2来说都为1。下面再来看个例子:

    此时的精确率为3/5=0.6:  ,召回率为: 3/6=0.5

    4. OOV Recall 与 IV Recall

    OOV指的是“未登录词”(Out Of Vocabulary)的简称,也就是新词,已知词典中不存在的词。出现OOV的原因一方面可能确实是因为产生了有意义的新词而词典并没有收录;另一方面可能就是因为分词器产生的错误无意义的分词结果,这当然也不会出现在字典中。IV指的是“登陆词”(In Vocabulary),也就是已经存在字典中的词。而OOV Recall和IV Recall 分别指的就是OOV的召回率和IV的召回率。为了说明这两个召回率的具体含义,请先耐心看下面的详细例子:

    标准分词 A:['结婚',' 的',' 和',' 尚未',' 结婚 ','的',' 都',' 应该',' 好好',' 考虑',' 一下',' 人生',' 大事']

    标准区间 A:[1,2],[3,3],[4,4],[5,6],[7,8],[9,9],[10,10],[11,12],[13,14],[15,16],[17,18],[19,20],[21,22]

    分词结果 B:['结婚',' 的','和尚','未结婚 ','的 ','都',' 应该',' 好好考虑',' 一下',' 人生大事']

    分词区间 B:[1,2],[3,3],[4,5],[6,7,8],[9,9],[10,10],[11,12],[13,14,15,16],[17,18],[19,20,21,22]

    重复词语 A∩B:['结婚',' 的',' 的',' 都',' 应该',' 一下']

    重复区间 A∩B:[1,2], [3,3], [9,9],[10,10],[11,12],[17,18]

    词典:['结婚', '尚未', '的', '和', '青年', '都', '应该', '好好考虑', '自己', '人生', '大事']

    前面三项指标同第3节中的一样,不在赘述。从上面的计算过程可以看到,OOV召回率等于重复词区间未在词典中出现的词除以标准分词中未在词典中出现的词。需要注意的是重复词区间未在词典中出现的词就意味着未在字典中出现的新词是有意义的,只是字典没有收录而已;同理标准分词中未在词典中出现的词就更是如此。同时也可以将两者分别称为重复词区间有意义的新词所有有意义的新词。有意义的新词越多也就表示你用来分词的字典收录越不全(可能也会因为词语的颗粒度大小造成),而OOV recall越低也就意味着词典分词器对有意义新词的发现或者说查找能力越低。

    同理,从IV 召回率的计算公式可以发现重复词区间在词典中出现的词指的就是分词得到的正确部分(即正样本);标准分词中在词典中出现的词指的就是所有正样本。因此,IV 召回率就可以来衡量词典中的词被正确找回的概率。如果IV召回率低,就说明字典分词器连词典中的词汇都无法百分之百的发现或者找回,说明其消歧能力不好。例如“商品,和服,服务”三个词都在词典中,词典分词依然可能分布对句子”商品和服务“。

    import re
     ​
     def to_region(segmentation: str) -> list:
         """
         将分词结果转换为区间
         :param segmentation: 商品 和 服务
         :return: [(0, 2), (2, 3), (3, 5)]
         """
         region = []
         start = 0
         for word in re.compile("\\s+").split(segmentation.strip()):
             end = start + len(word)
             region.append((start, end))
             start = end
         return region
     ​
     ​
     def prf(gold: str, pred: str, dic) -> tuple:
         """
         计算P、R、F1
         :param gold: 标准答案文件,比如“商品 和 服务”
         :param pred: 分词结果文件,比如“商品 和服 务”
         :param dic: 词典
         :return: (P, R, F1, OOV_R, IV_R)
         """
         A_size, B_size, A_cap_B_size, OOV, IV, OOV_R, IV_R = 0, 0, 0, 0, 0, 0, 0
         A, B = set(to_region(gold)), set(to_region(pred))
         A_size += len(A)
         B_size += len(B)
         A_cap_B_size += len(A & B)
         text = re.sub("\\s+", "", gold)
     ​
         for (start, end) in A:
             word = text[start: end]
             if word in dic:
                 IV += 1
             else:
                 OOV += 1
     ​
         for (start, end) in A & B:
             word = text[start: end]
             if word in dic:
                 IV_R += 1
             else:
                 OOV_R += 1
         p, r = A_cap_B_size / B_size * 100, A_cap_B_size / A_size * 100
         return p, r, 2 * p * r / (p + r), OOV_R / OOV * 100, IV_R / IV * 100
     ​
     ​
     if __name__ == '__main__':
         dic = ['结婚', '尚未', '的', '和', '青年', '都', '应该', '好好考虑', '自己',  '人生', '大事']
         gold = '结婚 的 和 尚未 结婚 的 都 应该 好好 考虑 一下 人生 大事'
         pred = '结婚 的 和尚 未结婚 的 都 应该 好好考虑 一下 人生大事'
         print("Precision:%.2f Recall:%.2f F1:%.2f OOV-R:%.2f IV-R:%.2f" % prf(gold, pred, dic))

    5. 总结

    此处一共介绍了精确率、召回率、F-score、OOV召回率、IV召回率,其中前面三种指标可以用来衡量任意一种分词器分词结果的好坏;而后两种指标则是用来衡量基于词典分词模型好坏的一个评估指标。同时,一定需要明白的是:精确率计算的是预测对的正样本数占整个预测为正样本数的比重,而召回率计算的是预测对的正样本占整个真实正样本的比重,而F-score则是对两者的一个调和平均。

    摘自:https://zhuanlan.zhihu.com/p/100552669     侵删!!!

    参考:

    • 《自然语言处理入门》,何晗

     

     

    展开全文
  • 准确率-召回率 - Precision-Recall

    千次阅读 2021-10-15 17:23:27
    Precision-Recall 准确率-召回率 本文翻译自 Precision-Recall

    Precision-Recall

    准确率-召回率

    本文翻译自 Precision-Recall
    更多翻译可以看 Scikit-learn 某部分的中文翻译

    用于评估分类器输出质量的 准确率-召回率 指标示例。
    当类别非常不平衡时, 准确率-召回率 是衡量预测成功与否的有用指标。在信息检索中,准确率是衡量结果相关性的指标,而召回率是衡量返回多少真正相关结果的指标。

    准确率-召回率 曲线显示了不同阈值下准确率召回率之间的权衡。曲线下方的高面积代表高召回率和高精度,其中高精度与低误报率相关,高召回率与低误报率相关。两者的高分表明分类器正在返回准确的结果(高精度),以及返回大部分阳性结果(高召回率)。

    召回率高但精度低的系统会返回很多结果,但与训练标签相比,其大部分预测标签是不正确的。精度高但召回率低的系统恰恰相反,返回的结果很少,但与训练标签相比,它的大部分预测标签都是正确的。具有高精度和高召回率的理想系统将返回许多结果,并且所有结果都正确标记。

    准确率 ( P ) 定义为真阳性数 (Tp) 加上真阳性数加上假阳性数 (Fp)。

    P = T p T p + T f P= {T_p \above{1px} T_p+T_f} P=Tp+TfTp
    召回率 ( R ) 定义为真阳性数 (Tp) 加上真阳性数加上假阴性数 (Fn)。
    P = T p T p + F n P= {T_p \above{1px} T_p+F_n} P=Tp+FnTp
    这些数量也与 (F1) 分数有关,该分数被定义为准确率和召回率的调和平均值。

    P = 2 × P × R P + R P= 2×{P×R \above{1px} P+R} P=2×P+RP×R

    请注意,准确率可能不会随着召回率而降低。准确率的定义表明降低分类器的阈值可以通过增加返回结果的数量来增加分母。如果之前阈值设置得太高,新的结果可能都是真阳性,这会提高准确率。如果之前的阈值大约正确或太低,进一步降低阈值会引入误报,从而降低准确率。

    召回率的坟墓 Tp+Fn 不依赖于分类器阈值。这意味着降低分类器阈值可能会通过增加真阳性结果的数量来提高召回率。降低阈值也有可能使召回率保持不变,而准确率会波动。

    在图的阶梯区域可以观察到召回率准确率之间的关系——在这些步骤的边缘,阈值的微小变化会大大降低精度,而召回率只有很小的提高。

    平均精度 (Average precision - AP) 总结了这样一个图,即在每个阈值处实现的准确率的加权平均值,并将前一个阈值的召回率增加用作权重:

    A P = ∑ n ( R n − R n − 1 ) P n AP = \textstyle\sum_n(R_n - R_{n-1}) P_n AP=n(RnRn1)Pn
    其中 Pn 和 Rn 是第 n 个阈值的准确率和召回率。一对 (Rk,Pk) 被称为 工作点 ( operating point )。
    AP 和操作点下的梯形面积 (sklearn.metrics.auc) 是总结导致不同结果的精确召回曲线的常用方法。在用户指南中阅读更多内容。

    准确率-召回率 曲线通常用于二元分类以研究分类器的输出。为了将 准确率-召回率 曲线和平均精度扩展到多类或多标签分类,需要对输出进行二值化。每个标签可以绘制一条曲线,但也可以通过将标签指标矩阵的每个元素视为二元预测(微平均 - micro-averaging)来绘制准确召回曲线。

    提示 也可以参考
    sklearn.metrics.average_precision_score,
    sklearn.metrics.recall_score,
    sklearn.metrics.precision_score,
    sklearn.metrics.f1_score

    在二分问题内

    数据集和模型

    我们将使用线性 SVC 分类器来区分两种类型的鸢尾花。

    import numpy as np
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    
    X, y = load_iris(return_X_y=True)
    
    # 加入噪声特征
    random_state = np.random.RandomState(0)
    n_samples, n_features = X.shape
    X = np.concatenate([X, random_state.randn(n_samples, 200 * n_features)], axis=1)
    
    # 限制为前两个类别,然后拆分训练集跟测试集
    X_train, X_test, y_train, y_test = train_test_split(
        X[y < 2], y[y < 2], test_size=0.5, random_state=random_state
    )
    
    

    线性 SVC 期望每个特征具有相似的值范围。因此,我们将首先使用 StandardScaler 缩放数据。

    from sklearn.pipeline import make_pipeline
    from sklearn.preprocessing import StandardScaler
    from sklearn.svm import LinearSVC
    
    classifier = make_pipeline(StandardScaler(), LinearSVC(random_state=random_state))
    classifier.fit(X_train, y_train)
    

    绘制 准确率-召回率 曲线

    要绘制 准确率-召回率 曲线,您应该使用 PrecisionRecallDisplay。实际上,有两种方法可用,具体取决于您是否已经计算了分类器的预测。

    让我们首先绘制没有分类器预测的 准确率-召回率 曲线。我们使用 from_estimator 在绘制曲线之前为我们计算预测。

    from sklearn.metrics import PrecisionRecallDisplay
    
    display = PrecisionRecallDisplay.from_estimator(
        classifier, X_test, y_test, name="LinearSVC"
    )
    _ = display.ax_.set_title("2-class Precision-Recall curve")
    

    在这里插入图片描述

    如果我们已经获得了模型的估计概率或分数,那么我们可以使用 from_predictions

    y_score = classifier.decision_function(X_test)
    
    display = PrecisionRecallDisplay.from_predictions(y_test, y_score, name="LinearSVC")
    _ = display.ax_.set_title("2-class Precision-Recall curve")
    

    在这里插入图片描述

    译者注:
    其实第一个就是把训练好的模型直接扔进去让他们帮我们把测试集算分,
    第二个是把分数算好直接绘制。

    在输出结果为多标签模型中

    准确率-召回率 曲线不支持结果为多标签(多分类)模型。但是,人们可以决定如何处理这种情况。我们在下面展示了这样一个例子。

    创建多标签数据、拟合和预测

    我们创建了一个多标签数据集,以说明多标签模型中的准确率-召回率

    from sklearn.preprocessing import label_binarize
    
    # 使用 label_binarize 进行多标签设置
    Y = label_binarize(y, classes=[0, 1, 2])
    n_classes = Y.shape[1]
    
    # 分为训练集和测试集
    X_train, X_test, Y_train, Y_test = train_test_split(
        X, Y, test_size=0.5, random_state=random_state
    )
    

    我们使用 OneVsRestClassifier 进行多标签预测。

    from sklearn.multiclass import OneVsRestClassifier
    
    classifier = OneVsRestClassifier(
        make_pipeline(StandardScaler(), LinearSVC(random_state=random_state))
    )
    classifier.fit(X_train, Y_train)
    y_score = classifier.decision_function(X_test
    

    多标签模型中的平均准确率分数

    from sklearn.metrics import precision_recall_curve
    from sklearn.metrics import average_precision_score
    
    # 对应每个分类(标签)
    precision = dict()
    recall = dict()
    average_precision = dict()
    for i in range(n_classes):
        precision[i], recall[i], _ = precision_recall_curve(Y_test[:, i], y_score[:, i])
        average_precision[i] = average_precision_score(Y_test[:, i], y_score[:, i])
    
    # "micro-average"(微平均): 联合量化所有分类(标签)的分数
    precision["micro"], recall["micro"], _ = precision_recall_curve(
        Y_test.ravel(), y_score.ravel()
    )
    average_precision["micro"] = average_precision_score(Y_test, y_score, average="micro")
    

    绘制 微平均 (micro-average) 准确率-召回率 曲线

    在这里插入图片描述

    绘制每个类别的 准确率-召回率 曲线和 iso-f1 曲线

    import matplotlib.pyplot as plt
    from itertools import cycle
    
    # 设置绘图细节
    colors = cycle(["navy", "turquoise", "darkorange", "cornflowerblue", "teal"])
    
    _, ax = plt.subplots(figsize=(7, 8))
    
    f_scores = np.linspace(0.2, 0.8, num=4)
    lines, labels = [], []
    for f_score in f_scores:
        x = np.linspace(0.01, 1)
        y = f_score * x / (2 * x - f_score)
        (l,) = plt.plot(x[y >= 0], y[y >= 0], color="gray", alpha=0.2)
        plt.annotate("f1={0:0.1f}".format(f_score), xy=(0.9, y[45] + 0.02))
    
    display = PrecisionRecallDisplay(
        recall=recall["micro"],
        precision=precision["micro"],
        average_precision=average_precision["micro"],
    )
    display.plot(ax=ax, name="Micro-average precision-recall", color="gold")
    
    for i, color in zip(range(n_classes), colors):
        display = PrecisionRecallDisplay(
            recall=recall[i],
            precision=precision[i],
            average_precision=average_precision[i],
        )
        display.plot(ax=ax, name=f"Precision-recall for class {i}", color=color)
    
    # 加入 iso-f1 曲线的图例
    handles, labels = display.ax_.get_legend_handles_labels()
    handles.extend([l])
    labels.extend(["iso-f1 curves"])
    # 设置图例与坐标轴
    ax.set_xlim([0.0, 1.0])
    ax.set_ylim([0.0, 1.05])
    ax.legend(handles=handles, labels=labels, loc="best")
    ax.set_title("Extension of Precision-Recall curve to multi-class")
    
    plt.show()
    
    

    在这里插入图片描述

    源代码如下:
    Download Python source code: plot_precision_recall.py

    Download Jupyter notebook: plot_precision_recall.ipynb

    展开全文
  • YOLOV4垃圾检测召回率提升

    千次阅读 多人点赞 2021-09-02 15:43:49
    YOLOV4垃圾检测召回率提升 一. 目标检测中的mAP 1. mAP相关知识 1.1 IOU(交并比) 目标检测时,预测框和真实框的交并比,是个重要的参数。 在正负样本的划分和非极大抑制中起到关键作用 1.2 precision(准确率) / ...

    YOLOV4垃圾检测召回率提升

    一. 目标检测中的mAP

    1. mAP相关知识

    1.1 IOU(交并比)

    目标检测时,预测框和真实框的交并比,是个重要的参数。

    在正负样本的划分和非极大抑制中起到关键作用

    在这里插入图片描述

    1.2 precision(准确率) / recall(召回率)

    首先我们需要了解目标检测过程中正负样本的概念

    在目标检测中,样本置信度大于一定阈值时,模型就认为检测到了该目标,否则不认为检测到目标

    正样本指的是我们真实想要检测到的的目标(但未必检测到了),负样本指的是样本中除了正样本之外的,即不是我们真实需求的目标

    以下有四个由True/False和Positive/Negative组合而成的参数,用来代表四种不同情况:

    TP(True Positive):模型检测到且检测正确的样本,视为正样本

    FP(False Positive):模型检测到但检测错误的样本,视为负样本

    TN(True Negative):模型未检测到且确实不需要检测到的样本,无需考虑

    FN(Fale Negative):模型未检测到但是其实需要检测到的样本,视为正样本

    在这里插入图片描述

    有了这四个参数,我们可以写出precision和recall的计算公式

    precision=TP/(TP+FP) 通俗解释为:正确检测到的样本占所有被检测到的样本比例

    recall=TP/(TP+FN) 通俗解释为:正确检测到的样本占所有希望被检测到的样本比例

    其实放到真实的算法过程当中,每个预测框都会企图和交并比最大的真实框进行匹配,当满足一定条件时,它们就配对成功,配对成功了的不能和其他框再配对,这种能够找到配对对象的预测框就属于TP(说明真实框被检测到了),而找不到配对对象的预测框就属于FP,未配对的真实框就属于FN(说明真实框没有被检测到)

    理解precision和recall的意义后,不难发现,他们之间其实存在着一定的制约关系,试想:当试图提升precision时,我们会提高置信度阈值,使得识别到的目标正确概率增大,但这样难免遗漏很多正确目标;当试图提升recall时,我们会降低置信度阈值,使得更多的目标可以被识别到,这样能够将很多正确目标囊括了进来,但也会识别到很多不正确的目标,准确率就难以维持较高水准。

    1.3 AP / mAP

    目标检测中,每个类别在不同的置信度阈值下,都会有不同的precision和recall,通过在坐标上刻画precision-recall曲线,得到曲线下方的面积来刻画模型性能的好坏。这个面积就是AP(average precision)。AP的出现是为了解决单一指标(precision或recall)对模型评估的局限性,从而能够综合评估模型好坏

    在这里插入图片描述

    而mAP就是对所有类的AP求平均值,作为多类别目标检测模型性能的衡量指标。

    2. yolov4中mAP的具体算法

    1. 利用get_gt_txt.py得到测试集中真实框的种类与位置信息

    2. 通过get_dr_txt.py将测试集传入模型进行预测,得到各个预测框种类、置信度得分、位置等信息。在进行mAP的计算时,我们需要产生大量的预测框,因此在这里我们需要先将生成预测框的置信度阈值设置得非常小(0.05),就是说置信度>=0.05就可以生成预测框。这样做的目的是允许有大量不同置信度区间的预测框产生,而mAP的预测需要在不同置信度下得到对应的precision和recall,也就是为mAP的精准计算提供了条件。

      Tip: 预测框的具体生成方式在下文detect_image中提到

    3. 在get_map.py中进行具体的计算:

      1. 首先进行正负样本的划分。之前我们提到了IOU,现在它派上用场了。
      2. 假定现在有类别I,属于类别I的每个预测框都去找与它IOU值最大的真实框,记录为maxIOU,设定一个IOU_threshold门限(一般设定IOU_threshold为0.5)用于划分正负样本。当某个预测框的maxIOU<IOU_threshold时,判定该预测框为正样本;当某个预测框的maxIOU>=IOU_threshold时,又要分为两种情况,若预测框和真实框的类别也相同,那么判定该预测框为正样本,否则会寻找其他的真实框,直到找到IOU值最大且>=IOU_threshold且类别也相同的真实框,这样可以判定为正样本,若找不到,判定为负样本。最后对类别I的所有预测框按照置信度由大到小进行排序,便于取置信度阈值。
      3. 所有类别都进行2步骤,但要注意并不是一个一个类别进行的,比如并不是类别I的框筛选完了,才去筛选类别II的框,实际的逻辑应该是根据IOU由大到小进行筛选。被认定为TP的预测框会和与之匹配的真实框一起被剔除掉,不再参与和其他框的匹配过程。
      4. 对每个类别,根据已经统计好的预测框样本,通过设置不同的置信度阈值,得到相应的precision-recall,从而刻画各个类别的precision-recall曲线,求出各个类别的AP,再求得mAP
    在这里插入图片描述

    可以针对上面这个例子进行一下计算,如果置信度阈值设为0.95,那么precision=1/1=1,recall=1/3=0.3333

    如果把置信度阈值设为0.35,那么precision=3/6=0.5,recall=3/3=1

    二. yolov4的detect_image算法

    1. anchors_box锚框

    1.1 引入

    在众多经典的目标检测模型中,均有先验框的说法,有的paper(如Faster RCNN)中称之为anchor(锚点),有的paper(如SSD)称之为prior bounding box(先验框),实际上是一个概念。

    举个形象但不够恰当的例子说明:

    由于目前污染比较严重,导致海洋中漂浮着许多垃圾,这些垃圾既污染环境,又不利于鱼类的生存。假设我们面前有一片海域,海域中零星地漂浮着很多不同类型的垃圾,这些垃圾有的大,有的小,有的是方形的,有的是长条形的。为了保护环境,我们需要将所有的垃圾打捞起来,还海洋生物一个美好家园。

    为此,我们设计了一种打捞机器,该机器能够在一定范围内撒下网,进行垃圾打捞,且只有一定大小的网能够打捞到对应一定大小的垃圾,这里我们认为当网与垃圾的IoU小于0.5时,该区域不存在垃圾;网与垃圾的IoU大于0.5时,该区域存在垃圾,当然该机器能够对网进行后续的调整(调整网的位置,形状)。由于该机器有些简陋,无法智能识别该海域中哪个区域包含垃圾,为了能够尽可能的打捞到所有的垃圾,我们需要在这片海域的不同位置下网,进行垃圾的打捞,且为了打捞不同类型的垃圾,我们需要在同一位置下多个不同形状(不同大小,不同长宽比)的网。实际上,我们希望既能打捞到所有的垃圾,同时我们又希望能够下最少的网,减少工作量。

    总结:对应到目标检测任务,海域相当于网络的输入图像;不同类型的垃圾,对应不同类型的目标类别;在海域上抛下的网相当于锚框,通过锚框来判断该区域中是否包含目标。预测框的前身就是各个锚框!

    1.2 不同尺度的锚框

    在引例我们说到,为了打捞不同类型的垃圾,我们需要在同一位置下多个不同形状(不同大小,不同长宽比)的网。同样在目标检测中,在图中的同一个位置,我们会设置几个不同尺度的锚框。

    同一位置,不同尺度的锚框

    1.3 先验框与特征图的对应

    在引例我们说到,我们需要在海域的不同位置下网,进行垃圾的打捞。同样在目标检测中,需要在图片的不同位置上设置锚框。

    但是实际上如果遍历原图每个像素,设置的锚框就太多了,完全没必要。假设一个224x224的图片,每个位置设置3个不同尺寸的锚框,那么就有224x224x3=150528个,但是如果我们不去遍历原图,而是去遍历原图对应的feature map呢?以vgg16的backbone为例,下采样了5次,得到7x7的feature map,那就只需要得到7x7x3=147个先验,这样的设置大大减少了锚框的数量,同时也能覆盖大多数情况。

    2. detect_image预测框算法

    1. 首先获得锚框尺度信息,用于在特征图上生成锚框

    2. 将图像传入网络模型进行预测

    3. 在特征图上生成锚框,每个锚框通过模型可以对每个类别都产生一个置信度,选择置信度最高的类别作为该锚框的类别

    4. 设置置信度阈值,保留置信度>=阈值的锚框

    5. 对留下的锚框进行非极大抑制(NMS),即需要删除一部分框,防止大量重叠框的出现,大致思路如下:

      从待检测目标中先按照分类置信度,找一个最可信的框。然后判断其他框和它的交并比(IoU),如果大于阈值TH,说明相似,抑制掉就好了。

      算法:1.按照置信度排序 2.判断其他框和得分最高的框的IoU,大于阈值则剔除得分较小的建议框 3.从没有处理的框中继续选择一个得分最高的,重复上述过程。 4.遍历所有的建议框,即所有物体种类都做一遍非极大值抑制。

      img
    6. 经过置信度阈值和NMS的双重筛选,剩下的就是需要的预测框了。

    三. 召回率提升

    1. 目前问题

    1. 对于各个类别,无论置信度阈值调整到什么位置都无法让recall达到95%,分析原因有两个方面:

      1. 预测框与真实框重合度不够,这样get_mAP.py就不认为检测到了目标

      2. 存在误检,即识别错了种类,把类别I识别成了类别II,那这样类别I的recall永远也到不到100%,因为已经有一个被识别为了其他种类,再怎么下降置信度阈值,也无法改变这个类别无法被完全正确识别的事实。

        image-20210902121034385

        以测试集中betel nut bags的置信度阈值-recall曲线举个例子,首先需要知道的是置信度阈值的设定方式,实际上这里的Score_Threhold以每个betel nut bags预测框的置信度都做一次置信度阈值,如果说这些预测框囊括了所有betel nut bags目标,那么以预测框中最低的置信度做阈值时,理论上recall将会达到100%。然而图像中并没有呈现这样的结果,说明这已经不是调整置信度阈值能解决的了,而是模型的性能存在问题,什么原因呢?大概就是以上两个原因。

    2. 我们需要的是整体的召回率>=95%还是每个类别的召回率都>=95%呢。相对而言整体召回率>=95%会更容易达到,而要求每个类别的召回率>=95%更加严苛,相信这个不难理解,因为某一个没达到并不代表整体无法达到

    2. 提升策略

    1. 调整模型参数,例如Epoch/batch_size的调整,防止出现过拟合,当然也不能出现欠拟合
    2. 丰富数据集,一方面是要具有特征的多样性,另一方面是同种类别也要有足够的数量,主要的重点类别之间数量要均衡。这样训练出的模型具更广泛的检测识别能力,且可以减少误识类别的现象,对召回率的提升均有帮助
    3. 开启yolov4中Mosaic数据增强
    4. 继续自主的数据增强
    5. 在必要情况下增多anchors锚框的种类(只在存在一些刁钻比例垃圾时才使用)
    6. 以上将决定recall召回率的上限,只有上限达到95%,才能通过调整置信度阈值来使得recall>=95%,否则再怎么降低阈值都没用,因为上限不够。在上限足够的情况下,就可以通过调整判定与真实框匹配的IOU值和置信度阈值,再进一步提高recall
    展开全文
  • python实现计算精度、召回率和F1值

    千次阅读 2020-12-17 02:47:13
    python实现计算精度、召回率和F1值摘要:在深度学习的分类任务中,对模型的评估或测试时需要计算其在验证集或测试集上的预测精度(prediction/accuracy)、召回率(recall)和F1值。本文首先简要介绍如何计算精度、召回...
  • 只考虑Accuracy和AUC的调参方式是错误的;尤其是在不均衡样本时候,必须考虑精确率和召回率,本文采用基于遗传算法思想的调参方式,大概率来获得全局最优解
  • 参考:准确率、精确率、召回率 - 知乎 以一个二分类系统来讲,通常情况下我们会将数据分为两类:正确(T),错误(F) ,但是在我们实际操作的运行模型的结果中会出现四种不同的分类结果 P(positive)N(Nagitive) ...
  • 分类是机器学习中比较常见的任务,对于分类任务常见的评价指标有 准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 score、ROC曲线(Receiver Operating Characteristic Curve)等。
  • 准确率,召回率

    万次阅读 2021-01-01 19:31:34
    1、准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。其中精度是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查...
  • 文章目录 TP、TN、FP、FN 召回率 Recall 命中率 TPR: True Positive Rate 误报率 FPR: False Positive Rate 准确率 Accuracy 精确度 Precision 综合查全率 F-Measure 参考 TP、TN、FP、FN 这 4 个名词表示的是数量。...
  • 分类模型的评估 estimator.score():一般最常见使用的是准确率,即预测结果正确的百分比 ...精确率(Precision)与召回率(Recall) 分类模型评估API •sklearn.metrics.classification_report ...
  • 文章目录1️⃣前言2️⃣召回率3️⃣精确率4️⃣总结 1️⃣前言 混淆矩阵的更多信息可以查看我另外一篇文章 2️⃣召回率 可以看到召回率的分母是TP+FN,表示正样本的个数,是没有办法改变的,是客观的;那么只有TP...
  • 「机器学习」准确率、精确率、召回率、F1分数、ROC-AUC机器学习最后更新 2020-08-31 16:22阅读 210最后更新 2020-08-31 16:22阅读 210机器学习在机器学习中衡量一个模型是否准确我们有很多指标:准确率 - accuracy...
  • 召回率和精准率

    2022-03-19 14:29:24
    召回率:真实正例的样本中预测结果为正例的比例 假设动物园中有一百只动物 那么其中老虎有20只,剩下的80只是其他的动物。 我们在做完预测后,预测结果20只动物里面有15只老虎(真正例),5只其他的动物(伪...
  • 最近在看机器学习的,要理解准确率、精确率、召回率的含义,首先要理解TP、FN、FT 和 TN 的含义。TP、FN、FT 和 TN 这几个概念一直搞得不太清楚。记录一下。看了别人的文章,举的例子不是太好,不太容易理解 。假设...
  • 召回率

    千次阅读 2018-09-29 17:57:46
    就是针对这次预测行为产生的正确率,76/78,召回率呢,就是就是样本里放出去80个A去测试,结果呢,只测试出78个A,相当于我只能收回来预测正确的76个 (错误的总不能召回吧), 所以召回率就是76/80 那么我们又...
  • T是True,F是False,P是positive,N是negetive TP ——将正类预测为正类的数量(解释为:预测正确,...P=TP/(TP+FP),TP+FP是预测出来是正类的总数二、召回率:在实际正类中,有多少正类被模型发现了 R = TP/(TP+FN),T
  • 参考:一文让你彻底理解准确率,精准率,召回率,真正率,假正率,ROC/AUC 待整理学习
  • 学习和研究机器学习、深度学习的人经常会需要对AI模型的效果进行判定,其中最常用到的判定依据是精确度(Precision,又称为准确度、精准度)和召回率(Callback)。到底什么是精确度和召回率?它们的本质区别是什么?...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,203
精华内容 18,481
关键字:

召回率