2013-05-02 11 views
28

Mam niektóre modele, używając pakietu ROCR na wektorze przewidywanych procentów klas, mam obiekt wydajności. Wykreślanie obiektu wydajności za pomocą specyfikacji "tpr", "fpr" daje mi krzywą ROC.Uzyskiwanie wartości progowych z krzywej ROC

Porównuję modele przy określonych wartościach progowych stopy fałszywie dodatniej (x). Mam nadzieję, że otrzymam wartość prawdziwej pozytywnej stawki (y) z obiektu wydajności. Co więcej, chciałbym uzyskać próg procentowy, który został użyty do wygenerowania tego punktu.

numer indeksu stawki fałszywie dodatniej (x-value), która jest najbliższa progowi bez przekroczenia tej wartości, powinien dać mi numer indeksu odpowiedniej stawki prawdziwej pozytywnej (y-value). Nie jestem do końca pewien, jak uzyskać tę wartość indeksu.

Co więcej, jak mogę uzyskać próg prawdopodobieństw klas, które zostały użyte do tego celu?

Odpowiedz

48

Dlatego str jest moja ulubiona funkcja 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 ... 

ahah! Jest to S4 class, więc możemy użyć @, aby uzyskać dostęp do gniazd. Oto jak to zrobić 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 

Jeśli masz próg fpr chcesz trafić można podzbiór ten data.frame znaleźć maksymalny TPR poniżej tego progu 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

Jesteś niesamowita. i dzięki za wzmiankę o str. Będę go używał, jeśli będę tak zaskoczony w przyszłości. – Faydey

+0

@ user24926 Cieszę się, że mogę pomóc! – Zach

+3

Bardzo podoba mi się interaktywne i iteracyjne podejście w tej odpowiedzi. –

5

2 rozwiązania oparte na że ROCR i pROC pakiety:

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 

Zobacz również OptimalCutpoints pakietów dostarcza niejeden lgorytmy, aby znaleźć optymalne progi.

6

Pakiet pROC obejmuje funkcję coords obliczania najlepszy próg:

library(pROC) 
my_roc <- roc(my_response, my_predictor) 
coords(my_roc, "best", ret = "threshold") 
Powiązane problemy