我有一些模型,使用ROCR包对预测类百分比的向量,我有一个性能对象。用“tpr”,“fpr”的规格绘制性能对象,得到ROC曲线。我在比较模型的假阳性率(x)的阈值,我希望从性能对象中得到真阳性率(y)的值,更希望得到用于生成该点的类百分比阈值。最接近阈值但不高于阈值的假阳性率(x-value)的索引号应该给予我适当的真阳性率(y-value)的索引号,我不确切地知道如何获得该索引值。更重要的是,我如何得到用来证明这一点的类概率的阈值?
ROCR
x-value
y-value
jk9hmnmh1#
这就是为什么str是我最喜欢的R函数:
str
library(ROCR) data(ROCR.simple) pred <- prediction( ROCR.simple$predictions, ROCR.simple$labels) perf <- performance(pred,"tpr","fpr") plot(perf) > str(perf) Formal class 'performance' [package "ROCR"] with 6 slots ..@ x.name : chr "False positive rate" ..@ y.name : chr "True positive rate" ..@ alpha.name : chr "Cutoff" ..@ x.values :List of 1 .. ..$ : num [1:201] 0 0 0 0 0.00935 ... ..@ y.values :List of 1 .. ..$ : num [1:201] 0 0.0108 0.0215 0.0323 0.0323 ... ..@ alpha.values:List of 1 .. ..$ : num [1:201] Inf 0.991 0.985 0.985 0.983 ...
这是一个S4 class,所以我们可以使用@来访问插槽。下面是如何创建一个data.frame:
@
data.frame
cutoffs <- data.frame(cut=perf@alpha.values[[1]], fpr=perf@x.values[[1]], tpr=perf@y.values[[1]]) > head(cutoffs) cut fpr tpr 1 Inf 0.000000000 0.00000000 2 0.9910964 0.000000000 0.01075269 3 0.9846673 0.000000000 0.02150538 4 0.9845992 0.000000000 0.03225806 5 0.9834944 0.009345794 0.03225806 6 0.9706413 0.009345794 0.04301075
如果您有一个想要达到的fpr阈值,可以将此data.frame作为子集,以查找低于此fpr阈值的最大tpr:
cutoffs <- cutoffs[order(cutoffs$tpr, decreasing=TRUE),] > head(subset(cutoffs, fpr < 0.2)) cut fpr tpr 96 0.5014893 0.1495327 0.8494624 97 0.4997881 0.1588785 0.8494624 98 0.4965132 0.1682243 0.8494624 99 0.4925969 0.1775701 0.8494624 100 0.4917356 0.1869159 0.8494624 101 0.4901199 0.1962617 0.8494624
piah890a2#
包pROC包括用于计算最佳阈值的函数coords:
pROC
coords
library(pROC) my_roc <- roc(my_response, my_predictor) coords(my_roc, "best", ret = "threshold")
uplii1fm3#
基于ROCR和pROC封装的2种解决方案:
threshold1 <- function(predict, response) { perf <- ROCR::performance(ROCR::prediction(predict, response), "sens", "spec") df <- data.frame(cut = perf@alpha.values[[1]], sens = perf@x.values[[1]], spec = perf@y.values[[1]]) df[which.max(df$sens + df$spec), "cut"] } threshold2 <- function(predict, response) { r <- pROC::roc(response, predict) r$thresholds[which.max(r$sensitivities + r$specificities)] } data(ROCR.simple, package = "ROCR") threshold1(ROCR.simple$predictions, ROCR.simple$labels) #> [1] 0.5014893 threshold2(ROCR.simple$predictions, ROCR.simple$labels) #> [1] 0.5006387
另请参见OptimalCutpoints包,其中提供了许多算法来查找最佳阈值。
OptimalCutpoints
jmp7cifd4#
基本上,ROC曲线中的最佳阈值是曲线的最宽部分,或者是在保持最低FPR FPR & TPR corresponding to best threshold - ROC curve的同时给出最大TPR的点因此,还可以通过找到TPR和FPR之间的最宽点或具有最大间隔的点来找到最佳阈值下面是使用ROSE包的快速解决方案
library(ROSE) library(data.table) threshold_data<-roc.curve(df$response,my_predictor,plotit = TRUE) #Get TPR, FPR and corresponding threshold from roc.curve function and convert to dataframe threshold_data<-data.frame(TPR = threshold_data$false.positive.rate, FPR = threshold_data$true.positive.rate, threshold = threshold_data$thresholds) # TPR FPR threshold sep # 1.0000000000 1.0000000 -Inf 0.0000000 # 0.7474009553 0.9820701 0.03405027 0.2346691 # 0.5869626300 0.9478403 0.08923265 0.3608776 # 0.4003933689 0.8777506 0.17368989 0.4773572 # 0.2225344198 0.7571312 0.25101859 0.5345968 # 0.1441416128 0.6495518 0.33035935 0.5054101 # 0.0868221411 0.5281174 0.44915920 0.4412952 # 0.0261309357 0.3390383 0.57857430 0.3129074 # 0.0089912897 0.2257539 0.76554635 0.2167626 # 0.0008429334 0.1140994 0.93730006 0.1132565 # 0.0000000000 0.0000000 Inf 0.0000000 threshold_data<-setDT(threshold_data) threshold_data[,sep:=abs(FPR-TPR)] best_threshold<-threshold_data[sep==max(sep),threshold] #0.2510185 #Same result with package pROC library(pROC) my_curve <- roc(df$my_response,my_predictor) coords(my_curve, "best", ret = "threshold") #0.2510185
jhdbpxl95#
以下是Juilee的回答:数据框中TPR和FPR的定义是错误的。更正它们并重新发布相同的答案。
threshold_data<-data.frame(FPR = threshold_data$false.positive.rate, TPR = threshold_data$true.positive.rate, threshold = threshold_data$thresholds)
5条答案
按热度按时间jk9hmnmh1#
这就是为什么
str
是我最喜欢的R函数:这是一个S4 class,所以我们可以使用
@
来访问插槽。下面是如何创建一个data.frame
:如果您有一个想要达到的fpr阈值,可以将此
data.frame
作为子集,以查找低于此fpr阈值的最大tpr:piah890a2#
包
pROC
包括用于计算最佳阈值的函数coords
:uplii1fm3#
基于
ROCR
和pROC
封装的2种解决方案:另请参见
OptimalCutpoints
包,其中提供了许多算法来查找最佳阈值。jmp7cifd4#
基本上,ROC曲线中的最佳阈值是曲线的最宽部分,或者是在保持最低FPR FPR & TPR corresponding to best threshold - ROC curve的同时给出最大TPR的点
因此,还可以通过找到TPR和FPR之间的最宽点或具有最大间隔的点来找到最佳阈值
下面是使用ROSE包的快速解决方案
jhdbpxl95#
以下是Juilee的回答:
数据框中TPR和FPR的定义是错误的。更正它们并重新发布相同的答案。