Oui, il existe des situations où la courbe de fonctionnement habituelle du récepteur ne peut pas être obtenue et un seul point existe.
Les SVM peuvent être configurés de manière à générer des probabilités d'appartenance à une classe. Ce serait la valeur habituelle pour laquelle un seuil serait modifié pour produire une courbe de fonctionnement du récepteur .
C'est bien ce que vous cherchez?
Les étapes du ROC se produisent généralement avec un petit nombre de cas de test plutôt que d'avoir quelque chose à voir avec une variation discrète de la covariable (en particulier, vous vous retrouvez avec les mêmes points si vous choisissez vos seuils discrets de sorte que pour chaque nouveau point, un seul échantillon change sa mission).
La variation continue d'autres (hyper) paramètres du modèle produit bien sûr des ensembles de paires spécificité / sensibilité qui donnent d'autres courbes dans le système de coordonnées FPR; TPR.
L'interprétation d'une courbe dépend bien sûr de la variation qui a généré la courbe.
Voici un ROC habituel (c'est-à-dire demander des probabilités en sortie) pour la classe "versicolor" de l'ensemble de données iris:
- FPR; TPR (γ = 1, C = 1, seuil de probabilité):
Même type de repère, mais TPR et FPR en fonction des paramètres de réglage γ et C:
FPR; TPR (γ, C = 1, seuil de probabilité = 0,5):
FPR; TPR (γ = 1, C, seuil de probabilité = 0,5):
Ces parcelles ont un sens, mais le sens est décidément différent de celui du ROC habituel!
Voici le code R que j'ai utilisé:
svmperf <- function (cost = 1, gamma = 1) {
model <- svm (Species ~ ., data = iris, probability=TRUE,
cost = cost, gamma = gamma)
pred <- predict (model, iris, probability=TRUE, decision.values=TRUE)
prob.versicolor <- attr (pred, "probabilities")[, "versicolor"]
roc.pred <- prediction (prob.versicolor, iris$Species == "versicolor")
perf <- performance (roc.pred, "tpr", "fpr")
data.frame (fpr = perf@x.values [[1]], tpr = perf@y.values [[1]],
threshold = perf@alpha.values [[1]],
cost = cost, gamma = gamma)
}
df <- data.frame ()
for (cost in -10:10)
df <- rbind (df, svmperf (cost = 2^cost))
head (df)
plot (df$fpr, df$tpr)
cost.df <- split (df, df$cost)
cost.df <- sapply (cost.df, function (x) {
i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y
x [i,]
})
cost.df <- as.data.frame (t (cost.df))
plot (cost.df$fpr, cost.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (cost.df$fpr, cost.df$tpr, pch = 20,
col = rev(rainbow(nrow (cost.df),start=0, end=4/6)))
df <- data.frame ()
for (gamma in -10:10)
df <- rbind (df, svmperf (gamma = 2^gamma))
head (df)
plot (df$fpr, df$tpr)
gamma.df <- split (df, df$gamma)
gamma.df <- sapply (gamma.df, function (x) {
i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y
x [i,]
})
gamma.df <- as.data.frame (t (gamma.df))
plot (gamma.df$fpr, gamma.df$tpr, type = "l", xlim = 0:1, ylim = 0:1, lty = 2)
points (gamma.df$fpr, gamma.df$tpr, pch = 20,
col = rev(rainbow(nrow (gamma.df),start=0, end=4/6)))
roc.df <- subset (df, cost == 1 & gamma == 1)
plot (roc.df$fpr, roc.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (roc.df$fpr, roc.df$tpr, pch = 20,
col = rev(rainbow(nrow (roc.df),start=0, end=4/6)))