J'ai quelques modèles, en utilisant le package ROCR
sur un vecteur des pourcentages de classe prédits, j'ai un objet de performance. Le tracé de l'objet de performance avec les spécifications "tpr", "fpr" me donne une courbe ROC.
Je compare des modèles à certains seuils de taux de faux positifs (x). J'espère obtenir la valeur du vrai taux positif (y) de l'objet de performance. Encore plus, je voudrais obtenir le seuil de pourcentage de classe qui a été utilisé pour générer ce point.
le numéro d'index du taux de faux positifs (x-value
) qui se rapproche le plus du seuil sans être au-dessus, doit me donner le numéro d'index du taux positif vrai approprié (y-value
). Je ne sais pas exactement comment obtenir cette valeur d'index.
Et plus précisément, comment puis-je obtenir le seuil de probabilités de classe qui a été utilisé pour faire ce point?
C'est pourquoi str
est ma fonction R préférée:
library(ROCR)
data(ROCR.simple)
pred <- prediction( ROCR.simple$predictions, ROCR.simple$labels)
perf <- performance(pred,"tpr","fpr")
plot(perf)
> str(perf)
Formal class 'performance' [package "ROCR"] with 6 slots
..@ x.name : chr "False positive rate"
..@ y.name : chr "True positive rate"
..@ alpha.name : chr "Cutoff"
..@ x.values :List of 1
.. ..$ : num [1:201] 0 0 0 0 0.00935 ...
..@ y.values :List of 1
.. ..$ : num [1:201] 0 0.0108 0.0215 0.0323 0.0323 ...
..@ alpha.values:List of 1
.. ..$ : num [1:201] Inf 0.991 0.985 0.985 0.983 ...
Ah ah! C'est un classe S4 , donc nous pouvons utiliser @
pour accéder aux emplacements. Voici comment créer un data.frame
:
cutoffs <- data.frame([email protected][[1]], [email protected][[1]],
[email protected][[1]])
> head(cutoffs)
cut fpr tpr
1 Inf 0.000000000 0.00000000
2 0.9910964 0.000000000 0.01075269
3 0.9846673 0.000000000 0.02150538
4 0.9845992 0.000000000 0.03225806
5 0.9834944 0.009345794 0.03225806
6 0.9706413 0.009345794 0.04301075
Si vous souhaitez atteindre un seuil fpr, vous pouvez sous-définir ce data.frame
pour trouver le maximum de tpr en dessous de ce seuil fpr:
cutoffs <- cutoffs[order(cutoffs$tpr, decreasing=TRUE),]
> head(subset(cutoffs, fpr < 0.2))
cut fpr tpr
96 0.5014893 0.1495327 0.8494624
97 0.4997881 0.1588785 0.8494624
98 0.4965132 0.1682243 0.8494624
99 0.4925969 0.1775701 0.8494624
100 0.4917356 0.1869159 0.8494624
101 0.4901199 0.1962617 0.8494624
Le package pROC
inclut la fonction coords
pour calculer le meilleur seuil:
library(pROC)
my_roc <- roc(my_response, my_predictor)
coords(my_roc, "best", ret = "threshold")
2 solutions basées sur les packages ROCR
et pROC
:
threshold1 <- function(predict, response) {
perf <- ROCR::performance(ROCR::prediction(predict, response), "sens", "spec")
df <- data.frame(cut = [email protected][[1]], sens = [email protected][[1]], spec = [email protected][[1]])
df[which.max(df$sens + df$spec), "cut"]
}
threshold2 <- function(predict, response) {
r <- pROC::roc(response, predict)
r$thresholds[which.max(r$sensitivities + r$specificities)]
}
data(ROCR.simple, package = "ROCR")
threshold1(ROCR.simple$predictions, ROCR.simple$labels)
#> [1] 0.5014893
threshold2(ROCR.simple$predictions, ROCR.simple$labels)
#> [1] 0.5006387
Voir aussi le package OptimalCutpoints
qui fournit de nombreux algorithmes pour trouver un seuil optimal.