Auto_ml, czyli kolejny moduł do automatyzacji uczenia maszynowego

Jeżeli zastanowimy się nad procesem uczenia maszynowego, to zauważymy, że spora jego część powtarza się. Na przykład może to być wybieranie hiperparametrów albo testowanie różnych funkcji modelujących. Fakt, całości nie możemy za bardzo zautomatyzować, ale wspomniane elementy nadają się do tego całkiem dobrze. Szczególnie że często jest to cykl – zmiana, uruchomienie, czekanie kilka minut (godzin?), sprawdzenie wyników, zmiana i tak dalej. No i właśnie w tym miejscu na arenę wchodzą automaty wspomagające uczenie maszynowe.

Jakiś czas temu pisałem o module tpot. Jest to pierwszy tego typu automat szukający „optymalnego” modelu. Optymalnego w cudzysłowie, bo nie mamy żadnej gwarancji, że taki będzie. Wiemy tylko, że znajdziemy jakiś model, który okazał się najlepszy w czasie, który poświęciliśmy na jego poszukiwanie. Ale często to wystarczy. Wspomniany tpot to nie jedyny tego typu moduł Pythonowy.

auto_ml

Korzystanie z auto_ml przypomina korzystanie z tpot. Importujemy funkcję, która będzie odpowiedzialna za stworzenie optymalnego procesu. W tym wypadku będzie to funkcja Predictor. Gdy już ją mamy, przekazujemy jej informacje o naszej ramce danych. Najważniejsze jest wskazanie, która kolumna jest naszym celem do wyznaczenia. Używamy do tego parametru column_descriptions. Podajemy tam słownik, w którym kluczem jest nazwa kolumny, a wartością odpowiedni typ rozumiany przez auto_ml. Dodatkowo musimy jeszcze podać typ naszego problemu. Jeśli będzie to klasyfikacja to classifier, a jeśli regresja to regressor. Informację tę przekazujemy za pomocą parametru type_of_estimator. Po zdefiniowaniu naszego zadania w formie obiektu uruchamiamy metodę train na zbiorze treningowym. I to byłoby w zasadzie tyle.

Jakich funkcji używa auto_ml?

Auto_ml domyślnie korzysta z funkcji GradientBoostingClassifier i GradientBoostingRegressor, które są dostępne w module Scikit-Learn. Nie są to, może najlepsze funkcje tego typu, ale są najłatwiej dostępne, z racje tego, że Scikit-Learn to najpopularniejszy i najlepiej sprawdzony (łącznie z instalacją) moduł z funkcjami uczenia maszynowego. Praktyczność wygrała.

Nie jest to jednak jedna dostępna funkcja ze Scikit-Learn. Mamy również dostępne ARDRegression, AdaBoostClassifier, AdaBoostRegressor, BayesianRidge, ElasticNet, ExtraTreesClassifier, ExtraTreesRegressor, Lasso, LassoLars, LinearRegression, LogisticRegression, MiniBatchKMeans, OrthogonalMatchingPursuit, PassiveAggressiveClassifier, PassiveAggressiveRegressor, Perceptron, RANSACRegressor, RandomForestClassifier, RandomForestRegressor, Ridge, RidgeClassifier, SGDClassifier, SGDRegressor. Czyli jest z czego wybierać.

Słabo by jednak było, gdybyśmy mieli tutaj dostępne tylko funkcje z Scikit-Learn. Nie jest tak jednak. Twórcy tego modułu zdecydowali się na rozszerzenie dostępnych funkcji o bardzo popularny moduł XGBoost. Nie było to pewnie zbyt skomplikowane, bo XGBoost wystawia API spójne ze Scikit-Learn, używamy wiec go poprzez funkcje XGBRegressor i XGBClassifier.

Oprócz XGBoost możemy też użyć (chyba) jego największego konkurenta, czyli LightGBM. Dostępny jest przez funkcje LGBMClassifier i LGBMRegressor.

Najciekawszą opcją jest zaprzęgnięcie modułów Keras i TensorFlow do wytrenowania sieci neuronowej do dokonania klasyfikacji lub regresji. Jeżeli mamy wspomniane moduły w naszym środowisku wirtualnym, to możemy użyć DeepLearningClassifier lub DeepLearningRegressor do rozwiązania naszego problemu. Auto_ml stworzy nam wtedy sieć neuronową i ją odpowiednio wytrenuje.

