Использование пакета 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
?
Ответы
Ответ 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
.