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!