Wszystkie te funkcje możemy przekazywać w liście jako wartość dla parametru model_names w metodzie train. Sami więc zadecydujemy, jak dużo funkcji chcemy sprawdzić. Jak to będzie wyglądać w postaci kodu?

</pre>

from auto_ml import Predictor

column_descriptions = {
  'fare_amount': 'output'
}

ml_predictor = Predictor(type_of_estimator='regressor', column_descriptions=column_descriptions)

ml_predictor.train(train, model_names=["LGBMRegressor", "XGBRegressor", "DeepLearningRegressor",
                                       "GradientBoostingRegressor"])

Jak widać, nie jest to nic specjalnie skomplikowanego.

Problemy z auto_ml

Głównym problemem z auto_ml jest mizerna dokumentacja. Nie jesteśmy w stanie dowiedzieć się z niej jakie parametry są przekazywane do każdej z funkcji, jakie są kryteria stopu oraz jaka sieć neuronowa jest tworzona. Oczywiście, możemy się dogrzebać do tego wszystkiego w kodzie źródłowym, ale nie tak to powinno wyglądać. Z tego powodu ja na przykład nie odważyłbym się użyć tego narzędzia do czegoś niż wyznaczenia benchmarku dla mojego problemu.

Drugim zasadniczym problemem jest stagnacja projektu. Ostatni zgłoszony problem został zamknięty w lutym 2018, a w tej chwili mamy październik 2018. W trakcie pobieżnego ich przeglądania natrafiłem na kilka błędów, które wyglądały na poważne i z którymi nic się aktualnie nie dzieje. Nie wygląda to więc na coraz lepiej rozwijany projekt niestety.

Pozytywne strony auto_ml

Jedną z najlepszych cech auto_ml jest możliwość łatwego zapisania i wczytania wytrenowanego modelu. Tpot dla porównania wciąż nie ma takiej funkcji. A to akurat jest według mnie bardzo fajna sprawa. W auto_ml jest to zorganizowane w bardzo prosty sposób:

 
ml_predictor.save(file_name = "../output/trained_model.dill")

from auto_ml.utils_models import load_ml_model
trained_model = load_ml_model(file_name = "../output/trained_model.dill")

Drugim całkiem przydatnym produktem auto_ml są informacje wyświetlane na ekranie. Po trenowaniu dostaniemy informację o przydatności poszczególnych kolumn. A gdy mamy już wytrenowany model, możemy też sobie wyświetlić raport zawierający różne metryki score:

 
ml_predictor.score(test, test.fare_amount)

Moja opinia na temat auto_ml

Czy używanie auto_ml ma sens? Według mnie, w tej chwili możemy potraktować moduł auto_ml jako bardzo ciekawą zabawkę. Z racji słabej dokumentacji, potencjalnych krytycznych błędów i stagnacji w rozwoju bałbym się wejść z tym na produkcję. Z kolei, jeśli zaczynamy dopiero pracę z danymi w projekcie, uruchomienie auto_ml z różnymi funkcjami modelującymi może dać nam całkiem ciekawe informacje i pokazać gdzie jest umieszczona najniższa poprzeczka, którą będziemy próbować przeskoczyć.

Osobiście, jeśli chciałbym postawić na któreś z tych dwóch narzędzi: tpot i auto_ml to stawiałbym na tpot. Faktem jest, że jest prostszy i nie wykorzystuje sieci neuronowych, ale zdecydowanie robi lepiej to, do czego został stworzony. Nie oznacza to, że auto_ml jest projektem spalonym. Wręcz przeciwnie, mam wrażenie, że ma o wiele większy potencjał niż tpot. Pytanie tylko, czy kiedykolwiek ten potencjał zostanie dobrze wykorzystany.

Początkowo chciałem porównać modele, które zostaną zaproponowane przez obydwa narzędzia po określonym czasie pracy. Jednakże braki w dokumentacji auto_ml zepsuły mi możliwość szybkiego eksperymentu. W każdym razie mam nadzieję, że jak powrócę np. za rok do tego zagadnienia, to będę miał możliwość dokładniejszego ich porównania.

Pełny kod użyty w tym artykule znajduje się tutaj.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *