#58

Patryk Palej - Nie tylko eksperymenty - co jeszcze Data Scientist powinien umieć?

W nowym odcinku podcastu Stacji.IT rozmawiamy o Data Science, skupimy się na kompetencjach, które każdy Data Scientist powinien posiadać. Gościem odcinka jest Patryk Palej - Data Scientist i trener IT.

Streszczenie odcinka

Podczas naszej dyskusji poruszamy następujące tematy:
Jakie są podstawowe umiejętności związane z rolą Data Science?
Czy Data Scientist to też programista?
Jaki zakres wiedzy programistycznej jest według Ciebie istotny dla osoby zajmującej się analizą danych?
Do eksperymentów potrzebne są dane. Jak można je pozyskać? Jakie są możliwe źródła danych? Jak tutaj przydają się umiejętności programistyczne?
Jakie są aspekty prawne i etyczne, na jakie trzeba zwrócić uwagę przy pozyskiwaniu danych?
Co trzeba zrobić z danymi, zanim da się je analizować?
Gdzie przechowywać pobrane i przetworzone dane?
Do czego może nam się przydać API?
Kiedy warto samodzielnie tworzyć API?
Jak wizualizować dane i wyniki eksperymentów?
Jak dużo musimy wiedzieć o technologiach frontendowych?
Jak właściwie komunikować wyniki analiz i wnioski z badań?
Rozwój zawodowy: Jakie są najważniejsze trendy i dziedziny w Data Science, które warto zgłębiać, by utrzymać konkurencyjność na rynku pracy?

Transkrypcja odcinka

Cześć, z tej strony Łukasz Kobyliński, witam was w kolejnym odcinku podcastu Stacja IT. Dzisiaj rozmawiamy kolejny raz o Data Science, tym razem o roli tutaj właśnie specjalisty w zakresie Data Science. Co taka osoba musi umieć, czy to jest tylko modelowanie danych, czy to jest tylko statystyka, czy też jakieś kwestie związane z programowaniem i w okolicach.

A z nami jest właśnie programista Python i specjalista od Data Science, Patryk Palej. Cześć Patryk. Cześć.

Mimo mi, że znalazłeś czas na rozmowę z nami. No tutaj mniej więcej nakreśliłem, o czym moglibyśmy dzisiaj porozmawiać. Może w tym kontekście właśnie powiedz jeszcze parę słów o sobie, czym się zajmujesz i co jest twoją specjalnością.

Jasne. Ja jestem programistą Pythona, tak mógłbym najkrócej się opisać i specjalizuję się w obszarach związanych z szeroko pojętą analizą danych, trochę uczenia maszynowego, trochę integracji tego wszystkiego z narzędziami opartymi o sztuczną inteligencję. No i tym się zajmuję tak mniej więcej na pół etatu, a drugie pół etatu prowadzę szkolenia.

Super. Może zacznijmy od tego, żeby zdefiniować te takie podstawowe umiejętności związane z data science, tak, no bo chcemy to rozszerzyć, znaczy powiedzieć, co jeszcze taki data scientist powinien umieć oprócz tych core’owych umiejętności, no ale właśnie co jest tą podstawą według ciebie, czy jakby z czego korzystasz najczęściej, czy co uważasz jakby w twojej też drodze edukacyjnej było najważniejsze, żeby tę podstawową rolę właśnie data scientista tutaj realizować.

Myślę, że kluczową rzeczą, jeśli chodzi o pracę jako data scientist jest generalnie umysł analityczny, to znaczy jakaś pewnego rodzaju pasja do liczb, umiejętność ich przetwarzania, rozumienia, no ale też jakieś podstawy programowania, przynajmniej podstawy, może nawet więcej należałoby umieć, dlatego że data scientist to jest ktoś taki, kto łączy z jednej strony elementy matematyki, analizy danych, czyli te wszystkie kwestie numeryczne, nazwijmy to, z programowaniem, z pisaniem kodu. Oczywiście można być data scientistem i kodu nie pisać, są różne narzędzia, które umożliwiają to, natomiast jednak taki klasyczny, typowy data scientist raczej ten kod będzie pisał i będzie łączył z jednej strony kwestie analityczne, ale z drugiej strony też programowanie.

No tak, mówisz o tej kwestii, że to programowanie jest potrzebne, ale też jest coraz więcej takich narzędzi no-code’owych czy low-code’owych, to też jest jakaś taka przestrzeń dla osób, które mają taki background bardziej analityczny czy statystyczny, że jeszcze nie wchodząc w programowanie, można wykorzystać te umiejętności, żeby dane analizować. Jakie jest twoje zdanie na temat tych narzędzi, czy według ciebie one są bardzo ograniczające, czy rzeczywiście można z ich pomocą sporo zrobić?

Tak, zdecydowanie można sporo zrobić. Ja osobiście nie przepadam za tego typu narzędziami, ja wolę pisać kod, natomiast prowadzę też zajęcia na studiach podyplomowych, gdzie mam styczność ze studentami, którzy albo pracują jako data scientist, albo chcą pracować, albo też jako analitycy różnego rodzaju, no i tam oni bardzo często właśnie w swojej pracy codziennej korzystają z narzędzi takich jak Tableau, jak Power BI, nawet Excel może być użyty w takim czy innym stopniu do analizy danych, jednak te podstawy przynajmniej z programowania, z umiejętności pisania kodu to jest coś, co na pewno bardzo się przydaje, bo daje nam dużo większą kontrolę nad tym, co się dzieje i nie jesteśmy ograniczeni przez to, co dane narzędzie no-code’owe pozwala nam zrobić.

