Вы не можете сгенерировать полную кривую 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)
![введите описание изображения здесь](https://i.stack.imgur.com/FkpCF.png)
Теперь предположим, что вместо 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)
![введите описание изображения здесь](https://i.stack.imgur.com/dvtZJ.png)
В основном то, что мы сделали, - это линейная интерполяция точек, которые у нас есть на кривой ROC. Если бы у вас были таблицы непредвиденных обстоятельств для многих отсечений, вы могли бы более точно аппроксимировать истинную кривую ROC. Если у вас нет широкого диапазона отсечки, вы не можете надеяться точно воспроизвести полную кривую ROC.
person
josliber♦
schedule
11.02.2015