web-dev-qa-db-fra.com

Comment utiliser des forêts aléatoires dans R avec des valeurs manquantes?

library(randomForest)
rf.model <- randomForest(WIN ~ ., data = learn)

Je voudrais adapter un modèle de forêt aléatoire, mais je reçois cette erreur:

Error in na.fail.default(list(WIN = c(2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L,  : 
missing values in object

J'ai le cadre de données apprendre avec 16 attributs numériques et WIN est un facteur avec les niveaux 0 1.

68
Borut Flis

Ma réaction initiale à cette question était qu’elle ne demandait pas beaucoup d’efforts de recherche, car "tout le monde" savait que les forêts aléatoires ne géraient pas les valeurs manquantes dans les prédicteurs. Mais après vérification ?randomForest Je dois avouer que cela pourrait être beaucoup plus explicite.

(Bien que le lien PDF de Breiman dans la documentation indique explicitement que les valeurs manquantes ne sont tout simplement pas gérées.

Le seul indice évident dans la documentation officielle que j'ai pu voir était que la valeur par défaut pour le na.action paramètre est na.fail, qui pourrait être trop cryptique pour les nouveaux utilisateurs.

Dans tous les cas, si vos valeurs prédites ont des valeurs manquantes, vous avez (essentiellement) deux choix:

  1. Utilisez un autre outil (rpart gère bien les valeurs manquantes.)
  2. Imputer les valeurs manquantes

Sans surprise, le paquet randomForest a une fonction pour cela, rfImpute. La documentation à ?rfImpute présente un exemple de base de son utilisation.

Si seul un petit nombre d'observations a des valeurs manquantes, vous pouvez également essayer de définir na.action = na.omit pour simplement laisser tomber ces cas.

Et bien sûr, cette réponse laisse supposer que votre problème est simplement d'avoir des valeurs manquantes.

111
joran

S'il est possible que les valeurs manquantes soient informatives, vous pouvez alors insérer des valeurs manquantes et ajouter des variables binaires supplémentaires (avec new.vars<-is.na(your_dataset)) et vérifier si l'erreur est réduite si new.var Est trop volumineux pour pouvoir être ajouté. your_dataset puis vous pouvez l’utiliser seul, choisir des variables significatives avec varImpPlot et les ajouter à your_dataset, vous pouvez également essayer d’ajouter une seule variable à your_dataset qui compte le nombre de NA de new.var <- rowSums(new.vars)

Ce n’est pas une réponse inopinée, si les variables manquantes sont informatives, une comptabilisation pour celles-ci pourrait corriger l’augmentation de l’erreur de modèle due à la seule procédure d’imputation imparfaite.

Les valeurs manquantes sont informatives, elles sont dues à des causes non aléatoires, ce qui est particulièrement courant dans les contextes d'expériences sociales.

3
Qbik

La forêt aléatoire de Breiman, sur laquelle est basé le paquetage randomForest , gère en réalité les valeurs manquantes en prédicteurs. Dans le package randomForest, vous pouvez définir

   na.action = na.roughfix

Il commencera par utiliser médiane/mode pour les valeurs manquantes, mais ensuite il développera une forêt et calculera les proximités, puis itérera et construira une forêt en utilisant ces valeurs nouvellement remplies, etc. Ceci n'est pas bien expliqué dans randomForest documentation (p10). ) . Il déclare seulement

.... Les NA sont remplacés par des médianes de colonne .... Ceci est utilisé comme point de départ pour imputer les valeurs manquantes par forêt aléatoire

Sur Breiman's page d'accueil vous trouverez un peu plus d'informations

missfill = 1,2 effectue un remplacement rapide des valeurs manquantes pour l'ensemble d'apprentissage (si égal à 1) et un remplacement plus prudent (si égal à 2).

mfixrep = k avec missfill = 2 effectue un remplacement plus lent, mais généralement plus efficace, en utilisant les proximités avec k itérations sur l'ensemble de formation uniquement. (Requiert nprox> 0).

1
Brigitte