2012-07-13 14 views
21

Qualcuno può spiegarmi per favore come tracciare una curva ROC con ROCR. So che avrei dovuto eseguire prima:curva ROC in R utilizzando il pacchetto ROCR

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

e poi:

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

non sto solo chiaro che cosa si intenda con la previsione ed etichette. Ho creato un modello con ctree e cforest e voglio la curva ROC per entrambi di confrontarlo alla fine. Nel mio caso l'attributo di classe è y_n, che suppongo dovrebbe essere usato per le etichette. Ma per quanto riguarda le previsioni? Ecco i passi di quello che faccio (dataset name = bank_part):

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

Dopo aver eseguito l'ultima riga ottengo questo errore:

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

Grazie in anticipo!

Ecco un altro esempio: ho il set di dati di formazione (bank_training) e test set di dati (bank_testing) e ho corso una foresta casuale, come di seguito:

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

Ora il bankrf.pred è un oggetto fattore con etichette c = ("0", "1"). Tuttavia, non so come tracciare la ROC, perché rimango bloccato nella parte di previsione. Qui è quello che faccio

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

ma questo è ancora errato, perché io il messaggio di errore

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

Se hai fornito un esempio completo e autosufficiente, potresti ottenere un pubblico più ampio che può aiutarti. Vedi http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example per alcuni suggerimenti su come farlo. –

risposta

23

le previsioni sono le vostre continue previsioni di classificazione, le etichette sono la verità binario per ogni variabile.

Quindi, qualcosa come il seguente dovrebbe funzionare:

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

per generare un ROC.

MODIFICA: può essere utile includere il codice riproducibile di esempio nella domanda (sto avendo difficoltà a interpretare il tuo commento).

Non c'è nessun nuovo codice qui, ma ... Ecco una funzione che uso molto spesso per il tracciato di un ROC:

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

    plot(perf, ...) 
} 
+0

[modifica] Ancora non capisco. Ecco un altro esempio: ho il set di dati di formazione (bank_training) e test set di dati (bank_testing) e ho eseguito una foresta casuale, come di seguito:. bankrf <-randomForest (y ~, bank_training, mtry = 4, ntree = 2, mastio .forest = TRUE, l'importanza = TRUE) bankrf.pred <-predict (bankrf, bank_testing) libreria (ROCR) pred <-prediction (bankrf.pred $ y, bank_testing $ y) Ma questo non è ancora corretta, perché ottengo il messaggio di errore che c'è un errore nel formato della previsione. – spektra

0

Il problema potrebbe essere che si desidera eseguire la funzione di predizione su più piste per esempio per cross-validatation.

In questo caso per la previsione (previsioni, etichette, label.ordering = NULL), la classe delle variabili "predizioni" e "etichette" deve essere elenco o matrice.

7

Come ha detto @Jeff, le tue previsioni devono essere continue per la funzione prediction di ROCR. require(randomForest); ?predict.randomForest mostra che, per impostazione predefinita, predict.randomForest restituisce una previsione sulla scala originale (etichette di classe, in classificazione), mentre predict.randomForest(..., type = 'prob') restituisce probabilità di ciascuna classe.Quindi:

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')) 

ti dà quello che vuoi. Diversi pacchetti di classificazione richiedono comandi diversi per ottenere le probabilità previste - a volte è predict(..., type='probs'), predict(..., type='prob')[,2], ecc., Quindi basta controllare i file di aiuto per ogni funzione che si sta chiamando.

1

Il problema è che, come indicato da altri, la previsione in ROCR prevede valori numerici. Se si inseriscono previsioni da randomForest (come primo argomento nella previsione in ROCR), tale previsione deve essere generata da type='prob' anziché da type='response', che è l'impostazione predefinita. In alternativa, puoi prendere i risultati type='response' e convertirli in numeri numerici (ovvero, se le tue risposte sono, diciamo 0/1). Ma quando lo si traccia, ROCR genera un singolo punto significativo sulla curva ROC. Per avere molti punti sulla tua curva ROC, hai davvero bisogno della probabilità associata a ciascuna previsione - ad esempio, utilizza type='prob' per generare previsioni.

4

Ecco come si può fare:

hanno i nostri dati in un file CSV, ("data_file.csv"), ma potrebbe essere necessario per dare il percorso completo qui. In quel file sono presenti le intestazioni delle colonne, che qui userò "default_flag", "var1", "var2", "var3", dove default_flag è 0 o 1 e le altre variabili hanno qualsiasi valore. Codice R:

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 

Nota che df $ punteggio ti darà la probabilità di default. Nel caso in cui si desidera utilizzare questo logit (stessi coefficienti di regressione) per testare in un altro dato DF2 set per la convalida incrociata, utilizzare

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

Prova questo:

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

La previsione funzione è presente è molti pacchetti. È necessario specificare esplicitamente (ROCR: :) per utilizzare quello in ROCR. Questo ha funzionato per me.

Problemi correlati