как использовать пакет PRROC, чтобы получить auc ROC & PR для случайного леса в R

Мой ресурс данных: https://www.kaggle.com/mlg-ulb/creditcardfraud Набор данных сильно несбалансирован, на положительный класс (мошенничество) приходится 0,172% всех транзакций,< img src="https://i.stack.imgur.com/2l72y.png" alt="введите здесь описание изображения">введите здесь описание изображения

Я использовал пакет PRROC, чтобы получить кривую AUC ROC, вот мой случайный код леса:

rf.model <- randomForest(Class ~ ., data = training, ntree = 2000, nodesize = 20)
rf_pred <- predict(rf.model, test,type="prob" 

поэтому, как и ожидалось, rf_pred должен возвращать вероятность каждого класса: введите описание изображения здесь Затем я использовал следующий код:

fg_rf <- rf_pred[test$Class==1]
bg_rf <- rf_pred[test$Class==0]
roc_rf <- roc.curve(scores.class0 = fg_rf,scores.class1 = bg_rf,curve = T)

Однако КРИВАЯ ROC оказалась не такой, как я ожидал введите здесь описание изображения Та же проблема возникла с кривой PR. Это из-за высокого дисбаланса в классе? И если предположить, что rf_pred возвращает вероятность 0/1, как я могу сделать так, чтобы fg_rf равнялась вероятности calss = 1, мой код: fg_rf <- rf_pred[test$Class==1] правильный?


person kyle chan    schedule 20.02.2018    source источник
comment
Мы могли бы проверить это, если бы вы сделали воспроизводимый пример :-) Что такое данные? stackoverflow.com/ вопросы/5963269/   -  person RobertMyles    schedule 20.02.2018
comment
Привет, мои данные имеют высокий дисбаланс в классе, 0:199021; 1:345. Должен ли я сбалансировать класс в данных обучения, прежде чем использовать эти данные обучения для правильного обучения модели?   -  person kyle chan    schedule 21.02.2018


Ответы (1)


Глядя на ваши результаты head(rf_pred), становится очевидным, что ваша функция predict возвращает (жесткие) классы (т.е. 0/1), а не оценки вероятности, вероятно, из-за вашей опечатки type="pro" (должно быть type="prob").

Аргументы scores.class0 и scores.class1 метода roc.curve должны быть оценками вероятности, а не предсказаниями жесткого класса.

Исправьте опечатку в predict, и все будет в порядке, но, скорее всего, вам нужно также поменять местами оценки - теперь вы присваиваете баллы класса 1 scores.class0:

rf_pred <- predict(rf.model, test,type="prob")
fg_rf <- rf_pred[test$Class==1]
bg_rf <- rf_pred[test$Class==0]
roc_rf <- roc.curve(scores.class0 = bg_rf, scores.class1 = fg_rf, curve = T)
person desertnaut    schedule 20.02.2018
comment
Спасибо за указание, но на самом деле я использовал type=prob, результат все тот же, не могли бы вы помочь мне проверить это? - person kyle chan; 21.02.2018
comment
@kylechan Ваш rf_pred определенно не содержит показателей вероятности; и вы поменяли местами scores.class0 и scores.class1, как показано в моем фрагменте? Вы действительно используете пример из виньетки пакета? - person desertnaut; 21.02.2018
comment
Также я пробовал переключать bg_rf и fg_rf, все равно AUC равен 0,5. - person kyle chan; 21.02.2018
comment
У меня есть теория: мои данные имеют высокий дисбаланс классов, 0:199021:1:345, поэтому на самом деле я использовал функцию SMOTE для повторной балансировки класса в данных обучения, и я должен использовать эти данные обучения сбалансированного класса для обучения случайного леса вместо оригинального несбалансированного, верно? - person kyle chan; 21.02.2018
comment
Привет, только что обновил свой вопрос, может быть, это поможет вам лучше понять его. - person kyle chan; 21.02.2018
comment
Дисбаланс классов @kylechan меняет все (вы должны были включить эту информацию в вопрос). Учитывая это, ваш AUC не является странным — и да, вы должны использовать набор данных, сбалансированный SMOTE, для обучения вашего классификатора. - person desertnaut; 21.02.2018