Processing math: 0%

8 votos

¿Cómo imputar una variable predictiva categórica perdida para un modelo forestal aleatorio?

Tengo un conjunto de datos x, y que estoy usando para construir un bosque al azar. Los datos x son un vector de valores que incluye algunos NAs. Así que uso rfImpute para manejar los datos que faltan y crear un bosque aleatorio. Ahora tengo una nueva observación no vista x (con una NA) y quiero predecir y. ¿Cómo imputar el valor que falta para poder usar el bosque aleatorio que ya he crecido? El rfImpute La función parece requerir x e y. Sólo tengo x para propósitos de predicción.

Mi pregunta es similar (pero diferente) a esta pregunta . Y por ejemplo, puedo usar el mismo conjunto de datos del iris. Si he interpretado 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 la Species (el valor Y). En mi problema no sabría el Species -Quiero usar el bosque aleatorio para predecir eso. Tendría las 4 variables independientes, pero algunas podrían ser NA para una fila determinada. Para continuar la analogía, imagina que tengo 3 de las 4 variables (falta una). Quiero imputar ese valor. Luego quiero predecir las especies que no conozco.

En respuesta al comentario de Gung de que debería añadir una ilustración, permítanme 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 la Petal.Width y luego usar esos 4 valores dentro de un modelo de RF para predecir la Species .

4voto

Creo que necesitas un método de imputación sin supervisión. Uno que no utilice los valores objetivo para la imputación. Si sólo tienes unos pocos vectores de características de predicción, puede ser difícil descubrir una estructura de datos. En cambio, podrías mezclar tus predicciones con vectores de características de formación ya imputados y utilizar esta estructura para imputar una vez más. Nótese que este procedimiento puede violar los supuestos de independencia, por lo tanto, envuelva todo el procedimiento en una validación cruzada externa para comprobar si hay una sobrecarga grave.

Me acabo de enterar de lo de MissForest por un comentario a este pregunta MissForest parece hacer el truco. He simulado su 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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X