Кривая ROC в R с использованием пакета ROCR
Может кто-нибудь объяснить мне, пожалуйста, как построить кривую ROC с ROCR.
Я знаю, что я должен сначала запустить:
prediction(predictions, labels, label.ordering = NULL)
а затем:
performance(prediction.obj, measure, x.measure="cutoff", ...)
Я просто не понимаю, что имеется в виду с предсказанием и ярлыками. Я создал модель с ctree и cforest, и я хочу, чтобы кривая ROC для обоих из них сравнивала ее в конце. В моем случае атрибут класса - y_n, который, я полагаю, должен использоваться для ярлыков. Но как насчет прогнозов? Вот шаги, которые я делаю (dataset name= bank_part):
pred<-cforest(y_n~.,bank_part)
tablebank<-table(predict(pred),bank_part$y_n)
prediction(tablebank, bank_part$y_n)
После запуска последней строки я получаю эту ошибку:
Error in prediction(tablebank, bank_part$y_n) :
Number of cross-validation runs must be equal for predictions and labels.
Спасибо заранее!
Вот еще один пример: у меня есть учебный набор данных (bank_training) и тестовый набор данных (bank_testing), и я запускал randomForest, как показано ниже:
bankrf<-randomForest(y~., bank_training, mtry=4, ntree=2,
keep.forest=TRUE,importance=TRUE)
bankrf.pred<-predict(bankrf, bank_testing, type='response')
Теперь bankrf.pred является фактором-объектом с метками c = ( "0", "1" ). Тем не менее, я не знаю, как построить ROC, потому что я застрял в части предсказания. Вот что я делаю
library(ROCR)
pred<-prediction(bankrf.pred$y, bank_testing$c(0,1)
Но это все еще неверно, потому что я получаю сообщение об ошибке
Error in bankrf.pred$y_n : $ operator is invalid for atomic vectors
Ответы
Ответ 1
Прогнозы - это ваши непрерывные прогнозы классификации, метки - бинарная истина для каждой переменной.
Так должно работать следующее:
> pred <- prediction(c(0.1,.5,.3,.8,.9,.4,.9,.5), c(0,0,0,1,1,1,1,1))
> perf <- performance(pred, "tpr", "fpr")
> plot(perf)
для создания ROC.
EDIT: может быть полезно включить образец воспроизводимого кода в вопрос (мне сложно понять ваш комментарий).
Здесь нет нового кода, но... здесь функция, которую я часто использую для построения ROC:
plotROC <- function(truth, predicted, ...){
pred <- prediction(abs(predicted), truth)
perf <- performance(pred,"tpr","fpr")
plot(perf, ...)
}
Ответ 2
Как и @Jeff, ваши прогнозы должны быть непрерывными для функции ROCR
prediction
. require(randomForest); ?predict.randomForest
показывает, что по умолчанию predict.randomForest
возвращает предсказание исходной шкалы (метки класса, в классификации), тогда как predict.randomForest(..., type = 'prob')
возвращает вероятности каждого класса. Итак:
require(ROCR)
data(iris)
iris$setosa <- factor(1*(iris$Species == 'setosa'))
iris.rf <- randomForest(setosa ~ ., data=iris[,-5])
summary(predict(iris.rf, iris[,-5]))
summary(iris.preds <- predict(iris.rf, iris[,-5], type = 'prob'))
preds <- iris.preds[,2]
plot(performance(prediction(preds, iris$setosa), 'tpr', 'fpr'))
дает вам то, что вы хотите. В разных пакетах классификации требуются разные команды для получения прогнозируемых вероятностей - иногда это predict(..., type='probs')
, predict(..., type='prob')[,2]
и т.д., Поэтому просто проверяйте файлы справки для каждой функции, которую вы вызываете.
Ответ 3
Вот как вы можете это сделать:
имеют наши данные в файле csv ( "data_file.csv" ), но вам может понадобиться указать полный путь здесь. В этом файле есть заголовки столбцов, которые я буду использовать
"default_flag", "var1", "var2", "var3", где default_flag равно 0 или 1, а другие переменные имеют какое-либо значение.
R-код:
rm(list=ls())
df <- read.csv("data_file.csv") #use the full path if needed
mylogit <- glm(default_flag ~ var1 + var2 + var3, family = "binomial" , data = df)
summary(mylogit)
library(ROCR)
df$score<-predict.glm(mylogit, type="response" )
pred<-prediction(df$score,df$default_flag)
perf<-performance(pred,"tpr", "fpr")
plot(perf)
auc<- performance(pred,"auc")
auc
Обратите внимание, что оценка df $даст вам вероятность дефолта.
Если вы хотите использовать этот логит (те же коэффициенты регрессии) для тестирования в другом наборе данных df2, установленном для перекрестной проверки, используйте
df2 <- read.csv("data_file2.csv")
df2$score<-predict.glm(mylogit,newdata=df2, type="response" )
pred<-prediction(df2$score,df2$default_flag)
perf<-performance(pred,"tpr", "fpr")
plot(perf)
auc<- performance(pred,"auc")
auc
Ответ 4
Проблема заключается в том, что, как отмечают другие, предсказание в ROCR предполагает численные значения. Если вы вставляете прогнозы из randomForest
(как первый аргумент в прогнозирование в ROCR), это предсказание должно быть сгенерировано type='prob'
вместо type='response'
, которое является значением по умолчанию. Кроме того, вы можете взять type='response'
результаты и преобразовать в числовые (то есть, если ваши ответы равны 0/1). Но когда вы планируете это, ROCR генерирует одну значимую точку на кривой ROC. Для того, чтобы иметь много точек на кривой ROC, вам действительно нужна вероятность, связанная с каждым прогнозом - т.е. Использовать type='prob'
для генерации прогнозов.
Ответ 5
Проблема может заключаться в том, что вы хотели бы запустить функцию прогнозирования на нескольких прогонах, например, для перекрестной проверки.
В этом случае для прогнозирования (предсказания, метки, label.ordering = NULL) класс переменных "предсказания" и "метки" должен быть списком или матрицей.
Ответ 6
Попробуйте следующее:
library(ROCR)
pred<-ROCR::prediction(bankrf.pred$y, bank_testing$c(0,1)
В предложении функции присутствует много пакетов. Вы должны явно указать (ROCR::) использовать одно в ROCR. Это работало для меня.