Où dans le flux de travail devons-nous traiter les données manquantes?


16

Je crée un flux de travail pour créer des modèles d'apprentissage automatique (dans mon cas, en utilisant Python pandaset des sklearnpackages) à partir de données extraites d'une très grande base de données (ici, Vertica via SQL et pyodbc), et une étape critique de ce processus consiste à imputer les données manquantes valeurs des prédicteurs. C'est simple dans une seule plateforme d'analyse ou de statistiques --- que ce soit Python, R, Stata, etc. - mais je suis curieux de savoir où localiser cette étape dans un flux de travail multi-plateforme.

C'est assez simple de le faire en Python, soit avec la sklearn.preprocessing.Imputerclasse, en utilisant la pandas.DataFrame.fillnaméthode, soit à la main (selon la complexité de la méthode d'imputation utilisée). Mais comme je vais l'utiliser pour des dizaines ou des centaines de colonnes sur des centaines de millions d'enregistrements, je me demande s'il existe un moyen plus efficace de le faire directement via SQL à l'avance. Mis à part l'efficacité potentielle de le faire dans une plate-forme distribuée comme Vertica, cela aurait l'avantage supplémentaire de nous permettre de créer un pipeline automatisé pour la création de versions "complètes" de tableaux, nous n'avons donc pas besoin de remplir un nouvel ensemble des valeurs manquantes à partir de zéro chaque fois que nous voulons exécuter un modèle.

Je n'ai pas pu trouver beaucoup de conseils à ce sujet, mais j'imagine que nous pourrions:

  1. créer un tableau de valeurs de substitution (p. ex. moyenne / médiane / mode, global ou par groupe) pour chaque colonne incomplète
  2. joindre la table des valeurs de substitution à la table d'origine pour attribuer une valeur de remplacement à chaque ligne et colonne incomplète
  3. utiliser une série d'instructions de cas pour prendre la valeur d'origine si disponible et la valeur de substitution sinon

Est-ce une chose raisonnable à faire dans Vertica / SQL, ou y a-t-il une bonne raison de ne pas s'embêter et de simplement le gérer en Python à la place? Et si ce dernier est, y a-t-il un argument solide pour faire cela dans les pandas plutôt que dans sklearn ou vice-versa? Merci!

Réponses:


14

Ma forte opinion concernant les tâches automatisées comme l'imputation (mais, ici, je peux également inclure la mise à l'échelle, le centrage, la sélection de fonctionnalités, etc.) est d'éviter en aucune façon de faire de telles choses sans inspecter soigneusement vos données.

Bien sûr, après avoir décidé quel type d'imputation appliquer, il peut être automatisé (en supposant que les nouvelles données ont la même forme / les mêmes problèmes).

Alors, avant toute chose, prenez une sage décision. J'ai souvent perdu du temps à essayer d'automatiser ces choses, détruisant mes données. Je vais vous donner quelques exemples: - un marché codé N / A, que j'ai manqué et considéré comme étant du Nord / Amérique - des chiffres comme -999,0, parce que le producteur de données n'a pas pu trouver un meilleur remplacement pour les données manquantes - un nombre comme 0 pour pression artérielle ou température corporelle, au lieu de données manquantes (il est difficile d'imaginer un être humain vivant avec 0 tension artérielle) - plusieurs espaces réservés pour les données manquantes, car les données ont été collectées à partir de diverses sources

Après cela, vous devez comprendre quel type d'imputation ressemblerait mieux aux informations de vos données pour une tâche donnée. C'est souvent beaucoup plus difficile à faire correctement qu'il n'y paraît.

Après toutes ces choses, mon conseil est de reporter votre tâche d'imputation à une couche supérieure où vous avez des outils pour reproduire sur de nouvelles données et pour vérifier si les hypothèses pour les nouvelles données ne sont pas violées (si c'est possible).


1
L'automatisation +1 n'améliore pas nécessairement les choses, mais de manière plus cohérente et souvent plus rapide!
James

4

Therriault, vraiment heureux d'apprendre que vous utilisez Vertica! Divulgation complète, je suis le responsable des données là-bas :). Le flux de travail que vous décrivez est exactement ce que je rencontre assez fréquemment et je suis un fervent partisan du prétraitement de ces très grands ensembles de données dans la base de données avant tout travail pyODBC et pandas. Je suggère de créer une vue ou une table via une requête basée sur un fichier juste pour assurer un travail reproductible. Bonne chance

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.