2012-07-13 7 views
21

Kann mir bitte jemand erklären, wie man eine ROC-Kurve mit ROCR plottet. Ich weiß, dass ich zunächst laufen:ROC-Kurve in R mit ROCR-Paket

prediction(predictions, labels, label.ordering = NULL) 

und dann:

performance(prediction.obj, measure, x.measure="cutoff", ...) 

Ich bin klar einfach nicht, was mit Vorhersage und Etiketten gemeint ist. Ich habe ein Modell mit ctree und cforest erstellt und möchte die ROC-Kurve für beide, um sie am Ende zu vergleichen. In meinem Fall ist das Klassenattribut y_n, was vermutlich für die Labels verwendet werden sollte. Aber was ist mit den Vorhersagen? Hier sind die Schritte von dem, was ich tun (Dataset name = bank_part):

pred<-cforest(y_n~.,bank_part) 
tablebank<-table(predict(pred),bank_part$y_n) 
prediction(tablebank, bank_part$y_n) 

Nach dem Ausführen der letzten Zeile ich diesen Fehler:

Error in prediction(tablebank, bank_part$y_n) : 
Number of cross-validation runs must be equal for predictions and labels. 

Vielen Dank im Voraus!

Hier ist ein weiteres Beispiel: Ich habe den Trainingsdatensatz (bank_training) und Testdatensatz (bank_testing) und ich lief wie unten einen Random:

bankrf<-randomForest(y~., bank_training, mtry=4, ntree=2,  
keep.forest=TRUE,importance=TRUE) 
bankrf.pred<-predict(bankrf, bank_testing, type='response') 

Nun ist die bankrf.pred ist ein Objekt Faktor = Etikett c ("0", "1"). Trotzdem weiß ich nicht, wie man ROC plottet, weil ich am Vorhersageteil festhalte. Hier ist, was ich tun

