Dzisiaj o tym, jak radzić sobie z brakującymi danymi. Zacznijmy od krótkiego cytatu.

„Życie jest jak pudełko czekoladek, nigdy nie wiesz, na co trafisz…”.

Forrest Gump

Jak jest z danymi?

Podobnie, choć jest niemal pewne, że prędzej czy później trafisz na brakujące dane. I choć nie me idealnego sposobu by ten brak czymś zastąpić to są metody, które pozwalają sobie z tym problemem radzić.

Zadasz sobie być może filozoficzne pytanie: „Po co zaprzątać sobie głowę brakującymi danymi?”

Praktyczny powód jest taki, że większość algorytmów nie działa poprawnie, jeżeli nie mamy kompletu danych. Wyjątkami od tej reguły są najnowsze biblioteki XGBoost, CatBoost i LighgtGBM.

Jakie więc mamy możliwości w zakresie radzenia sobie z brakiem danych? Praktycznie są 3 sposoby:

  • braki usunąć,
  • zrobić imputację (czyli zamienić brakujące dane na coś innego),
  • oznaczyć miejsca gdzie danych brakuje a następnie zrobić imputację.

Jesteśmy dalej w klimacie Forresta Gumpa, pokażę więc 3 strategie, na przykładowym zbiorze o krewetkach.

logo Bubba Gump Shrimp Company
Żródło: https://en.wikipedia.org/wiki/Bubba_Gump_Shrimp_Company

Jeśli ktoś kojarzy Bubba, kolega Forresta z wojska lubił krewetki i wiedział o nich wszystko.

Forrest co nieco tej wiedzy zachował i postanowił zbierać informację na ich temat. Zostając poławiaczem krewetek, dorobił się zbioru danych, który wyglądał mniej więcej tak, jak poniżej.

Zbiór danych o krewetkach według Forresta Gumpa, widać brakujące dane
Zbiór danych o krewetkach według Forresta Gumpa.
Źródło: Opracowanie własne.

Da się zauważyć pewne braki (NaN) i warto coś z nimi zrobić jeśli ten zbiór miałby do czegoś posłużyć.

Usuwanie Braków

Usuwanie brakujących danych intuicyjnie wydaje się mało optymalnym rozwiązaniem. Przy okazji usuwania braków, usuwamy część informacji, co sprowadza nas do dwóch wniosków:

  • brak informacji może być informacją samą w sobie,
  • w realnym świecie często musimy podejmować decyzję na podstawie niepełnej informacji.

No dobrze, ale jak w praktyce wygląda proste usunięcie braków?

Za pomocą funkcji dropna() pozbywamy się wierszy gdzie jest NaN.

usunięcie brakujących danych po wierszach
Po funkcji dropna() zostały tylko 2 wiersze

Zamiast usuwać wiersze możemy usunąć kolumny z brakującymi danymi za pomocą dropna(axis=1).

usunięcie brakujacych danych po kolumnach
Usuniecie danych po kolumnach dropna(axis=1) pozbawiło nas danych

Skrajny przykład, tego, jak sporo możemy stracić. Na tym etapie praca zakończona, bo nie ma już nad czym pracować.

Imputacja Wartości w Miejsce Braków

Imputacja też nie wydaje się do końca optymalna. Stosując nawet wyszukane metody wprowadzania danych, których nie znamy znowu:

  • tracimy informację o tym, że nie mamy wszystkich danych,
  • jeżeli stworzymy model do wprowadzania, wartości to dalej nie dodajemy żadnej realnej informacji. Staramy się odkryć wzór i powielić go dla danego atrybutu.

Jak więc podchodzimy do imputacji?

Zazwyczaj wprowadza się wartości, które można wyliczyć dla danego atrybutu typu: średnia, mediana, wartość minimalna, wartość maksymalna, najczęściej występująca wartość. Czasami wprowadza się 0 lub jakąś stałą wartość. Można skorzystać też z innych bardziej wyszukanych metod opisanych tutaj.

Przykład imputacja danych dla wszystkich braków (braki uzupełnimy 0).

imputacja brakujących danych zerami
Imputacja braków za pomocą fillna(0)

Oznaczenie Braków i Imputacja

Ostatnia strategia polega na przyjęciu założenia, że brak danych jest także informacją, którą należałoby przekazać algorytmowi.

W tym celu należy stworzyć osobną kolumnę, która jest oznaczeniem miejsca, gdzie brakuje danych.

A co robimy z brakami?

Robimy imputację za pomocą metody, która wydaje nam się optymalna dla danego problemu.

Jak zatem wyglądałby scenariusz pracy z danymi dla tej strategi?

Dla kategorii, czyli kolumny Gatunek tworzymy po prostu nową kategorię np. brak. Tutaj nie trzeba już tworzyć osobnej kolumny informującej o brakujących danych.

imputacja brakujących danych w danych kategorycznych
Braki w kategoriach wypełniamy poprzez stworzenie nowej kategorii ‚brak’

Teraz braki w kolumnach numerycznych. Na bazie istniejących kolumn z brakami tworzymy nowe, które tam, gdzie mają 1.

nowe kolumny z oznaczeniem gdzie są brakujące dane
Stworzenie nowych kolumn z oznaczeniem gdzie są braki.

Teraz imputacja brakujących danych, czyli to, co już znamy.

imputacja danych w miejsce brakujących danych numerycznych
Wypełnienie braków dla danych numerycznych

W ten sposób zachowaliśmy wszystkie dane łącznie, z informacją gdzie brakuje pierwotnych danych. Teraz dane są gotowe na następne etapy.

Podsumowanie

Poznałeś 3 strategie radzenia sobie z brakami:

  • usuwanie,
  • imputacja,
  • oznaczenie braków w nowych kolumnach i imputacja.

Jeśli nie chcemy tracić informacji ze zbioru najbardziej optymalnym rozwiązaniem jest oznaczanie braków i imputacja.

Źródła:

Kategorie: Proces