Как использовать случайные леса в 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).