用R语言绘制ROC曲线的实例讲解
程序员文章站
2022-03-17 16:19:51
1 roc曲线的意义roc曲线就是用来判断诊断的正确性,最理想的就是曲线下的面积为1,比较理想的状态就是曲线下的面积在0.8-0.9之间,0.5的话对实验结果没有什么影响。如图:2代码部分instal...
1 roc曲线的意义
roc曲线就是用来判断诊断的正确性,最理想的就是曲线下的面积为1,比较理想的状态就是曲线下的面积在0.8-0.9之间,0.5的话对实验结果没有什么影响。
如图:
2代码部分
install.packages(“proc”) install.packages(“ggplot2”) library(proc) library(ggplot2) #建立曲线 data(asah) rocobj1<-roc(asaho u t c o m e , a s a h outcome,asahoutcome,asahs100b) rocobj2<-roc(asaho u t c o m e , a s a h outcome,asahoutcome,asahwfns) rocobj3<-roc(asaho u t c o m e , a s a h outcome,asahoutcome,asahndka) #计算full auc auc(rocobj1) auc(rocobj2) auc(rocobj3) #绘制曲线 plot(rocobj1) #其他参数美化 plot(rocobj1,print.auc=true,auc.polygon=true,grid=c(0.1,0.2),grid.col=c(“green”,“red”),max.auc.polygon=true,auc.polygon.col=“skyblue”,print.thres=true) #计算partial auc选择关注一定范围数据 plot(rocobj1,print.auc=true,auc.polygon=true,partial.auc=c(0.8,0.4),partial.auc.focus=“sp”,grid=c(0.1,0.2),grid.col=c(“green”,“red”),max.auc.polygon=true,auc.polygon.col=“skyblue”,print.thres=true,reuse.auc=false) #比较两个曲线,proc提供三种方法比较“delong”, “bootstrap”或“venkatraman” roc.test(rocobj1,rocobj2,method = “bootstrap”) #ggroc(功能仍在测试中)绘制multiple curves g3<-ggroc(list(s100b=rocobj,wfns=rocobj2,ndka=rocobj3)) g3 install.packages(“proc”) library(“proc”)##roc data(asah) roc1<-roc(mydatal a b e l , m y d a t a label,mydatalabel,mydatascore) roc2<-roc(mydata2l a b e l , m y d a t a 2 label,mydata2label,mydata2score) polt(roc1,col=“blue”) polt.roc(roc2,add=true,col=“red”)
3 实验结果
补充:r语言proc包绘制多重roc曲线(信用评分应用,已有label和相应score)
数据:好坏标签label、用四种model简单计算出的每一个样本的score,标记为pre1至pre4,约1w样本
目的:使用proc包绘制roc曲线,并生成auc值
1.读入数据
data<-read.csv(file="d:/个人消费信用/第三次上机/工作簿2.csv",header=t)
header=t 即在读取中,将原有数据的第一行设置为变量名。
注意文件的分隔为 “ / ”,与默认不同。
2.画出最基本的roc曲线
library(proc) #加载proc包 roc1<-roc(data$label,data$pre1) plot(roc1,print.auc=true,plot=true, print.thres=true)
包含auc的值和最优临界点,下面把它美化一下~
(问题:为啥横坐标specificity的范围是1.5到-0.5,查了一下没有找到原因,可能是因为原数据本身的问题,以前以违约概率而非score的时候没有出现这个问题,择日探究……tvt)
3.美化roc曲线
plot(roc2,print.auc=true,print.auc.x=0.4,print.auc.y=0.4,auc.polygon=true,auc.polygon.col="gray", smooth=true, grid=c(0.5, 0.2), grid.col=c("black", "black"), max.auc.polygon=true, print.thres=true,print.thres.cex=0.8, lty=1,main=" roc曲线",mfrow=c(1,1))
解释在括号里面叠加命令的代码:
print.auc.x=0.4,print.auc.y=0.4 #设置auc值显示出来的坐标 auc.polygon=true,auc.polygon.col="gray" #设置roc曲线下填充色,此处设定为灰色 smooth=true #使roc曲线变得光滑 max.auc.polygon=true #整个图像填充 print.thres.cex=0.8 #设置最优临界点字体的大小 lty=1,main=" roc曲线",mfrow=c(1,1) #设置标题啥的 mfrow貌似是图形参数,待查……
4.合并roc曲线
由于共有4个model,所以要想比较模型的优劣,可以将四个roc曲线画到一起。
roc1<- roc(data$label,data$pre1) roc2<- roc(data$label,data$pre2) roc3<- roc(data$label,data$pre3) roc4<- roc(data$label,data$pre4) plot(roc1, print.auc=true,print.auc.x=0.4,print.auc.y=0.4, auc.polygon=true,auc.polygon.col="gray", grid=c(0.5, 0.2),smooth=t,grid.col=c("black", "black"), max.auc.polygon=true) plot.roc(roc2,add=t,col="red", print.auc=true,print.auc.x=0.3,print.auc.y=0.3) plot.roc(roc3,add=t,col="blue",print.auc=true,print.auc.x=0.5,print.auc.y=0.5) plot.roc(roc4,add=t,col="yellow",print.auc=true,print.auc.x=0.6,print.auc.y=0.6)
由于此处要显示auc值,且不要重合~所以在后面加上了print.auc=true,print.auc.x=0.6,print.auc.y=0.6的命令。
如果不重合的话,直接在roc1下面加上下列代码即可:
plot.roc(roc2,add=t,col="red")
由于原有数据的问题,这里的四条roc曲线几乎重合~但此处只是介绍proc包绘制roc曲线的用法。就不要太在意辽!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。