Как использовать случайные леса в R с пропущенными значениями?

library(randomForest)
rf.model <- randomForest(WIN ~ ., data = learn)

Я хотел бы соответствовать модели случайного леса, но я получаю эту ошибку:

Error in na.fail.default(list(WIN = c(2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L,  : 
missing values in object

У меня есть фрейм данных с 16 числовыми атрибутами и WIN является фактором с уровнями 0 1.

Ответ 1

Моя первоначальная реакция на этот вопрос заключалась в том, что он не показал больших исследовательских усилий, поскольку "каждый" знает, что случайные леса не обрабатывают недостающие значения в предикторах. Но после проверки ?randomForest я должен признаться, что это может быть гораздо более явным.

(Хотя, Breiman PDF, связанный в документации, явно указывает, что отсутствующие значения просто не обрабатываются вообще.)

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

В любом случае, если у ваших предикторов отсутствуют значения, у вас есть (в основном) два варианта:

  • Используйте другой инструмент (rpart отлично справляется с отсутствующими значениями.)
  • Утратить недостающие значения

Неудивительно, что пакет randomForest имеет функцию для этого, rfImpute. Документация на ?rfImpute проходит через базовый пример ее использования.

Если только небольшое число случаев имеет отсутствующие значения, вы также можете попробовать установить na.action = na.omit, чтобы просто удалить эти случаи.

И, конечно же, этот ответ - это немного догадка, что ваша проблема действительно просто отсутствует.

Ответ 2

Если есть вероятность, что пропущенные значения информативны, вы можете ввести недостающие значения и добавить дополнительные двоичные переменные (с помощью new.vars<-is.na(your_dataset)) и проверить, не уменьшила ли она ошибку, если new.var слишком большой, чтобы добавить его в your_dataset затем вы можете использовать его в одиночку, выбрать значащие переменные с помощью varImpPlot и добавить их в your_dataset, вы также можете попытаться добавить одну переменную в your_dataset, которая подсчитывает число NA new.var <- rowSums(new.vars)

Это не ответ на вопрос, если отсутствующие переменные - информативный учет, который может быть исправлен для увеличения ошибки модели из-за неэффективной процедуры вменения.

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

Ответ 3

Случайный лес Бреймана, на котором основан пакет randomForest, фактически обрабатывает пропущенные значения в предикторах. В пакете randomForest вы можете установить

   na.action = na.roughfix

Он начнется с использования медианы/режима для пропущенных значений, но затем он вырастит лес и вычислит близость, затем итерирует и построит лес, используя эти вновь заполненные значения и т.д. Это не очень хорошо объяснено в документации randomForest. Это только утверждает

.... NA заменяются на медианы столбцов.... Это используется в качестве отправной точки для приписывания пропущенных значений случайному лесу

На домашней странице Бреймана вы найдете немного больше информации

missfill = 1,2 выполняет быструю замену отсутствующих значений для тренировочного набора (если равно 1) и более аккуратную замену (если равно 2).

mfixrep = k с missfill = 2 делает более медленную, но обычно более эффективную замену, используя близость с k итерациями только на обучающем наборе. (Требуется nprox> 0).