Как построить случайные леса в 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
, что может быть слишком загадочным для новых пользователей.
В любом случае, если ваши предикторы имеют пропущенные значения, у вас есть (в основном) два варианта:
- Используйте другой инструмент (
rpart
хорошо обрабатывает пропущенные значения.) - Вменяем недостающие значения
Не удивительно, что 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)
Это не не верный ответ, если отсутствующие переменные являются информативными, их учет может исправить увеличение ошибки модели из-за одной только несовершенной процедуры вменения.
Недостающие значения информативны, тогда они возникают из-за неслучайных причин, что особенно часто встречается в социальных экспериментах.