¿Cómo imputar una variable predictora categórica faltante para un modelo de bosque aleatorio?

8

Tengo un conjunto de datos x, y que estoy usando para construir un bosque aleatorio. Los datos x son un vector de valores que incluye algunos NA. Así que solía rfImputemanejar los datos faltantes y crear un bosque aleatorio. Ahora tengo una nueva observación invisible x (con un NA) y quiero predecir y. ¿Cómo imputo el valor faltante para poder usar el bosque aleatorio que ya he crecido? La rfImputefunción parece requerir x e y. Solo tengo x para fines de predicción.

Mi pregunta es similar (pero diferente) a esta pregunta . Y, por ejemplo, puedo usar el mismo conjunto de datos de iris. Si interpreté correctamente el código en la respuesta a la pregunta a la que me refiero, el código iris.na[148, , drop=FALSE]en la declaración iris.na2 = rbind(iris.imputed, iris.na[148, , drop=FALSE])representa los nuevos datos que incluyen el Species(el valor Y). En mi problema, no sabría: Speciesquiero utilizar el bosque aleatorio para predecir eso. Tendría las 4 variables independientes, pero algunas podrían ser NApara una fila dada. Para continuar con la analogía, imagine que tengo 3 de las 4 variables (falta una). Quiero imputar ese valor. Entonces quiero predecir las especies que no conozco.

En respuesta al comentario de Gung de que debería agregar una ilustración, déjenme ponerla en términos del conjunto de datos del iris. Imagine que tengo los siguientes datos sobre una flor. Sé que es Sepal.Length, Sepal.Width, Petal.Length, pero no el Petal.Width. Me gustaría imputar el Petal.Widthy luego usar esos 4 valores dentro de un modelo de RF para predecir el Species.

rmacey
fuente
¿Estás diciendo que no tienes nada ? Comienza con solo x & y para construir un modelo, y ahora desea predecir y para una observación para la que no tiene ni x ni y. ¿Es eso correcto?
gung - Restablece a Monica
Gung, tengo algo. Tengo una nueva observación x pero no y. Quiero predecir la y en función de la nueva x. Pero el vector x tiene algunos valores de NA que quiero imputar. Gracias.
rmacey
Ya veo, entonces x es un conjunto de variables predictoras donde tienes algunas pero no otras. ¿Está bien? Es posible que desee actualizar su Q (que la incluirá en la página principal), y puede incluir un pequeño ejemplo ilustrativo. Una nota de precaución: esta Q se ve en el borde de '¿cómo uso R?' & / o '¿qué código me ayudará a hacer esto?', que se considerará programado y podría cerrarse. Debe asegurarse de dejar en claro que esta es una pregunta sobre RF, no sobre cómo hacer RF con R.
gung - Vuelva a instalar a Monica
LOL ... cuando lo puse en el intercambio de pila simple, me sugirieron que lo moviera aquí. Esto es realmente sobre rfImpute o algo similar.
rmacey
Por "intercambio de pila simple", ¿se refiere a desbordamiento de pila ? Si su pregunta es cómo usar el código, va allí; si es cómo entender las estadísticas subyacentes, va aquí. (Por supuesto, también hay Q's que están fuera de tema en ambos lugares). No creo que tu Q esté necesariamente fuera de tema aquí. Solo le estoy informando que tenga cuidado de cómo lo dice, así que está claro que es una pregunta estadística, no una pregunta de codificación.
gung - Restablecer Monica

Respuestas:

4

Creo que necesita un método de supervisión no supervisado. Es uno que no utiliza los valores objetivo para la imputación. Si solo tiene pocos vectores de características de predicción, puede ser difícil descubrir una estructura de datos. En cambio, podría mezclar sus predicciones con vectores de funciones de entrenamiento ya imputados y utilizar esta estructura para imputar una vez más. Tenga en cuenta que este procedimiento puede violar supuestos de independencia, por lo tanto, envuelva todo el procedimiento en una validación cruzada externa para verificar si hay un sobreajuste grave.

Acabo de enterarme de missForest por un comentario a esta pregunta . missForest parece hacer el truco. Simulé tu problema con los datos del iris. (sin validación 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
fuente