A jeśli chodzi właśnie jeszcze wracając do tych takich właśnie podstawowych umiejętności związanych z data science, tutaj mówisz o liczbach, o takim krytycznym, analitycznym myśleniu. Czy uważasz, że takie umiejętności statystyczne też tutaj są istotne, czy właśnie może doświadczenie z różnymi metodami uczenia maszynowego? Ja tutaj też rozmawiając z różnymi osobami, też często trafiam na takie pytanie, czy jest jakaś lista, jakby tabela, którą metodę zastosować do którego problemu, jeśli mówimy właśnie o jakimś analizie danych, o uczeniu maszynowym, no także tutaj doświadczenie w tym, jak dobrać metodę do problemu, żeby uzyskać rozwiązanie, też jest chyba w tym wszystkim istotne, prawda?

Jasne. Pytałeś o statystykę. Zdecydowanie przynajmniej podstawy statystyki to jest coś, co każdy data scientist powinien znać.

I teraz im więcej tej statystyki znamy, tym oczywiście lepiej, natomiast nie jest też tak, że musimy rozumieć to bardzo dobrze i mieć tę wiedzę bardzo rozległą, dlatego że analizę danych można robić na bardzo podstawowej statystyce. Oczywiście, jeżeli chcemy wejść w jakieś testowanie hipotez, takie podejście bardziej naukowe, no bo w końcu jest to data science, czyli jednak powinna być w tym wszystkim jakaś nauka, no to tak, to pewnie nieco większa znajomość statystyki na pewno nie zaszkodzi, ale do takich podstawowych zagadnień analitycznych, nawet do trenowania modeli machine learningowych, czy też wykorzystywania już gotowych narzędzi AI-owych, tam ta statystyka podstawowa w zupełności wystarczy.

No i na pewno też kwestia samego uczenia maszynowego, to znaczy umiejętność trenowania modeli, czy też wykorzystywania już istniejących, wytrenowanych modeli, to jest coś, co data scientist prędzej czy później pewnie będzie musiał poznać i się tego nauczyć.

Okej, to może przejdźmy do kwestii właśnie tych umiejętności na około, i tutaj na pierwszym miejscu wymieniłeś programowanie, no bo ono poszerza zakres tego, co możemy zrobić. Czy jesteśmy w stanie jakoś zdefiniować właśnie zakres tych kompetencji programistycznych, które tutaj są potrzebne, tak, no bo programowanie też jest tutaj szerokim zagadnieniem, tak, no tutaj są jakby, czy to różnego rodzaju środowiska biblioteki, różne podejścia do programowania, co według ciebie jest takim zakresem niezbędnym dla właśnie osoby zajmującej się data science w kontekście programowania.

Więc na pewno oczywiście należy zacząć od tych zupełnych podstaw, od podstawowych elementów składni, jakiejś struktury danych, pętlę, funkcje, to na początek jak najbardziej. Jeżeli już poznamy te podstawy, nauczymy się programować obiektowo, no właśnie, programowanie obiektowe może nie jest jakiegoś bardzo kluczowe w data science, ale te podstawy przynajmniej trzeba znać, no i potem im lepiej nauczymy się programować, tym nasze rozwiązania, które tworzymy, będą po prostu lepsze, bo oczywiście możemy sobie napisać jakiś skrypt, który przetwarza dane, który może robić jakiś wykres, który może coś wylicza i na podstawie tego wyciągamy wnioski, ale jeżeli potrafimy pisać dobry kod, kod pisany obiektowo, no to będziemy w stanie tworzyć de facto oprogramowanie, którego jednym z feature’ów jest to, że służy ono do jakiejś analizy danych, do jakiegoś może wykorzystania modeli, natomiast jeśli chodzi już o takie bardziej, powiedzmy specjalistyczne elementy programowania, no bo powiedziałem o tych podstawowych strukturach, to jest oczywiste, ale z takich już bardziej konkretnych tematów na pewno warto nauczyć się integrowania naszego kodu z bazami danych, czyli nie tylko język SQL, który jest jakąś tam podstawą, którą też pewnie każdy data scientist powinien znać, ale również mam na myśli takie narzędzia, które pozwalają integrować kod pisany najczęściej w Pythonie, chociaż oczywiście są też inne języki, ale jednak w Data Science to głównie Python.

No właśnie, żeby w tym naszym kodzie można było integrować się z bazą danych, więc chociażby takie narzędzia typu ORM, czyli Object Relational Mapping, które pozwalają pisać kod obiektowo, ale ten kod dotyczy jednak bazy danych, tabel rekordów, no to jest bardzo przydatne. Co jeszcze? Zdecydowanie polecam nauczyć się przynajmniej podstaw, jeśli chodzi o wykorzystanie protokołu HTTP, czyli wysyłanie requestów do różnego rodzaju API, ale też web scraping, no bo przecież analizując dane, najpierw te dane skądś musimy pozyskać, i teraz albo dostajemy je skądś, mamy je po prostu, albo musimy zrobić to samodzielnie i wtedy wszelkiego rodzaju web scrapery, jakieś na przykład API, z których możemy pozyskiwać dane, wyciągać je, to wszystko nam będzie potrzebne, no ale żeby z tego skorzystać, musimy znać te podstawy protokołu HTTP, tak żebyśmy mogli sobie te dane wyciągnąć. Co jeszcze?

