ML: Obróbka danych: Brakujące dane

Dawno dawno temu,

w poście mówiącym o przygotowaniu modelu jako części workflow uczenia maszynowego, pisałem że aby nasz model był jak najbardziej skuteczny wymaga dostarczenia dobrej jakości danych. Dobrej jakości dane nie rosną same na drzewach czerwono czarnych. Trzeba niestety samemu o nie zadbać i poprawić trapiące je problemy. Jakie to mogą być problemy? Zastanówmy się patrząc na poniższy “wycinek” pochodzący ze znanego zbioru z danymi dotyczącego katastrofy Titanica (nie będę opisywał tutaj tego datasetu (dataseta?) więc wszystkich zainteresowanych odsyłam tutaj , gdzie będziecie mogli go również ściągnąć):

MissingValuesTitanic

W oczy rzuca się kilka kwestii:

  • W zbiorze posiadamy kolumny gdzie znajdują się brakujące dane – na powyższym wycinku są one w kolumnach Age i Cabin, ale oczywiście może być ich więcej.
  • Wiele kolumn posiada dane kategoryzujące. Zarówno nominalne(np. kolumna Sex) jak i porządkowe(np. kolumna Pclass). Dane te są przedstawione zarówno w postaci numerycznej jak i w postaci łańcuchów znaków.
  • Dane numeryczne nie są przeskalowane (np. kolumna Age).
  • Dane mogą (ale nie muszą) się duplikować.
  • Oprócz tego oczywiście trzeba wybrać kolumnę której wartość chcemy przewidywać, oraz wyselekcjonować odpowiednie kolumny, na podstawie których chcemy przewidywać.

Dziś chciałbym omówić temat brakujących danych.

Brakujące dane

są powszechnym problemem. Często zdarza się, że wartość nie została zapisana czy to z powodu błędu człowieka, czy z powodu błędu komputera. Gdy w wierszu znajduje się brakująca wartość nie możemy jej zostawić “ot tak”, ponieważ może to drastycznie wpłynąć na pogorszenie dokładności estymacji. Jednocześnie należy pamiętać, że brak też może nieść pewną informację – wszystko zależy od kontekstu i wymaga wiedzy domenowej związanej ze zbiorem. W tym wpisie zaprezentuje sposoby radzenia sobie z brakującymi danymi, w oderwaniu od kontekstu.

Załadujmy zbiór, którego wycinek widać na screenie, do pamięci komputera i zobaczmy czego możemy się o nim dowiedzieć:

Po uruchomieniu powyższego kodu możemy zobaczyć, że brakuje wartości w 177 wierszach w kolumnie Age,  w 687 wierszach w kolumnie Cabin oraz w 2 wierszach w kolumnie Embarked.

Jeżeli chcemy sprawdzić osobno daną kolumnę pod kątem brakujących wartości, możemy zrobić to w taki sposób:

Pierwsza linia powyższego kodu zwraca wartość boolowska określającą czy w podanej kolumnie znajdują się jakiekolwiek brakujące wartości. Druga zwraca ich ilość (W naszym przypadku 177).

Sposoby radzenia sobie z brakującymi danymi

Usuwanie kolumn/wierszy:

Jeżeli chodzi o usuwanie wierszy to metoda ta sprawdza się w przypadku, gdy ilość wierszy z brakującymi danymi jest niewielka w porównaniu do wszystkich próbek (w realnym świecie nie zapominajmy też o kontekście :))

W naszym przypadku brakujące dane w kolumnie Age stanowią ~20% całości, w kolumnie Embarked ~0.2% całości, a w kolumnie Cabin ~77%. Wydaje się więc, że możemy usunąć jedynie wiersze z brakującymi wartościami z kolumny Embarked. Możemy to zrobić w następujący sposób:

Możemy też zastanowić się nad usunięciem całej kolumny Cabin. Tutaj rozwiązaniem jest albo nie branie jej pod uwagę podczas wyboru cech do uczenia, albo skorzystanie z poniższej komedy (poskutkuje to trwałym usunięciem jej z wczytanego zbioru):

Drugi parametr oznacza oś usuwania – 0 dla wierszy i 1 dla kolumn.

 Wstawianie(imputacja) brakujących danych jako mediany/średniej – dla wartości numerycznych :

Ta metoda sprawdza się jeżeli liczba wierszy z brakującymi wartościami stanowi nie więcej niż 10 – 15%. W datasecie, którym się zajmujemy nie ma takiego przypadku, ale pokażę tę metodę na przykładzie kolumny Age, gdzie jest ~20% brakujących wartości. Najprostszym sposobem, jeżeli chcemy wstawić dane tylko dla jednej kolumny, jest użycie poniższej komendy:

Pierwsze dwie linijki wyliczają kolejno średnią i medianę. Trzecia zamienia wszystkie brakujące dane w kolumnie Age, na średnią wartości w kolumnie.

Oprócz tego biblioteka Pandas udostępnia klasę Imputer pozwalającą na wygodne wstawianie danych (dla wielu kolumn na raz również). Zamiast powyższej metody możemy zrobić coś takiego:

 Imputacja brakujących danych jako stałej- dla wartości kategoryzujących:

Metoda analogiczna do poprzedniej, ale dla danych kategoryzujących (jak np. wartości w kolumnie Cabin). Polega na wprowadzeniu nowej kategorii dla brakujących danych.

 Szukanie brakujących wartości za pomocą ML:

Nic nie stoi na przeszkodzie abyśmy spróbowali znaleźć brakujące wartości, na podstawie innych cech zbioru, korzystając z uczenia maszynowego. Oczywiście rodzi to kolejne problemy – musimy odpowiedzieć sobie na pytanie jaki wpływ będzie miała błędna estymacja na resztę wyników – ale może to być również potężne narzędzie. Z oczywistych względów nie przedstawię tu przykładu – musielibyśmy poradzić sobie z pozostałymi problemami, a o ich rozwiązaniach chciałbym popełnić kolejne wpisy 🙂


 

Jeżeli chodzi o brakujące wartości to powyższe sposoby radzenia powinny być wystarczające do tworzenia modeli, gdzie braki w zbiorze nie będą stanowiły powodu niedostatecznej wydajności. W kolejnym wpisie związanym z obróbką danych będę chciał omówić sposoby radzenia sobie z problemami dotyczącymi danych kategoryzujących. Opiszę czym różnią się dane kategoryzujące porządkowe od nominalnych, oraz w jaki sposób sprawiać by były zrozumiałe dla algorytmów uczenia maszynowego.

Dodaj komentarz

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