Pierwszy commit;) – Jupyter Notebook

W ostatnim czasie udało mi się przerobić całkiem fajny tutorial na Kaggle.com, który uczy podstaw machine learning na przykładzie pasażerów Titanica i przewidywania, którzy mieli szansę na przetrwanie. Tutorial nazywa się Titanic: Machine Learning from Disaster i pozwala on na przejście całego procesu od przetworzenia zbioru danych do uzyskania wyników, które możemy wysłać na serwer Kaggle w celu zrobienia sobie portfolio.

Ponieważ moim celem w ramach tegorocznego Daj się poznać jest właśnie wrzucenie swoich właśnych „prognoz” na Kaggle do zadania „Partly Sunny with a Chance of Hashtags” taki tutorial bardzo mi pomógł w zrozumieniu co i jak po kolei. Jest tam jednak parę rzeczy, które muszę bardziej zgłębić, by wiedzieć co robię a nie tylko odtwarzać. Jednak w tym świetnie pomaga mi uczenie się na Dataquest o którym już tutaj wspominałam.

Po przerobieniu tutoriala z Titanica moim pierwszym krokiem było przeniesienie instrukcji z tutoriala do notesu Jupyter aby później móc na tym pracować już moim zbiorem danych. Okazało się jednak, że to nie było takie proste, ponieważ po pierwsze po instrukcji:

predictions[predictions > .5] = 1
predictions[predictions <=.5] = 0

dostałam informację: „FutureWarning: in the future, boolean array-likes will be handled as a boolean array index app.launch_new_instance()” Na szczęście to póki co ostrzeżenie, więc nie szukałam w tym momencie rozwiązania dla tego problemu.
Gorzej było, gdy po instrukcji:

alg = LogisticRegression(random_state=1)

pojawiło się:

NameError Traceback (most recent call last)
in ()
----> 1 alg = LogisticRegression(random_state=1)

NameError: name 'LogisticRegression' is not defined

Na szczęście okazało się, że wystarczy instrukcję zamienić na:

alg = linear_model.LogisticRegression(random_state=1)

Jednak w tutorialu nic takiego potrzebne nie było;) No ale na szczęście wszystko ostatecznie poszło szybko i sprawnie. Tak więc krok po kroku posuwam się coraz dalej. Jednak już wiem, że temat Data science jest tak ogromny, iż jeśli nie zwiększę ilości czasu jaki mu poświęcam, zgłębienie go zajmie mi dłużej niż bym chciałą. Ale nie przeszkadza mi to zbytnio, bo jest to bardzo ciekawe!

No i udało się też wrzucić wreszcie coś sensownego do Gita – czyli mój Jupyter Notebook z póki co rozwiązaniem do kwestii Titanica.

Skąd brać dane do projektów data science? Czyli webscraping.

Webscraping – co to takiego?

Jest to proces automatycznego pobierania stron internetowych i wyciągania z nich interesujących nas informacji. Ponieważ dzieje się to automatycznie zajmuje to oczywiście mniej czasu niż gdybyśmy to chcieli zrobić ręcznie.

Od czego zacząć?

Najważniejsze co musimy zrobić chcąc skorzystać z danych umieszczonych na jakiejś stronie to upewnienie się, że jej warunki użytkowania nam na to pozwalają.
Jeśli już mamy taką stronę, której zawartość możęmy wykorzystać musimy się zastanowić jakie dane są nam potrzebne. Nastepnie z pomocą przyjdzie nam opcja Inspect (Zbadaj) w przeglądarce. Pozwoli nam ona w wygodny sposób przejrzeć strukturę HTML.

Kiedy ustalimy strukturę stron, które nas interesują jesteśmy gotowi napisać automat. W Pythonie z pomocą przyjdą nam takie biblioteki jak:

URLOPEN

Jest to funkcja modułu urllib.request, który umożliwia pobieranie stron z danego URL. Korzystamy z niej w bardzo prosty sposób:

