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)zmodel.score(X_test, y_test)to pierwszy test na przeuczenie;cross_val_scoredaje 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.