Ja, es gibt Situationen, in denen die normale Betriebskurve des Empfängers nicht erhalten werden kann und nur ein Punkt vorhanden ist.
SVMs können so eingerichtet werden, dass sie Klassenmitgliedschaftswahrscheinlichkeiten ausgeben. Dies wäre der übliche Wert , für den ein Schwellenwert Betreiben eines Empfängers zu erzeugen , variiert werden würde Kurve .
Ist es das wonach du suchst?
Schritte im ROC erfolgen normalerweise mit einer geringen Anzahl von Testfällen, anstatt mit diskreten Variationen in der Kovariate zu tun zu haben (insbesondere erhalten Sie dieselben Punkte, wenn Sie Ihre diskreten Schwellenwerte so wählen, dass sich für jeden neuen Punkt nur eine Stichprobe ändert seine Zuordnung).
Das kontinuierliche Variieren anderer (Hyper-) Parameter des Modells erzeugt natürlich Sätze von Spezifitäts- / Empfindlichkeitspaaren, die andere Kurven im FPR; TPR-Koordinatensystem ergeben.
Die Interpretation einer Kurve hängt natürlich davon ab, durch welche Variation die Kurve erzeugt wurde.
Hier ist ein üblicher ROC (dh Anfordern von Wahrscheinlichkeiten als Ausgabe) für die "Versicolor" -Klasse des Iris-Datensatzes:
- FPR; TPR (γ = 1, C = 1, Wahrscheinlichkeitsschwelle):
Gleiches Koordinatensystem, jedoch TPR und FPR als Funktion der Abstimmparameter γ und C:
FPR; TPR (γ, C = 1, Wahrscheinlichkeitsschwelle = 0,5):
FPR; TPR (γ = 1, C, Wahrscheinlichkeitsschwelle = 0,5):
Diese Diagramme haben zwar eine Bedeutung, aber die Bedeutung unterscheidet sich deutlich von der des üblichen ROC!
Hier ist der R-Code, den ich verwendet habe:
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)))