2013-05-02 9 views
28

Ich habe einige Modelle, mit ROCR Paket auf einem Vektor der vorhergesagten Klassenprozentwerte, ich habe ein Leistungsobjekt. Die Darstellung des Performance-Objekts mit den Angaben "tpr", "fpr" ergibt eine ROC-Kurve.Erhalten von Schwellenwerten aus einer ROC-Kurve

Ich vergleiche Modelle bei bestimmten Schwellenwerten der falsch positiven Rate (x). Ich hoffe, den Wert der wahren positiven Rate (y) aus dem Leistungsobjekt zu bekommen. Noch mehr möchte ich den Klassenprozentsatzschwellenwert erhalten, der verwendet wurde, um diesen Punkt zu generieren.

Die Indexnummer der falschen positiven Rate (x-value), die der Schwelle am nächsten ist, ohne darüber zu liegen, sollte mir die Indexnummer der entsprechenden wahren positiven Rate geben (y-value). Ich weiß nicht genau, wie ich diesen Indexwert bekommen soll.

Und mehr auf den Punkt, wie bekomme ich die Schwelle der Klassenwahrscheinlichkeiten, die verwendet wurde, um diesen Punkt zu machen?

Antwort

48

Aus diesem Grund str meine Lieblings R Funktion:

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! Es ist ein S4 class, so dass wir @ verwenden können, um auf die Steckplätze zuzugreifen. Hier ist, wie Sie machen ein 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 

Wenn Sie ein fpr Schwelle haben Sie treffen wollen, können Sie diese data.frame Teilmenge maximal tpr unterhalb dieser fpr Schwelle zu finden:

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

Sie sind erstaunlich. und danke für die Erwähnung von str. Ich werde es einsetzen, sollte ich in Zukunft so ratlos sein. – Faydey

+0

@ user24926 Froh, helfen zu können! – Zach

+3

Ich mag den interaktiven und iterativen Ansatz in dieser Antwort sehr. –

5

2 Lösungen, basierend auf die ROCR und pROC Pakete:

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 

Siehe auch OptimalCutpoints Paket, das viele liefert Algorithmen, um optimale Schwellenwerte zu finden.

6

Paket pROC für die Berechnung der besten Schwellenfunktion coords umfasst:

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