Có, có những tình huống mà đường cong vận hành máy thu thông thường không thể có được và chỉ tồn tại một điểm.
Các SVM có thể được thiết lập để chúng đưa ra xác suất thành viên của lớp. Đây sẽ là giá trị thông thường mà ngưỡng sẽ được thay đổi để tạo đường cong vận hành máy thu .
Có phải đó là những gì bạn đang tìm kiếm?
Các bước trong ROC thường xảy ra với số lượng nhỏ các trường hợp thử nghiệm thay vì liên quan đến biến thể rời rạc trong hiệp phương sai (đặc biệt, bạn kết thúc với cùng một điểm nếu bạn chọn ngưỡng riêng biệt để mỗi điểm mới chỉ có một mẫu thay đổi nhiệm vụ của nó).
Việc thay đổi liên tục các tham số (siêu) khác của mô hình tất nhiên tạo ra các cặp độ đặc hiệu / độ nhạy cung cấp các đường cong khác trong hệ tọa độ FPR; TPR.
Việc giải thích một đường cong tất nhiên phụ thuộc vào biến thể nào đã tạo ra đường cong.
Đây là một ROC thông thường (nghĩa là yêu cầu xác suất làm đầu ra) cho lớp "nhiều màu" của tập dữ liệu mống mắt:
- FPR; TPR (= 1, C = 1, ngưỡng xác suất):
Cùng loại hệ tọa độ, nhưng TPR và FPR là chức năng của các tham số điều chỉnh và C:
FPR; TPR (, C = 1, ngưỡng xác suất = 0,5):
FPR; TPR (= 1, C, ngưỡng xác suất = 0,5):
Những mảnh đất này có một ý nghĩa, nhưng ý nghĩa khác hẳn với ý nghĩa của ROC thông thường!
Đây là mã R tôi đã sử dụng:
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)))