Z jednej strony, jako data scientiści będziemy wyciągać dane z różnych API, ale z drugiej strony możemy też stworzyć własne API, które posłuży nam do tego, żeby albo udostępnić nasze dane na zewnątrz, albo dowolne inne usługi, które tworzymy. Możemy wytrenować jakiś model i chcieć go komuś udostępnić. W jaki sposób?

No chociażby wystawiając API, które będzie obsługiwało dostęp do tego modelu. Także te umiejętności to są myślę kluczowe dla data scientista.

Jeszcze wracając do samego języka programowania, bo wspomniałeś tutaj, że najczęściej właśnie to będzie Python. Jak to teraz obserwujesz właśnie w świecie data science? Czy Python rządzi?

Nie ma nic innego? I z czego to wynika, że właśnie Python?

No właśnie, czyli nie ma czegoś innego. Pewnie są inne języki. Też tak się mówi, albo kiedyś się mówiło, że mamy Python i R i oba te języki są, powiedzmy, jakoś tam równorzędne.

Natomiast mam wrażenie, że z czasem ten R jest coraz bardziej wypierany i owszem, w pewnych środowiskach akademickich, chociażby on cały czas jest w użyciu, ale jednak coraz rzadziej w takich komercyjnych projektach mam wrażenie. Myślę, że wynika to z tego, że owszem, jest to język programowania, ale na pewno nie taki, który wielu programistów by lubiło z nim pracować. Ma on pewne elementy składni, które nie są zbyt przyjazne, tak to nazwę.

Stąd też jest on wypierany przez Pythona, który dynamicznie się rozwija, w którym powstaje wiele narzędzi, które sprawiają, że ten język wybiera inne. Oczywiście też mamy skalę chociażby, która gdzieś tam się przewija, ale poza Pythonem i oczywiście SQLem nie ma aż tak wielu alternatyw dla data scientistów.

Ok, to teraz jednym z kluczowych elementów tego całego procesu, jaki wymieniłeś w kontekście analizy danych, to jest pozyskanie tych danych. Pytanie skąd je mamy? Oczywiście możemy je skądś dostać od klienta, czy po prostu już są wcześniej przygotowane w danym problemie, ale w wielu przypadkach te dane są problemem i ich nie mamy.

Musimy je skądś zdobyć i tutaj możesz powiedzieć, jakie są typowe scenariusze, gdzie tutaj się przydaje programowanie. Trochę już wspomniałeś właśnie o API czy webscrapingu, ale jakie tam problemy mogą wystąpić, czy właśnie, do czego to programowanie tutaj specyficznie trzeba będzie wykorzystać.

Tak, rzeczywiście jeżeli nie dysponujemy danymi, które chcemy analizować, może w ogóle te dane nie pochodzą z naszej organizacji, tylko są gdzieś dostępne mniej lub bardziej publicznie i chcemy je pozyskać właśnie skądinąd, to mamy takie dwa podstawowe rozwiązania, dwie możliwości. Albo to będzie skorzystanie z API, które te dane udostępnia i to jest sytuacja, taki scenariusz bardziej dla nas pomyślny i pozytywny, dlatego że korzystanie z API jest po prostu łatwiejsze. Są zwykle tam przygotowane jakaś dokumentacja, jakiś opis poszczególnych endpointów i wiadomo, co trzeba zrobić.

Po prostu wysyłamy requesty HTTP pod odpowiedni adres, przekazujemy jakieś parametry być może i dostajemy w odpowiedzi dane. Te dane są zazwyczaj w formacie JSON, czasami też XML, ale jednak głównie są to dane w formacie JSON. No, ale nie zawsze jest tak łatwo.

To znaczy, są sytuacje, kiedy pozyskujemy dane, które nie są udostępniane w sposób oficjalny, ale jednak są dostępne publicznie i są możliwe do pozyskania. W takiej sytuacji musimy używać web scrapingu. W praktyce polega to na tym, że wpiszemy program, który wysyła requesta, czyli tak jakby wchodzi na jakąś stronę www i pobiera kod HTML, który tą stronę opisuje.

Po pobraniu takiego kodu oczywiście musimy go sparsować, jakoś wyciągnąć z niego poszczególne informacje i to jest rzecz czasami trochę żmudna, ale nie szczególnie trudna. Natomiast problem robi się wtedy, kiedy dana strona blokuje nas przed skrapowaniem. Mogą tam być zabezpieczenia, które sprawiają, że skrapowanie jest, jeżeli nie, niemożliwe, to bardzo trudne i wtedy takie podejście klasyczne z wysyłaniem zwykłych requestów może nie być wystarczające.

Natomiast mamy narzędzia typu, chociażby Selenium, które pozwalają nam udawać, że jesteśmy przeglądarką i symulować takie zachowanie, jak gdybyśmy rzeczywiście jako użytkownicy wchodzili na tą stronę. No i kiedy już takiego requesta wykonamy, otrzymamy HTML, potem przetworzenie go jest względnie łatwe.

No tak, no tutaj jakby czasem się pojawia problem, jeśli te dane są jakoś tam zanieczyszczone, czy musimy jakoś je wyfiltrować z całej strony. Ja często pracuję z danymi tekstowymi i jeśli tam pozyskujemy te dane właśnie ze stron internetowych, no to często są jakieś takie elementy, jak elementy sterujące na stronach jakiejś menu, jakieś reklamy i w przypadku tekstu to jest problemem, że trzeba odsiać tego rodzaju rzeczy, żeby dostać ten główny czysty tekst. Tutaj też mogą się przydać już na tym etapie w zasadzie modele uczenia maszynowego, prawda?

