Gdzie w przepływie pracy powinniśmy radzić sobie z brakującymi danymi?


16

Buduję przepływ pracy do tworzenia modeli uczenia maszynowego (w moim przypadku przy użyciu Pythona pandasi sklearnpakietów) z danych pobranych z bardzo dużej bazy danych (tutaj, Vertica za pomocą SQL i pyodbc), a kluczowym krokiem w tym procesie jest przypisywanie braku wartości predyktorów. Jest to proste w obrębie pojedynczej platformy analitycznej lub statystycznej - czy to Python, R, Stata itp. - Ale jestem ciekawy, gdzie najlepiej zlokalizować ten krok w wieloplatformowym przepływie pracy.

Jest to wystarczająco proste, aby zrobić to w Pythonie, z sklearn.preprocessing.Imputerklasą, przy użyciu pandas.DataFrame.fillnametody lub ręcznie (w zależności od złożoności zastosowanej metody imputacji). Ale ponieważ zamierzam używać tego do dziesiątek lub setek kolumn w setkach milionów rekordów, zastanawiam się, czy istnieje bardziej skuteczny sposób, aby zrobić to bezpośrednio za pomocą SQL przed czasem. Oprócz potencjalnej wydajności robienia tego na platformie rozproszonej, takiej jak Vertica, miałoby to dodatkową zaletę, ponieważ pozwala nam stworzyć zautomatyzowany potok do budowania „kompletnych” wersji tabel, więc nie musimy wypełniać nowego zestawu brakujących wartości od podstaw za każdym razem, gdy chcemy uruchomić model.

Nie byłem w stanie znaleźć wielu wskazówek na ten temat, ale wyobrażam sobie, że moglibyśmy:

  1. utwórz tabelę wartości zastępczych (np. średnia / mediana / tryb, ogólnie lub według grup) dla każdej niekompletnej kolumny
  2. połącz tabelę wartości zastępczych z tabelą oryginalną, aby przypisać wartość zastępczą dla każdego wiersza i niekompletnej kolumny
  3. użyj szeregu instrukcji case, aby przyjąć oryginalną wartość, jeśli jest dostępna, lub wartość zastępczą w innym przypadku

Czy jest to rozsądne rozwiązanie w Vertica / SQL, czy jest dobry powód, aby nie zawracać sobie głowy i po prostu obsługiwać go w Pythonie? A jeśli to drugie, czy istnieje silna przesłanka, aby robić to w pandach zamiast sklearn lub odwrotnie? Dzięki!

Odpowiedzi:


14

Moją zdecydowaną opinią na temat zautomatyzowanych zadań, takich jak imputacja (ale tutaj mogę również uwzględnić skalowanie, centrowanie, wybór funkcji itp.), Jest unikanie w jakikolwiek sposób takich czynności bez dokładnej kontroli danych.

Oczywiście po podjęciu decyzji o rodzaju przypisania można go zautomatyzować (przy założeniu, że nowe dane mają ten sam kształt / problemy).

Przede wszystkim podejmij mądrą decyzję. Często traciłem czas, próbując zautomatyzować te rzeczy, niszcząc moje dane. Podam kilka przykładów: - rynek zakodowany jako N / A, którego brakowało i uważałem za Amerykę Północną - liczby takie jak -999.0, ponieważ producent danych nie mógł znaleźć lepszego zamiennika dla brakujących danych - liczba taka jak 0 dla ciśnienie krwi lub temperatura ciała, zamiast brakujących danych (trudno wyobrazić sobie żywego człowieka z zerowym ciśnieniem krwi) - wiele symboli zastępczych dla brakujących danych, ponieważ dane zostały zebrane z różnych źródeł

Następnie musisz zrozumieć, jaki rodzaj przypisania lepiej przypominałby informacje z twoich danych dla danego zadania. Często jest to o wiele trudniejsze, niż się wydaje.

Po tych wszystkich rzeczach radzę odłożyć zadanie przypisania do wyższej warstwy, gdzie masz narzędzia do odtwarzania nowych danych i sprawdzania, czy założenia dotyczące nowych danych nie są naruszone (jeśli to możliwe).


1
Automatyzacja +1 niekoniecznie poprawia sytuację, tylko bardziej konsekwentnie i często szybciej!
James

4

Therriault, bardzo się cieszę, że używasz Vertica! Pełne ujawnienie, jestem tam głównym specjalistą ds. Danych :). Przepływ pracy, który opisujesz, jest dokładnie tym, z czym spotykam się dość często i jestem prawdziwym zwolennikiem wstępnego przetwarzania tych bardzo dużych zbiorów danych w bazie danych, zanim zacznie działać pyODBC i pandy. Sugeruję utworzenie widoku lub tabeli za pomocą zapytania opartego na plikach, aby zapewnić powtarzalną pracę. Powodzenia

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.