page = urlopen("Url którego zawartość chcemy pobrać).read()

W ten sposób w zmiennej page mamy zawartość danej strony.

BEAUTIFULSOUP4

Ta biblioteka ułatwia przechodzenie po strukturze HTML. Na przykład, by wybrać wszystkie punkty danej listy wywołamy coś takiego:

data = BeautifulSoup(html, "lxml")
listelements = data.find_all("li")

Gdy już będziemy mieli dane, to możemy użyć biblioteki pandas, o której już tutaj wspominałam. Pozwala ona analizować dane w bardzo wygodny sposób.

Mogą nam się również przydać wyrażenia regularne i tutaj z przyda nam się operator Re, który również znajdziemy w Pythonie.  Pozwala on między innymi na wyszukiwanie i dopasowywanie tekstów do wzorca.

Kiedy już zdobędziemy dane, wyciągniemy co trzeba, obrobimy by format nam odpowiadał możemy użyć klasy DictWriter aby zapisać je w formacie CSV albo modułu do Sqlite by zapisać dane w bazie.

Przetwarzanie danych w data science

Jednym z podstawowych wyzwań jakie stoją przed data scientistami jest odpowiednia analiza zbiorów danych. Czasami takimi rzeczami zajmują się data analyst, ale jednak dla obu specjalności wiedza o tym jak postępować ze zbiorami danych jest bardzo ważna.

Po pierwsze przydaje się wiedza biznesowa na temat danych z jakimi ma się do czynienia, po to by zrozumieć, co poszczególne kolumny tabeli, którą dostaliśmy reprezentują. Czasem może to wymagać jakiegoś rozeznania w temacie. Tutaj możę się przydać też cecha, którą każdy data scientist powinien posiadać – czyli ciekawość. Im lepiej poznamy dany temat tym lepiej będziemy w stanie przeanalizować dane i uzyskać z nich przydatne wyniki. Przyda się też komunikatywność – aby informacje na temat danych zdobyć od ludzi, którzy wiedzę biznesową posiadają.

Po drugie – ważne jest, by zastanowić się, które z posiadanych przez nas danych mogą mieć wpływ na wynik, którego szukamy oraz jakie te korelacje mogą być. Jeśli na przykład chcemy przewidzieć wzrost czytelnictwa w danej grupie wiekowej będzie nas interesował wiek oraz ilość przeczytanych książek w ciągu roku. Ale niekoniecznie będzie nas interesował region czy płeć czytelników. Dlatego też już na wstępie pewne dane możemy wyciąć, jeśli wiemy, że do wyniku nas nie przybliżą.

Trzecia rzecz – dane nie zawsze są uporządkowane i kompletne. Możemy się spotkać z tabelami w których brakuje danych dla jakiejś kolumny w pewnym procencie wierszy. Co wtedy? Podejścia są różne – jeśli procent takich danych jest mały można pokusić się o usunięcie tych wierszy. Jednak jeśli danych nie mamy dużo i nie chcemy niczego usuwać częstą praktyką jest wstawienie w puste miejsca mediany wartości z danej kolumny. Spotkałam się też z uzupełnianiem pustych miejsc wartością średnią.

Ostatnie – często by dane łatwiej się przetwarzało pozbywamy się wartości tekstowych i zamieniamy je na wartości liczbowe. I tak na przykład gdy mamy kolumnę przechowującą płeć w formacie F lub M, możemy ja zamienić na reprezentację za pomocą cyfr 1 i 0.

Nadal w kosmicznym klimacie – Jupyter

Ostatnio w czasie kursu o którym wspomniałam w poprzednim wpisie – Dataquest miałam okazję zapoznać się narzędziem jakim jest Jupyter.
Jest to środowisko często używane w świecie data science. Mamy w nim do dyspozycji konsolę w której możemy wywoływać kolejne komendy, ale jest to dość rozbudowana konsola przypominając raczej rich text editor. W wersji online wygląda to mniej więcej tak:

Jupyter

W polu z zieloną obwódką możemy wywoływać polecenia. Przykład totalnie prosty:

Jupyter

Każde z tych pól to tzw komórka (cell). Aby po wpisaniu do niej dany kod się wywołał musimy nacisnąć Shift + Enter. W moim przypadku pokazanym powyżej wyglądało to tak:

Wpisałam a = 3, Shift + Enter, b = 4, Shift + Enter, c = a*b, Shift + Enter, print(c), Shift + Enter.

I tak dostałam wynik mnożenia liczb, które sobie zdefiniowałam. Oczywiście można by to wszystko umieścić w jednej komórce i wówczas wcisnąć Shift + Enter. Wyglądało by to wtedy tak:

Jupyter

Co jest fajne i ciekawe w tej konsoli, to że każdą komórkę w każdej chwili możemy zmienić. Czyli w tym pierwszym przykładzie mogłabym na przykład zmienić linijkę b = 4 na b = 5 i wywołać wszystko jeszcze raz. Jednak nie musiałabym przechodzić komórka po komórce i klikać Shift + Enter, ale mam w menu do dyspozycji coś takiego:

Jupyter

Wówczas możemy wybrać opcję „Run All” albo odpowiednio do potrzeb którąś z innych i zawartość komórek wywoła się hurtowo. Komórki na których pracujemy możemy również dowolnie przesuwać w górę i w dół, usuwać albo dodawać w dowolnym miejscu.

Jeśli chodzi o języki nie jesteśmy ograniczeni do Pythona. Jupiter pozwala nam korzystać z różnych języków:

Jupyter

Na zrzucie ekranu widać „Notebook” – o co chodzi? Otóż, jest to zbiór dokumentów, które mogą zawierać zarówno kod jak i wykresy czy tekst. Wybieramy język dla danego notesu aby Jupiter wiedział czego ma użyć do wywołania naszego kodu. Notesy możemy zapisywać na dysku:

Jupyter

By je później odczytać bądź komuś przesłać.

Wygląda na to, że Jupyter to całkiem fajne narzędzie i będę z niego jeszcze wiele razy korzystać podczas nauki:)

 

