ML Atlas

02 · Dane · 4 min czytania · Interaktywne · aktualizacja

Jak radzić sobie z brakującymi danymi w uczeniu maszynowym?

W skrócie

Brak danych rzadko jest przypadkowy. Mechanizm braków (MCAR, MAR, MNAR) decyduje, czy usunąć wiersze, imputować wartości, czy uczynić z braku osobną cechę.

Co to jest

Brakujące wartości to komórki tabeli, w których nie ma pomiaru: pacjent nie podał wagi, czujnik się wyłączył, pole w formularzu było opcjonalne. Imputacja to wstawianie w ich miejsce wartości zastępczych — średniej, mediany, przewidywania innego modelu — tak, by algorytm mógł przetworzyć wiersz.

Kluczowe pytanie nie brzmi „czym uzupełnić?”, tylko „dlaczego tej wartości nie ma?”. Ten sam odsetek braków może być niewinny albo całkowicie zmieniać wnioski — zależnie od tego, kto i dlaczego nie ma pomiaru.

Intuicja: w ankiecie o dochodach najczęściej odmawiają odpowiedzi osoby najbogatsze i najbiedniejsze. Średnia z udzielonych odpowiedzi opisuje wtedy środek, a nie całą populację.

Mechanizm — dlaczego tak działa

Rubin (1976) wyróżnił trzy mechanizmy. MCAR (missing completely at random) — brak nie zależy od niczego, np. losowo zgubione kartki. Usunięcie takich wierszy zmniejsza próbę, ale nie zniekształca wyników. MAR (missing at random) — brak zależy od innych zmiennych obserwowanych, np. młodsi rzadziej podają wagę. Można to skorygować, modelując braki na podstawie tych zmiennych. MNAR (missing not at random) — brak zależy od samej brakującej wartości, np. ciężej chorzy rzadziej przychodzą na badanie kontrolne. Tego nie da się naprawić wyłącznie danymi, które mamy.

Usuwanie wierszy z brakami (listwise deletion) jest bezpieczne tylko przy MCAR. Przy MAR i MNAR zostaje próba systematycznie różna od populacji — to forma błędu doboru próby.

Prosta imputacja średnią lub medianą zachowuje liczbę wierszy, ale ma koszt. Wszystkie braki dostają tę samą wartość, więc rozkład zyskuje sztuczny szczyt, wariancja maleje, a korelacje z innymi zmiennymi słabną. Model widzi ludzi „dokładnie przeciętnych”, których w rzeczywistości nie ma. Imputacja warunkowa (medianą w grupie, regresją, k najbliższymi sąsiadami) zachowuje więcej struktury. Imputacja wielokrotna (multiple imputation) losuje kilka wersji uzupełnień, by odzwierciedlić niepewność — standard w statystyce wnioskującej.

W uczeniu maszynowym często najcenniejszy jest sam fakt braku. Jeśli brak niesie informację (MAR lub MNAR), dodanie cechy binarnej „wartość była pusta” pozwala modelowi to wykorzystać. Część algorytmów, np. gradient boosting w implementacjach LightGBM czy HistGradientBoostingClassifier, obsługuje braki natywnie: uczy się, w którą stronę drzewa kierować puste wartości.

Ważna zasada techniczna: statystyki do imputacji (średnią, medianę, model) wyznacza się na zbiorze treningowym i dopiero potem stosuje do walidacyjnego i testowego. Liczenie ich na całości to subtelny wyciek danych.

Na przykładzie

W zbiorze Titanic (891 pasażerów) brakuje wieku u 177 osób (19,9%), pokładu u 688 (77,2%) i portu zaokrętowania u 2. Czy braki są losowe? Nie. Wśród pasażerów bez zapisanego wieku przeżyło 29,4%, wśród pozostałych 40,6%. Pokładu brakuje u 19% pasażerów pierwszej klasy, ale u 91% drugiej i 98% trzeciej; przeżywalność przy znanym pokładzie to 67,0%, przy nieznanym 29,9%. Brak pokładu jest więc w praktyce wskaźnikiem niskiej klasy — cechą informacyjną, nie szumem.

Imputacja wieku medianą (28 lat) sprawia, że 22,7% pasażerów ma wiek dokładnie 28, a odchylenie standardowe spada z 14,5 do 13,0 roku. Mediana warunkowa jest znacznie rozsądniejsza: dorosły mężczyzna w pierwszej klasie ma medianę 42 lata, dziecko w trzeciej klasie — 6 lat. Kolumna who (mężczyzna, kobieta, dziecko) pochodzi z tytułów w nazwiskach („Master” oznaczał chłopca), więc niesie informację o wieku także tam, gdzie wiek nie został zapisany.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: wiek brakuje u 177 z 891 pasażerów Titanica; wypełnienie średnią tworzy szpic 177 identycznych wartości i zaniża rozrzut.

Dane: Titanic

W praktyce

  • Diagnoza: df.isna().mean() i porównanie celu w grupach df.groupby(df['x'].isna())['y'].mean().
  • Proste uzupełnianie: SimpleImputer(strategy='median'), z add_indicator=True dla cechy „był brak”.
  • Imputacja oparta na sąsiadach lub modelu: KNNImputer, IterativeImputer (wymaga from sklearn.experimental import enable_iterative_imputer).
  • Imputer zawsze wewnątrz Pipeline, żeby uczył się tylko na danych treningowych w każdym foldzie walidacji krzyżowej.
  • Kolumny z ogromnym odsetkiem braków (np. ponad 70–80%) często lepiej zamienić na samą cechę „znane/nieznane” niż imputować.
  • Typowy błąd: kod braku zapisany jako liczba (−1, 0, 999) i potraktowany jak zwykła wartość.

Najczęstsze pytania

Czy można po prostu usunąć wiersze z brakami?
Można, jeśli braków jest mało i są całkowicie losowe (MCAR). W przeciwnym razie usunięcie zmienia skład próby i model uczy się na populacji innej niż ta, na której będzie działał.
Średnia czy mediana do imputacji?
Dla zmiennych skośnych mediana, bo nie jest ciągnięta przez skrajne wartości. Obie metody zaniżają wariancję i osłabiają korelacje, więc przy dużym odsetku braków lepsza jest imputacja warunkowa.
Jak sprawdzić, czy braki są losowe?
Porównaj rozkłady innych zmiennych i celu w wierszach z brakiem i bez niego. Duże różnice wykluczają MCAR. MNAR nie da się jednak udowodnić ani wykluczyć z samych danych — potrzebna jest wiedza o tym, jak dane zbierano.

Źródła

  • Rubin D. B. (1976). „Inference and Missing Data”. Biometrika, 63(3), 581–592.
  • Little R. J. A., Rubin D. B. „Statistical Analysis with Missing Data”, 3rd ed., Wiley, 2019.
  • van Buuren S. „Flexible Imputation of Missing Data”, 2nd ed., CRC Press, 2018.
  • Hastie T., Tibshirani R., Friedman J. „The Elements of Statistical Learning”, 2nd ed., 2009, rozdz. 9.6 (Missing Data).
  • Dokumentacja scikit-learn: Imputation of missing values, https://scikit-learn.org/stable/modules/impute.html

Zobacz też