40

我有一些模型,ROCR在预测类百分比的向量上使用包,我有一个性能对象。用规格“tpr”、“fpr”绘制性能对象会给我一条 ROC 曲线。

我正在比较某些误报率 (x) 阈值的模型。我希望从性能对象中获得真阳性率 (y) 的值。更重要的是,我想获得用于生成该点的班级百分比阈值。

x-value最接近阈值但不超过阈值的误报率 ( ) 的索引号应该给我适当的真阳性率 ( y-value) 的索引号。我不确定如何获得该索引值。

更重要的是,我如何获得用于说明这一点的类概率阈值?

4

3 回答 3

68

这就是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 类,所以我们可以@用来访问插槽。这是您制作的方法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
于 2013-05-02T19:13:27.853 回答
18

软件包pROC包括coords计算最佳阈值的功能:

library(pROC)
my_roc <- roc(my_response, my_predictor)
coords(my_roc, "best", ret = "threshold")
于 2016-10-26T18:53:08.093 回答
9

2个基于ROCRpROC包的解决方案:

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包,它提供了许多算法来找到最佳阈值。

于 2016-01-31T15:15:36.090 回答