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

Использование пакета randomforest в R, как получить вероятности из модели классификации?

TL; DR:

Есть ли что-то, что я могу отметить в исходном randomForest вызове, чтобы избежать повторного запуска функции predict , чтобы получить предсказанные категориальные вероятности, а не только вероятную категорию?

Подробнее:

Я использую пакет randomForest.

У меня есть модель вроде:

model <- randomForest(x=out.data[train.rows, feature.cols],
                      y=out.data[train.rows, response.col],
                      xtest=out.data[test.rows, feature.cols],
                      ytest=out.data[test.rows, response.col],
                      importance= TRUE)

где out.data - это кадр данных, а feature.cols - смесь числовых и категориальных признаков, а response.col - двоичная переменная TRUE/FALSE, которую я принудительно вставлял в factor, чтобы randomForest будет правильно относиться к ней как к категорическому.

Все работает хорошо, и переменная model возвращается мне правильно. Тем не менее, я не могу найти флаг или параметр для передачи функции randomForest, так что model возвращается мне с вероятностями из TRUE или FALSE. Вместо этого я получаю просто предсказанные значения. То есть, если я посмотрю на model$predicted, я увижу что-то вроде:

FALSE
FALSE
TRUE
TRUE
FALSE
.
.
.

Вместо этого я хочу увидеть что-то вроде:

   FALSE  TRUE
1  0.84   0.16
2  0.66   0.34
3  0.11   0.89
4  0.17   0.83
5  0.92   0.08
.   .      .
.   .      .
.   .      .

Я могу получить выше, но для этого мне нужно сделать что-то вроде:

tmp <- predict(model, out.data[test.rows, feature.cols], "prob")

[test.rows фиксирует номера строк для тех, которые использовались во время тестирования модели. Подробности здесь не показаны, но просты, так как идентификаторы тестовых строк выводятся в model.]

Тогда все работает нормально. проблема заключается в том, что модель большая и занимает очень много времени, и даже само прогнозирование занимает некоторое время. Поскольку предсказание должно быть совершенно ненужным (я просто ищу, чтобы вычислить кривую ROC в наборе тестовых данных, набор данных, который должен был быть уже рассчитан), я надеялся пропустить этот шаг. Есть ли что-то, что я могу указать в исходном randomForest вызове, чтобы избежать повторного запуска функции predict ?

4b9b3361

Ответ 1

model$predicted НЕ то же самое возвращается predict(). Если вы хотите вероятность класса TRUE или FALSE, тогда вы должны запустить predict() или передать x,y,xtest,ytest как

randomForest(x,y,xtest=x,ytest=y), 

где x=out.data[, feature.cols], y=out.data[, response.col].

model$predicted возвращает класс, основанный на том, какой класс имел большее значение в model$votes для каждой записи. votes, как отметил @joran, это доля голосов OOB (из сумки) из случайного леса, а голосование учитывается только тогда, когда запись была выбрана в образце OOB. С другой стороны, predict() возвращает истинную вероятность для каждого класса на основе голосов всеми деревьями.

Использование randomForest(x,y,xtest=x,ytest=y) действует несколько иначе, чем при передаче формулы или просто randomForest(x,y), как в приведенном выше примере. randomForest(x,y,xtest=x,ytest=y) Вернет вероятность для каждого класса, это может показаться немного странным, но оно находится под model$test$votes, а предсказанный класс под model$test$predicted, который просто выбирает класс, на основе которого класс имел большее значение в model$test$votes. Кроме того, при использовании randomForest(x,y,xtest=x,ytest=y), model$predicted и model$votes имеют такое же определение, как указано выше.

Наконец, просто отметим, что если используется randomForest(x,y,xtest=x,ytest=y), то для использования функции прогноза() флаг keep.forest должен быть установлен в TRUE.

model=randomForest(x,y,xtest=x,ytest=y,keep.forest=TRUE). 
prob=predict(model,x,type="prob")

prob WILL эквивалентен model$test$votes, так как ввод тестовых данных как x.