Prédiction avec randomForest (R) lorsque certaines entrées ont des valeurs manquantes (NA)

9

J'ai un randomForestmodèle de classification fine que j'aimerais utiliser dans une application qui prédit la classe d'un nouveau cas. Le nouveau cas a inévitablement des valeurs manquantes. Predict ne fonctionnera pas comme tel pour les AN. Comment dois-je faire alors?

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>

J'ai essayé missForest. J'ai combiné les données d'origine et le nouveau cas, je les ai secouées missForestet j'ai obtenu des valeurs imputées pour les NA dans mon nouveau cas. Informatique trop lourde cependant.

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

Mais il doit y avoir un moyen d'utiliser le modèle rf pour prédire un nouveau cas avec des valeurs manquantes, non?

hermo
la source
4
Il existe de nombreuses façons de traiter les valeurs manquantes dans les arbres de décision, mais le randomForestpackage de R ne dispose que de la méthode d'imputation que vous avez décrite. Si vous voulez rester dans un environnement similaire, gbma une méthode un peu plus fluide pour gérer les valeurs manquantes dans les nouvelles données (ce n'est pas parfait, mais c'est utile).
Shea Parkes
Je pense que le forfait fête traite mieux les valeurs manquantes
Simone
Cher @Simone, comment fonctionne le partypackage avec les NA dans l'ensemble de test? Je n'ai trouvé aucune trace d'imputation dans des partymanuels ou des exemples.
hermo
@hermo essaie de jeter un œil au journal du parti citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.92.9930 il semble que l'algorithme fonctionne comme CART - il recherche des divisions de substitution.
Simone
Essayez d'utiliser "na.action = na.roughfix".

Réponses:

1

Vous n'avez pas d'autre choix que d'imputer les valeurs ou de changer de modèle. Un bon choix pourrait être aregImpute dans le paquet Hmisc. Je pense que c'est moins lourd que rfimpute qui est ce qui vous retient, premier exemple de package (il y en a d'autres):

# 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

Vous mentionnez que de nombreuses nouvelles observations ont des valeurs manquantes sur les variables indépendantes. Même si vous avez de nombreux cas comme celui-ci, si pour chaque nouvelle observation il n'y a que des lacunes dans une ou deux de ses variables et que votre quantité de variables n'est pas minuscule, peut-être simplement en remplissant les trous avec une médiane ou une moyenne (sont-ils continus?) pourrait fonctionner.

Une autre chose qui pourrait être intéressante est de faire une analyse d'importance variable mineure. L'implémentation aléatoire de la forêt R calcule deux mesures d'importance et des parcelles respectives:

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

Et vous pouvez jouer avec l'inclusion de variables "importantes" dans la formation du modèle, jusqu'à ce que la précision de la prédiction ne soit pas autant affectée par rapport au "modèle complet". Peut-être que vous conservez des variables avec un faible nombre de manquements. Cela pourrait vous aider à réduire la taille de votre problème.

JEquihua
la source