web-dev-qa-db-fra.com

Courbe ROC en R utilisant le package ROCR

Quelqu'un peut-il m'expliquer s'il vous plaît comment tracer une courbe ROC avec ROCR . Je sais que je devrais d'abord exécuter:

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

et alors: 

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

Je ne comprends tout simplement pas ce que l'on entend par prédiction et étiquettes. J'ai créé un modèle avec ctree et cforest et je souhaite que la courbe ROC soit comparée à la fin. Dans mon cas, l'attribut de classe est y_n, ce qui, je suppose, devrait être utilisé pour les étiquettes. Mais qu'en est-il des prédictions? Voici les étapes de ce que je fais (nom de l'ensemble de données = bank_part):

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

Après avoir exécuté la dernière ligne, j'obtiens cette erreur:

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

Merci d'avance!

Voici un autre exemple: j'ai le jeu de données de formation (bank_training) et le jeu de données de test (bank_testing) et j'ai exécuté un randomForest comme suit:

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

Le bankrf.pred est maintenant un objet facteur avec les étiquettes c = ("0", "1"). Pourtant, je ne sais pas comment tracer le ROC, parce que je reste coincé dans la partie prédiction. Voici ce que je fais

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

Mais cela reste incorrect, car je reçois le message d'erreur

Error in bankrf.pred$y_n : $ operator is invalid for atomic vectors
22
spektra

Les prédictions sont vos prédictions continues de la classification, les étiquettes sont la vérité binaire pour chaque variable.

Donc, quelque chose comme ce qui suit devrait fonctionner:

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

générer un ROC.

EDIT: Il peut être utile pour vous d'inclure l'exemple de code reproductible dans la question (j'ai du mal à interpréter votre commentaire).

Il n'y a pas de nouveau code ici, mais ... voici une fonction que j'utilise assez souvent pour tracer un ROC:

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

   plot(perf, ...)
}
24
Jeff Allen

Comme @Jeff l'a dit, vos prédictions doivent être continues pour la fonction ROCR de prediction. require(randomForest); ?predict.randomForest indique que, par défaut, predict.randomForest renvoie une prédiction sur l'échelle d'origine (étiquettes de classe, dans la classification), alors que predict.randomForest(..., type = 'prob') renvoie des probabilités de chaque classe. Alors:

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

vous donne ce que vous voulez. Différents packages de classification nécessitent différentes commandes pour obtenir les probabilités prédites - parfois, il s'agit de predict(..., type='probs'), predict(..., type='prob')[,2], etc., il suffit donc de consulter les fichiers d'aide pour chaque fonction que vous appelez.

7
lockedoff

Voici comment vous pouvez le faire:

avoir nos données dans un fichier csv, ("data_file.csv") mais vous devrez peut-être donner le chemin complet ici. Dans ce fichier ont les en-têtes de colonne, que je vais utiliser ici "default_flag", "var1", "var2", "var3", où default_flag est égal à 0 ou 1 et les autres variables ont une valeur quelconque. Code 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

Notez que df $ score vous donnera la probabilité de défaut. Si vous souhaitez utiliser ce logit (mêmes coefficients de régression) pour tester dans un autre fichier de données df2 défini pour la validation croisée, utilisez

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
4
Mariav

Comme le soulignent d’autres, le problème est que la prévision dans ROCR attend des valeurs numériques. Si vous insérez des prédictions de randomForest (en tant que premier argument de la prédiction dans ROCR), cette prédiction doit être générée par type='prob' au lieu de type='response', qui est la valeur par défaut. Vous pouvez également utiliser les résultats de type='response' et les convertir en chiffres (c'est-à-dire si vos réponses sont, par exemple, 0/1). Mais lorsque vous tracez cela, ROCR génère un seul point significatif sur la courbe ROC. Pour avoir plusieurs points sur votre courbe ROC, vous avez vraiment besoin de la probabilité associée à chaque prédiction - c'est-à-dire, utilisez type='prob' pour générer des prédictions. 

1
Oytun

Essaye celui-là: 

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

La prédiction de fonction est présente dans de nombreux packages. Vous devez explicitement spécifier (ROCR: :) pour utiliser celui de ROCR. Celui-ci a fonctionné pour moi.

0
Jawahar Sam

Le problème peut être que vous souhaitiez exécuter la fonction de prédiction sur plusieurs exécutions, par exemple pour une validation croisée. 

Dans ce cas, pour la prédiction (prédictions, étiquettes, label.ordering = NULL), la classe des variables "prédictions" et "étiquettes" doit être liste ou matrice.

0
sztup