Comment imputer une variable prédictive catégorielle manquante pour un modèle de forêt aléatoire?

8

J'ai un ensemble de données x, y que j'utilise pour construire une forêt aléatoire. Les données x sont un vecteur de valeurs qui inclut certaines NA. J'utilise donc rfImputepour gérer les données manquantes et créer une forêt aléatoire. Maintenant, j'ai une nouvelle observation invisible x (avec un NA) et je veux prédire y. Comment imputer la valeur manquante afin de pouvoir utiliser la forêt aléatoire que j'ai déjà développée? La rfImputefonction semble nécessiter x et y. Je n'ai que x à des fins de prédiction.

Ma question est similaire (mais différente) à cette question . Et par exemple, je peux utiliser le même jeu de données iris. Si j'ai correctement interprété le code dans la réponse à la question à laquelle je fais référence, le code iris.na[148, , drop=FALSE]dans l'instruction iris.na2 = rbind(iris.imputed, iris.na[148, , drop=FALSE])représente les nouvelles données qui incluent la Species(la valeur Y). Dans mon problème, je ne saurais pas… SpeciesJe veux utiliser la forêt aléatoire pour prédire cela. J'aurais les 4 variables indépendantes, mais certaines pourraient être NApour une ligne donnée. Pour continuer l'analogie, imaginez que j'ai 3 des 4 variables (une manque). Je veux imputer cette valeur. Ensuite, je veux prédire les espèces que je ne connais pas.

En réponse au commentaire de Gung que je devrais ajouter une illustration, permettez-moi de le mettre en termes de l'ensemble de données sur l'iris. Imaginez que j'ai les données suivantes sur une fleur. Je sais qu'il est Sepal.Length, Sepal.Width, Petal.Lengthmais pas Petal.Width. Je voudrais imputer le Petal.Widthpuis utiliser ces 4 valeurs dans un modèle RF pour prédire le Species.

rmacey
la source
Voulez-vous dire que vous n'avez rien ? Vous commencez avec seulement x & y pour construire un modèle, et maintenant vous voulez prédire y pour une observation pour laquelle vous n'avez ni x ni y. Est-ce exact?
gung - Réintégrer Monica
gung, j'ai quelque chose. J'ai une nouvelle observation x mais pas y. Je veux prédire le y sur la base du nouveau x. Mais le vecteur x a des valeurs NA que je veux imputer. Merci.
rmacey
Je vois, donc x est un ensemble de variables prédictives où vous en avez mais pas d'autres. Est-ce correct? Vous voudrez peut-être mettre à jour votre Q (qui le fera tomber sur la page principale), et vous voudrez peut-être inclure un petit exemple illustratif. Une note de prudence: ce Q ressemble à la frontière de «comment utiliser R? & / ou 'quel code m'aidera à le faire?', qui sera considéré comme programme-y & pourrait être fermé. Vous devez vous assurer qu'il s'agit bien d'une question sur les RF, et non de savoir comment faire des RF avec R.
gung - Réinstallez Monica
LOL ... quand je l'ai mis sur échange de pile ordinaire, ils ont suggéré de le déplacer ici. Il s'agit vraiment de rfImpute ou de quelque chose de similaire.
rmacey
Par «échange de pile ordinaire», voulez-vous dire débordement de pile ? Si votre question est de savoir comment utiliser le code, il y va; si c'est comment comprendre les statistiques sous-jacentes, c'est ici. (Bien sûr, il y a aussi des Q qui sont hors sujet aux deux endroits.) Je ne pense pas que votre Q soit nécessairement hors sujet ici. Je vous informe simplement de faire attention à la façon dont vous le dites, il est donc clair que c'est une question statistique, pas une question de codage.
gung - Réintégrer Monica

Réponses:

4

Je pense que vous avez besoin d'une méthode d'imputation non supervisée. C'est celui qui n'utilise pas les valeurs cibles pour l'imputation. Si vous ne disposez que de quelques vecteurs de fonction de prédiction, il peut être difficile de découvrir une structure de données. Au lieu de cela, vous pouvez mélanger vos prédictions avec des vecteurs de fonction d'apprentissage déjà imputés et utiliser cette structure pour imputer à nouveau. Notez que cette procédure peut violer les hypothèses d'indépendance, donc envelopper toute la procédure dans une validation croisée externe pour vérifier un sur-ajustement sérieux.

Je viens d'apprendre sur missForest d'un commentaire à cette question . missForest semble faire l'affaire. J'ai simulé votre problème sur les données d'iris. (sans validation croisée externe)

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
la source