Sí, hay situaciones en las que no se puede obtener la curva de funcionamiento habitual del receptor y solo existe un punto.
Los SVM se pueden configurar para que generen probabilidades de pertenencia a clases. Estos serían el valor habitual para el cual se variaría un umbral para producir una curva de operación del receptor .
¿Es esto lo que estás buscando?
Los pasos en el ROC generalmente ocurren con un pequeño número de casos de prueba en lugar de tener algo que ver con una variación discreta en la covariable (en particular, terminas con los mismos puntos si eliges tus umbrales discretos para que para cada nuevo punto solo cambie una muestra su asignación).
La variación continua de otros parámetros (hiper) del modelo, por supuesto, produce conjuntos de pares de especificidad / sensibilidad que dan otras curvas en el sistema de coordenadas FPR; TPR.
La interpretación de una curva, por supuesto, depende de qué variación generó la curva.
Aquí hay un ROC habitual (es decir, solicitar probabilidades como salida) para la clase "versicolor" del conjunto de datos de iris:
- FPR; TPR (γ = 1, C = 1, umbral de probabilidad):
El mismo tipo de sistema de coordenadas, pero TPR y FPR como función de los parámetros de ajuste γ y C:
FPR; TPR (γ, C = 1, umbral de probabilidad = 0.5):
FPR; TPR (γ = 1, C, umbral de probabilidad = 0.5):
Estas tramas tienen un significado, ¡pero el significado es decididamente diferente del de la ROC habitual!
Aquí está el código R que utilicé:
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)))