Так, бувають ситуації, коли звичайної кривої роботи приймача неможливо отримати і існує лише одна точка.
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):
Ці сюжети мають значення, але сенс рішуче відрізняється від звичайного РПЦ!
Ось код 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)))