Bo można też zaprząc do tego sztuczną inteligencję, żeby próbowała nam pomóc w wyfiltrowaniu tych danych, w jego opracowaniu, ich oczyszczeniu. I także już w zasadzie na tym wczesnym etapie moglibyśmy korzystać właśnie z metod sztucznej inteligencji, prawda?

Tak, w zasadzie tak. Można powiedzieć, że z takim zadaniem sztuczna inteligencja powinna poradzić sobie bez problemu. Natomiast z drugiej strony jest to coś, co o ile kod jest napisany względnie dobrze, mam na myśli kod HTML, to jesteśmy w stanie zrobić to również za pomocą bardziej podstawowych narzędzi.

Można używać do tego regexów. Nie jest to na pewno optymalne rozwiązanie, ale jest jakoś tam możliwe. Myślę, że takim optymalnym podejściem będzie skorzystanie z biblioteki takiej jak Beautiful Soup w Pythonie, która pozwala zamienić tekst de facto, czyli kod HTML na obiekt, który jest łatwo przeszukiwalny.

To znaczy, możemy skorzystać z metody, do której przekazujemy jako argumenty znacznik HTML oraz dodatkowej informacji, na przykład klasę, CSS, czy inne atrybuty, po których jesteśmy w stanie zlokalizować dany element w kodzie HTML na stronie i w łatwy sposób możemy takie elementy wyciągać. To jest, myślę najlepsze rozwiązanie. O ile oczywiście już tym kodem HTML dysponujemy, to znaczy wykonaliśmy poprawnego requesta.

No tak, no i te strony na przykład się nie zmieniają w czasie, nie zmieniają struktury, tak, przez co tam trzeba zmienić te requesty.

Dokładnie, to jest taki częsty problem, który się pojawia. Zdarza się, chociażby coś takiego, że struktura strony nawet pozostaje niezmienna, chociaż oczywiście też może się zmienić, ale nazwy klasy CSS mogą się zmienić. One nie zawsze są takie, że pozostają takie same przez cały czas, tylko czasami są jakoś tam losowo generowane.

No i po zrobieniu kolejnego deploya może się okazać, że te nazwy uległy zmianie. No i wtedy nasz skraper jest można powiedzieć, do wyrzucenia. Więc dobrze jest tak pisać takie skrapery, żeby, o ile to możliwe oczywiście, nie bazować na konkretnych nazwach klas, tylko, no właśnie, taka ciekawa rzecz, czasami można znaleźć na stronie w kodzie HTML, konkretnie w skrypcie javascriptowym, który tam jest gdzieś ukryty, dane w formacie JSON.

Więc niby robimy web scraping, ale tak naprawdę wyciągamy z tego HTML-a czy z tego JSON-a i ten JSON potem jako tekst zamieniamy na słownik w Pythonie. No i już możemy z niego wyciągać dane w łatwy sposób.

W sytuacjach, kiedy ta strona sama była generowana pewnie tak przez jakiś javascript z danych takich ustrukturyzowanych. No tak, to rzeczywiście wtedy jest to łatwiejsze. Okej, no to w kolejnym kroku, bo tutaj powiedzmy, że już mamy te dane pozyskane właśnie, czy to z API, czy ze stron internetowych, czy z jakichś własnych zasobów firmowych, to tutaj kolejnym krokiem jest zwykle jakieś przetwarzanie czy czyszczenie, z czego tutaj zwykle korzystasz, czy to tutaj właśnie programistycznie może się przydać, tak żeby te dane przygotować właśnie do dalszego przetwarzania.

Jasne, więc na początek pewnie taka podstawowa obróbka tekstu może się przydać, tak żeby sprawdzić, czy wszystkie znaki po pobraniu ich, chociażby przez nasz scraper, czy one będą takie, jakie widzimy je na stronie. Czasami się zdarza, że my na stronie widzimy jakiś znak, ale tam w kodzie są inne i w takiej sytuacji należy to w odpowiedni sposób przetworzyć. Na pewno też może się przydać jakieś usunięcie znaków białych, takie standardowe operacje.

No i potem już w zależności od tego, co chcemy zrobić, ale bardzo często te dane będziemy chcieli prędzej czy później przenieść do jakiejś tabeli, czy to w bazie danych, czy to DataFrame w Pandasie i takie dane tabelaryczne też może się okazać, że wymagają jakiegoś tam czyszczenia. Chociażby już po wczytaniu tych danych z tabeli, z pliku CSV, może się okazać, że błędy w zapisie liczb, na przykład separator dziesiętny będzie nie kropką, tylko przecinkiem. No i coś takiego może sprawić, że ta liczba, a wręcz cała kolumna wartości liczbowych, tak naprawdę wczyta się jako tekst.

No i będziemy musieli te przecinki zamienić na kropki i potem rzutować typ na typ liczbowy. Czasami też chcemy, żeby dane w którejś kolumnie naszej tabeli miały postać kategoryczną. Wtedy również możemy rzutować je na odpowiedni typ kategoryczny, pomimo tego, że w samych danych był to na przykład tekst.

Więc tego typu operacje na pewno można zrobić. No i potem już jest praca z danymi, czyli ewentualnie odsianie jakichś wartości odstających, czy takich, które z innego powodu nie nadają się dalej do pracy, do analizy.

