Je crée un flux de travail pour créer des modèles d'apprentissage automatique (dans mon cas, en utilisant Python pandas
et des sklearn
packages) à 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.Imputer
classe, en utilisant la pandas.DataFrame.fillna
mé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:
- créer un tableau de valeurs de substitution (p. ex. moyenne / médiane / mode, global ou par groupe) pour chaque colonne incomplète
- joindre la table des valeurs de substitution à la table d'origine pour attribuer une valeur de remplacement à chaque ligne et colonne incomplète
- 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!
la source
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
la source