Predicción con randomForest (R) cuando algunas entradas tienen valores faltantes (NA)

9

Tengo un randomForestmodelo de clasificación fina que me gustaría utilizar en una aplicación que predice la clase de un nuevo caso. El nuevo caso inevitablemente tiene valores perdidos. Predecir no funcionará como tal para las AN. ¿Cómo debo hacer esto entonces?

data(iris)
# create first the new case with missing values
na.row<-45
na.col<-c(3,5)
case.na<-iris[na.row,]
case.na[,na.col]<-NA

iris.rf <- randomForest(Species ~ ., data=iris[-na.row,])
# print(iris.rf)

myrf.pred <- predict(iris.rf, case.na[-5], type="response")
myrf.pred
[1] <NA>

Probé missForest. Combiné los datos originales y el nuevo caso, lo sacudí missForesty obtuve valores imputados para NA en mi nuevo caso. Sin embargo, la computación es demasiado pesada.

data.imp <- missForest(data.with.na)

Pero debe haber una manera de usar rf-model para predecir un nuevo caso con valores faltantes, ¿verdad?

hermo
fuente
44
Hay muchas formas en que los valores perdidos se pueden manejar en los árboles de decisión, pero el randomForestpaquete en R solo tiene el método de imputación que usted describió. Si desea permanecer en un entorno similar, gbmtiene un método más sencillo para manejar los valores faltantes en los datos nuevos (no es perfecto, pero es útil).
Shea Parkes
Creo que ese paquete de fiesta trata mejor con valores perdidos
Simone
Estimado @Simone, ¿cómo funciona el partypaquete con NA en el conjunto de prueba? No pude encontrar un rastro de inducción en partymanuales o ejemplos.
hermo
@hermo intenta echar un vistazo al documento de la fiesta citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.92.9930 parece que el algoritmo funciona como CART: busca divisiones sustitutas.
Simone
Intenta usar "na.action = na.roughfix".

Respuestas:

1

No tiene más remedio que imputar los valores o cambiar los modelos. Una buena opción podría ser aregImpute en el paquete Hmisc. Creo que es menos pesado que rfimpute, que es lo que te está deteniendo, primer ejemplo de paquete (hay otros):

# Check that aregImpute can almost exactly estimate missing values when
# there is a perfect nonlinear relationship between two variables
# Fit restricted cubic splines with 4 knots for x1 and x2, linear for x3
set.seed(3)
x1 <- rnorm(200)
x2 <- x1^2
x3 <- runif(200)
m <- 30
x2[1:m] <- NA
a <- aregImpute(~x1+x2+I(x3), n.impute=5, nk=4, match='closest')
a
matplot(x1[1:m]^2, a$imputed$x2)
abline(a=0, b=1, lty=2)

x1[1:m]^2
a$imputed$x2

# Multiple imputation and estimation of variances and covariances of
# regression coefficient estimates accounting for imputation
# Example 1: large sample size, much missing data, no overlap in
# NAs across variables
x1 <- factor(sample(c('a','b','c'),1000,TRUE))
x2 <- (x1=='b') + 3*(x1=='c') + rnorm(1000,0,2)
x3 <- rnorm(1000)
y  <- x2 + 1*(x1=='c') + .2*x3 + rnorm(1000,0,2)
orig.x1 <- x1[1:250]
orig.x2 <- x2[251:350]
x1[1:250] <- NA
x2[251:350] <- NA
d <- data.frame(x1,x2,x3,y)
# Find value of nk that yields best validating imputation models
# tlinear=FALSE means to not force the target variable to be linear
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), tlinear=FALSE,
                data=d, B=10) # normally B=75
f
# Try forcing target variable (x1, then x2) to be linear while allowing
# predictors to be nonlinear (could also say tlinear=TRUE)
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), data=d, B=10)
f

# Use 100 imputations to better check against individual true values
f <- aregImpute(~y + x1 + x2 + x3, n.impute=100, data=d)
f
par(mfrow=c(2,1))
plot(f)
modecat <- function(u) {
 tab <- table(u)
 as.numeric(names(tab)[tab==max(tab)][1])
}
table(orig.x1,apply(f$imputed$x1, 1, modecat))
par(mfrow=c(1,1))
plot(orig.x2, apply(f$imputed$x2, 1, mean))
fmi <- fit.mult.impute(y ~ x1 + x2 + x3, lm, f, 
                       data=d)
sqrt(diag(vcov(fmi)))
fcc <- lm(y ~ x1 + x2 + x3)
summary(fcc)   # SEs are larger than from mult. imputation

Usted menciona que tiene muchas observaciones nuevas que tienen valores faltantes en las variables independientes. A pesar de que tiene muchos casos como este, si para cada nueva observación solo hay faltas en una o dos de sus variables y su cantidad de variables no es pequeña, tal vez solo llene los agujeros con una mediana o un promedio (¿son continuos?) podría funcionar.

Otra cosa que podría ser interesante es hacer un análisis menor de importancia variable. La implementación aleatoria del bosque R calcula dos medidas de importancia y parcelas respectivas:

varImpPlot(yourRandomForestModel) # yourRandomForestModel must have the argument importance=TRUE 

Y puede jugar con solo incluir variables "importantes" en el entrenamiento del modelo, hasta que la precisión de la predicción no se vea tan afectada en comparación con el "modelo completo". Tal vez mantenga variables con un bajo número de faltas. Podría ayudarlo a reducir el tamaño de su problema.

JEquihua
fuente