2013-05-02 14 views
28

Ho alcuni modelli, utilizzando il pacchetto ROCR su un vettore delle percentuali di classe previste, ho un oggetto prestazione. Tracciando l'oggetto performance con le specifiche "tpr", "fpr" mi dà una curva ROC.Ottenere valori soglia da una curva ROC

Sto confrontando i modelli a determinate soglie di tasso di falsi positivi (x). Spero di ottenere il valore del vero tasso positivo (y) dall'oggetto performance. Ancor più, vorrei ottenere la soglia percentuale della classe utilizzata per generare quel punto.

il numero di indice del tasso di falsi positivi (x-value) che è più vicino alla soglia senza essere sopra di esso, dovrebbe darmi il numero di indice del tasso positivo vero appropriato (y-value). Non sono esattamente sicuro di come ottenere quel valore di indice.

E altro ancora, come ottengo la soglia delle probabilità di classe che è stata utilizzata per ottenere quel punto?

risposta

48

Questo è il motivo per cui str è la mia funzione di R preferito:

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 ... 

Ahah! È un S4 class, quindi possiamo usare @ per accedere agli slot. Ecco come si fa un 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 

Se si dispone di una soglia di FPR si vuole colpire, si può sottoinsieme questo data.frame per trovare la massima TPR al di sotto di questa soglia FPR:

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

Sei incredibile. e grazie per aver menzionato str. Lo impiegherò se dovessi essere così perplesso in futuro. – Faydey

+0

@ user24926 Felice di aiutare! – Zach

+3

Mi piace molto l'approccio interattivo e iterativo in questa risposta. –

5

2 soluzioni basate su le ROCR e pROC pacchetti:

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 

Vedi anche OptimalCutpoints pacchetto che fornisce molti gli algoritmi per trovare le soglie ottimali.

6

pacchetto pROC include la funzione per il calcolo coords miglior soglia:

library(pROC) 
my_roc <- roc(my_response, my_predictor) 
coords(my_roc, "best", ret = "threshold") 
Problemi correlati