Przeczytałem następujące posty dotyczące sprawdzania poprawności krzyżowania zagnieżdżonego i wciąż nie jestem w 100% pewien, co mam zrobić z wyborem modelu za pomocą sprawdzania poprawności krzyżowania zagnieżdżonego:
- Zagnieżdżone sprawdzanie poprawności wyboru modelu
- Wybór modelu i walidacja krzyżowa: właściwa droga
Aby wyjaśnić moje zamieszanie, pozwól mi przejść krok po kroku przez wybór modelu z zagnieżdżoną metodą sprawdzania poprawności krzyżowej.
- Utwórz zewnętrzną pętlę CV za pomocą K-Fold. Będzie to wykorzystane do oszacowania wydajności hiper-parametrów, które „wygrały” każdą wewnętrzną pętlę CV.
- Użyj GridSearchCV, aby utworzyć wewnętrzną pętlę CV, w której w każdej wewnętrznej pętli GSCV przechodzi przez wszystkie możliwe kombinacje przestrzeni parametrów i zapewnia najlepszy zestaw parametrów.
- Po znalezieniu przez GSCV najlepszych parametrów w wewnętrznej pętli, jest on testowany z zestawem testowym w zewnętrznej pętli, aby uzyskać oszacowanie wydajności.
- Pętla zewnętrzna jest następnie aktualizowana do następnej zakładki jako zestaw testowy, a reszta jako zestaw treningowy i 1-3 powtórzenia. Łącznie możliwe parametry „wygranej” to liczba fałd wyznaczona w zewnętrznej pętli. Więc jeśli zewnętrzna pętla jest 5-krotna, będziesz miał oszacowanie wydajności algorytmu z 5 różnymi zestawami hiper parametrów, NIE wydajność jednego określonego zestawu hiper parametrów.
Podejście to zilustrowano na przykładowej stronie SKLearn: http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html
Pytanie: Po 4. jak określić, które hiperparametry działały najlepiej? Rozumiem, że chcesz wytrenować algorytm (np. Regresję logistyczną, losowy las itp.) Z zestawem danych KOMPLETNY na końcu. Ale w jaki sposób określasz, które hiperparametry działały najlepiej w sprawdzaniu poprawności zagnieżdżonej? Rozumiem, że dla każdej wewnętrznej pętli wygra inny zestaw hiper parametrów. W przypadku zewnętrznej pętli otrzymujesz oszacowanie wydajności GridSearchCV, ale nie otrzymujesz żadnego konkretnego zestawu parametrów hiper. A więc, w ostatecznym utworzeniu modelu, skąd wiesz, jakich hiper parametrów użyć? Tę brakującą logikę trudno mi zrozumieć na podstawie innych stopni.
Z góry dziękuję za wszelkie wskazówki, szczególnie jeśli @Dikran Marsupial i @cbeleites mogą się włączyć!
Edycja: Jeśli możesz, w odpowiedzi użyj terminów takich jak „algorytm” i „parametry hiperparametru”. Myślę, że jednym ze źródeł nieporozumień jest to, że ludzie używają terminu „model” lub „wybór modelu”. Jestem zdezorientowany, czy chodzi o wybranie algorytmu, którego należy użyć, czy jakich hiper parametrów użyć.
Edycja 2: Utworzyłem notatnik, który pokazuje dwa sposoby wykonywania zagnieżdżonej weryfikacji krzyżowej. Pierwszym sposobem jest ten pokazany w przykładzie SKLearn, a innym dłuższym sposobem jest ten, który napisałem. Sposób pokazany w SKLearn nie ujawnia „zwycięskich” hiperparametrów, ale moja dłuższa droga tak. Ale pytanie pozostaje takie samo. Po zakończeniu sprawdzania poprawności zagnieżdżonej, nawet przy odsłoniętych hiperparametrach, co mam teraz zrobić? Jak widać z hiperparametrów na końcu notebooka, różnią się one dość.
źródło
Odpowiedzi:
(Jestem pewien, że większość tego napisałem już w jakiejś odpowiedzi - ale nie mogę jej teraz znaleźć. Jeśli ktoś natknie się na tę odpowiedź, proszę ją połączyć). Widzę tutaj 2 nieco inne podejścia, które moim zdaniem są rozsądne.
Ale najpierw trochę terminologii:
Myślę, że różnica między nimi jest związana z różnicą między kimś opracowującym nowe algorytmy szkoleniowe, który zwykle opisywałby klasę algorytmów szkoleniowych wraz z niektórymi parametrami sterującymi ( hiperparametry), które są trudne / niemożliwe do naprawienia (lub przynajmniej ustalenia, w jaki sposób należy je ustalić / oszacować) bez wiedzy o aplikacji / dziedzinie.
Podejście 1: wymaga stabilnych wyników optymalizacji
Dzięki takiemu podejściu „trening modelu” jest dopasowaniem „normalnych” parametrów modelu i podane są hiperparametry . Wewnętrzna walidacja krzyżowa zajmuje się optymalizacją hiperparametrów.
Kluczowym krokiem / założeniem w celu rozwiązania dylematu, którego zestaw hiperparametrów powinien być wybrany, jest wymaganie stabilizacji optymalizacji . Krzyżowa walidacja do celów walidacji zakłada, że wszystkie modele zastępcze są wystarczająco podobne do ostatecznego modelu (uzyskanego przez ten sam algorytm treningowy zastosowany do całego zestawu danych), aby umożliwić traktowanie ich jako równych (między sobą, a także do ostatecznego modelu). Jeżeli założenie to się załamie i
modele zastępcze są nadal równe (lub równoważne) między sobą, ale nie do ostatecznego modelu, mówimy o dobrze znanym pesymistycznym nastawieniu walidacji krzyżowej.
Jeśli również model zastępczy nie jest sobie równy / równoważny, mamy problemy z niestabilnością .
Dla wyników optymalizacji wewnętrznej pętli oznacza to, że jeśli optymalizacja jest stabilna, nie ma konfliktu w wyborze hiperparametrów . A jeśli zaobserwowane zostaną znaczne różnice w wynikach wewnętrznej weryfikacji krzyżowej, optymalizacja nie będzie stabilna . Niestabilne sytuacje treningowe mają znacznie gorsze problemy niż sama decyzja, który zestaw hiperparametrów wybrać, i naprawdę polecam cofnąć się w tym przypadku i rozpocząć proces modelowania od nowa.
Jest tu jednak wyjątek: może istnieć kilka lokalnych minimów w optymalizacji zapewniających jednakową wydajność dla celów praktycznych. Wymaganie również wyboru spośród nich, aby był stabilny, może być niepotrzebnie silnym wymogiem - ale nie wiem, jak wyjść z tego dylematu.
Zauważ, że jeśli nie wszystkie modele dają ten sam zwycięski zestaw parametrów, nie należy tutaj używać oszacowań pętli zewnętrznej jako błędu generalizacji:
Podejście 2: traktuj strojenie hiperparametrów jako część treningu modelowego
Podejście to łączy perspektywy „twórcy algorytmu szkoleniowego” i zastosowanego użytkownika algorytmu szkoleniowego.
Twórca algorytmu treningowego zapewnia algorytm „nagi”
model = train_naked (trainingdata, hyperparameters)
. Jako zastosowany użytkownik potrzebuje,tunedmodel = train_tuned (trainingdata)
który dba również o ustalenie hiperparametrów.train_tuned
może być zaimplementowany np. poprzez owijanie optymalizatora opartego na krzyżowej weryfikacji wokół algorytmu „goły trening”train_naked
.train_tuned
może być następnie użyty jak każdy inny algorytm szkoleniowy, który nie wymaga wprowadzania hiperparametrów, np. jego dane wyjściowetunedmodel
mogą być poddawane walidacji krzyżowej. Teraz hiperparametry są sprawdzane pod kątem stabilności, podobnie jak „normalne” parametry powinny być sprawdzane pod kątem stabilności w ramach oceny walidacji krzyżowej.To jest właśnie to, co robisz i oceniasz w zagnieżdżonej walidacji krzyżowej, jeśli uśredniasz wydajność wszystkich zwycięskich modeli, niezależnie od ich poszczególnych zestawów parametrów.
Co za różnica?
Prawdopodobnie otrzymamy różne modele końcowe, przyjmując te 2 podejścia:
train_naked (all data, hyperparameters from optimization)
train_tuned (all data)
i - ponieważ ponownie uruchomi optymalizację hiperparametrów dla większego zestawu danych - może to zakończyć się innym zestawem hiperparametrów.Ale znowu ta sama logika ma zastosowanie: jeśli stwierdzimy, że ostateczny model ma zasadniczo inne parametry niż modele zastępcze walidacji krzyżowej, jest to objaw naruszenia zasady 1. IMHO, więc znowu nie mamy konfliktu, a raczej sprawdzenie, czy nasze (dorozumiane) założenia są uzasadnione. A jeśli tak nie jest, to i tak nie powinniśmy zbytnio stawiać na dobre oszacowanie wydajności tego ostatecznego modelu.
Mam wrażenie (również na podstawie liczby podobnych pytań / zamieszania tutaj w CV), że wiele osób myśli o zagnieżdżonej weryfikacji krzyżowej przy podejściu 1. Ale błąd uogólnienia jest zwykle szacowany zgodnie z podejściem 2, więc to jest droga do ostateczny model również.
Przykład tęczówki
Podsumowanie: Optymalizacja jest w zasadzie bezcelowa. Dostępny rozmiar próbki nie pozwala na rozróżnienie między wydajnością żadnego z zestawów parametrów tutaj.
Jednak z punktu widzenia aplikacji wniosek jest taki, że nie ma znaczenia, który z 4 zestawów parametrów wybierzesz - co nie jest wcale takie złe: znalazłeś względnie stabilny plateau parametrów. Oto zaleta właściwego zagnieżdżonego sprawdzania poprawności dostrojonego modelu: chociaż nie możesz twierdzić, że jest to model optymalny, nadal możesz twierdzić, że model zbudowany na całych danych przy użyciu podejścia 2 będzie miał około 97% dokładności (95% przedział ufności dla 145 poprawnych ze 150 przypadków testowych: 92–99%)
Zauważ, że również podejście 1 nie jest tak dalekie, jak się wydaje - patrz poniżej: twoja optymalizacja przypadkowo pominęła stosunkowo wyraźnego „zwycięzcę” z powodu powiązań (w rzeczywistości jest to kolejny bardzo znaczący objaw problemu z wielkością próby).
Chociaż nie jestem wystarczająco głęboko w SVM, aby „zobaczyć”, że C = 1 powinien być tutaj dobrym wyborem, wybrałbym bardziej restrykcyjne liniowe jądro. Ponadto, gdy dokonałeś optymalizacji, nie ma nic złego w wyborze zwycięskiego zestawu parametrów, nawet jeśli masz świadomość, że wszystkie zestawy parametrów prowadzą do praktycznie jednakowej wydajności.
Jednak w przyszłości zastanów się, czy Twoje doświadczenie nie pozwala oszacować, jakiej wydajności możesz się spodziewać, i z grubsza, który model byłby dobrym wyborem. Następnie zbuduj ten model (z ręcznie ustalonymi hiperparametrami) i oblicz przedział ufności dla jego wydajności. Użyj tego, aby zdecydować, czy próba optymalizacji jest w ogóle sensowna. (Mogę dodać, że głównie pracuję z danymi, w których uzyskanie 10 niezależnych przypadków nie jest łatwe - jeśli jesteś w polu z dużymi niezależnymi próbkami, sprawy wyglądają o wiele lepiej)
długa wersja:
Jak na przykład wyniki w zestawie
iris
danych.iris
ma 150 przypadków, rozważa się SVM z siatką 2 x 2 parametry (2 jądra, 2 rzędy wielkości karyC
).Pętla wewnętrzna ma podziały 129 (2x) i 132 (6x) przypadków. „Najlepszy” zestawu parametrów niepewny między liniowymi lub jądro RBF, zarówno z C = 1. Jednak dokładność wewnętrzną testu są wszystkie (w tym zawsze loosing C = 10) w 94 - 98,5% Obserwowany dokładności. Największa różnica, jaką mamy w jednym z podziałów, to 3 vs 8 błędów dla rbf przy C = 1 vs 10.
Nie ma mowy, że to znacząca różnica. Nie wiem, jak wyodrębnić prognozy dla poszczególnych przypadków w CV, ale nawet zakładając, że 3 błędy były wspólne, a model C = 10 popełnił dodatkowe 5 błędów:
Pamiętaj, że w siatce 2 x 2 jest 6 porównań parami, więc musimy poprawić również wiele porównań.
Podejście 1
W 3 z 4 zewnętrznych podziałów, w których rbf „wygrał” w stosunku do jądra liniowego, faktycznie miały tę samą oszacowaną dokładność (wydaje mi się, że min w przypadku powiązań zwraca pierwszy odpowiedni indeks).
Zmiana siatki na
params = {'kernel':['linear', 'rbf'],'C':[1,10]}
plonyPodejście 2:
Oto
clf
twój ostateczny model. Zrandom_state = 2
, rbf z C = 1 wygrywa:(dzieje się od około 1 do 5 razy, 1 na 6 razy
linear
irbf
zC = 1
są związane na miejscu 1)źródło
Przeczytałem twoje pytanie i odpowiedź powyżej 2 razy (pierwszy raz 3 miesiące temu). Jestem zainteresowany, a także chcę znaleźć absolutnie odpowiedni sposób weryfikacji krzyżowej moich danych. Po wielu przemyśleniach i czytaniu wydaje mi się, że znajduję dziury i oto moja poprawka:
Rozumowanie:
źródło
Nie używasz zagnieżdżonej weryfikacji krzyżowej do wybierania hiper parametrów algorytmu, ta metoda służy do oszacowania błędu uogólnienia procedury budowania modelu . Gdzie, według procedury budowy modelu, zamierzam wykonać wszystkie kroki, które zastosowałeś, aby osiągnąć ostateczny model, którego będziesz używać na polu.re i generuje jako wynik „algorytm”, składający się ze stałego zestawu transformacji przetwarzania wstępnego, cech i wartości hiperparametrów.
Procedura budowania modelu może składać się z reguł zastosowanych w celu podjęcia decyzji, które przetwarzanie wstępne zastosować do danych, której funkcji użyć, a na koniec jakich hiper parametrów użyć. Pomyśl o tym jako o „meta-algorytmie”, który odbiera jako dane wejściowe określony zestaw danych
Powiedzmy na przykład, że maszX, y jako macierz projektową i cel, a chcesz wyszkolić klasyfikatora: x funkcje w X które mają najwyższą korelację z y .
1. który używa tylko pierwszego
2. wybierasz wartości hiper parametrów poprzez minimalizację 10-krotnego oszacowania błędu walidacji krzyżowej.
Jeśli zastosujesz te dwa kroki do konkretnej paryX′, y′ uzyskasz określony algorytm z określonym zestawem funkcji i ustalonymi parametrami hiper, które niekoniecznie będą takie same jak te, które uzyskasz dla X, y chociaż procedura budowania modelu byłaby identyczna, tj .: kroki 1 + 2, które nie są powiązane z żadnym konkretnym zestawem danych.
Powiedzmy, że zrobiłeś wszystkie powyższe, nie dzieląc danych na test kolejowy, ponieważ masz mały zestaw danych, jak oszacujesz błąd uogólnienia właśnie utworzonego klasyfikatora? Czy możesz użyć najlepszego błędu znalezionego podczas weryfikacji krzyżowej w kroku 2?
Nie , pierwszym dużym problemem jest krok 1, w którym używasz wszystkich danych, aby wybrać funkcje do użycia. Dlatego nawet po przeprowadzeniu weryfikacji krzyżowej w kroku 2 funkcje będą już widzieć i zapamiętywać pewne informacje obecne w folderze testowym przy każdym uruchomieniu weryfikacji krzyżowej. Rezultatem będzie zbyt optymistyczne oszacowanie błędu testu i to się nazywa stronniczość wyboru funkcji. Aby uwzględnić to w szacunkach, należy umieścić krok wyboru funkcji w pętli weryfikacji krzyżowej kroku 2.
Ok, teraz jesteśmy w porządku? Czy najlepszy błąd znaleziony w weryfikacji krzyżowej z krokiem wyboru funkcji w pętli jest uczciwym oszacowaniem błędu uogólnienia?
Teoretycznie odpowiedź brzmi „nie” , problem polega na tym, że parametry hiper-parametrów zostały wybrane w celu zminimalizowania błędu weryfikacji krzyżowej w określonym zestawie danych do Państwa dyspozycji, więc w pewnym sensie dopasowujesz parametry hiperparametru do swoich danych z ryzykiem ich nadmierne dopasowanie, co nazywa się uprzedzeniem wyboru modelu. Ale czy jest to problem w praktyce? Zależy to od konkretnej aplikacji: może stać się bardziej dotkliwe, ponieważ nadmiernie pasuje do treningu, gdy zestaw danych jest mały, a liczba hiperparowanych parametrówdostrojony jest stosunkowo duży. Aby uwzględnić to podczas szacowania błędu uogólnienia, zastosowałbyś zagnieżdżoną weryfikację krzyżową, jak opisano, co dałoby prawidłowe oszacowanie błędu uogólnienia.
Wreszcie, aby odpowiedzieć na ostatnie pytanie, po rzetelnym oszacowaniu błędu uogólnienia „procedury budowania modelu” z zagnieżdżoną weryfikacją krzyżową, wystarczy zastosować procedurę (krok 1 + 2) do całego zestawu danych, uzyskując model ze stałym zestawem funkcji i ustaw wartości hiperparametrów, ale należy pamiętać, że błędem, jakiego oczekujemy od tego modelu w przypadku niewidzialnych danych, jest szacunek zagnieżdżenia krzyżowego .
źródło