multiclass - Curva ROC en R usando el paquete ROCR
roc curve in r example (6)
Así es como puedes hacerlo:
tenga nuestros datos en un archivo csv, ("data_file.csv") pero es posible que deba indicar la ruta completa aquí. En ese archivo tienen los encabezados de columna, que aquí usaré "default_flag", "var1", "var2", "var3", donde default_flag es 0 o 1 y las otras variables tienen cualquier 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 $ score le dará la probabilidad de incumplimiento. En caso de que desee utilizar este logit (los mismos coeficientes de regresión) para probar en otro conjunto de datos df2 para validación cruzada, use
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
¿Puede alguien explicarme cómo trazar una curva ROC con ROCR? Sé que primero debo ejecutar:
prediction(predictions, labels, label.ordering = NULL)
y entonces:
performance(prediction.obj, measure, x.measure="cutoff", ...)
Simplemente no tengo claro lo que se quiere decir con predicción y etiquetas. Creé un modelo con ctree y cforest y quiero que la curva ROC para ambos lo comparen al final. En mi caso, el atributo de clase es y_n, que supongo que debería usarse para las etiquetas. Pero ¿qué pasa con las predicciones? Aquí están los pasos de lo que hago (nombre de conjunto de datos = 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 por adelantado!
Aquí hay otro ejemplo: tengo el conjunto de datos de entrenamiento (bank_training) y el conjunto de datos de prueba (bank_testing) y ejecuté un randomForest como se muestra a continuación:
bankrf<-randomForest(y~., bank_training, mtry=4, ntree=2,
keep.forest=TRUE,importance=TRUE)
bankrf.pred<-predict(bankrf, bank_testing, type=''response'')
Ahora bankrf.pred es un objeto factor con etiquetas c = ("0", "1"). Aún así, no sé cómo trazar ROC, porque me quedo atascado en la parte de predicción. Esto es lo que hago
library(ROCR)
pred<-prediction(bankrf.pred$y, bank_testing$c(0,1)
Pero esto sigue siendo incorrecto, porque me aparece el mensaje de error
Error in bankrf.pred$y_n : $ operator is invalid for atomic vectors
Como dijo @Jeff, sus predicciones deben ser continuas para la función de prediction
ROCR
. require(randomForest); ?predict.randomForest
require(randomForest); ?predict.randomForest
muestra que, de forma predeterminada, predict.randomForest
devuelve una predicción en la escala original (etiquetas de clase, en clasificación), mientras que predict.randomForest(..., type = ''prob'')
devuelve las probabilidades de cada clase. Asi que:
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''))
Te da lo que quieres. Los diferentes paquetes de clasificación requieren diferentes comandos para obtener probabilidades pronosticadas: a veces es predict(..., type=''probs'')
, predict(..., type=''prob'')[,2]
, etc., así que simplemente verifique los archivos de ayuda para cada función que está llamando.
El problema es, como han señalado otros, la predicción en ROCR espera valores numéricos. Si está insertando predicciones de randomForest
(como el primer argumento en la predicción en ROCR), esa predicción debe ser generada por type=''prob''
lugar de type=''response''
, que es la opción predeterminada. Alternativamente, puede tomar los resultados de type=''response''
y convertirlos a números (es decir, si sus respuestas son, digamos 0/1). Pero cuando se traza 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''
para generar predicciones.
El problema puede ser que le gustaría ejecutar la función de predicción en varias ejecuciones, por ejemplo, para validación cruzada.
En este caso para la función de predicción (predicciones, etiquetas, label.ordering = NULL), la clase de "predicciones" y las variables de "etiquetas" deben ser lista o matriz.
Las predicciones son sus predicciones continuas de la clasificación, las etiquetas son la verdad binaria para cada variable.
Así que algo como lo siguiente debería 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 un ROC.
EDITAR: Puede ser útil para usted incluir el código reproducible de la muestra en la pregunta (me está costando mucho interpretar su comentario).
No hay ningún código nuevo aquí, pero ... aquí hay una función que uso con bastante frecuencia para trazar un ROC:
plotROC <- function(truth, predicted, ...){
pred <- prediction(abs(predicted), truth)
perf <- performance(pred,"tpr","fpr")
plot(perf, ...)
}
Prueba este:
library(ROCR)
pred<-ROCR::prediction(bankrf.pred$y, bank_testing$c(0,1)
La función de predicción está presente en muchos paquetes. Debe especificar explícitamente (ROCR: :) para usar el de ROCR. Este funcionó para mí.