2013-05-02 32 views
28

私はいくつかのモデルを持っており、ROCRパッケージを予測クラスパーセンテージのベクトルに使用しています。私はパフォーマンスオブジェクトを持っています。パフォーマンスオブジェクトを仕様 "tpr"、 "fpr"でプロットすると、ROC曲線が得られます。ROC曲線からのしきい値の取得

私は偽陽性率(x)の特定の閾値でモデルを比較しています。真の正のレート(y)の値をパフォーマンスオブジェクトから得ることを望んでいます。さらに、そのポイントを生成するために使用されたクラスのパーセンテージのしきい値を取得したいと思います。

偽陽性率(x-value)のインデックス番号は、それを超えないでしきい値に最も近く、適切な真陽性率(y-value)のインデックス番号を私に与えるべきです。私はそのインデックス値を取得する方法を正確にはわかりません。

さらに、ポイントを作るために使用されたクラス確率のしきい値はどのようにして得られますか?

答えて

48

strは私の好きなR機能である理由は次のとおりです。

library(ROCR) 
data(ROCR.simple) 
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels) 
perf <- performance(pred,"tpr","fpr") 
plot(perf) 
> str(perf) 
Formal class 'performance' [package "ROCR"] with 6 slots 
    [email protected] x.name  : chr "False positive rate" 
    [email protected] y.name  : chr "True positive rate" 
    [email protected] alpha.name : chr "Cutoff" 
    [email protected] x.values :List of 1 
    .. ..$ : num [1:201] 0 0 0 0 0.00935 ... 
     [email protected] y.values :List of 1 
     .. ..$ : num [1:201] 0 0.0108 0.0215 0.0323 0.0323 ... 
    [email protected] alpha.values:List of 1 
    .. ..$ : num [1:201] Inf 0.991 0.985 0.985 0.983 ... 

AHAH!それはS4 classなので、@を使用してスロットにアクセスできます。ここでは、data.frameを作る方法は次のとおりです。

cutoffs <- data.frame([email protected][[1]], [email protected][[1]], 
         [email protected][[1]]) 
> head(cutoffs) 
     cut   fpr  tpr 
1  Inf 0.000000000 0.00000000 
2 0.9910964 0.000000000 0.01075269 
3 0.9846673 0.000000000 0.02150538 
4 0.9845992 0.000000000 0.03225806 
5 0.9834944 0.009345794 0.03225806 
6 0.9706413 0.009345794 0.04301075 

あなたがヒットしたいFPRしきい値を持っている場合、あなたはこのFPRしきい値以下の最大TPRを見つけるために、このdata.frameをサブセットすることができます

cutoffs <- cutoffs[order(cutoffs$tpr, decreasing=TRUE),] 
> head(subset(cutoffs, fpr < 0.2)) 
      cut  fpr  tpr 
96 0.5014893 0.1495327 0.8494624 
97 0.4997881 0.1588785 0.8494624 
98 0.4965132 0.1682243 0.8494624 
99 0.4925969 0.1775701 0.8494624 
100 0.4917356 0.1869159 0.8494624 
101 0.4901199 0.1962617 0.8494624 
+3

あなたが素晴らしいです。 strに言及してくれてありがとう。私はそれを雇うだろう。 – Faydey

+0

@ user24926喜んで助けてください! – Zach

+3

私はこの答えでインタラクティブで反復的なアプローチが本当に好きです。 –

5

2に基づくソリューションは、 ROCRpROCパッケージ:

threshold1 <- function(predict, response) { 
    perf <- ROCR::performance(ROCR::prediction(predict, response), "sens", "spec") 
    df <- data.frame(cut = [email protected][[1]], sens = [email protected][[1]], spec = [email protected][[1]]) 
    df[which.max(df$sens + df$spec), "cut"] 
} 
threshold2 <- function(predict, response) { 
    r <- pROC::roc(response, predict) 
    r$thresholds[which.max(r$sensitivities + r$specificities)] 
} 
data(ROCR.simple, package = "ROCR") 
threshold1(ROCR.simple$predictions, ROCR.simple$labels) 
#> [1] 0.5014893 
threshold2(ROCR.simple$predictions, ROCR.simple$labels) 
#> [1] 0.5006387 

も参照してくださいOptimalCutpointsパッケージ、多くのAを提供アルゴリズムを使用して最適なしきい値を見つけます。最高のしきい値を計算するための関数coordsが含まpROC

6

パッケージ:

library(pROC) 
my_roc <- roc(my_response, my_predictor) 
coords(my_roc, "best", ret = "threshold") 
関連する問題