2012-07-13 36 views
21

¿Alguien me puede explicar cómo trazar una curva ROC con ROCR? sé que primero debería funcionar:Curva ROC en R usando el paquete ROCR

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

y luego:

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

yo no tengo claro lo que se quiere decir con la predicción y etiquetas. Creé un modelo con ctree y cforest y quiero que la curva ROC para ambos lo compare al final. En mi caso, el atributo de clase es y_n, que supongo que debería usarse para las etiquetas. Pero, ¿y las predicciones? Estos son los pasos de lo que hago (conjunto de datos name = bank_part):

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

Después de ejecutar la última línea me sale este error:

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

Gracias de antemano!

He aquí otro ejemplo: Tengo la formación de datos (bank_training) y el conjunto de datos de prueba (bank_testing) y me encontré con un randomForest de la siguiente manera:

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

Ahora el bankrf.pred es un factor de objeto con etiquetas c = ("0", "1"). Aún así, no sé cómo trazar ROC, porque me quedo atascado en la parte de predicción. Aquí es lo que hago

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

pero esto sigue siendo incorrecto, porque me sale el mensaje de error

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

Si proporcionó un ejemplo completo e independiente, es posible que obtenga un público más amplio que pueda ayudarlo. Consulte http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example para obtener algunos consejos sobre cómo hacerlo. –

Respuesta

23

Las predicciones son sus predicciones continuas de la clasificación, las etiquetas son la verdad binario para cada variable.

así que algo como lo siguiente debe funcionar:

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

para generar una ROC.

EDITAR: Puede ser útil para usted incluir el código reproducible de la muestra en la pregunta (estoy teniendo dificultades para interpretar su comentario).

No hay código nuevo aquí, pero ... aquí es una función que uso muy a menudo para el trazado de una ROC:

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

    plot(perf, ...) 
} 
+0

[edit] Todavía no lo entiendo. He aquí otro ejemplo: Tengo la formación de datos (bank_training) y el conjunto de datos de prueba (bank_testing) y me pasó una randomForest de la siguiente manera:. bankrf <-randomForest (y ~, bank_training, mtry = 4, ntree = 2, torreón .forest = TRUE, la importancia = TRUE) bankrf.pred <-predict (bankrf, bank_testing) biblioteca (ROCR) pred <-prediction (bankrf.pred $ yy $ bank_testing y) Pero esto sigue siendo incorrecta, porque recibo el mensaje de error de que hay un error en el formato de predicción. – spektra

0

El problema puede ser que le gustaría ejecutar la función de predicción en varias carreras para ejemplo para la validación cruzada.

En este caso para la predicción (predictions, labels, label.ordering = NULL) funcionan la clase de "predicciones" y las variables de "etiquetas" deben ser listas o matrices.

7

Como dijo @Jeff, sus predicciones deben ser continuas para la función ROCRprediction. require(randomForest); ?predict.randomForest muestra que, de forma predeterminada, predict.randomForest devuelve una predicción en la escala original (etiquetas de clase, en la clasificación), mientras que predict.randomForest(..., type = 'prob') devuelve probabilidades de cada clase.Entonces:

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

le ofrece lo que usted quiere. Los diferentes paquetes de clasificación requieren diferentes comandos para obtener las probabilidades pronosticadas, a veces es predict(..., type='probs'), predict(..., type='prob')[,2], etc., así que solo revisa los archivos de ayuda para cada función que estás llamando.

1

El problema es que, como señalaron otros, la predicción en ROCR espera valores numéricos. Si está insertando predicciones de randomForest (como primer argumento en predicción en ROCR), esa predicción debe generarse por type='prob' en lugar de type='response', que es la predeterminada. Alternativamente, puede tomar los resultados de type='response' y convertirlos en numéricos (es decir, si sus respuestas son, por ejemplo, 0/1). Pero cuando trazas eso, ROCR genera un único punto significativo en la curva ROC. Para tener muchos puntos en su curva ROC, realmente necesita la probabilidad asociada con cada predicción, es decir, use type='prob' en la generación de predicciones.

4

Esta es la forma en que puede hacerlo:

tienen nuestros datos en un archivo CSV, ("data_file.csv"), pero puede que tenga que dar la ruta completa aquí. En ese archivo tienen los encabezados de las columnas, que aquí usaré "default_flag", "var1", "var2", "var3", donde default_flag es 0 o 1 y las otras variables tienen algún valor. código 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 

Tenga en cuenta que df $ puntuación le dará la probabilidad de incumplimiento. En caso de que quiera utilizar este logit (los mismos coeficientes de regresión) para probar en otro dato DF2 fijado para la validación cruzada, utilice

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

Intente éste:

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

La función de predicción es presente es muchos paquetes. Debería especificar explícitamente (ROCR :) para usar el de ROCR. Éste trabajó para mí.

Cuestiones relacionadas