如何画ROC曲线和FROC曲线

更新时间:2023-06-27 03:03:14 阅读: 评论:0

如何画ROC曲线和FROC曲线
画ROC曲线代码
例⼦
# coding=UTF-8
from sklearn import metrics
import matplotlib.pylab as plt
#真实值
GTlist = [1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]
#模型预测值
Problist = [0.99, 0.98, 0.97, 0.93, 0.85, 0.80, 0.79, 0.75, 0.70, 0.65,
0.64, 0.63, 0.55, 0.54, 0.51, 0.49, 0.30, 0.2, 0.1, 0.09]
fpr, tpr, thresholds = _curve(GTlist, Problist, pos_label=1)
roc_auc = metrics.auc(fpr, tpr)  #auc为Roc曲线下的⾯积
print(roc_auc)
plt.plot(fpr, tpr, 'b',label='AUC = %0.2f'% roc_auc)
plt.legend(loc='lower right')
# plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([-0.1, 1.1])
plt.ylim([-0.1, 1.1])
plt.xlabel('Fal Positive Rate') #横坐标是fpr
plt.ylabel('True Positive Rate')  #纵坐标是tpr
plt.title('Receiver operating characteristic example')
plt.show()
FROC曲线
FROC曲线介绍
FROC曲线,是ROC曲线的⼀个⼩变种,将横轴上Specificity改为Fal positives number,即FP数。
FROC曲线的横坐标FPS = FP/image_num,image_num代指测试image的个数(如果测试整个luna16的话,那么image_num就是888)。这就是⾥⾯会出现0.125,0.25,0.5,1.0,2.0,....,8.0的原因。
但是得代码中并不是根据横坐标值,然后去得到纵坐标值。如果看过ROC曲线怎么画出来就知道,是通过⼀个阈值,然后得到nsitive, specificity。FROC也⼀样,还是得通过阈值,在每个阈值下,就可以求得TP,FP,FN, TN,然后知道nsitive,
specificity(公式),然后通过公式FPS = FP/image_num就可以得到。这⾥⾯还有⼀点是luna16的检测指标是CPM值(即在每个样本的假阳例数为1/8,1/4,1/2,1,2,4和8上的平均敏感度)。如果在所有阈值下都没有1/8,1/4,1/2,1,2,4和8。做法很简单直接在这些值附近就可以进⾏代替。
FROC曲线代码
⾸先还是提⼀下原理吧,sklearn⾥⾯没有求FROC曲线的的函数,看了其他代码才知道可以使⽤求ROC曲线的函数
(_curve),使⽤这个函数就可以完成FROC曲线代码。FROC曲线的纵坐标是nsitity,这个使⽤_curve这个函数返回值就有(tpr)。FROC曲线的横坐标FP/image_num,image_num代指测试image的个数,这个是知道的,主要是FP,其实FP 可以使⽤fpr得到(
c_curve的返回值),FPR即Fal Positive Rate,FPR=FP/(TN+FP),转化⼀下FP=FPR(TN+FP),现在都知道了FP,既然所有都知道该怎么求了,就可可以画出FROC曲线。其中TN+FP就是代码⾥⾯的(totalNumberOfCandidates -numberOfDetectedLesions)
代码参考的是的源码
reduction例⼦
# coding=UTF-8
atofrom sklearn import metrics
import matplotlib.pylab as plt
GTlist = [1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
Problist = [0.99, 0.98, 0.97, 0.93, 0.85, 0.80, 0.79, 0.75, 0.70, 0.65,
shero是什么意思
0.64, 0.63, 0.55, 0.54, 0.51, 0.49, 0.30, 0.2, 0.1, 0.09,
0.1, 0.5, 0.6, 0.7, 0.8, 0.5, 0.2, 0.3, 0.2, 0.5]
#num of image
totalNumberOfImages = 2
numberOfDetectedLesions = sum(GTlist)
totalNumberOfCandidates = len(Problist)
fpr, tpr, thresholds = _curve(GTlist, Problist, pos_label=1)
#FROC
fps = fpr * (totalNumberOfCandidates - numberOfDetectedLesions) / totalNumberOfImages
ns = tpr
plt.plot(fps, ns, color='b', lw=2)
botswanaplt.legend(loc='lower right')
# plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.125, 8])
plt.ylim([0, 1.1])
plt.xlabel('Average number of fal positives per scan') #横坐标是fpr
plt.ylabel('True Positive Rate')  #纵坐标是tpr
plt.title('FROC performence')
plt.show()
下⾯的代码多了⼀个平均FROC,供参考
# coding=UTF-8
from sklearn import metrics
rvices msc
import matplotlib.pylab as plt
import numpy as np
GTlist = [1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
汽车保险购买技巧
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
Problist = [0.99, 0.98, 0.97, 0.93, 0.85, 0.80, 0.79, 0.75, 0.70, 0.65,
0.64, 0.63, 0.55, 0.54, 0.51, 0.49, 0.30, 0.2, 0.1, 0.09,
0.1, 0.5, 0.6, 0.7, 0.8, 0.5, 0.2, 0.3, 0.2, 0.5]民法案例分析
#num of image
totalNumberOfImages = 2
numberOfDetectedLesions = sum(GTlist)
totalNumberOfCandidates = len(Problist)
fpr, tpr, thresholds = _curve(GTlist, Problist, pos_label=1)
#FROC
fps = fpr * (totalNumberOfCandidates - numberOfDetectedLesions) / totalNumberOfImages
ns = tpr
fps_itp = np.linspace(0.125, 8, num=10001)
ns_itp = np.interp(fps_itp, fps, ns)
frvvlu = 0
nxth = 0.125
for fp, ss in zip(fps_itp, ns_itp):
if abs(fp - nxth) < 3e-4:
print(ss)
frvvlu += ss
nxth *= 2
if abs(nxth - 16) < 1e-5: break
print(frvvlu / 7, nxth)
#画图
plt.plot(fps, ns, color='b', lw=2)
plt.legend(loc='lower right')
# plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.125, 8])
plt.ylim([0, 1.1])
plt.xlabel('Average number of fal positives per scan') #横坐标是fpr
plt.ylabel('True Positive Rate')  #纵坐标是tpr
plt.title('FROC performence')
plt.show()
下⾯是转别⼈的,原理讲解的很详细,原地址;
1. ⼆分类的评估标准
其实⼤家都很容易了解,我就举个例⼦就过了哈,⼆分类⽆⾮就是⼀个预测器(随着深度学习流⾏,⼤家都只知道model模型了吧?其实在古⽼的机器学习中,应该叫学习器,预测器等),预测器对输⼊数据作预测,⼀般都是预测出该输⼊数据有多⼤概率属于正类,因为是⼆分类嘛,⼀般设定阈值为0.5(后⾯细说阈值),⼤于0.5预测为正,⼩于则预测为负。
然⽽你预测的数据是有真实的类别吧,就有可能会出现以下四种情况:
正样本被预测为正,当然正确,就是真正类(TP, true positive),真的是正类。
正样本被预测为负,错了吧,就是假负类(FN,fal negative),假的负类。
负样本被预测为正,也是错滴,就是假正类(FP,fal positive),假的正类。
负样本被预测为负,正确的,就是真负类(TN,true negative),真的是负类。
图1:混淆矩阵(Confusion matrix)
那么要如何评价我们的预测器性能,最简单的就是准确性(Accuracy):
primadonna
可是,这样的评估标准真的就很好了吗?其实,是最差滴....
观众英语让我们来试着计算⼀下以下模型的准确率,该模型将 100 个肿瘤分为恶性(正类)或良性(负类):
图2:准确性的评估标准往往并不客观
knika数据不均衡的数据集
可以看到,准确率为91%呢,可是这个预测器真的好吗?100个有肿瘤的样本中,91个为良性(90个TN和1个FP),9个为恶性(1个TP 和8个FN)。
在 91 个良性肿瘤中,该模型将 90 个正确识别为良性。这很好。不过,在 9 个恶性肿瘤中,该模型仅将 1 个正确识别为恶性。这是多么可怕的结果!9 个恶性肿瘤中有 8 个未被诊断出来!
虽然 91% 的准确率可能乍⼀看还不错,但如果另⼀个肿瘤分类器模型总是预测良性,那么这个模型使⽤我们的样本进⾏预测也会实现相同的准确率(100 个中有 91 个预测正确)。换⾔之,我们的模型与那些没有预测能⼒来区分恶性肿瘤和良性肿瘤的模型差不多。
当使⽤分类不平衡的数据集(⽐如正类别标签和负类别标签的数量之间存在明显差异)时,单单准确率⼀项并不能反映全⾯情况。这时候就需要查准率和查全率。
2. 查准率和查全率
现实情况复杂,针对预测器需求的不同,例如:信息检索中,都有以下情况(下⾯有点绕):
查准率:预测器检索出的信息要尽可能的满⾜⽤户(即,预测感兴趣(正类)要更准,减少预测出⽤户不感兴趣的信息数(假正类的数量))
查全率:⽤户感兴趣的信息要尽可能检索出来(即,⽤户感兴趣的信息要预测全,减少预测为不感兴趣的信息⽽实际确实感兴趣信息的数量(假负类))
上述的⽆⾮就是查准率(Precision)和查全率(Recall):
同样举例⼦:0,1,2,...,9,⼗个信息,⽤户对于0-4的5个信息是不感兴趣的,⽽5-9的信息是感兴趣的。以下两个预测器A和B:预测器A预测:0-5是⽤户不感兴趣的,6-9是⽤户感兴趣的。
查准率:100%,查全率:75%
预测器B预测:0-3是⽤户不感兴趣的,4-9是⽤户感兴趣的。
查准率:80%,查全率:100%
选择哪个预测器更好?这时候就需要看需求了,是要⾼的查准率还是⾼的查全率?
但是,更多的情况是预测器间差距⼩,想要⼀个更好的预测器,如何评估?
可以使⽤F1-Score来评估:
上述例⼦中,预测器A的F1-Score为0.857,预测器B的F1-Score为0.889。
当然上述的例⼦有点极端,但是真实计算过程⼤概就那样!
3. ROC曲线和AUC的计算
在真实的预测器中,要想调整查准率和查全率是很简单的,还记得我们第⼀节说的阈值。
这⾥好好说下这个概念,预测器实际是预测出输⼊样本属于正类别的概率,⽽我们上述所说的预测正类,全是因为设置了阈值,⼀般设置为0.5。
通过改变阈值的设置,可以改变预测器的准确率,查准率,查全率等。那么要对⼀个分类器作全⾯的评估,我们使⽤ROC曲线(Receiver operating characteristic)。
参考资料:
有⼈可能会问:为啥要⽤不同阈值评估,不可以统⼀设置阈值为0.5,⼤家都来⽐较准确率,查准率和查全率就得了,不⽤那么⿇烦。
这是因为,只评估单⼀阈值,是对分类器不公平的,不同分类器可能会对不同阈值有⼀定的依赖,在这⼀阈值下可能A分类性能都要好,但在另⼀个阈值下,可能B分类性能要更好些。所以要做到更加客观的评估,我们绘出ROC曲线。
那么ROC曲线是如何通过不同阈值来计算出最终结果的呢?

本文发布于:2023-06-27 03:03:14,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/158953.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:预测器   曲线   预测   阈值   信息   评估   模型   正类
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图