R caret et NAs

26

Je préfère de beaucoup le caret pour sa capacité de réglage des paramètres et son interface uniforme, mais j'ai observé qu'il nécessite toujours des ensembles de données complets (c'est-à-dire sans NA) même si le modèle "nu" appliqué autorise les NA. C'est très gênant, car il faut appliquer des méthodes d'imputation laborieuses, qui ne sont pas nécessaires en premier lieu. Comment pourrait-on éluder l'imputation tout en utilisant les avantages du caret?

Fredrik
la source
3
Vous devez toujours faire quelque chose avec des valeurs manquantes. Je dois dire que je ne comprends pas vraiment votre question - vous cherchez une approche universelle ...? Si vous ne voulez pas imputer les NA, que voulez-vous en faire? Supprimer?
Tim
1
Je veux laisser les NA là-bas et laisser au modèle le soin de faire face aux NA. Si je le fais avec une fonction C5.0 dans C50, par exemple, il pourrait faire face aux NA lui-même, mais dans ce cas, je ne peux pas utiliser caret, car la fonction trainet de caret n'autorise aucune NA dans les jeux de données même lorsque je veux utiliser le C5. 0 fonction de C50 mentionnée ci-dessus.
Fredrik
3
Mais ce que fait le «modèle», c'est qu'il ignore (supprime) ces données, vous laissant un échantillon plus petit; il estime (impute) ces valeurs; ou il prédit la catégorie "NA" (par exemple dans certains modèles arborescents). Que voulez-vous que votre "modèle" fasse d'autre? Certains logiciels font ces choses automatiquement pour vous, mais imaginez que votre machine à café vous a donné le café "par défaut" ... Certains logiciels font le "café par défaut" des NA, mais ce n'est pas le meilleur que vous puissiez obtenir.
Tim
3
Êtes-vous sûr que le signe d'insertion n'autorise pas les NA? J'ai essayé d'introduire NA avec l'exemple par défaut dans la page d'aide du train et avec la méthode C5.0, le train a très bien fonctionné. Il a échoué avec une forêt aléatoire.
mpiktas

Réponses:

32

Pour la fonction train dans caret, vous pouvez passer le paramètre na.action = na.pass, et pas de prétraitement (ne spécifiez pas preProcess, laissez-le comme valeur par défaut NULL). Cela transmettra les valeurs NA non modifiées directement à la fonction de prédiction (cela entraînera l'échec des fonctions de prédiction qui ne prennent pas en charge les valeurs manquantes, pour celles dont vous auriez besoin de spécifier preProcess pour imputer les valeurs manquantes avant d'appeler la fonction de prédiction). Par exemple:

train(formula,
      dataset,
      method = "C5.0",
      na.action = na.pass)

Dans ce cas, C5.0 gérera lui-même les valeurs manquantes.

Stan Hatko
la source
1
Ceci est une discussion intéressante. Quel serait le piège d'ajouter NA comme autre niveau à un prédicteur catégorique? Si les AN ne peuvent pas être modélisés ou imputés, c'est-à-dire que la présence d'une absence est réellement informative, il semblerait que simplement faire de NA un niveau supplémentaire soit logique?
Seanosapien
Si l'on utilise la spécification x, y pour trainque l' na.action = na.passoption soit définie, l'erreur suivante se Something is wrong; all the RMSE metric values are missing
produira
3

Avez-vous essayé de recoder les NA? Quelque chose> 3 écarts-types en dehors de vos données (par exemple -12345) devraient encourager C5.0 à les prévoir séparément, comme c'est le cas avec les NA.

psychonomie
la source
2

Je pense que votre solution serait d'imputer les valeurs tout en utilisant la fonction Predict () .

Voir ?predict.trainpour plus de détails.

Vous pouvez utiliser na.omitpour permettre au curseur d'inscrire des valeurs. Par exemple:

    ## S3 method for class 'train':
    predict((object, newdata = NULL, type = "raw", na.action = na.omit, ...)

depuis http://www.inside-r.org/packages/cran/caret/docs/predict.train

Une autre solution consisterait à imputer lors du prétraitement des données:

    ## S3 method for class 'default':
    preProcess(x, 
       method = "knnImpute",   # or *bagImpute* / *medianImpute*
       pcaComp = 10,
       na.remove = TRUE,
       k = 5,
       knnSummary = mean,
       outcome = NULL,
       fudge = .2,
       numUnique = 3,
       verbose = TRUE,
       )

depuis http://www.inside-r.org/node/86978

Kristijan
la source