Como imputar uma variável preditora categórica ausente para um modelo aleatório de floresta?

8

Eu tenho um conjunto de dados x, y que estou usando para criar uma floresta aleatória. Os dados x são um vetor de valores que inclui algumas NAs. Então, eu uso rfImputepara manipular os dados ausentes e criar uma floresta aleatória. Agora eu tenho uma nova observação invisível x (com um NA) e quero prever y. Como imputo o valor ausente para que eu possa usar a floresta aleatória que já cresci? A rfImputefunção parece exigir x e y. Eu só tenho x para fins de previsão.

Minha pergunta é semelhante (mas diferente) a esta pergunta . E, por exemplo, eu posso usar o mesmo conjunto de dados da íris. Se eu interpretei corretamente o código na resposta à pergunta que refiro, o código iris.na[148, , drop=FALSE]na declaração iris.na2 = rbind(iris.imputed, iris.na[148, , drop=FALSE])representa os novos dados que incluem o Species(o valor Y). No meu problema, eu não saberia o Species- quero usar a floresta aleatória para prever isso. Eu teria as 4 variáveis ​​independentes, mas algumas podem ser NApara uma determinada linha. Para continuar a analogia, imagine que eu tenho 3 das 4 variáveis ​​(uma está faltando). Eu quero imputar esse valor. Então eu quero prever as espécies que eu não conheço.

Em resposta ao comentário de Gung de que devo adicionar uma ilustração, deixe-me colocá-la em termos do conjunto de dados da íris. Imagine que tenho os seguintes dados em uma flor. Eu sei que é Sepal.Length, Sepal.Width, Petal.Length, mas não o Petal.Width. Eu gostaria de imputar o Petal.Widthe, em seguida, usar esses 4 valores dentro de um modelo de RF para prever o Species.

rmacey
fonte
Você está dizendo que não tem nada ? Você começa com apenas x e y para criar um modelo e agora deseja prever y para uma observação para a qual você não tem nem x nem y. Isso está correto?
gung - Restabelece Monica
Gung, eu tenho alguma coisa. Eu tenho uma nova observação x, mas não y. Eu quero prever o y com base no novo x. Mas o vetor x tem alguns valores de NA que eu quero atribuir. Obrigado.
rmacey
Entendo, então x é um conjunto de variáveis ​​preditoras em que você tem algumas, mas não outras. Isso está certo? Você pode atualizar seu Q (que o encontrará na página principal) e incluir um pequeno exemplo ilustrativo. Uma nota de cautela: esse Q aparece na fronteira de 'como uso o R?' & / ou 'que código me ajudará a fazer isso?', que será considerado programado e poderá ser fechado. Você deve se certificar que ficar claro que esta é uma pergunta sobre RF, não como fazer RF w / R.
gung - Reintegrar Monica
LOL ... quando eu o coloquei na troca de pilhas simples, eles sugeriram que eu fosse movido para cá. Isso é realmente sobre rfImpute ou algo semelhante.
rmacey
Por "troca de pilha simples", você quer dizer Estouro de Pilha ? Se sua pergunta é como usar o código, ele vai para lá; se é como entender as estatísticas subjacentes, ele vai aqui. (Claro, também existem perguntas que estão fora do tópico nos dois lugares.) Eu não acho que o seu Q esteja necessariamente fora do tópico aqui. Estou apenas informando que você deve ter cuidado com o que você expressa, para que fique claro que é uma questão estatística, não uma questão de codificação.
gung - Restabelece Monica

Respostas:

4

Eu acho que você precisa de um método de imputação não supervisionado. Esse é um que não usa os valores de destino para imputação. Se você tiver apenas alguns vetores de recursos de previsão, poderá ser difícil descobrir uma estrutura de dados. Em vez disso, você pode misturar suas previsões com vetores de recursos de treinamento já imputados e usar essa estrutura para imputar mais uma vez. Observe que este procedimento pode violar suposições de independência, portanto, envolva todo o procedimento em uma validação cruzada externa para verificar se há excesso de ajuste.

Acabei de aprender sobre o missForest a partir de um comentário a esta pergunta . missForest parece fazer o truque. Simulei seu problema nos dados da íris. (sem validação cruzada externa)

rm(list=ls())
data("iris")
set.seed(1234)
n.train = 100
train.index = sample(nrow(iris),n.train)
feature.train = as.matrix(iris[ train.index,1:4])
feature.test  = as.matrix(iris[-train.index,1:4])


#simulate 40 NAs in train
n.NAs = 40
NA.index = sample(length(feature.train),n.NAs)
NA.feature.train = feature.train; NA.feature.train[NA.index] = NA

#imputing 40 NAs unsupervised
library(missForest)
imp.feature.train = missForest(NA.feature.train)$ximp
#check how well imputation went, seems promsing for this data set
plot(    feature.train[NA.index],xlab="true value",
     imp.feature.train[NA.index],ylab="imp  value",)

#simulate random NAs in feature test
feature.test[sample(length(feature.test),20)] = NA

#mix feature.test with imp.feature.train
nrow.test = nrow(feature.test)
mix.feature = rbind(feature.test,imp.feature.train)
imp.feature.test = missForest(mix.feature)$ximp[1:nrow.test,]

#train RF and predict
library(randomForest)
rf = randomForest(imp.feature.train,iris$Species[train.index])
pred.test = predict(rf,imp.feature.test)
table(pred.test, iris$Species[-train.index])

Printing...
-----------------
pred.test    setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         20         2
  virginica       0          1        15
Soren Havelund Welling
fonte