library(ROCR) 
pred<-prediction(bankrf.pred$y, bank_testing$c(0,1) 

Aber das ist immer noch falsch, weil ich die Fehlermeldung

Error in bankrf.pred$y_n : $ operator is invalid for atomic vectors 
+5

Wenn Sie ein vollständiges, eigenständiges Beispiel angegeben haben, erhalten Sie möglicherweise eine größere Zielgruppe, die Ihnen helfen kann. Siehe http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example für einige Tipps, wie man das macht. –

Antwort

23

Die Prognosen sind Ihre kontinuierliche Prognosen der Klassifikation sind die Etiketten die binäre Wahrheit für jede Variable.

So sollte etwa wie folgt funktionieren:

> pred <- prediction(c(0.1,.5,.3,.8,.9,.4,.9,.5), c(0,0,0,1,1,1,1,1)) 
> perf <- performance(pred, "tpr", "fpr") 
> plot(perf) 

eine ROC zu erzeugen.

BEARBEITEN: Es kann hilfreich sein, den Beispielcode in die Frage einzufügen (ich habe Schwierigkeiten, Ihren Kommentar zu interpretieren).

Es gibt keinen neuen Code hier, aber ... hier ist eine Funktion, die ich sehr oft verwenden eine ROC zum Plotten:

plotROC <- function(truth, predicted, ...){ 
    pred <- prediction(abs(predicted), truth)  
    perf <- performance(pred,"tpr","fpr") 

    plot(perf, ...) 
} 
+0

[Bearbeiten] Ich verstehe es immer noch nicht. Hier ist ein anderes Beispiel: Ich habe den Trainingsdatensatz (bank_training) und Testdatensatz (bank_testing) und ich lief einen randomForest wie folgt: bankrf <-randomForest (y ~., Bank_training, mtry = 4, ntree = 2, behalten .forest = TRUE, Bedeutung = TRUE) bankrf.pred <-predict (bankrf, bank_testing) Bibliothek (ROCR) pred <-prediction (bankrf.pred $ y, bank_testing $ y) Aber diese noch nicht richtig ist, Ursache Ich erhalte die Fehlermeldung, dass ein Fehler im Format der Vorhersage vorliegt. – spektra

0

Das Problem kann sein, dass Sie die Vorhersage-Funktion auf mehrere Durchläufe ausgeführt werden soll für Beispiel für Cross-Validation.

In diesem Fall für die Vorhersage (Vorhersagen, Labels, Label.Ordering = NULL) -Funktion sollte die Klasse der "Vorhersagen" und "Labels" Variablen Liste oder Matrix sein.

7

Wie @Jeff sagte, Ihre Vorhersagen müssen kontinuierlich für ROCR 's prediction Funktion sein. require(randomForest); ?predict.randomForest zeigt, dass predict.randomForest standardmäßig eine Vorhersage auf der ursprünglichen Skala (Klassenbeschriftungen in der Klassifizierung) zurückgibt, während Wahrscheinlichkeiten jeder Klasse zurückgibt.Also:

require(ROCR) 
data(iris) 
iris$setosa <- factor(1*(iris$Species == 'setosa')) 
iris.rf <- randomForest(setosa ~ ., data=iris[,-5]) 
summary(predict(iris.rf, iris[,-5])) 
summary(iris.preds <- predict(iris.rf, iris[,-5], type = 'prob')) 
preds <- iris.preds[,2] 
plot(performance(prediction(preds, iris$setosa), 'tpr', 'fpr')) 

gibt Ihnen was Sie wollen. Verschiedene Klassifizierungspakete erfordern verschiedene Befehle, um vorhergesagte Wahrscheinlichkeiten zu erhalten - manchmal sind es predict(..., type='probs'), predict(..., type='prob')[,2], usw., also schauen Sie sich einfach die Hilfedateien für jede Funktion an, die Sie anrufen.

1

Das Problem ist, wie von anderen hingewiesen, Vorhersage in ROCR numerische Werte erwartet. Wenn Sie Vorhersagen aus randomForest (als erstes Argument in die Vorhersage in ROCR) einfügen, muss diese Vorhersage von type='prob' anstelle von type='response' generiert werden, was der Standardwert ist. Alternativ könnten Sie type='response' Ergebnisse nehmen und in numerische konvertieren (dh, wenn Ihre Antworten sind, sagen 0/1). Aber wenn Sie das plotten, erzeugt ROCR einen einzigen sinnvollen Punkt auf der ROC-Kurve. Um viele Punkte auf Ihrer ROC-Kurve zu haben, brauchen Sie wirklich die Wahrscheinlichkeit, die mit jeder Vorhersage verbunden ist - d. H. bei der Erzeugung von Vorhersagen verwenden. Diese

4

ist, wie Sie es tun können:

unsere Daten in einer CSV-Datei haben, („data_file.csv“), aber Sie können hier den vollständigen Pfad geben müssen. In dieser Datei haben die Spaltenüberschriften, die ich hier verwenden werde "default_flag", "var1", "var2", "var3", wobei default_flag 0 oder 1 ist und die anderen Variablen einen beliebigen Wert haben. R Code:

rm(list=ls()) 
df <- read.csv("data_file.csv") #use the full path if needed 
mylogit <- glm(default_flag ~ var1 + var2 + var3, family = "binomial" , data = df) 

summary(mylogit) 
library(ROCR) 

df$score<-predict.glm(mylogit, type="response") 
pred<-prediction(df$score,df$default_flag) 
perf<-performance(pred,"tpr", "fpr") 
plot(perf) 
auc<- performance(pred,"auc") 
auc 

Beachten Sie, dass df $ Punktzahl geben Ihnen die Ausfallwahrscheinlichkeit. Falls Sie diese logit (gleiche Regressionskoeffizienten) verwenden, weitere Daten zu testen, in dF2 für Kreuzvalidierung festzulegen, verwenden

df2 <- read.csv("data_file2.csv") 

df2$score<-predict.glm(mylogit,newdata=df2, type="response") 

pred<-prediction(df2$score,df2$default_flag) 
perf<-performance(pred,"tpr", "fpr") 
plot(perf) 
auc<- performance(pred,"auc") 
auc 
0

Versuchen Sie dieses:

library(ROCR) pred<-ROCR::prediction(bankrf.pred$y, bank_testing$c(0,1)

Die Funktion Vorhersage ist Geschenk ist viele Pakete. Sie sollten explizit (ROCR: :) angeben, um das in ROCR zu verwenden. Dieser hat für mich funktioniert.