web-dev-qa-db-fra.com

Obtention de valeurs de seuil à partir d'une courbe ROC

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?

31
Faydey

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
59
Zach

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

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.

6
Artem Klevtsov