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

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

library(randomForest)
cars$speed[1] <- NA # to simulate missing value
model <- randomForest(speed ~., data=cars)

Я получаю следующую ошибку

Error in na.fail.default(list(speed = c(NA, 4, 7, 7, 8, 9, 10, 10, 10,  : 
   missing values in object

2 ответа

Решение

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

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

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

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

  1. Используйте другой инструмент (rpart хорошо обрабатывает пропущенные значения.)
  2. Вменяем недостающие значения

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

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

И, конечно, этот ответ немного догадывается, что ваша проблема на самом деле просто в том, что пропущены значения.

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

   na.action = na.roughfix

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

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

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

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

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

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

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

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

Другие вопросы по тегам