Кривая ROC в R с использованием пакета ROCR

Может кто-нибудь объяснить мне, пожалуйста, как построить кривую ROC с ROCR. Я знаю, что мне нужно сначала запустить:

prediction(predictions, labels, label.ordering = NULL)

а потом:

performance(prediction.obj, measure, x.measure="cutoff", ...)

Мне просто непонятно, что подразумевается под предсказаниями и ярлыками. Я создал модель с ctree и cforest, и я хочу, чтобы кривая ROC для них обоих сравнивала ее в конце. В моем случае атрибут класса y_n, который, как я полагаю, следует использовать для меток. А как насчет прогнозов? Вот шаги того, что я делаю (имя набора данных = 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

r roc
person spektra    schedule 13.07.2012    source источник
comment
Если вы предоставите полноценный, самодостаточный пример, вы можете получить более широкую аудиторию, которая сможет вам помочь. См. stackoverflow.com / questions / 5963269 /, чтобы узнать, как это сделать.   -  person Roman Luštrik    schedule 13.07.2012


Ответы (6)


Прогнозы - это ваши непрерывные предсказания классификации, метки - это двоичная истина для каждой переменной.

Таким образом, должно работать что-то вроде следующего:

> 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.

РЕДАКТИРОВАТЬ: вам может быть полезно включить в вопрос образец воспроизводимого кода (мне трудно понять ваш комментарий).

Здесь нет нового кода, но ... вот функция, которую я довольно часто использую для построения ROC:

 plotROC <- function(truth, predicted, ...){
   pred <- prediction(abs(predicted), truth)    
   perf <- performance(pred,"tpr","fpr")

   plot(perf, ...)
}
person Jeff Allen    schedule 13.07.2012
comment
edit Я все еще не понимаю. Вот еще один пример: у меня есть набор данных для обучения (bank_training) и набор данных для тестирования (bank_testing), и я запустил randomForest, как показано ниже: bankrf ‹-randomForest (y ~., Bank_training, mtry = 4, ntree = 2, keep.forest = TRUE , important = TRUE) bankrf.pred ‹-predict (bankrf, bank_testing) library (ROCR) pred‹ -prediction (bankrf.pred $ y, bank_testing $ y) Но это все равно неверно, потому что я получаю сообщение об ошибке ошибка в формате прогноза. - person spektra; 13.07.2012

Как сказал @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] и т. Д., Поэтому просто просмотрите файлы справки для каждой функции, которую вы вызываете.

person lockedoff    schedule 13.07.2012

Вот как это можно сделать:

иметь наши данные в файле 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
person Mariav    schedule 03.02.2016

Проблема в том, что, как указывали другие, прогнозирование в ROCR ожидает числовых значений. Если вы вставляете прогнозы из randomForest (в качестве первого аргумента в прогноз в ROCR), этот прогноз должен быть сгенерирован type='prob' вместо type='response', который используется по умолчанию. В качестве альтернативы вы можете взять type='response' результатов и преобразовать их в числовые (то есть, если ваши ответы, скажем, 0/1). Но когда вы строите это, ROCR генерирует единственную значимую точку на кривой ROC. Чтобы иметь много точек на кривой ROC, вам действительно нужна вероятность, связанная с каждым прогнозом, то есть использовать type='prob' при создании прогнозов.

person Oytun    schedule 10.02.2014

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

В этом случае для функции предсказания (предсказания, метки, label.ordering = NULL) класс переменных «предсказания» и «метки» должен быть списком или матрицей.

person sztup    schedule 13.07.2012

Попробуй это:

library(ROCR)
pred<-ROCR::prediction(bankrf.pred$y, bank_testing$c(0,1)

Функция предсказания присутствует во многих пакетах. Вы должны явно указать (ROCR: :), чтобы использовать его в ROCR. Этот сработал для меня.

person Jawahar Sam    schedule 29.09.2016