Tak, są sytuacje, w których nie można uzyskać zwykłej krzywej działania odbiornika i istnieje tylko jeden punkt.
SVM można skonfigurować tak, aby generowały prawdopodobieństwa członkostwa w klasie. Byłyby to zwykle wartości, dla których wartość progowa byłaby zmieniana w celu uzyskania krzywej działania odbiornika .
Czy tego szukasz?
Kroki w ROC zwykle zdarzają się z małą liczbą przypadków testowych, a nie mają nic wspólnego z dyskretnymi zmianami współzmiennej (szczególnie, jeśli wybierasz swoje dyskretne progi, uzyskujesz te same punkty, tak że dla każdego nowego punktu zmienia się tylko jedna próbka jego zadanie).
Ciągłe zmienianie innych (hiper) parametrów modelu tworzy zestawy par specyficzności / czułości, które dają inne krzywe w układzie współrzędnych FPR; TPR.
Interpretacja krzywej zależy oczywiście od tego, która odmiana wygenerowała krzywą.
Oto typowy ROC (tj. Żądanie prawdopodobieństwa jako danych wyjściowych) dla klasy „versicolor” zestawu danych tęczówki:
- FPR; TPR (γ = 1, C = 1, próg prawdopodobieństwa):
Ten sam typ układu współrzędnych, ale TPR i FPR jako funkcja parametrów strojenia γ i C:
FPR; TPR (γ, C = 1, próg prawdopodobieństwa = 0,5):
FPR; TPR (γ = 1, C, próg prawdopodobieństwa = 0,5):
Te wątki mają znaczenie, ale znaczenie zdecydowanie różni się od zwykłego ROC!
Oto kod R, którego użyłem:
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)))