A tutaj mówisz, że właśnie dane trzeba gdzieś tam przechować, być może właśnie w bazie danych. Co tutaj jako taki właśnie aspirujący data scientist, czy rozwijający się data scientist, na co powinniśmy spojrzeć, czego się tutaj douczyć, jeśli chodzi właśnie o kwestię baz danych i baz danych i przechowywania tych danych? Co tutaj według ciebie jest takim, jakie są podstawowe rozwiązania, czy najczęściej wykorzystywane?

Ok, więc poza oczywiście samym językiem SQL, którego warto się nauczyć, na pewno potrzebujemy narzędzi, które integrują kod spisany przez nas, chociażby w tym Pythonie z bazą danych. Więc są do tego, pomyślałem dwa, ale tak naprawdę jest ich więcej podejścia. Podstawowym takim, który myślę, że na początek można by wykorzystać, jest pobranie danych z bazy bezpośrednio do data frame’a w Pandasie.

Tam jest taka funkcja read SQL, która pozwala połączyć się z bazą, napisać zapytanie, no i to zapytanie wraz z połączeniem, które dostarczamy, wyciąga te dane z bazy i bezpośrednio ładuje je do data frame’a. To jest rozwiązanie najszybsze, no i w praktyce zazwyczaj skuteczne. O ile nie chcemy zrobić jakichś bardzo zaawansowanych operacji, to myślę, że tutaj bez problemu sobie z tym narzędziem poradzimy.

Jeżeli chcemy mieć większą elastyczność, to znaczy chcemy nie tylko móc selektować, wyciągać dane z bazy, ale również wykonywać dowolne inne operacje, jakieś update’y, jakieś insert’y, create, no cokolwiek takiego, to możemy skorzystać z narzędzi, które pozwalają nam pisać kod SQL, ale wykonywać go z poziomu Pythona. Chociażby jest taka biblioteka, która nazywa się CyclePG. Ona służy do integracji Pythona i bazy postgreSQL.

Także piszemy sobie kod w SQLu, po czym wykonujemy go za pomocą odpowiedniej funkcji na połączeniu z bazą, no i dostajemy wynik albo tego selekta, którego wyciągaliśmy, albo też na bazie pojawiają się zmiany, które my wprowadziliśmy poprzez to właśnie polecenie. Natomiast mamy również takie narzędzie, czy taką klasę narzędzi jak ORM. O tym już wspominałem wcześniej, to jest Object Relational Mapping.

I to jest ciekawe rozwiązanie, ponieważ pozwala nam pisać kod obiektowo, to znaczy tworzymy klasę, tworzymy instancje tej klasy i klasy te są mapowane na tabele, a więc konkretnej tabeli odpowiada konkretna klasa, a instancja tej klasy odpowiada rekordowi w tabeli. Więc potem możemy wykonywać operacje na takim obiekcie, na przykład modyfikować jego wartości, jakieś atrybuty, możemy nawet usunąć taki obiekt i po wykonaniu potem odpowiedniej funkcji te zmiany są widoczne w bazie.

Powiedziałeś też w pewnym momencie, że warto też czasem samemu otworzyć API, tak w swojej aplikacji, w swoim rozwiązaniu. Do czego to się może przydać i jakich wtedy potrzebujemy technologii czy umiejętności właśnie programistycznych?

Tak, więc API możemy traktować jako pewien interfejs, który służy do tego, żeby jakieś albo dane, albo dowolne usługi wystawiać na zewnątrz, tak żeby każdy albo ten kto ma dostęp mógł z nich skorzystać. Takim najprostszym scenariuszem jest to, co robiliśmy z pobieraniem danych, tylko w drugą stronę, to znaczy, zamiast pobierać dane my, to te dane udostępnimy komuś, czy to w ramach naszej organizacji, czy do dostępu publicznego, czyli takie API mogłoby być powiązane, połączone z naszą bazą danych i z tej bazy wyciągać mogłoby dane na podstawie tego, co tam użytkownik poda, jakieś parametry wyszukiwania, może sortowanie, cokolwiek takiego. Może być też tak, że wytrenowaliśmy jakiś model, który robi cokolwiek właściwie, ale on wymaga tego, żebyśmy podali mu pewien input, jakieś dane wejściowe i tam oblicza na przykład wycenę czegoś albo dowolną inną predykcję robi i taki model również może posiadać interfejs w postaci API, tak, że ktoś robi requesta do naszego API i w odpowiedzi dostaje wynik predykcji tego modelu.

Jeśli chodzi o narzędzia, to mamy w Pythonie kilka frameworków do tworzenia API, takie najbardziej znane to są pewnie Flask czy Django, natomiast ja bardzo lubię framework, który nazywa się FastAPI, on jest z tych trzech najnowszy i taki najbardziej myślę współczesny, szybko się rozwija i jest on pewnym kompromisem pomiędzy z jednej strony łatwością użycia i taką lekkością, a z drugiej strony ma też wiele możliwości, które pozwalają tworzyć całkiem zaawansowane rozwiązania. Więc jest to coś takiego pomiędzy Flaskiem a Django i gdybym miał rekomendować jeden framework dla osoby zupełnie początkującej, jeśli chodzi o programowanie aplikacji webowych, ale która już coś tam wie, na przykład jeśli chodzi o data science, no to myślę, że to jest takie optymalne rozwiązanie.

Czyli udostępniając w ten sposób swoje dane, właśnie poprzez API też umożliwiamy innym korzystanie z tych danych czy z wyników programistycznie, tak?

