2013-05-02 9 views
28

से थ्रेसहोल्ड मान प्राप्त करना मेरे पास अनुमानित वर्ग प्रतिशत के वेक्टर पर ROCR पैकेज का उपयोग करके कुछ मॉडल हैं, मेरे पास एक प्रदर्शन ऑब्जेक्ट है। विनिर्देशों के साथ प्रदर्शन ऑब्जेक्ट को प्लॉट करना "tpr", "fpr" मुझे एक आरओसी वक्र देता है।आरओसी वक्र

मैं झूठी सकारात्मक दर (x) के कुछ थ्रेसहोल्ड पर मॉडल की तुलना कर रहा हूं। मैं प्रदर्शन ऑब्जेक्ट से वास्तविक सकारात्मक दर (वाई) का मूल्य प्राप्त करने की उम्मीद कर रहा हूं। और भी, मैं कक्षा प्रतिशत सीमा प्राप्त करना चाहता हूं जिसका उपयोग उस बिंदु को उत्पन्न करने के लिए किया गया था।

झूठी सकारात्मक दर (x-value) की सूचकांक संख्या जो इसके ऊपर होने के बिना सीमा के निकटतम है, मुझे उचित वास्तविक सकारात्मक दर (y-value) का सूचकांक संख्या देना चाहिए। मुझे बिल्कुल यकीन नहीं है कि सूचकांक मूल्य कैसे प्राप्त करें।

और इस बिंदु पर, मैं उस बिंदु को बनाने के लिए कक्षा की संभावनाओं की सीमा कैसे प्राप्त करूं?

उत्तर

48

यही कारण है कि str मेरी पसंदीदा आर समारोह है:

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 है, इसलिए हम स्लॉट तक पहुंचने के लिए @ का उपयोग कर सकते हैं।

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 सीमा आप हिट करना चाहते हैं, तो आप इस data.frame सबसेट इस fpr सीमा से नीचे अधिकतम TPR को खोजने के लिए कर सकते हैं::

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 समाधान के आधार पर यहाँ आप कैसे एक data.frame करते हैं ROCR और pROC संकुल:

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 पैकेज जो कई एक प्रदान करता है इष्टतम थ्रेसहोल्ड खोजने के लिए लिगोरिदम।

6

पैकेज pROC सबसे अच्छा सीमा की गणना के लिए समारोह coords में शामिल हैं:

library(pROC) 
my_roc <- roc(my_response, my_predictor) 
coords(my_roc, "best", ret = "threshold") 
संबंधित मुद्दे