Да, существуют ситуации, когда обычная рабочая кривая приемника не может быть получена и существует только одна точка.
SVM можно настроить так, чтобы они выводили вероятности членства в классе. Это будет обычное значение, для которого будет изменяться пороговое значение для получения кривой работы приемника .
Это то, что вы ищете?
Шаги в ROC обычно выполняются с небольшим числом тестовых случаев, а не с каким-либо влиянием на дискретное изменение ковариаты (в частности, вы получаете те же самые точки, если выбираете свои дискретные пороги так, чтобы для каждой новой точки изменялся только один образец) его назначение).
Непрерывное изменение других (гипер) параметров модели, конечно, создает наборы пар специфичности / чувствительности, которые дают другие кривые в системе координат FPR; TPR.
Интерпретация кривой, конечно, зависит от того, какое изменение породило эту кривую.
Вот обычный ROC (то есть запрос вероятностей в качестве выходных данных) для класса "versicolor" набора данных радужной оболочки:
- FPR; TPR (γ = 1, C = 1, порог вероятности):
Система координат того же типа, но TPR и FPR как функция параметров настройки γ и C:
FPR; TPR (γ, C = 1, порог вероятности = 0,5):
FPR; TPR (γ = 1, C, порог вероятности = 0,5):
Эти сюжеты действительно имеют значение, но значение определенно отличается от значения обычного ROC!
Вот код R, который я использовал:
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)))