Dokładnie. Tak, o tym należy myśleć jako o pewnym interfejsie, którego używamy do wystawiania pewnych usług czy też danych. Tak, żeby ktoś mógł de facto wykonać pewien kod, bo endpoint, czyli taka pojedyncza usługa w ramach API, tak to można rozumieć, jest de facto pewną funkcją, którą wykonujemy spoza naszego programu, to znaczy użytkownik poprzez wykonanie requestu HTTP wywołuje tę funkcję i dostaje w odpowiedzi wynik tego, co ona robi.

To może być wyciągnięcie danych z bazy, ale również wykonanie predykcji za pomocą wytrenowanego modelu.

Okej, to czyli tutaj mamy interfejs programistyczny, no a tak dla zwykłych śmiertelników mamy jakiś interfejs wizualny, taki interfejs, którego użytkownik korzysta, klikając myszą. Współcześnie takim interfejsem najczęściej jest chyba interfejs webowy, czyli jest to jakaś tam postać aplikacji webowej.

Tak, zdecydowanie. Są oczywiście interfejsy graficzne desktopowe, natomiast nie są one tak uniwersalne jak interfejsy webowe, które pozwalają się połączyć z tą aplikacją z dowolnego miejsca teoretycznie. Więc tak, rzeczywiście oprócz tego, że tworzymy interfejsy w postaci API, które są wygodne dla programistów, to jednak warto również stworzyć czasami interfejs, który pozwala do tych, czy to danych, czy do modelu, czy do dowolnej innej usługi, którą chcemy wystawić na świat, pozwalają połączyć się i pracować z nią de facto z poziomu interfejsów graficznych, takich, z którymi mamy do czynienia na co dzień. Więc są różnego rodzaju frameworki, narzędzia do tworzenia takich dashboardów, tak to można określić.

Oczywiście możemy korzystać również z takiego podejścia klasycznego , czyli stworzyć sobie jakąś stronę z frontendem w HTMLu, CSSie, JavaScriptie, no ale mówimy o sytuacji, kiedy ktoś jest data scientistem, więc pewnie zna Pythona, a niekoniecznie musi znać tamte języki, a nawet jeżeli zna, to może chce stworzyć coś na szybko. Co w krótkiej ilości kodu pozwoli zawrzeć pewien interfejs pozwalający na wiele możliwości.
Więc ja bym tutaj rekomendował, żeby użyć jakiegoś narzędzia Pythonowego, które taki webowy frontend pozwala nam stworzyć. No i tutaj mamy różne możliwości. Takim narzędziem, które w ostatnim czasie, w ostatnich miesiącach, czy nawet latach wysuwa się na prowadzenie, jeśli chodzi o popularność i też prostotę użycia jest framework o nazwie Streamlit.
Bardzo popularny wśród data scientistów, wśród osób, które pracują z danymi, z modelami uczenia maszynowego. Jest to proste w obsłudze, wygląda całkiem dobrze. I moim zdaniem to jest najlepsze narzędzie tego typu.
Ale mamy też inne narzędzia. Jest na przykład framework Dash, który jest nieco starszy, nieco bardziej toporny. Trudniejszy też w wykorzystaniu, ponieważ po prostu musimy napisać więcej kodu.
I więcej, chociażby jeśli chodzi o wygląd elementów na stronie, o ich kompozycję, układ, zależy od nas. Co z jednej strony daje nam pewną elastyczność i wolność, ale z drugiej strony sprawia, że jesteśmy odpowiedzialni nie tylko za logikę działania tego, ale również za to, jak to wszystko wygląda. Natomiast Streamlit, owszem, jak najbardziej pozwala nam modyfikować wygląd tego wszystkiego, ale jest to po prostu szybsze, wygodniejsze no i też efekt końcowy jest moim zdaniem dużo ładniejszy.

Czy widziałbyś jakieś granice wykorzystania tego rodzaju frameworku? W sensie przy jakiego rodzaju aplikacjach jest to już za mało? Czy właśnie jest to zbyt ograniczające, czy niewydajne w jakichś tam większych rozwiązaniach? A może tak nie jest? Może tego rodzaju technologii można wykorzystywać nawet i przy dużych rozwiązaniach?

Ok, więc powiedziałbym tak. To, co nas ogranicza w wykorzystaniu Streamlita i innych podobnych narzędzi jest to, że jednak nie jest to do końca framework taki typowo frontendowy, javascriptowy, gdzie mamy pełną dowolność w pisaniu HTMLa, który za tym wszystkim stoi, tylko jesteśmy ograniczeni przez pewne ramy, które nakłada ten framework, więc jeśli chodzi o kwestię tego, jak to wygląda, jaki jest wygląd komponentów, jakie są miejsca położenia pewnych na przykład sidebara, czyli tego paska bocznego, który jest na takim dashboardzie, no jesteśmy przez to wszystko, przez ten framework jesteśmy ograniczeni, więc o ile nie zależy nam na stworzeniu czegoś bardzo customowego, z wykorzystaniem jakichś powiedzmy naszych własnych ikon, które grafik nam zrobi, tylko zdajemy się na te ogólne ramy, które framework narzuca, to bez problemu możemy to zrobić.
Też minus, minus albo plus jest taki, że od razu widać, że dany dashboard jest stworzony w takim właśnie narzędziu, co nie zawsze będzie nam odpowiadało. Czasami chcemy podejść bardziej customowo. Także w takiej sytuacji należałoby stworzyć cały frontend tak jak normalnie byśmy to robili, tworząc stronę www, ale jeśli chcemy zrobić coś na szybko, co po prostu ma działać, co ma wykorzystywać te podstawowe featury komponenty frontendowe, to myślę, że spokojnie wystarczy.

