Подтвердить что ты не робот

Получение пороговых значений из кривой ROC

У меня есть несколько моделей, используя пакет ROCR для вектора прогнозируемого процентного содержания класса, у меня есть объект производительности. Построение объекта производительности со спецификациями "tpr", "fpr" дает мне кривую ROC.

Я сравниваю модели с определенными порогами ложной положительной скорости (x). Я надеюсь получить значение истинной положительной скорости (y) из объекта производительности. Более того, я хотел бы получить порог процентного класса, который использовался для создания этой точки.

номер индекса ложной положительной скорости (x-value), ближайший к порогу без превышения его, должен дать мне индексный номер соответствующей истинной положительной скорости (y-value). Я не совсем уверен, как получить это значение индекса.

И более того, как мне получить порог вероятности класса, который использовался для создания этой точки?

4b9b3361

Ответ 1

Вот почему 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 ...

Ахаха! Это класс S4, поэтому мы можем использовать @ для доступа к слотам. Вот как вы делаете 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, который вы хотите ударить, вы можете подмножить этот data.frame, чтобы найти максимальный tpr ниже этого порога fpr:

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

Ответ 2

Пакет pROC включает функцию coords для вычисления наилучшего порога:

library(pROC)
my_roc <- roc(my_response, my_predictor)
coords(my_roc, "best", ret = "threshold")

Ответ 3

2 решения на основе пакетов 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, который предоставляет множество алгоритмов для поиска оптимальных пороговых значений.

Ответ 4

Мне нужно решение как можно скорее. У меня есть значения чувствительности и 1-специфичности в файле csv. Мне просто нужно построить кривую ROC в R. Пожалуйста, помогите мне.

Заранее спасибо!