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.
Dane: Titanic
W praktyce
- Diagnoza:
df.isna().mean()i porównanie celu w grupachdf.groupby(df['x'].isna())['y'].mean(). - Proste uzupełnianie:
SimpleImputer(strategy='median'), zadd_indicator=Truedla cechy „był brak”. - Imputacja oparta na sąsiadach lub modelu:
KNNImputer,IterativeImputer(wymagafrom 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