はい、通常の受信機動作曲線を取得できず、1つのポイントしか存在しない状況があります。
SVMは、クラスメンバーシップの確率を出力するように設定できます。これらは受信機動作曲線を作り出すために敷居が変えられる通常の値でしょう。
それはあなたが探しているものですか?
ROCのステップは通常、共変量の個別の変動とは関係なく、少数のテストケースで発生します(特に、新しいポイントごとに1つのサンプルのみが変更されるように個別のしきい値を選択すると、同じポイントになりますその割り当て)。
もちろん、モデルの他の(ハイパー)パラメーターを連続的に変化させると、FPR; TPR座標系に他の曲線を与える特異性/感度のペアのセットが生成されます。
もちろん、曲線の解釈は、どのバリエーションが曲線を生成したかによって異なります。
以下は、アイリスデータセットの「versicolor」クラスの通常のROC(つまり、出力として確率を要求する)です。
- FPR; TPR(γ= 1、C = 1、確率しきい値):
同じタイプの座標系ですが、調整パラメーターγおよびCの関数としてのTPRおよびFPR:
これらのプロットには意味がありますが、通常の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)))