Sì, ci sono situazioni in cui non è possibile ottenere la normale curva operativa del ricevitore ed esiste solo un punto.
Le SVM possono essere impostate in modo tale da generare probabilità di appartenenza alla classe. Questi sarebbero i valori usuali per i quali una soglia sarebbe variata per produrre una curva operativa del ricevitore .
È quello che stai cercando?
I passaggi nel ROC di solito si verificano con un numero limitato di casi di test anziché avere a che fare con variazioni discrete nella covariata (in particolare, si ottengono gli stessi punti se si scelgono le soglie discrete in modo che per ogni nuovo punto cambi solo un campione il suo incarico).
Ovviamente, la variazione continua di altri parametri (iper) del modello produce serie di coppie specificità / sensibilità che danno altre curve nel sistema di coordinate FPR; TPR.
L'interpretazione di una curva ovviamente dipende da quale variazione ha generato la curva.
Ecco un normale ROC (ovvero richiesta di probabilità come output) per la classe "versicolor" del set di dati dell'iride:
- FPR; TPR (γ = 1, C = 1, soglia di probabilità):
Lo stesso tipo di sistema di coordinate, ma TPR e FPR in funzione dei parametri di regolazione γ e C:
FPR; TPR (γ, C = 1, soglia di probabilità = 0,5):
FPR; TPR (γ = 1, C, soglia di probabilità = 0,5):
Queste trame hanno un significato, ma il significato è decisamente diverso da quello del solito ROC!
Ecco il codice R che ho usato:
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)))