前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PR曲线和ROC曲线概念及其区别

PR曲线和ROC曲线概念及其区别

作者头像
全栈程序员站长
发布2022-07-02 16:25:03
4940
发布2022-07-02 16:25:03
举报

大家好,又见面了,我是你们的朋友全栈君。

知识点

Precision=TP/(TP+FP) Recall=TP/(总的正样本)=TP/(TP+FN) # 这个时候的 TPR=TP/(TP+FN)=Recall # 真正例率 FPR=FP/(TN+FP) # PR曲线 横Recall,纵Precision PR曲线的绘制 场景:有限样本。 方法:固定分类阈值(比如0.5),对分类器的预测结果按照置信度进行降序排序,然后按此顺序对样例进行预测,每次可以计算出当前的查全率(Recall)和查准率(Precision),然后以此作图,绘制出P-R曲线。(疑惑??:P-R曲线是按照固定的分类阈值,还是按照西瓜书所讲,按照置信度降序的顺序,逐个把样本作为正例进行预测??我做商汤的笔试题,是采取固定分类阈值的策略) ROC曲线 横FPR,纵TPR,理想的情况是TPR=1,FPR=0,一般来说,FPR增大,则TPR也会跟着增大。 ROC曲线的绘制: 场景:有限样本。 方法:卡阈值,对学习器的预测结果排序,排在前面的是最可能为正例的样本,最后的是最不可能的样本,然后计算不同阈值下的TPR和FPR值,绘制出曲线。 卡阈值作为正负样本的判定依据,阈值较高时,Precision比较大,阈值较低时,Recall较大。(推荐的话,想Precision较大,用户希望排名靠前的推荐是自己想要的,刑侦的话希望Recall较大,不错过一个犯人) AUC:ROC曲线下面积。 PR和ROC曲线应用范围: 1.当正负样本比例差不多的时候,两者区别不大。 2.PR曲线比ROC曲线更加关注正样本,而ROC则兼顾了两者。 3.AUC越大,反映出正样本的预测结果更加靠前。(推荐的样本更能符合用户的喜好) 4.当正负样本比例失调时,比如正样本1个,负样本100个,则ROC曲线变化不大,此时用PR曲线更加能反映出分类器性能的好坏。 5.PR曲线和ROC绘制的方法不一样。

PR曲线和ROC曲线区别参考链接: http://www.fullstackdevel.com/computer-tec/data-mining-machine-learning/501.html

附:商汤计算PR题

代码语言:javascript
复制
#-*-coding:utf-8-*-
def s4j5(a):
    a1=float(int(a*100))
    tag=a*100-a1
    if tag>=0.5:
        return((a1+1)/100)
    else:
        return(a1/100)

N = int(raw_input())
recall = 0.0
labelCon = []
totalPos = 0
for i in range(N):
    temp = [xx for xx in raw_input().strip().split()]
    target, confidence = int(temp[0]), float(temp[0])
    labelCon.append([target, confidence])
    if target==1:
        totalPos+=1
count = 0
posCount = 0
correctCount = 0
FP = 0
FN = 0
someRecallDict = {0.3:0,
            0.4:0,
            0.5:0,
            0.6:0,
            0.7:0,
            0.8:0,
            0.9:0}

someRecall = [0.3,0.4,0.5,0.6,0.7,0.8,0.9]
res = []
posId = 0
predictPos = 0
for target, confidence in labelCon:
    count+=1
    if confidence>=0.5:
        predictPos+=1 # 预测为正类的样本个数
    if target==0:
        if confidence>=0.5:
            FP+=1
    if target==1:
        posCount+=1
        if confidence>=0.5:
            correctCount+=1
        else:
            FN+=1
        recall = float(correctCount)/float(totalPos)
        if posId<=6:
            if recall==someRecall[posId] and someRecallDict[someRecall[posId]]==0:
                someRecallDict[someRecall[posId]]=1
                posId+=1
                precision = int(str(s4j5(float(correctCount)/float(predictPos))*100).split('.')[0])
                res.append(precision)

for i in res:
    print(i)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148428.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 知识点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档