ML Atlas

04 · Ocena · 4 min czytania · aktualizacja

Dlaczego wysoka trafność na treningu nie przekłada się na nowe dane?

W skrócie

Wysoki wynik na zbiorze treningowym może być zapamiętaniem przykładów, a nie reguły. Prawdę o modelu mówi tylko wynik na danych, których model nie widział.

Co to jest

Złudzenie trafności treningowej to sytuacja, w której model osiąga wysoką trafność na przykładach, na których się uczył, a na nowych danych wypada znacznie gorzej — w skrajnym przypadku jak rzut monetą. To praktyczna twarz przeuczenia i powód, dla którego w każdym projekcie ML istnieje zbiór walidacyjny i testowy.

Dotyczy w równym stopniu sieci neuronowych, drzew decyzyjnych, boostingu i dostrajania dużych modeli językowych.

Intuicja: uczeń, który wykuł na pamięć odpowiedzi do zeszłorocznego testu, dostanie z niego 100%. To nic nie mówi o tym, czy zda tegoroczny — bo nie wiadomo, czy nauczył się przedmiotu, czy listy odpowiedzi.

Mechanizm — dlaczego tak działa

Trening minimalizuje stratę na konkretnych przykładach. Jeśli model ma dość swobody, może tę stratę obniżyć na dwa sposoby: nauczyć się reguły, która łączy cechy z etykietą, albo zapamiętać, które punkty mają jaką etykietę. Z punktu widzenia straty treningowej oba sposoby wyglądają identycznie. Różnicę widać dopiero na punktach, których w treningu nie było: reguła przenosi się na nie, zapamiętane etykiety — nie.

Przykład graniczny: reguła typu XOR (wynik pozytywny, gdy spełniony jest dokładnie jeden z dwóch warunków). Model liniowy nie może wyrazić tej reguły, ale kilkanaście przypadkowo ułożonych punktów prawie zawsze da się przeciąć prostą tak, by większość wypadła dobrze — zwłaszcza gdy inne, nieistotne cechy przypadkiem korelują z etykietą w małej próbce. Wynik treningowy jest wtedy wysoki, a wynik na nowych danych bliski 50%, bo reguły w wagach nie ma.

Ogólna zasada: wynik treningowy jest obciążony w górę, bo wagi zostały dobrane tak, by na tych właśnie punktach wypaść dobrze. Oczekiwana wartość tego obciążenia (tzw. optymizm błędu treningowego, opisany u Hastiego i in.) rośnie z pojemnością modelu i maleje z liczbą przykładów. Nieobciążone oszacowanie daje tylko próbka, która nie brała udziału w żadnej decyzji o modelu — ani w treningu, ani w strojeniu hiperparametrów.

Zastrzeżenie: wynik testowy też bywa złudzeniem, jeśli informacja z testu przeciekła do treningu — ta sama osoba, ten sam dzień, standaryzacja policzona na całości. Wtedy obie liczby kłamią zgodnie.

Na przykładzie

Drzewo decyzyjne bez ograniczenia głębokości (DecisionTreeClassifier(random_state=0)) na Breast Cancer Wisconsin (podział 75/25 z warstwowaniem, random_state=0) osiąga 100% na treningu i 90,2% na teście. Ten sam algorytm na tych samych cechach, ale z etykietami treningowymi losowo przetasowanymi, też osiąga 100% na treningu — potrzebuje tylko więcej liści (82 zamiast 18) — a na teście 58,0%, niewiele ponad zgadywanie. Sama trafność treningowa nie odróżnia modelu, który nauczył się diagnozy, od modelu, który zapamiętał szum.

Na Titanicu (891 pasażerów, cechy: klasa, płeć, wiek, rodzina, opłata, port; brakujący wiek zastąpiony wartością −1; ten sam podział) drzewo bez ograniczeń ma 98,7% na treningu i 76,7% na teście. Drzewo o głębokości 3 ma na treningu tylko 82,0%, a na teście 77,1% — czyli więcej. Wyższa trafność treningowa kupiła tu wyłącznie zapamiętanie.

Dane: Titanic Breast Cancer Wisconsin (diagnostyka raka piersi)

W praktyce

  • Zawsze raportuj wynik na odłożonych danych; wynik treningowy traktuj jako diagnostykę (czy model w ogóle potrafi dopasować dane), nie jako ocenę.
  • scikit-learn: porównanie model.score(X_train, y_train) z model.score(X_test, y_test) to pierwszy test na przeuczenie; cross_val_score daje stabilniejszy obraz.
  • Drzewa bez ograniczenia głębokości (max_depth=None) mają zwykle 100% na treningu — to normalne i nic nie mówi.
  • Przy danych z grupami (pacjenci, sesje, dni) dziel po grupach (GroupKFold), inaczej wynik testowy też staje się złudzeniem.
  • Typowy błąd: dostrajanie modelu, aż wynik treningowy przestanie rosnąć, bez patrzenia na walidację.

Najczęstsze pytania

Dlaczego mój model ma 95% na treningu i 60% na teście?
Bo zapamiętał przykłady treningowe zamiast nauczyć się reguły — ma za dużą pojemność względem liczby danych — albo model nie potrafi wyrazić reguły i dopasował się do przypadkowych korelacji. Pomagają: więcej danych, regularyzacja, prostszy model, odpowiednia architektura.
Czy wynik na treningu jest w ogóle do czegoś przydatny?
Tak, jako diagnostyka. Niski wynik treningowy oznacza niedouczenie (model nie potrafi nawet dopasować danych). Wysoki wynik treningowy przy niskim walidacyjnym oznacza przeuczenie. Sam w sobie nigdy nie jest oceną jakości modelu.
Jak uczciwie ocenić model?
Odłóż część danych przed jakąkolwiek decyzją (podział, standaryzacja, wybór cech) i użyj jej raz, na końcu. Hiperparametry stroisz na osobnej walidacji lub walidacji krzyżowej. Jeśli dane mają grupy (pacjenci, sesje), dziel po grupach, nie po wierszach.

Źródła

  • Goodfellow, Bengio, Courville (2016). Deep Learning, rozdz. 5.2 "Capacity, overfitting and underfitting", 5.3 "Hyperparameters and validation sets". https://www.deeplearningbook.org/contents/ml.html
  • Hastie, Tibshirani, Friedman (2009). The Elements of Statistical Learning, 2nd ed., rozdz. 7.2 "Bias, variance and model complexity", 7.4 "Optimism of the training error rate".
  • Géron, A. (2022). Hands-On Machine Learning, 3rd ed., rozdz. 1 "Overfitting the training data", "Testing and validating".
  • Minsky, M., Papert, S. (1969). Perceptrons. MIT Press.

Zobacz też