Как построить кривую ROC с помощью пакета ROCR в r, * только с классификационной таблицей непредвиденных обстоятельств *

Как построить кривую ROC с использованием пакета ROCR в r, только с классификационной таблицей непредвиденных обстоятельств?

У меня есть таблица непредвиденных обстоятельств, в которой можно вычислить истинное положительное, ложное срабатывание и т. Д. У меня 500 репликаций, значит 500 таблиц. Но я не могу сгенерировать данные прогноза, указывающие на каждый отдельный случай оценки вероятности и истины. Как получить кривую без индивидуальных данных. Ниже приведена инструкция по использованию пакета.

## computing a simple ROC curve (x-axis: fpr, y-axis: tpr)
library(ROCR)
data(ROCR.simple)
pred <- prediction( ROCR.simple$predictions, ROCR.simple$labels)
perf <- performance(pred,"tpr","fpr")
plot(perf)    

person William Liu    schedule 10.02.2015    source источник
comment
Моя проблема в том, что у меня нет файла ROCR.simple.   -  person William Liu    schedule 11.02.2015
comment
Что ж, если у вас нет индивидуальных данных, поделитесь некоторыми примерами ввода, которые у вас есть для ваших данных.   -  person MrFlick    schedule 11.02.2015
comment
являются ли ваши таблицы таблицами два на два, с одной таблицей для каждого уникального порога (например, у вас есть 500 таблиц, b / c набор данных, из которого они были созданы, имеет 500 записей?)   -  person Jthorpe    schedule 11.02.2015


Ответы (1)


Вы не можете сгенерировать полную кривую ROC с одной таблицей непредвиденных обстоятельств, потому что таблица непредвиденных обстоятельств предоставляет только одну пару чувствительность / специфичность (для любого прогнозируемого порога, использованного для создания таблицы непредвиденных обстоятельств).

Если бы у вас было много таблиц непредвиденных обстоятельств, которые были созданы с разными порогами, вы могли бы аппроксимировать кривую ROC (в основном это будет линейная интерполяция между значениями чувствительности / специфичности в ваших таблицах непредвиденных обстоятельств). В качестве примера давайте рассмотрим прогнозирование того, является ли цветок разноцветным в наборе данных радужной оболочки, с помощью логистической регрессии:

iris$isv <- as.numeric(iris$Species == "versicolor")
mod <- glm(isv~Sepal.Length+Sepal.Width, data=iris, family="binomial")

Мы могли бы использовать стандартный ROCR код для вычисления кривой ROC для этой модели:

library(ROCR)
pred1 <- prediction(predict(mod), iris$isv)
perf1 <- performance(pred1,"tpr","fpr")
plot(perf1)

введите описание изображения здесь

Теперь предположим, что вместо mod все, что у нас есть, - это таблицы непредвиденных обстоятельств с рядом значений отсечки для прогнозов:

tables <- lapply(seq(0, 1, .1), function(x) table(iris$isv, factor(predict(mod, type="response") >= x, levels=c(F, T))))

# Predict TRUE if predicted probability at least 0
tables[[1]]
#     FALSE TRUE
#   0     0  100
#   1     0   50

# Predict TRUE if predicted probability at least 0.5
tables[[6]]
#     FALSE TRUE
#   0    86   14
#   1    29   21

# Predict TRUE if predicted probability at least 1
tables[[11]]
#     FALSE TRUE
#   0   100    0
#   1    50    0

От одной таблицы к другой некоторые прогнозы изменились с ИСТИНА на ЛОЖЬ из-за увеличенного отсечения, и, сравнивая столбец 1 следующей таблицы, мы можем определить, какие из них представляют истинно отрицательные и ложноотрицательные предсказания. Перебирая наш упорядоченный список таблиц непредвиденных обстоятельств, мы можем создавать поддельные пары прогнозируемых значений / результатов, которые мы можем передать в ROCR, обеспечивая соответствие чувствительности / специфичности для каждой таблицы непредвиденных обстоятельств.

fake.info <- do.call(rbind, lapply(1:(length(tables)-1), function(idx) {
  true.neg <- tables[[idx+1]][1,1] - tables[[idx]][1,1]
  false.neg <- tables[[idx+1]][2,1] - tables[[idx]][2,1]
  if (true.neg <= 0 & false.neg <= 0) {
    return(NULL)
  } else {
    return(data.frame(fake.pred=idx,
                      outcome=rep(c(0, 1), times=c(true.neg, false.neg))))
  }
}))

Теперь мы можем передать фальшивые прогнозы в ROCR как обычно:

pred2 <- prediction(fake.info$fake.pred, fake.info$outcome)
perf2 <- performance(pred2,"tpr","fpr")
plot(perf2)

введите описание изображения здесь

В основном то, что мы сделали, - это линейная интерполяция точек, которые у нас есть на кривой ROC. Если бы у вас были таблицы непредвиденных обстоятельств для многих отсечений, вы могли бы более точно аппроксимировать истинную кривую ROC. Если у вас нет широкого диапазона отсечки, вы не можете надеяться точно воспроизвести полную кривую ROC.

person josliber♦    schedule 11.02.2015