A jeśli w Twoim projekcie to nie wystarcza, to z jakich technologii frontendowych najczęściej korzystasz?

Ja akurat frontendem się za bardzo nie zajmuję, więc dla mnie w zupełności wystarczają te frameworki, o których powiedziałem. Natomiast miałem taką sytuację akurat niedawno w pracy, że pewien dashboard był stworzony w oparciu o Streamlit, ale z czasem okazało się, że potrzebowaliśmy większej dowolności i też chcieliśmy, żeby to bardziej wyglądało jak coś naszego niż jak coś takiego generycznego, więc wzięliśmy osobną osobę do tego, żeby taki frontend nam napisała. Tam był użyty, zdaje się jakiś React, czy inny javascriptowy framework.
No ale tak, rzeczywiście czasami do tego się musimy posunąć, ale jeżeli takiej potrzeby nie ma, to w zupełności wystarczy ten Streamlit.

Okej, to mamy tutaj kwestię zbierania danych, mamy kwestię czyszczenia danych, przechowywania ich w bazie, kwestie właśnie API i frontendu. Czy w tych wszystkich obszarach i generalnie w data science też widzisz tutaj jakieś takie trendy, które pozwalają w tej chwili poprawić konkurencyjność na rynku pracy? Coś, czego powinniśmy się uczyć, powinny się uczyć osoby, które szukają takiej pracy, żeby być nadal atrakcyjnym wyborem na rynku.

Tak, pewnie nie będzie zaskoczeniem, jeżeli powiem, że takim trendem jest sztuczna inteligencja oraz integrowanie naszego kodu, naszych rozwiązań z modelami, które są publicznie dostępne, chociażby tymi od OpenAI. Tak naprawdę wszystko to, co da się jakoś zautomatyzować za pomocą sztucznej inteligencji, to może być jakaś na przykład moderacja tekstu, jakaś klasyfikacja, na przykład analiza sentymentu, chociażby, czy dowolna inna klasyfikacja, czy cokolwiek takiego, co wymaga pewnego wkładu modeli, no tutaj mam na myśli modele językowe, oczywiście to mogą być też inne kategorie modeli, choćby jakieś podsumowanie tekstu, nawet automatyzacja Customer Service, tworzenie agentów, którzy zastępują te osoby, które normalnie odpowiadałyby na pytania naszych klientów. To wszystko możemy zrobić za pomocą dostępnych publicznie modeli. Oczywiście te modele są płatne, więc tutaj już nasze rozwiązanie będzie nas kosztować więcej, niż byłoby to bez ich wykorzystania, natomiast to jest taka brakująca cegiełka pomiędzy programowaniem i tworzeniem projektów takich stricte programistycznych, a data science, czy szeroko pojętym uczeniem maszynowym, ponieważ jesteśmy w stanie jako programiści, którzy nawet właśnie, to jest teraz w drugą stronę, to znaczy my rozmawiamy o tym, co data scientist powinien zrobić, żeby czegoś się nauczyć, jeśli chodzi o programowanie, żeby swoją pracę, swój warsztat jakoś polepszyć, natomiast jest też w drugą stronę, to znaczy programista, który nie zna się na nauczeniu maszynowym, na modelach, na analizie danych, może skorzystać z takich modeli, które stosunkowo łatwo się integruje do tego, żeby wykorzystywać funkcjonalności takich modeli.

A w takim razie właśnie od strony programisty, który chce tworzyć tego rodzaju rozwiązania, tak jak mówisz, które są w tej chwili w trendzie, które pozwalają osiągnąć dużo więcej, niż było można zwykłymi metodami programistycznymi, to co z kolei programista musi poznać, żeby tego rodzaju rozwiązania tworzyć, tak, czy poznać bliżej właśnie API tego rodzaju modeli, czy ich możliwości, jak tutaj widzisz, jakie są te kluczowe elementy, na które trzeba zwrócić uwagę, żeby móc takie rozwiązania tworzyć.

Tak, faktycznie, żeby z modelami tego typu się zintegrować, musimy skorzystać z ich API, to jest bardzo proste i myślę, że każdy programista, który ma jakiekolwiek doświadczenie z tego typu API, sobie poradzi, mamy dostępną dokumentację, także to jest de facto bardzo proste, więc myślę, że programista akurat, żeby się z takimi rozwiązaniami połączyć, nie musi zdobywać żadnej konkretnej wiedzy, ponieważ to już prawdopodobnie umie, natomiast jeżeli taki programista chciałby wykorzystać dostępne publicznie modele do tego, żeby wykonać jakąś pracę no właśnie, taką wiążącą się trochę z tematem czy to analizy danych, czy jakiejś klasyfikacji lub innych predykcji machine learningowych, no to pewnie musiałby się dowiedzieć, czym są metryki dotyczące predykcji, czy to klasyfikacji, czy regresji, jak ocenić, czy model sobie dobrze radzi. Tutaj taką może też ciekawą rzecz powiem, jeśli chodzi o jedno ze szkoleń, które realizuję w Sagesie.

