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

Кривая 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
4b9b3361

Ответ 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. Это работало для меня.