DSP2017: Trenowanie modelu- raport 3

DSP2017

Po dłuższej przerwie od raportów, w końcu piszę kolejny – dzisiaj o przebiegu procesu trenowania modelu w moim projekcie, który jak całość dziedziny uczenia maszynowego został przeprowadzony z wykorzystaniem Pythona, i bibliotek Pandas oraz scikit-learn.

Rodzaj uczenia…

Przed przystąpieniem do wyboru algorytmu uczącego trzeba określić pewne ramy dla swojego projektu. Tak jak pisałem wcześniej, na początku należy zastanowić się nad tym, czy rozwiązywany problem podlega uczeniu nadzorowanemu, czy nie. Innymi słowy czy w zbiorze danych literalnie znajduje się wartość, którą chcemy moc później odczytywać. W moim projekcie chcę przewidzieć preferencje filmowe posiadając preferencje muzyczne (tutaj trochę więcej na temat pytania na które staram się znaleźć odpowiedź).  Na mój zbiór danych składają się informacje zarówno o preferencjach muzycznych jak i preferencjach filmowych. Z tego wynika, że muszę wykorzystać uczenie nadzorowane(supervised learning).

i rodzaj problemu

Kolejna kwestia to rodzaj problemu. Jako, że zamierzam przewidywać konkretne wartości na podstawie innych, to na pierwszy rzut oka mogłoby się wydawać że problem należy do dziedziny regresji. Nic bardziej mylnego –  wartości które chcę przewidywać należą do przedziału <1,5> i odpowiadają na pytanie: “Jak bardzo lubisz… ?”. Czyli w skrócie, muszę sklasyfikować odpowiedź w podane ramy – jest to więc klasyfikacja (ściśle multi-klasyfikacja).

Ponieważ chcę przewidywać wiele wartości, a nie tylko jedną mógłbym spróbować tzw. multi-label classification, jednak (po rozmowie z Mariuszem Gilem – na 4Developers) stwierdziłem że zacznę od klasyfikowania każdej wartości osobno tworząc po prostu wiele modeli. Mam nadzieję, że to podejście pozwoli mi na uzyskanie względnie wysokiej dokładności.

Podział danych na treningowe i testowe:

Ostatnim,  a przynajmniej tak mi się wydawało, etapem przed wyborem algorytmu miało być podzielenie danych na treningowe i testowe. Scikit-learn pozwala na łatwe wykonanie tej operacji korzystając z metody train_test_split z modułu cross_validation. Po podziale przyjrzałem się otrzymanym wynikom i zacząłem się spodziewać problemów. W moim zbiorze danych, każda kolumna posiada wartości źle zbalansowane. Co to znaczy? Podział ocen jest bardzo nierównomierny – okazuje się, że dla większości kolumn wynikowych (czyli tych które chcemy przewidzieć) jest np. bardzo dużo ocen równych 4, czy 5, ale bardzo mało dla 1 czy 2. Gdybym próbował trenować model w takiej postaci to poziom osiągniętej dokładności byłby bardzo niski.

Poradziłem sobie z tym problemem, przynajmniej w tej iteracji, korzystając z metody tzw. under-sampling’u (dokładnie z EasyEnsemble dostarczanego z modułem imbalanced-learn). Polega ona przede wszystkim na zbliżeniu ilości wierszy dla każdej z klas (czyli w moim przypadku dla liczb całkowitych od 1 do 5) poprzez usunięcie nadmiaru wierszy dla klas które ich mają dużo w porównaniu z pozostałymi klasami. W efekcie w moim modelu pozostało zaledwie 100 wierszy (po 20 dla każdej klasy). Na ten moment wydaje mi się, że jest to jedna z rzeczy którą będę musiał poprawić w przyszłej iteracji.

Po zrobieniu tego wszystkiego mogłem wybrać algorytm startowy – uczenie maszynowe do proces iteracyjny , wiec rzadko kiedy zdarza się by za pierwszym razem uzyskać pożądaną wydajność. Ja jako algorytm startowy wybrałem, dosyć losowo, tzw. One vs. all multiclass, który dał bardzo dobre wyniki na zbiorze treningowym, ale bardzo słabe na zbiorze testowym. O tym jednak następnym razem.

Co dalej?

W najbliższym czasie będę chciał napisać o konwencjach pracy z algorytmami uczącymi przy wykorzystaniu scikit-learn. Oprócz tego szykuję wpis dotyczący testowania modelu. Gdzieś w przyszłości chciałbym tez napisać trochę więcej o poszczególnych rodzajach algorytmów, ale na ten temat sam na razie zdecydowanie zbyt mało wiem, więc jest to pieśń przyszłości.

Dodaj komentarz

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