2013-05-02 4 views
28

У меня есть несколько моделей с использованием пакета ROCR на векторе прогнозируемого процентного класса, у меня есть объект производительности. Построение объекта производительности со спецификациями «tpr», «fpr» дает мне кривую ROC.Получение пороговых значений из кривой ROC

Я сравниваю модели с определенными порогами ложной положительной скорости (x). Я надеюсь получить значение истинной положительной скорости (y) из объекта производительности. Более того, я хотел бы получить порог процентного класса, который использовался для создания этой точки.

номер индекса ложной положительной ставки (x-value), ближайший к порогу, не превышающий его, должен дать мне индексный номер соответствующей истинной положительной ставки (y-value). Я не совсем уверен, как получить значение этого индекса.

И еще, насколько я могу получить порог вероятности класса, который использовался для создания этой точки?

ответ

48

Вот почему 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 
    [email protected] x.name  : chr "False positive rate" 
    [email protected] y.name  : chr "True positive rate" 
    [email protected] alpha.name : chr "Cutoff" 
    [email protected] x.values :List of 1 
    .. ..$ : num [1:201] 0 0 0 0 0.00935 ... 
     [email protected] y.values :List of 1 
     .. ..$ : num [1:201] 0 0.0108 0.0215 0.0323 0.0323 ... 
    [email protected] alpha.values:List of 1 
    .. ..$ : num [1:201] Inf 0.991 0.985 0.985 0.983 ... 

Ахаха! Это S4 class, поэтому мы можем использовать @ для доступа к слотам. Вот как сделать data.frame:

cutoffs <- data.frame([email protected][[1]], [email protected][[1]], 
         [email protected][[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 найти максимальную 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 
+3

Вы удивительно. и спасибо за упоминание str. Я буду использовать его, если я буду в таком положении в будущем. – Faydey

+0

@ user24926 Рад помочь! – Zach

+3

Мне очень нравится интерактивный и итеративный подход в этом ответе. –

5

2 решения, основанные на в ROCR и pROC пакеты:

threshold1 <- function(predict, response) { 
    perf <- ROCR::performance(ROCR::prediction(predict, response), "sens", "spec") 
    df <- data.frame(cut = [email protected][[1]], sens = [email protected][[1]], spec = [email protected][[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 пакет, который обеспечивает многие алгоритмов для поиска оптимальных порогов.

6

Пакет pROC включает в себя функцию coords для вычисления наилучшего порога:

library(pROC) 
my_roc <- roc(my_response, my_predictor) 
coords(my_roc, "best", ret = "threshold") 
Смежные вопросы