Evet, normal alıcının çalışma eğrisinin elde edilemediği ve sadece bir nokta olduğu durumlar vardır.
SVM'ler, sınıf üyeliği olasılıklarını ortaya çıkaracak şekilde ayarlanabilir. Bunlar, bir alıcı çalışma eğrisi üretmek için bir eşiğin değiştirileceği olağan değer olacaktır .
Aradığınız şey bu mu?
ROC'deki adımlar genellikle değişkenlerde farklı değişkenlik gösterecek herhangi bir şey yapmak yerine genellikle küçük sayıdaki test durumlarında gerçekleşir (özellikle, her yeni nokta için yalnızca bir örnek değişecek şekilde ayrı eşiklerinizi seçerseniz, aynı puanla sonuçlanırsınız) atama).
Elbette modelin sürekli değişen diğer (hiper) parametreleri, FPR; TPR koordinat sisteminde diğer eğrileri veren özgüllük / hassasiyet çiftleri setleri üretir.
Bir eğrinin yorumlanması elbette hangi değişimin eğriyi oluşturduğuna bağlıdır.
İşte iris veri setinin "versicolor" sınıfı için normal bir ROC (yani çıktı olarak olasılık istemek):
- FPR; TPR (γ = 1, C = 1, olasılık eşiği):
Aynı tip koordinat sistemi, ancak parameters ve C ayar parametrelerinin bir fonksiyonu olarak TPR ve FPR:
FPR; TPR (γ, C = 1, olasılık eşiği = 0.5):
FPR; TPR (γ = 1, C, olasılık eşiği = 0.5):
Bu parsellerin bir anlamı vardır, ancak anlam her zamanki ROC'dan kesinlikle farklıdır!
İşte kullandığım R kodu:
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)))