ML Atlas

02 · Dane · 4 min czytania · aktualizacja

Jak i dlaczego dzielić dane na zbiór treningowy i testowy?

W skrócie

Zbiór testowy to dane, których model nie widział, więc mierzy działanie na nowych przypadkach. Podział ma naśladować użycie: losowo, warstwowo lub w czasie.

Co to jest

Podział na zbiór treningowy i testowy to odłożenie części danych — zwykle 20–30% — przed jakimkolwiek uczeniem. Model uczy się wyłącznie na zbiorze treningowym, a zbiór testowy służy na końcu do jednorazowej oceny, jak model poradzi sobie z danymi, których nigdy nie widział.

Bez tego nie wiemy, czy model nauczył się wzorca, czy zapamiętał przykłady. Wynik na danych treningowych jest zawsze zbyt optymistyczny, a im bardziej elastyczny model, tym bardziej: drzewo bez ograniczeń czy 1-NN osiągają na treningu 100% niezależnie od tego, czy cokolwiek zrozumiały.

Intuicja: egzamin z tych samych zadań, które były na ćwiczeniach, sprawdza pamięć, nie umiejętności. Zbiór testowy to egzamin z nowych zadań.

Mechanizm — dlaczego tak działa

Celem uczenia jest mały błąd na przyszłych danych z tego samego rozkładu (błąd uogólnienia). Błąd treningowy jest jego obciążonym oszacowaniem, bo parametry dobrano właśnie pod te przykłady. Zbiór testowy, niezależny od procesu dopasowania, daje oszacowanie nieobciążone — ale tylko pod warunkiem, że rzeczywiście pozostaje nietknięty.

Każda decyzja podjęta na podstawie wyniku testowego — wybór modelu, hiperparametrów, cech, progu — „wpuszcza” informację z testu do modelu. Po kilkudziesięciu takich próbach wynik testowy staje się równie optymistyczny jak walidacyjny. Dlatego decyzje podejmuje się na osobnym zbiorze walidacyjnym albo walidacją krzyżową na części treningowej, a test otwiera się raz, na końcu.

Drugi problem to wariancja. Wynik na zbiorze testowym to statystyka z próby: przy 100 przykładach testowych i prawdziwej trafności 90% błąd standardowy wynosi około 3 punktów procentowych. Inny losowy podział da inną liczbę. Przy małych zbiorach jeden podział jest więc loterią, a walidacja krzyżowa (średnia z wielu podziałów) daje stabilniejszą ocenę.

Trzeci problem: podział musi naśladować sposób, w jaki model będzie używany. Losowy podział zakłada, że przykłady są niezależne. Warstwowy (stratified) zachowuje proporcje klas, co ma znaczenie przy rzadkich klasach i małych zbiorach. Grupowy trzyma wszystkie obserwacje jednej osoby, pacjenta czy urządzenia po tej samej stronie — inaczej model rozpoznaje osobę, a nie zjawisko. Czasowy uczy na przeszłości i testuje na przyszłości — jedyny uczciwy wybór dla prognoz.

Wszystkie kroki przetwarzania, które uczą się z danych (skalowanie, imputacja, selekcja cech, kodowanie celu), dopasowuje się po podziale, tylko na części treningowej. Skalowanie na całym zbiorze przed podziałem to klasyczny, choć zwykle drobny, wyciek danych.

Na przykładzie

Regresja logistyczna na zbiorze Breast Cancer Wisconsin (569 guzów), oceniana na 200 różnych losowych podziałach 75/25, daje średnio 97,7% trafności na teście. Ale pojedynczy podział mógł dać cokolwiek od 93,7% do 100%; odchylenie standardowe wynosi 1,2 punktu procentowego, a 95% podziałów mieści się między 95,1% a 100%. Dwie osoby z tym samym kodem i innym random_state mogłyby raportować wyniki różniące się o ponad 6 punktów.

Warstwowanie ma znaczenie przy małym teście. Przy podziale 90/10 test liczy 57 guzów; bez warstwowania odsetek złośliwych w teście wahał się w 200 losowaniach od 21% do 53%, choć w całym zbiorze wynosi 37%. Z stratify=y za każdym razem było to 36,8%.

Dane: Breast Cancer Wisconsin (diagnostyka raka piersi)

W praktyce

  • train_test_split(X, y, test_size=0.2, stratify=y, random_state=42) w scikit-learn.
  • Dla danych z grupami: GroupShuffleSplit, GroupKFold; dla czasu: TimeSeriesSplit lub ręczne cięcie po dacie.
  • Typowe proporcje: 80/20 lub 70/30; przy milionach przykładów wystarczy 1–5% na test.
  • Wszystkie transformacje w Pipeline, dopasowywanym tylko na X_train.
  • Ustal random_state dla powtarzalności, ale nie wybieraj ziarna, które daje najlepszy wynik.
  • Typowy błąd: wielokrotne „zaglądanie” do testu przy strojeniu i raportowanie tego wyniku jako ostatecznego.

Najczęstsze pytania

Ile danych przeznaczyć na test?
Tyle, by oszacowanie było wystarczająco precyzyjne: przy kilkuset przykładach testowych błąd standardowy trafności to 1–2 punkty procentowe. Przy małych zbiorach lepsza jest walidacja krzyżowa niż jeden mały test.
Czym różni się zbiór walidacyjny od testowego?
Walidacyjny służy do podejmowania decyzji: wyboru modelu, hiperparametrów, momentu zatrzymania. Testowy służy tylko do końcowej oceny. Jeśli używasz testu do decyzji, staje się on de facto walidacyjnym i tracisz uczciwą ocenę.
Czy po ocenie można wytrenować model na wszystkich danych?
Tak, to częsta praktyka: po wybraniu konfiguracji trenuje się ją ponownie na całości. Wynik testowy z wcześniejszego podziału jest wtedy oszacowaniem dla tej procedury, a nie dokładnie tego modelu.

Źródła

  • James G., Witten D., Hastie T., Tibshirani R. „An Introduction to Statistical Learning”, 2nd ed., 2021, rozdz. 2.2 i 5.1.
  • Hastie T., Tibshirani R., Friedman J. „The Elements of Statistical Learning”, 2nd ed., 2009, rozdz. 7.
  • Kohavi R. (1995). „A study of cross-validation and bootstrap for accuracy estimation and model selection”. Proceedings of IJCAI 1995.
  • Raschka S. (2018). „Model Evaluation, Model Selection, and Algorithm Selection in Machine Learning”. arXiv:1811.12808.
  • Dokumentacja scikit-learn: Cross-validation: evaluating estimator performance, https://scikit-learn.org/stable/modules/cross_validation.html

Zobacz też