DSP2017: Przygotowanie modelu – raport 2

DSP2017

Przyszedł czas na trochę bardziej konkretną pracę z danymi. Ostatnio pisałem, o przygotowaniu modelu – dzisiaj też będzie o tym ale w kontekście pracy nad moim projektem. Gwoli przypomnienia – dane nad którymi pracuję pochodzą ze strony kaggle.com, a dokładnie stąd. Są one w formacie csv, i do ich pierwszej obróbki (czyli zanim zostaną wczytane do pamięci) wykorzystuję darmowy program CSVed. Następnie właściwa część pracy związana z uczeniem maszynowym jest pisana przy wykorzystaniu edytora Jupyter Notebook. O samym “jupiterze” popełnię być może osobny wpis ale, jak mawiał klasyk, nie uprzedzajmy faktów.

Czego chcę się dowiedzieć z danych?

Zbiór danych, który posiadam zawiera 150 odpowiedzi na różne pytania od preferencji muzycznych, przez lęki i nawyki zdrowotne, po kwestie światopoglądowe. Jest to ogrom wiedzy. Wydaje mi się, że nawet ktoś kto ma pojęcie na temat socjologii mógłby mieć problem z wyborem danych do analizy. Przeglądając dane doszedłem do wniosku, że jest małe prawdopodobieństwo że uda mi się zadać odpowiednie pytanie i uzyskać na nie satysfakcjonującą odpowiedź już przy pierwszym podejściu. Bardzo chciałem poruszyć jakieś ważkie tematy w stylu: “Na podstawie słuchanej muzyki oraz deklarowanego stosunku do wiary określ deklarowany poziom szczęścia/satysfakcji z życia”. Stwierdziłem jednak, że na początku wezmę się za coś bardziej namacalnego :). Na start: Postaram się określić preferencje filmowe na podstawie preferencji muzycznych.

Nie jest to może aż tak interesujące, ale wydaje mi się że nada się do prezentacji podstawowego cyklu pracy w uczeniu maszynowym. Zobaczymy co z tego wyjdzie i czy w ogóle na podstawie posiadanych przeze mnie danych jest szansa by określać to z co najmniej 70 procentową skutecznością. Tak więc wybór pytania w tej iteracji mam za sobą.

W jaki sposób zebrałem dane?

Skoro chcę określić zależność tego co kto lubi oglądać do tego co lubi słuchać, nie potrzebowałem większości kolumn z mojego zbioru. Przy pomocy CSVed usunąłem zbędne kolumny zostawiając tylko te, które określały preferencje muzyczne i filmowe – z 150 kolumn zostało 31.

CSVed
CSVed pozwala na łatwą obróbkę plików csv

Przetworzenie danych

Pierwotnie miałem w tym wpisie umieścić wprowadzenie do bibliotek którymi się posługuję (przypominając: pandas, numpy, matplotlib), ale stwierdziłem że a) rozmyłoby to idee raportu b) nie pełniło by faktycznej funkcji wprowadzenia do bibliotek c) co jest do wszystkiego to jest do niczego. Napiszę więc o tym osobno, natomiast ten wpis pozostawię tylko opisem tego co robię w projekcie. No więc…

Po wczytaniu danych, na starcie sprawdziłem czy nie zawierają brakujących wartości. Okazało się, że w każdej kolumnie znajdują się wartości puste. Znam dwa sposoby radzenia sobie w takich przypadkach. Pierwszy i najprostszy to usunięcie wierszy zawierających puste komórki, drugi to wypełnienie ich znaczącą wartością (np. średnią wartości w kolumnie). Mam 1010 wierszy z czego 104 zawiera puste komórki. Po usunięciu zostaje więc 906 wierszy. Wydaje mi się, że jest to wystarczająca próba więc w tym wypadku wybrałem opcję pierwszą, niemniej jeżeli wyniki nie będą zadowalające to jest to miejsce do którego wrócę.

Według tego co mówi twórca mojego zbioru danych, kolumny które zostawiłem powinny zawierać odpowiedzi w postaci numerycznej od 1 do 5, gdzie przy 1 ankietowany zdecydowanie nie zgadza się z pytaniem, a przy 5 odpowiedź jest zdecydowanie twierdząca. Kolejną więc kwestią do sprawdzenia było czy żadna kolumna nie zawiera wartości wychodzących po za tą skalę. Na szczęście okazało się wszystko zgadza się z opisem. Sprawdziłem jeszcze pro forma czy aby na pewno wszystkie wartości są numeryczne, i tu też wszystko było cacy.

Ostatnią rzeczą do sprawdzenia była kwestia korelacji kolumn. Żadna z kolumn nie była tożsama z inną więc nie musiałem tutaj nic czyścić. Mimo to już po analizie korelacji można zauważyć, że np. że kolumna dotycząca muzyki klasycznej jest dosyć mocno skorelowana z operową, a filmy animowane są skorelowane z fantastycznymi. Okazuje się też, że ankietowani miłośnicy hardrocka nie przepadają za filmami romantycznymi :).

Poniżej wykres korelacji, wykonany przy wykorzystaniu biblioteki matplotlib. Im jaśniejszy kwadrat tym silniejsza korelacja. Przekątna utworzona z białych kwadratów to po prostu te same kolumny (oś 0X odpowiada osi 0Y ) – czyli 100 procentowy związek.

Wykres korelacji

Plany na najbliższy tydzień:

W nadchodzącym tygodniu będę chciał przejść do chyba najciekawszej części, czyli algorytmu uczącego. W rzeczywistości nie zajmie mi to więcej niż 1 – 2 dni czyli przypuszczalnie przejdę do dalszej części projektu, ale opisywał będę to dalej, w tygodniowych raportach. Samo “uczenie” wymaga wykonania kilku ważnych spraw. Między innymi trzeba odpowiednio podzielić dane na część treningową, testową i weryfikacyjną, oraz właściwie wybrać algorytm (coś czuję że nie obejdzie się bez metody prób i błędów) więc zabawa na pewno mnie nie ominie 🙂

Co do wpisów, to stale powiększa się pula kwestii do opisania, a czasu nie przybywa. Po pierwsze muszę opisać kolejną część cyklu pracy w uczeniu maszynowym. Po drugie obiecane wprowadzenie do bibliotek. Po trzecie na wrzucenie na blog czeka już kolejna część code smells. No i jeszcze kolejny raport. Żeby to nadgonić, w przyszłym tygodniu musiałbym napisać cztery posty. Nie chcę nic obiecywać, ale spróbuję na pewno.

 

Dodaj komentarz

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