W niektórych wykładach i samouczkach , które widziałem, sugerują podzielenie danych na trzy części: szkolenie, walidacja i test. Nie jest jednak jasne, w jaki sposób należy używać zestawu danych testowych, ani w jaki sposób to podejście jest lepsze niż weryfikacja krzyżowa całego zestawu danych.
Załóżmy, że zapisaliśmy 20% naszych danych jako zestaw testowy. Następnie bierzemy resztę, dzielimy ją na k fałdy i, korzystając z weryfikacji krzyżowej, znajdujemy model, który najlepiej prognozuje nieznane dane z tego zestawu danych. Powiedzmy, że najlepszy model, który znaleźliśmy, daje nam 75% dokładności.
Różne samouczki i wiele pytań na różnych stronach z pytaniami i odpowiedziami mówią, że teraz możemy zweryfikować nasz model na zapisanym (testowym) zbiorze danych. Ale wciąż nie mogę zrozumieć, jak to dokładnie zostało zrobione, ani jaki jest tego sens.
Powiedzmy, że mamy dokładność 70% w zestawie danych testowych. Co więc robimy dalej? Czy wypróbowujemy inny model, a potem inny, dopóki nie uzyskamy wysokiej oceny w naszym zestawie danych testowych? Ale w tym przypadku wygląda na to, że po prostu znajdziemy model, który pasuje do naszego ograniczonego (tylko 20%) zestawu testowego . Nie oznacza to, że znajdziemy model, który jest ogólnie najlepszy.
Co więcej, jak możemy uznać ten wynik za ogólną ocenę modelu, jeśli jest on obliczany tylko na podstawie ograniczonego zestawu danych? Jeśli ten wynik jest niski, być może mieliśmy pecha i wybraliśmy „złe” dane testowe.
Z drugiej strony, jeśli wykorzystamy wszystkie dane, które mamy, a następnie wybierzmy model przy użyciu k-krotnej walidacji krzyżowej, znajdziemy model, który najlepiej prognozuje nieznane dane z całego zestawu danych .
Odpowiedzi:
Jest to podobne do innego pytania, na które odpowiedziałem w sprawie weryfikacji krzyżowej i zestawów testowych . Kluczową koncepcją do zrozumienia tutaj są niezależne zestawy danych . Rozważ tylko dwa scenariusze:
Teraz, jeśli jestem badaczem, który nie ma tyle szczęścia, co mam zrobić? Możesz spróbować naśladować dokładnie ten scenariusz:
Aby rozwiązać pozostałe problemy:
W pewnym sensie chodzi o to, że tworzysz najlepszy model, jaki możesz na podstawie swoich danych, a następnie oceniasz go na kilku innych danych, których nigdy wcześniej nie widział. Możesz ponownie ocenić swój schemat weryfikacji krzyżowej, ale gdy masz już dostrojony model (tj. Hiperparametry), posuwasz się naprzód z tym modelem, ponieważ był on najlepszy, jaki mogłeś zrobić. Kluczem jest NIGDY NIE UŻYWAĆ DANYCH TESTOWYCH DO STROJENIA . Wynik z danych testowych stanowi wydajność modelu w odniesieniu do danych „ogólnych”. Replikacja tego procesu usunęłaby niezależność zestawów danych (co stanowiło cały punkt). Jest to również poruszone w innym pytaniu dotyczącym danych testowych / walidacyjnych .
Jest to mało prawdopodobne, jeśli poprawnie podzieliłeś swoje dane. Powinieneś rozdzielać swoje dane losowo (chociaż potencjalnie rozwarstwione dla równoważenia klas). Jeśli zestaw danych jest wystarczająco duży, aby podzielić dane na trzy części, podzbiór testowy powinien być na tyle duży, aby szansa na wybranie złych danych była bardzo niska. Bardziej prawdopodobne jest, że Twój model został przeregulowany.
źródło
Jeśli wszystko, co zamierzasz zrobić, to trenować model z ustawieniami domyślnymi na nieprzetworzonym lub minimalnie wstępnie przetworzonym zestawie danych (np. Jednorazowe kodowanie i / lub usuwanie NA), nie potrzebujesz osobnego zestawu testowego, możesz po prostu trenować na swoim trenuj zestaw i testuj na swoim zestawie walidacyjnym, lub jeszcze lepiej, trenuj na całym zestawie za pomocą walidacji krzyżowej, aby oszacować swoją wydajność.
Jednak gdy tylko twoja wiedza na temat danych spowoduje, że dokonasz zmian w swojej pierwotnej strategii, teraz „zepsułeś” swój wynik. Niektóre przykłady obejmują:
Wybór modelu: przetestowałeś maszyny logistyczne, lasso, losowy las, XGBoost i obsługujący wektor i wybrałeś najlepszy model
Strojenie parametrów: Dostroiłeś XGBoost, aby znaleźć optymalne hiperparametry
Wybór funkcji: Użyłeś selekcji wstecznej, algorytmu genetycznego, boruty itp., Aby wybrać optymalny podzbiór funkcji do uwzględnienia w modelu
Brakujące przypisanie: przypisałeś brakujące zmienne średniej lub prostemu modelowi opartemu na innych zmiennych
Transformacja cech: wyśrodkowałeś i skalowałeś zmienne numeryczne, zastępując je wynikiem Z (liczba odchyleń standardowych od średniej)
We wszystkich powyższych przypadkach użycie pojedynczego zestawu wstrzymań lub nawet walidacja krzyżowa nie da realistycznego oszacowania rzeczywistej wydajności, ponieważ w swojej decyzji korzystasz z informacji, których nie będziesz mieć na temat przyszłych danych. Zamiast tego wybierasz najlepszy model, najlepsze hiperparametry, najlepszy zestaw funkcji itp. Dla swoich danych i prawdopodobnie nieco „przerastasz” strategię względem danych. Aby uzyskać uczciwe oszacowanie rzeczywistej wydajności, musisz ocenić ją na danych, które w ogóle nie weszły w proces decyzyjny, stąd powszechna praktyka korzystania z niezależnego zestawu testów niezależnego od treningu (modelowania) i walidacji ( wybranie modelu, funkcji, hiperparametrów itp.).
Jako alternatywę dla trzymania zestawu testowego możesz zamiast tego użyć techniki zwanej zagnieżdżoną weryfikacją krzyżową. Wymaga to zakodowania całej strategii modelowania (transformacja, imputacja, wybór funkcji, wybór modelu, strojenie hiperparametrów) jako funkcji nieparametrycznej, a następnie przeprowadzenia weryfikacji krzyżowej dla całej funkcji, tak jakby była to po prostu funkcja dopasowania modelu. Jest to trudne w większości pakietów ML, ale można je dość łatwo wdrożyć w pakiecie R z pakietem mlr, używając opakowań do zdefiniowania strategii treningu, a następnie ponownego próbkowania zapakowanego ucznia:
https://mlr.mlr-org.com/articles/tutorial/nested_resampling.html
źródło
Zakładam, że dokonujesz klasyfikacji.
Weź swoje dane i podziel je 70/30 na podzbiory trainingData / testData. Weź podzbiór trainingData i ponownie podziel go na 70/30 na podzbiory trainingData / validateData. Teraz masz 3 podzbiory oryginalnych danych - trainingData (.7 * .7), validateData (.7 * .3) i testData (.3).
Trenujesz swój model za pomocą trainingData. Następnie sprawdzasz wydajność tego modelu za pomocą validateData, co możemy uznać za niezależne od trainingData, a zatem dobrą ocenę tego, jak dobrze model się uogólnia. Udawajmy, że osiągasz 75% dokładności.
Teraz przekwalifikowujesz swój model dowolną liczbę razy. Podczas każdego przekwalifikowania oceniasz inny zestaw hiperparametrów (w pierwszej kolejności parametry podawane do modelu w porównaniu z tymi, które optymalizuje Twój model), ale nadal używasz podzestawu trainingData. Przy każdym ponownym szkoleniu ponownie sprawdzasz, jak dobrze nowy model się uogólnia, sprawdzając wydajność na validateData.
Po sprawdzeniu każdej kombinacji hiperparametrów, którą chcesz ocenić, wybierasz zestaw hiperparametrów, który zapewnił Ci najlepszą wydajność w sprawdzaniu poprawności danych - udawajmy, że twoja najlepsza wydajność w sprawdzaniu poprawności wyniosła 80% dokładności. To są twoje ostateczne hiperparametry, a model zdefiniowany przez te hiperparametry jest tym, którego użyjesz w następnym kroku.
Teraz weź model, który używa ostatecznych hiperparametrów i oceń testData. To pierwszy raz, kiedy testData został dotknięty od początku całego procesu! Jeśli uzyskasz wydajność testData, która jest porównywalna z wydajnością na validateData (choć zwykle będzie nieco niższa), możesz mieć pewność, że Twój model działa zgodnie z oczekiwaniami i dobrze się uogólnia! Jeśli tak się stanie, to twój ostateczny model!
Dlaczego to wszystko? Próbujesz uniknąć przeuczenia. Zawsze istnieje ryzyko, że nadmiernie dopasujesz się do danych, których używasz podczas treningu i dostrajania (czyli sprawdzania poprawności) modelu. Jeśli trenujesz, dostrajasz (sprawdzasz) i testujesz przy użyciu tylko jednego zestawu danych, istnieje duża szansa, że dopasujesz te dane i nie uogólni się dobrze. Po rozbiciu zestawów danych treningowych i testowych (i przy założeniu, że dostroisz dane testowe), masz szansę sprawdzić się wewnętrznie, ale nadal istnieje szansa, że po prostu przerastasz dane testowe. Właśnie dlatego wybieramy trzeci zestaw danych, sprawdzamy poprawność, dzięki czemu mamy dodatkową warstwę wewnętrznej uczciwości. Strojenie za pomocą validateData powstrzymuje nas od nadmiernego dopasowania do trainingData. Końcowe testy z testData powstrzymują nas od nadmiernego dopasowania do validateData.
źródło
Spójrzmy na to w następujący sposób
Powszechna praktyka
a) Dane treningowe - wykorzystywane do wyboru parametrów modelu.
b) Dane walidacyjne - wykorzystywane do wyboru hiperparametrów.
c) Dane testowe - używane do uzyskania pewności wyniku z powyższych dwóch kroków
Inny sposób spojrzenia na część 1
a) Nasza pula modeli kandydatów to zestaw 5-dimensonów, tj.
b) Krok 1a zredukuj model kandydatów z 5 wymiarów do 1 wymiarów.
c) Krok 1b zredukuj kandydatów do modelu z 1-wymiaru do 0-wymiaru, co jest pojedynczym modelem.
d) Jednak OP może myśleć, że powyższy wynik „końcowy” nie działa wystarczająco dobrze na zbiorze danych testowych, a zatem ponownie wykonaj cały proces, powiedzmy, używając regresji grzbietu zamiast zwykłej regresji liniowej. Następnie zestaw danych testowych jest wykorzystywany wiele razy, a zatem szum w tych danych może powodować pewne niedopasowanie przy podejmowaniu decyzji o zastosowaniu regresji liniowej lub regresji kalenicowej.
e) Aby poradzić sobie z pulą modeli wielowymiarowych z parametrami, hiperparametrami, typami modeli i metodami wstępnego przetwarzania, każdy podział na dostępne nam dane zasadniczo określa proces decyzyjny, który
Wnioski i odpowiedzi na pytanie OP
a) Dwuczęściowy (szkolenie i test), trójdzielny (szkolenie, sprawdzanie poprawności i testowanie) lub większa liczba podziałów dotyczy zasadniczo zmniejszenia wymiarów i przydzielania danych (zwłaszcza hałasu i ryzyka nadmiernego dopasowania).
b) Na pewnym etapie możesz wymyślić „ostateczną” pulę kandydatów na model, a następnie zastanowić się, jak zaprojektować proces sekwencyjnego zmniejszania wymiaru w taki sposób, aby
c) Co jeśli nie możesz osiągnąć b
źródło