Buduję przepływ pracy do tworzenia modeli uczenia maszynowego (w moim przypadku przy użyciu Pythona pandas
i sklearn
pakietó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.Imputer
klasą, przy użyciu pandas.DataFrame.fillna
metody 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:
- utwórz tabelę wartości zastępczych (np. średnia / mediana / tryb, ogólnie lub według grup) dla każdej niekompletnej kolumny
- połącz tabelę wartości zastępczych z tabelą oryginalną, aby przypisać wartość zastępczą dla każdego wiersza i niekompletnej kolumny
- 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!
źródło
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
źródło