ML Atlas

11 · Prawa i prawdy · 4 min czytania · Interaktywne · aktualizacja

Czym jest wyciek danych w uczeniu maszynowym i jak go uniknąć?

W skrócie

Wyciek danych to sytuacja, w której model w treningu lub walidacji dostaje informację niedostępną w chwili prawdziwej prognozy. Daje zawyżone wyniki.

Co to jest

Każda informacja, która w chwili prawdziwej prognozy nie byłaby dostępna, a mimo to trafiła do treningu lub oceny modelu, zawyża jego zmierzoną skuteczność. Pojęcie usystematyzowali Shachar Kaufman, Saharon Rosset, Claudia Perlich i Ori Stitelman w 2012 roku; Sayash Kapoor i Arvind Narayanan w 2023 roku pokazali, że wyciek odpowiada za błędy w setkach prac naukowych korzystających z ML.

Wyciek ma dwie główne postaci. Wyciek celu: cecha zawiera ślad etykiety, np. „data wypisu ze szpitala” w modelu przewidującym hospitalizację albo „kwota zwrotu” w modelu przewidującym reklamację. Wyciek z podziału: informacja ze zbioru walidacyjnego lub testowego przenika do treningu — przez skalowanie, selekcję cech, imputację czy dobór hiperparametrów na całych danych, przez duplikaty albo przez ten sam obiekt obecny po obu stronach podziału.

Objaw jest zawsze ten sam: wynik w walidacji jest wyraźnie lepszy niż po wdrożeniu. Wyciek to najczęstszy powód „cudownych” wyników, które nie powtarzają się w praktyce.

Mechanizm — dlaczego tak działa

Walidacja ma symulować przyszłość: model ocenia się na danych, których nie widział. Każdy krok przetwarzania dopasowany do danych — średnia do imputacji, parametry skalowania, wybór najlepszych cech — jest częścią modelu. Jeśli ten krok zobaczył dane walidacyjne, model pośrednio się na nich uczył.

Najgroźniejsza jest selekcja cech. Wśród tysięcy cech czystego szumu niektóre przypadkowo korelują z etykietą w danym zbiorze. Jeśli wybierzemy je na całych danych, a potem przeprowadzimy walidację krzyżową, te przypadkowe korelacje są obecne także w foldach walidacyjnych — model „odkrywa” zależność, którą sami tam wprowadziliśmy. Hastie, Tibshirani i Friedman opisują to jako „zły i dobry sposób walidacji krzyżowej”; Ambroise i McLachlan w 2002 roku pokazali, że ten błąd zawyżał wyniki prac o klasyfikacji na danych z mikromacierzy genowych.

Siła wycieku zależy od stosunku liczby cech do liczby przykładów i od tego, ile informacji przenosi dany krok. Skalowanie przenosi niewiele (dwie liczby na cechę), więc przy dużych zbiorach jego wpływ bywa pomijalny. Selekcja spośród tysięcy cech przenosi bardzo dużo. Wyciek celu potrafi dać prawie idealny wynik niezależnie od wszystkiego.

W szeregach czasowych dochodzi wyciek z przyszłości: losowy podział miesza przeszłość z przyszłością, a cechy liczone na oknach (średnie kroczące) mogą zawierać wartości późniejsze niż moment prognozy.

Na przykładzie

Breast Cancer Wisconsin (569 przypadków, 30 cech), 5-krotna walidacja krzyżowa. Standaryzacja przed podziałem i kNN: 0,965. Standaryzacja wewnątrz potoku: też 0,965. Selekcja 5 najlepszych cech spośród 30 prawdziwych i 2000 szumowych przed podziałem: 0,947; wewnątrz potoku: 0,947. Na tym zbiorze, z silnym sygnałem, wyciek nic nie zmienił — i to jest pułapka, bo uczy, że „nie ma problemu”.

Teraz te same etykiety, ale wyłącznie cechy z czystego szumu. Wybór 20 „najlepszych” z 10 000 kolumn szumu przed walidacją daje dokładność 0,71 — powyżej odsetka najczęstszej klasy (0,63), więc wygląda na sygnał. Ta sama selekcja wewnątrz potoku daje 0,50: prawdy nie ma. Na losowej podpróbce 60 pacjentów różnica jest dramatyczna: 0,98 z wyciekiem wobec 0,48 bez niego. Model na czystym szumie wyglądał na niemal idealny.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: na 60 próbkach czystego szumu (1000 kolumn, losowe etykiety) wybór 10 cech przed walidacją krzyżową daje pozorne 82% trafności, a wybór wewnątrz każdego podziału uczciwe 43% — poziom zgadywania.

Dane: Breast Cancer Wisconsin (diagnostyka raka piersi)

W praktyce

  • Każdy krok dopasowywany do danych umieszczaj w Pipeline / make_pipeline razem z modelem i dopiero całość podawaj do cross_val_score lub GridSearchCV.
  • Gdy jeden obiekt (pacjent, klient, sesja) ma wiele wierszy, dziel danymi grupami: GroupKFold, GroupShuffleSplit.
  • W szeregach czasowych używaj TimeSeriesSplit i licz cechy wyłącznie z przeszłości względem momentu prognozy.
  • Dla każdej cechy zadaj pytanie: czy znałbym tę wartość w chwili podejmowania decyzji? Podejrzanie ważne cechy sprawdzaj w pierwszej kolejności.
  • Usuń duplikaty i prawie-duplikaty przed podziałem; sprawdź, czy zbiór testowy nie zawiera wierszy z treningu.

Najczęstsze pytania

Czy skalowanie przed podziałem to naprawdę wyciek?
Formalnie tak, bo parametry skalowania zawierają informację z danych walidacyjnych. Praktycznie przy dużych zbiorach skutek bywa znikomy. Mimo to warto zawsze używać potoku — ten sam nawyk chroni przed groźnymi przypadkami, jak selekcja cech czy kodowanie docelowe.
Jak rozpoznać wyciek, gdy wynik jest po prostu dobry?
Sygnały ostrzegawcze: wynik znacznie lepszy niż w literaturze lub u konkurencji, jedna cecha dominująca ważność, duży spadek między walidacją a nowymi danymi. Wtedy przejrzyj pochodzenie i czas powstania każdej ważnej cechy.
Czym wyciek różni się od uczenia na skróty?
Wyciek to błąd w przygotowaniu danych lub procedurze oceny. Uczenie na skróty to zachowanie modelu, który korzysta z przypadkowej cechy obecnej w danych. Wyciek często tworzy skróty, ale skrót może istnieć bez wycieku.

Źródła

  • Kaufman S., Rosset S., Perlich C., Stitelman O. (2012). Leakage in Data Mining: Formulation, Detection, and Avoidance. ACM Transactions on Knowledge Discovery from Data, 6(4), 15.
  • Kapoor S., Narayanan A. (2023). Leakage and the Reproducibility Crisis in Machine-Learning-Based Science. Patterns, 4(9), 100804.
  • Ambroise C., McLachlan G. J. (2002). Selection Bias in Gene Extraction on the Basis of Microarray Gene-Expression Data. PNAS, 99(10), 6562–6566.
  • Hastie T., Tibshirani R., Friedman J. (2009). The Elements of Statistical Learning, 2nd ed. Springer, rozdz. 7.10.2.
  • scikit-learn: Common pitfalls and recommended practices, https://scikit-learn.org/stable/common_pitfalls.html

Zobacz też