Wo im Workflow sollten wir mit fehlenden Daten umgehen?

16

Ich erstelle einen Workflow zum Erstellen von Modellen für maschinelles Lernen (in meinem Fall mit Python pandasund sklearnPaketen) aus Daten, die aus einer sehr großen Datenbank (hier Vertica über SQL und pyodbc) abgerufen wurden , und ein wichtiger Schritt in diesem Prozess besteht darin, fehlende Daten zu unterstellen Werte der Prädiktoren. Dies ist innerhalb einer einzelnen Analyse- oder Statistikplattform unkompliziert - sei es Python, R, Stata usw. -, aber ich bin gespannt, wo Sie diesen Schritt in einem plattformübergreifenden Workflow am besten finden.

Es ist einfach genug, dies in Python entweder mit der sklearn.preprocessing.ImputerKlasse, mit der pandas.DataFrame.fillnaMethode oder von Hand zu tun (abhängig von der Komplexität der verwendeten Imputationsmethode). Da ich dies jedoch für Dutzende oder Hunderte von Spalten in Hunderten von Millionen von Datensätzen verwenden werde, frage ich mich, ob es eine effizientere Möglichkeit gibt, dies im Voraus direkt über SQL zu tun. Abgesehen von der potenziellen Effizienz einer verteilten Plattform wie Vertica hätte dies den zusätzlichen Vorteil, dass wir eine automatisierte Pipeline zum Erstellen "vollständiger" Versionen von Tabellen erstellen können, sodass wir keinen neuen Satz ausfüllen müssen von Grund auf fehlende Werte jedes Mal, wenn wir ein Modell ausführen möchten.

Ich habe nicht viel Anleitung dazu finden können, aber ich stelle mir vor, dass wir:

  1. Erstellen Sie für jede unvollständige Spalte eine Tabelle mit Ersatzwerten (z. B. Mittelwert / Median / Modus, entweder insgesamt oder nach Gruppe)
  2. Verbinden Sie die Ersatzwerttabelle mit der Originaltabelle, um einen Ersatzwert für jede Zeile und unvollständige Spalte zuzuweisen
  3. Verwenden Sie eine Reihe von case-Anweisungen, um den ursprünglichen Wert (sofern verfügbar) und den Ersatzwert (sofern nicht anders angegeben) zu verwenden

Ist dies in Vertica / SQL eine vernünftige Sache, oder gibt es einen guten Grund, sich nicht darum zu kümmern und stattdessen nur in Python damit umzugehen? Und wenn letzteres der Fall ist, gibt es ein starkes Argument dafür, dies eher bei Pandas als bei Sklearn oder umgekehrt zu tun? Vielen Dank!

Therriault
quelle

Antworten:

14

Ich bin der festen Überzeugung, dass automatisierte Aufgaben wie die Imputation (hier kann ich aber auch Skalierung, Zentrierung, Featureauswahl usw. einbeziehen) in keiner Weise dazu führen sollten, dass Ihre Daten nicht sorgfältig überprüft werden.

Nach der Entscheidung, welche Art von Imputation angewendet werden soll, kann sie natürlich automatisiert werden (unter der Annahme, dass die neuen Daten dieselbe Form / dieselben Probleme haben).

Treffen Sie also vor allem eine kluge Entscheidung. Ich habe oft Zeit verschwendet, um diese Dinge zu automatisieren und meine Daten zu zerstören. Ich gebe Ihnen einige Beispiele: - Ein Markt, der als N / A codiert ist, den ich übersehen habe und der als Nordamerika eingestuft wurde - Zahlen wie -999.0, weil der Datenproduzent keinen besseren Ersatz für fehlende Daten finden konnte - Zahlen wie 0 für Blutdruck oder Körpertemperatur anstelle fehlender Daten (ein lebender Mensch mit 0 Blutdruck ist kaum vorstellbar) - mehrere Platzhalter für fehlende Daten, da die Daten aus verschiedenen Quellen stammen

Danach müssen Sie verstehen, welche Art von Imputation den Informationen aus Ihren Daten für eine bestimmte Aufgabe besser ähneln würde. Dies ist oft viel schwieriger, als es scheint.

Nach all diesen Dingen rate ich Ihnen, Ihre Imputationsaufgabe auf eine höhere Ebene zu verschieben, auf der Sie Tools zum Reproduzieren neuer Daten haben und zu prüfen, ob die Annahmen für die neuen Daten nicht verletzt werden (sofern dies möglich ist).

rapaio
quelle
1
+1 Automatisierung macht die Dinge nicht unbedingt besser, nur konsequenter und oft schneller!
James
4

Therriault, wirklich froh zu hören, dass Sie Vertica verwenden! Vollständige Offenlegung, ich bin der Chefdatenwissenschaftler dort :). Der von Ihnen beschriebene Workflow ist genau das, was mir recht häufig begegnet, und ich bin fest davon überzeugt, dass ich diese sehr großen Datensätze in der Datenbank vor der Arbeit mit pyODBC und Pandas verarbeiten muss. Ich würde vorschlagen, eine Ansicht oder Tabelle über eine dateibasierte Abfrage zu erstellen, um eine reproduzierbare Arbeit zu gewährleisten. Viel Glück

Will Cairns
quelle