Data Science – nowe materiały

Niby druga notka nie musi być w temacie konkursowym, ale jakoś tak mi dziś wyszło. Koniecznie chciałam napisać o pewnym nowym znalezisku jakie odkryłam w zeszłym tygodniu. Mianowicie po pierwsze artykuł
„Building a data science portfolio: Storytelling with data”, który krok po krok opowiada jak zacząć przygodę z danymi i Pythonem. Genialny, tylko bardzo długi. Artykuł pochodzi z bardzo ciekawego bloga Dataquest. Jest to platforma do nauki pod hasłem „Become a Data Scientist – Learn by writing code, working with data, and building projects in your browser”. Są tam trzy ścieżki: Data Scientist, Data Analyst i Data Engineer. Jedną z nich wybiera się na początku i następnie realizuje kolejne misje. Logo portalu to rakieta, więc wszystko jest utrzymane w klimacie nieco kosmicznym, co chyba świetnie pasuje do Data Science.

Tryb nauki wygląda bardzo fajnie, bo jest troszkę tekstu do przeczytania, po czym instrukcje do zrealizowania w okienku z Pythonem. Jest to dużo bardziej dynamiczny tryb nauki niż Edx i chyba bardziej mi odpowiada. Nie wiem jeszcze jak dokładnie wygląda ewentualna certyfikacja, bo póki co korzystam z wersji darmowej, ale opłaty są miesięczne/roczne, więc całkiem inaczej niż w Edx, gdzie ostatnio certyfikacja podrożała dwukrotnie.

Chwilowo zatem próbuję swoich sił w misjach Dataquest. Bardzo podoba mi się tam też to, że jest dużo zadań „z życia” – na przykład misje typu „Guided Project: Using Jupyter Notebook. Learn how to perform analysis and communicate results with Jupyter notebook.” albo „Guided Project: Explore U.S. Births. Practice the basics of Python by analyzing births in the U.S.” No ale Edx z kolei ma korzystanie z Azure Machine Learning:) Tak więc mocno się uzupełniają.