Normalement, nous ne pouvons pas tracer une courbe ROC pour les classificateurs discrets comme les arbres de décision. Ai-je raison? Existe-t-il un moyen de tracer une courbe ROC pour Dtrees?
Normalement, nous ne pouvons pas tracer une courbe ROC pour les classificateurs discrets comme les arbres de décision. Ai-je raison? Existe-t-il un moyen de tracer une courbe ROC pour Dtrees?
Réponses:
Si votre classificateur ne produit que des résultats factoriels (uniquement des étiquettes), sans scores, vous pouvez toujours tracer une courbe ROC. Cependant, cette courbe ROC n'est qu'un point. Compte tenu de l'espace ROC, ce point est , où FPR - taux de faux positifs et TPR - taux de vrais positifs.
En savoir plus sur la façon dont cela est calculé sur la page Wikipedia .
Pour un arbre de décision, les classes sont toujours prédites avec un certain niveau de certitude. La réponse est déjà donnée par @rapaio, mais je vais développer un peu.
Imaginez l'arbre de décision suivant (c'est une version légèrement modifiée de celui- ci )
À chaque nœud, il y a non seulement les étiquettes de classe majoritaire, mais aussi d'autres éléments qui se sont retrouvés à cette feuille, nous pouvons donc attribuer le degré de certitude à cette feuille à laquelle nous prédisons l'étiquette.
Par exemple, considérez les données suivantes
Nous l'exécutons et attribuons les scores à la sortie, pas les étiquettes réelles. Avec cela, nous pouvons dessiner une courbe ROC, comme suggéré ici
Cela n'a pas de sens, cependant, de l'utiliser pour régler votre seuil (car, bien sûr, il n'y a pas de seuil dans les arbres de décision), mais il peut toujours être utilisé pour calculer l'AUC, qui, dans ce cas, est de 0,92
Code R utilisé ici:
outlook = c('rain', 'overcast', 'rain', 'sunny', 'rain',
'rain', 'sunny', 'overcast', 'overcast', 'overcast',
'sunny', 'sunny', 'rain', 'rain', 'overcast',
'sunny', 'overcast', 'overcast', 'sunny', 'sunny',
'sunny', 'overcast')
humidity = c(79, 74, 80, 60, 65, 79, 60, 74, 77, 80,
71, 70, 80, 65, 70, 56, 80, 70, 56, 70,
71, 77)
windy = c(T, T, F, T, F, T, T, T, T, F, T, F, F, F, T, T, F, T, T, F, T, T)
play = c(F, F, T, F, T, F, F, T, T, T, F, F, T, T, T, T, T, T, F, T, F, T)
game = data.frame(outlook, humidity, windy, play)
game$score = NA
attach(game)
game$score[outlook == 'sunny' & humidity <= 70] = 5/8
game$score[outlook == 'sunny' & humidity > 70] = 1 - 3/4
game$score[outlook == 'overcast'] = 4/5
game$score[outlook == 'rain' & windy == T] = 1 - 2/2
game$score[outlook == 'rain' & windy == F] = 3/3
detach(game)
game$predict = game$score >= 0.5
game$correct = game$predict == game$play
library(ROCR)
pred = prediction(game$score, game$play)
roc = performance(pred, measure="tpr", x.measure="fpr")
plot(roc, col="orange", lwd=2)
lines(x=c(0, 1), y=c(0, 1), col="red", lwd=2)
auc = performance(pred, 'auc')
slot(auc, 'y.values')