> Statistiques > Apprentissage > Courbe ROC
Courbe ROC
Courbe ROC : Receiver Operating Characteristic Curve (car a été créée au cours de recherches pour établir des signaux radios au milieu du bruit). On peut en générer grâce au package ROCR
Spécificité et sensibilité :
- la sensibilité est : TP / (TP + FN) = TP / P.
- la spécificité est : TN / (TN + FP) = TN / N.
avec
- TP (true positives) : les prédits positifs qui le sont vraiment.
- FP (false positives) : les prédits positifs qui sont en fait négatifs.
- TN (true negatives) : les prédits négatifs qui le sont vraiment.
- FN (false negatives) : les prédits négatifs qui sont en fait positifs.
- P (positives) : tous les positifs quelque soit l'état de leur prédiction. P = TP + FN.
- N (negatives) : tous les négatifs quelque soit l'état de leur prédiction. N = TN + FP.
Principe de la courbe ROC : si le test donne un résultat numérique avec un seuil t tel que la prédiction est positive si x > t, et la prédiction est négative si x < t, alors au fur et à mesure que t augmente :
- la spécificité augmente.
- mais la sensibilité diminue.
La courbe ROC représente l'évolution de la sensibilité (taux de vrais positifs) en fonction de 1 - spécificité (taux de faux positifs) quand on fait varier le seuil t.
- C'est une courbe croissante entre le point (0,0) et le point (1, 1) et en principe au-dessus de la première bissectrice.
- Une prédiction random donnerait la première bissectrice.
- Meilleure est la prédiction, plus la courbe est au-dessus la première bissectrice.
- Une prédiction idéale est l'horizontale y=1 sur ]0,1] et le point (0,0).
- L'aire sous la courbe ROC (AUC, Area Under the Curve) donne un indicateur de la qualité de la prédiction (1 pour une prédiction idéale, 0.5 pour une prédiction random).
fonction prediction : construit un object de la classe prediction à partir des scores de prédiction obtenus et de la classe réelle :
library(ROCR)
fr <- data.frame(score = c(0.61, 0.36, 0.43, 0.14, 0.38, 0.24, 0.97, 0.89, 0.78, 0.86, 0.71, 0.36),
label = c(1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0))
pred <- prediction(fr$score, fr$label)
- les scores doivent avoir des valeurs croissantes pour des probabilités d'être positifs croissantes.
- le plus grand des deux labels doit correspondres aux positifs.
Un objet de la classe prediction a notamment les attributs suivants :
- pred@predictions[[1]] : les scores donné (dans le même ordre).
- pred@labels[[1]] : les classes réelles données (dans le même ordre).
- pred@cutoffs[[1]] : une liste des seuils correspondant aux valeurs uniques des scores dans l'ordre décroissant.
- pred@tp[[1]], pred@fp[[1]], pred@tn[[1]], pred@fn[[1]] : les listes des nombres de vrais positifs, faux positifs, vrais négatifs, faux négatifs (respectivement) pour chacun des seuils.
Traçage d'une courbe ROC :
On calcule un objet de la classe performance avec comme variable y le taux de vrais positifs (TPR) et comme variable x le taux de faux positifs (FPR) :
library(ROCR)
fr <- data.frame(score = c(0.61, 0.36, 0.43, 0.14, 0.38, 0.24, 0.97, 0.89, 0.78, 0.86, 0.71, 0.36),
label = c(1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0))
pred <- prediction(fr$score, fr$label)
perf <- performance(pred, "tpr", "fpr")
plot(perf)
On peut utiliser les paramètres suivants dans le plot :
- cex.main pour la taille de la police du titre.
- cex.lab pour la taille des étiquettes des axes.
- xaxis.cex.axis et yaxis.cex.axis pour la taille des nombres sur les graduations des axes.
Autres indicateurs de performance :
Indicateurs de performance disponibles (liste partielle) :
- acc : accuracy ((TP + TN) / (P + N) = 1 - taux d'erreur).
- err : taux d'erreur ((FP + FN) / (P + N)).
- tpr : taux de vrais positifs.
- fpr : taux de faux positifs.
- tnr : taux de vrais négatifs.
- fnr : taux de faux négatifs.
- sens : sensibilité, égal à tpr.
- rec : recall, égal à tpr.
- spec : spécificité, égal à tnr.
- prec : précision (TP / (TP + FP)).
- mat : coefficient de corrélation de Matthews (TP*TN - FP*FN)/(sqrt((TP+FN)*(TN+FP)*(TP+FP)*(TN+FN))), qui varie entre -1 et 1 : 1 = prédiction parfaite, 0 = prédiction random, -1 = prédiction parfaitement mauvaise.
Calcul de l'AUC :
library(ROCR)
fr <- data.frame(score = c(0.61, 0.36, 0.43, 0.14, 0.38, 0.24, 0.97, 0.89, 0.78, 0.86, 0.71, 0.36),
label = c(1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0))
pred <- prediction(fr$score, fr$label)
perf <- performance(pred, "auc")
perf@y.values[[1]]
donne :
0.7
Copyright Aymeric Duclert
programmer en R, tutoriel R, graphes en R