从 ROC 曲线获取阈值
Posted
技术标签:
【中文标题】从 ROC 曲线获取阈值【英文标题】:Obtaining threshold values from a ROC curve 【发布时间】:2013-04-27 04:24:54 【问题描述】:我有一些模型,在预测类百分比的向量上使用ROCR
包,我有一个性能对象。用规格“tpr”、“fpr”绘制性能对象会给我一条 ROC 曲线。
我正在比较具有某些误报率 (x) 阈值的模型。我希望从性能对象中获得真阳性率 (y) 的值。更重要的是,我想获得用于生成该点的班级百分比阈值。
最接近阈值但不超过阈值的误报率 (x-value
) 的索引号,应该给我适当的真阳性率 (y-value
) 的索引号。我不确定如何获得该索引值。
更重要的是,我如何获得用于说明这一点的类概率阈值?
【问题讨论】:
【参考方案1】:2 个基于 ROCR
和 pROC
包的解决方案:
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
包,它提供了许多算法来找到最佳阈值。
【讨论】:
【参考方案2】:包pROC
包含函数coords
用于计算最佳阈值:
library(pROC)
my_roc <- roc(my_response, my_predictor)
coords(my_roc, "best", ret = "threshold")
【讨论】:
【参考方案3】:这就是为什么str
是我最喜欢的 R 函数:
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
的方法:
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
【讨论】:
你太棒了。并感谢您提及 str。如果我将来如此难过,我会使用它。 @user24926 很高兴为您提供帮助! 我真的很喜欢这个答案中的交互式和迭代方法。 如果您想自动找到给出 50% 截止值的 t 值:cutoffs[findInterval(0.5, cu$tpr), 'cut']
,只要截止值按升序排序。
如果您的截止点不在列表中怎么办? @smci 50% 截止的答案输出 cutoff= 0.4997881
的值以上是关于从 ROC 曲线获取阈值的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用Epi包的的ROC函数对单变量进行ROC分析并可视化ROC曲线寻找最佳阈值(thresholdcutoff)在可视化曲线中添加最佳阈值点
Sklearn机器学习——ROC曲线ROC曲线的绘制和AUC面积运用ROC曲线找到最佳阈值
R语言使用pROC包的的plot.roc函数对单变量进行ROC分析并可视化ROC曲线寻找最佳阈值(thresholdcutoff)在可视化曲线中添加最佳阈值点
R语言使用Epi包的的ROC函数对多变量进行ROC分析并可视化ROC曲线寻找最佳阈值(thresholdcutoff)在可视化曲线中添加最佳阈值点