Ya, ada situasi di mana kurva operasi penerima yang biasa tidak dapat diperoleh dan hanya ada satu titik.
SVM dapat diatur sehingga menghasilkan probabilitas keanggotaan kelas. Ini akan menjadi nilai biasa dimana ambang akan bervariasi untuk menghasilkan kurva operasi penerima .
Apakah itu yang Anda cari?
Langkah-langkah dalam ROC biasanya terjadi dengan sejumlah kecil kasus uji daripada ada hubungannya dengan variasi diskrit dalam kovariat (terutama, Anda berakhir dengan poin yang sama jika Anda memilih ambang diskrit Anda sehingga untuk setiap titik baru hanya satu perubahan sampel tugasnya).
Secara terus menerus memvariasikan parameter lain (hiper) dari model tentu saja menghasilkan serangkaian pasangan spesifisitas / sensitivitas yang memberikan kurva lain dalam sistem koordinat FPR; TPR.
Interpretasi kurva tentu saja tergantung pada variasi apa yang menghasilkan kurva.
Berikut ini adalah ROC biasa (yaitu meminta probabilitas sebagai output) untuk kelas "versicolor" dari set data iris:
- FPR; TPR (γ = 1, C = 1, ambang batas probabilitas):
Jenis sistem koordinat yang sama, tetapi TPR dan FPR sebagai fungsi dari parameter tuning γ dan C:
FPR; TPR (γ, C = 1, ambang batas probabilitas = 0,5):
FPR; TPR (γ = 1, C, ambang batas probabilitas = 0,5):
Plot-plot ini memang memiliki makna, tetapi maknanya jelas berbeda dari ROC yang biasa!
Inilah kode R yang saya gunakan:
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)))