Gdy zaczynamy przygodę z uczeniem maszynowym w Pythonie, możemy się poczuć trochę zagubieni. Zastanawiamy się, czy mamy tworzyć nasze rozwiązania wykorzystując tylko i wyłącznie własny kod. A może skorzystać z istniejących już modułów? Szukać jakichś nowinek, które będą implementować nowe i ciekawe pomysły, czy opierać się o przetestowane „starocie”, które mają trochę starych standardów, ale na pewno negatywnie nie zaskoczą? Czy będę potrzebował dobrego wsparcia społeczności i dokumentacji, czy może wystarczy mi nurzanie się w kodzie źródłowym? Odpowiedzi są różne jak zwykle zresztą przy wyborze narzędzi w każdym nowo startującym projekcie. Jednakże jeśli chodzi o moje preferencje, w większości wypadków przewija się tam Scikit-Learn. Jak zresztą widać to też po treści bloga. Dlaczego akurat ten moduł wpadł mi tak bardzo w oko? Przygotowałem kilka argumentów przemawiających za jego użyciem. Spójrzmy więc, o co chodzi.
Jest darmowy
Jednym z kluczowych argumentów za używaniem Scikit-Learn i Pythona w ogóle jest jego efektywność finansowa. Język ten i moduły są po prostu darmowe. Oprócz bycia darmowym moduł Scikit-Learn jest wydany na licencji New BSD License, co pozwala go również używać w oprogramowaniu z zamkniętym kodem źródłowym. Nie musimy więc kupować żadnej licencji i nie tracimy potencjalnie żadnej przewagi technologicznej, jeśli taką na jego bazie wytworzymy.
Jest szybki
Tajemnicą poliszynela jest to, że Python jest dość powolnym językiem programowania. Nie odczujemy tego w prostych programach, jednakże jeśli przyjdzie nam dokonywać milionów operacji arytmetycznych, to możemy się rozczarować. Jednakże problem ten udało się rozwiązać, stosując „wstawki” napisane w C/C++ i Cythonie. Chodzi o to, że wnętrze tego modułu (jak i modułów, z których korzysta, czyli SciPy i NumPy) jest napisane w językach, które są „szybkie”. Szybkość ta wynika między innymi z tego, że te kluczowe elementy są już skompilowane wcześniej, a nie interpretowane „na żywo” jak z Pythonem bywa. Fakt, utrudnia to nieco rozwój tego projektu, bo trzeba się nauczyć innego języka programowania. Ale z drugiej strony, jeśli nie zamierzamy rozwijać tych modułów, to spokojnie możemy je sobie używać po Pythonowemu i nie przejmować się ich wnętrznościami.
Jest już dojrzały
Czasami każdego z nas kusi używanie oprogramowania, które implementuje jakąś nowinkę. Czy to jakiś pomysł żywcem wzięty z publikacji, czy to jakąś nową technologię, która pojawiła się w branży. Często jednak takie oprogramowanie, po początkowym zaangażowaniu twórców, zostaje porzucone i zaczyna tworzyć dług technologiczny. Nikt nie odnosi się w żaden sposób do zauważonych błędów, moduł przestaje być kompatybilny z innymi najnowszymi modułami, a jego rozbudowa staje pod znakiem zapytania. Wtedy taki moduł staje się coraz większym ciężarem i może stworzyć potrzebę zastąpienia go czymś innym. Scikit-Learn jest daleki od takiej sytuacji. Moduł ten powstał w roku 2007 i do momentu napisania tego artykułu (rok 2019) jest rozwijany. Cały czas do kodu dokładane są nowe funkcjonalności, testy, błędy są naprawiane, a całość jest jeszcze dodatkowo optymalizowana.
Jest potężny
Jeżeli przejrzymy sobie dokumentację Scikit-Learn, zauważymy, że oferuje on zaskakująco dużo funkcjonalności związanej z uczeniem maszynowym. Część związana z uczeniem nadzorowanym to zaimplementowane algorytmy z 17 kategorii. Uczenie nienadzorowane reprezentowane jest przez funkcje z 9 kategorii. Mamy tutaj jeszcze gotowe funkcje pomagające w ewaluacji modeli i transformacji danych. Myślę, że nie powinniśmy też zapominać o wbudowanych zbiorach danych i funkcjach pozwalających je generować. Scikit-Learn jest więc prawdziwym „szwajcarskim scyzorykiem”, jeśli chodzi o możliwości.
Jest jednorodny
Powyższa potęga nie miałaby jednak zbytniego sensu, jeśli wszystkie te funkcje byłyby rozwijanie przypadkowo i bez całościowej wizji. W Scikit-Learn udało się jednak uniknąć tej przypadkowości. Dostajemy więc narzędzie, które jest potężne i jednocześnie łatwe w użyciu. Funkcje modelujące wywoływane są według jednego standardu, możemy więc od razu zacząć korzystać z prawie wszystkich z nich. Wszystkie inne funkcje pomocnicze też cechują się taką samą logiką uruchamiania, przekazywania parametrów i przekazywania wyników. Dzięki temu, jeśli już raz pokonamy techniczny próg wejścia, to trafiamy do Edenu, gdzie swobodnie korzystamy z tego, co może być nam akurat potrzebne. Wbrew pozorom, nie zawsze jest tak różowo w programowaniu.
Jest dość uniwersalny
Wiemy już, że Scikit-Learn daje nam całą masę funkcji pozwalających używać uczenia maszynowego w naszych projektach. Jak bardzo jednak pokrywa przestrzeń możliwych do zobaczenia zagadnień związanych z uczeniem maszynowym? Nie znalazłem takiego spisu, wiem natomiast gdzie ten moduł, nie będzie pierwszym wyborem. Są to sieci neuronowe, przetwarzanie obrazów i dźwięku oraz praca z tekstem. Przy tych zagadnieniach w Pythonie, odnajdziemy moduły, które sobie lepiej z nimi poradzą (np. PyTorch i SpaCy). Co jest jednak ciekawe, Scikit-Learn posiada również funkcje związane z tymi tematami. Nie są one jednak dalej za mocno rozwijane, bo „konkurencja” poczyniła już znaczne postępy i bez sensu byłoby wynajdować koło na nowo. Nie jest też niczym zaskakującym używanie Scikit-Learn obok wspomnianych powyżej modułów – Scikit-Learn jest wtedy używany do transformacji i tym podobnych działań, a „mięso” już jest mielone przez inne moduły. Jest więc podstawą w wielu miejscach i całkiem sensowną pomocą w innych.
Jest najpopularniejszy
Według analizy Top 8 Python Machine Learning Libraries z końcówki 2018 roku, Scikit-Learn jest najpopularniejszym modułem Pythonowym w uczeniu maszynowym. Jeśli więc zamierzasz zajmować się właśnie tymi zagadnieniami przy pomocy tego języka programowania, będzie to dla Ciebie narzędzie, które będziesz musiał poznać. Na jakim poziomie to już będzie zależeć od Twoich potrzeb, na pewno jednak będzie się przewijać i nie zniknie za szybko (jeśli w ogóle) z tego ekosystemu. Jeśli więc zainwestujesz czas, żeby się wgryźć, od razu znajdziesz wspólny język z innymi osobami pracującymi w tych technologiach.
Warto więc?!
Koń, jaki jest, każdy widzi. Mam nadzieję, że mój esej przybliżył Cię nieco do podobnego odczucia dla Scikit-Learn. Oczywiście, pewne argumenty w niektórych specyficznych okolicznościach mogą okazać się zupełnie nietrafione (np. uczenie maszynowe w systemach wbudowanych). Jednakże jeśli któregoś luźniejszego wieczoru będziesz mieć dylemat pokroju „Co by tu fajnego nowego się nauczyć?” to Scikit-Learn jest dobrym kandydatem. No i wiesz już, dlaczego ja tak często pokazuję jakieś zagadnienia, bazując na tym module właśnie. Wpadnij więc na mój blog w przyszłości (albo najlepiej go subskrybuj przez formularz poniżej), jeśli ciekaw jesteś kolejnych przykładów użycia Scikit-Learn.
To wszystko jest zawsze do bani. nauczę w pythonie coś i ciezko to potem przeniesc do programu w C
generalnie to zabawki zupełnie nieprzydatne w prawdziwym zyciu, nawet w kołko i krzyzyk ciezko zagrac bo trzeba poswiecic lata na przeniesienie tego do C.
Hej!
Zgadza się, nie wszystkie biblioteki są kompatybilne z różnymi językami programowania. Jednakże chodzi tutaj o coś innego. Scikit-Learn może być z powodzeniem używany do analizy danych, wizualizacji i konstrukcji modelu. Natomiast wyniki, które w ten sposób się uzyskuje, mogą już być używane nawet w systemach wbudowanych. Dla przykładu, bazując na danych z kolumnami niezależnymi i zależnymi, możemy wytrenować drzewo decyzyjne. W zależności od ilości danych i docelowej złożoności takie drzewo może się długo konstruować nawet na całkiem mocnych komputerach. Ale gdy już jest wytrenowane, to jest to po prostu zbiór instrukcji if/else. A takie instrukcje można z powodzeniem zakodować nawet w asemblerze na mikrokontrolerze. Nie wyznaczymy ich jednak wygodnie i efektywnie z poziomu tego mikrokontrolera 😉