W ramach tego szkolenia, które dotyczyło analizy danych tekstowych, tam tworzyliśmy sobie m.in. klasyfikator tekstu, który wykonywał takie proste operacje, jak klasyfikacja spamu, czy analiza sentymentu. Zrobiłem taki eksperyment i sprawdziłem, jak z tym samym zadaniem, które normalnie wykonywałby model wytrenowany przez nas, jakiś klasyfikator, jak z tym samym zadaniem radzi sobie model GPT. No i okazało się, że wyniki, które on podawał, to znaczy klasyfikacja tego spamu, czy tam sentymentu były dokładniejsze niż model, który wytrenowaliśmy na szkoleniu.
Oczywiście można by w takim modelu rzeźbić i osiągnąć jeszcze lepszy wynik, mam na myśli ten nasz model, ale przy takim najprostszym możliwym podejściu, gdzie przygotowujemy dane, wektoryzujemy je, a następnie trenujemy nasz klasyfikator, to tam, z tego co pamiętam, dokładność takiego klasycznego modelu to było około 85%, natomiast klasyfikator oparty o model GPT miał 95% dokładności, więc ta różnica jest zauważalna, plus korzyść jest też taka, że nie musimy tego modelu trenować, więc oszczędzamy czas na jego wytrenowanie, też nie musimy umieć tego robić, no bo wiadomo, nie każdy programista potrafi trenować modele machine learningowe, a tutaj dostajemy już de facto rozwiązanie, które jest takim wytrenowanym, bardzo uniwersalnym modelem i wynik takiej klasyfikacji może nam ten model zwrócić. Oczywiście minus jest taki, że za to płacimy, natomiast te koszty, jeżeli bierzemy odpowiednio model, nie są aż tak duże, przykładowo korzystając z modelu GPT-4 te koszty będą całkiem spore, korzystając z GPT-4o będą mniejsze, a korzystając z GPT-4o modeli mini będą jeszcze mniejsze, zauważalnie, kilkanaście razy mniejsze zdaje się, z tego co pamiętam, ma ten model mini w porównaniu do zwykłego, a jeśli chodzi o dokładność takiej predykcji, takiej klasyfikacji, to jest praktycznie taka sama.

No tak, no to rewolucja z tymi modelami, GPT zmieniła wiele, więc rzeczywiście w tej chwili bardzo wiele takich zadań można zrealizować już tymi modelami bez stworzenia własnych, ale to fajnie, to przeszliśmy tutaj te wszystkie etapy i w kontekście też tutaj tego, co właśnie trzeba umieć wokół Data Science, tutaj też przekazujesz tę wiedzę na bootcampie w kodowamaczu, czy masz powiedzieć, jakie tam właśnie elementy są poruszane, czy właśnie jakiego rodzaju projekty można po takim bootcampie zrealizować?

Tak, więc faktycznie mamy nowy bootcamp, który jest stworzony z myślą o Data Scientistach, chociaż tak naprawdę nie trzeba umieć analizować dane, nie trzeba umieć trenować modeli, po to, czy też, żeby wziąć w nim udział, dlatego, że to jest de facto kurs wprowadzający w programowanie webowe, szeroko pojęte, tam będziemy się uczyć o takich rzeczach jak wykorzystanie baz danych, ale też tworzenie rozwiązań pobierających dane, np. skrapery, np. łączenie się z API, które udostępniają dane, ale też nauczymy się tworzyć własne API z wykorzystaniem frameworków takich jak FastAPI czy Django i poznamy też podstawowe narzędzia do tworzenia interfejsów graficznych, czyli właśnie ten wspomniany przeze mnie wcześniej Streamlit, ale również będzie tam nieco HTMLa, CSSa, Javascriptu, więc tego typu rozwiązania, będziemy się tam ich uczyć i myślę, że to, co jest ciekawe w tym kursie, to to, że wszystkie zjazdy, których będzie tam kilkanaście, z tego co pamiętam dwanaście, będą dotyczyły de facto jednego dużego projektu, to znaczy będziemy pobierać dane dostępne publicznie dotyczące nieruchomości wystawionych na sprzedaż, domy, mieszkania, działki, będziemy je pobierać, następnie zapisywać w bazie danych, po czym no właśnie, możemy potem te dane udostępniać dalej poprzez stworzone przez nas API, możemy, powiedzmy, że modeli trenować nie będziemy, ale możemy sobie taki model wytrenować, abstrahując od zajęć na tym bootcampie i następnie stworzyć API, które będzie pewnym interfejsem między tym modelem, a użytkownikiem, który chce dokonać predykcji, stworzymy też interfejs graficzny, który czy to ten model, czy to udostępnianie danych pozwoli w taki sposób opakować, żeby przyjemnie się z tego korzystało również osobom, które nie są programistami, również już może trochę w oderwaniu od tego projektu, nauczymy się integrować nasz kod z rozwiązaniami takimi jak modele od OpenAI, czy dowolnymi innymi usługami, które mają swoje API, które być może nie udostępniają danych, ale pozwalają poprzez API pewne operacje wykonać.

No, czyli jeśli kogoś tutaj zainteresowały te tematy, które dzisiaj poruszaliśmy i chciałby to zgłębić z innymi osobami i z Tobą na tego rodzaju kursie, to w takim razie zapraszamy. Na dzisiaj dzięki wielkie w takim razie za tę rozmowę i za ten rzut oka, co musimy umieć w Data Science oprócz właśnie modelowania, czy właśnie co jest potrzebne od strony programistycznej. Mam nadzieję, że to tutaj też pomogło Wam w tym, jaką ścieżkę karierę wybrać i jakie umiejętności rozwijać.

A tymczasem dzięki i do zobaczenia następnym razem.

Komentarze