(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:
- Pochodzący z zastosowanego pola model (dopasowany / wyszkolony) jest dla mnie gotowy do użycia. Tj. Model zawiera wszystkie informacje potrzebne do wygenerowania prognoz dla nowych danych. Zatem model zawiera również hiperparametry . Jak zobaczycie, ten punkt widzenia jest ściśle związany z podejściem 2 poniżej.
- OTOH, algorytm treningowy z mojego doświadczenia nie jest dobrze zdefiniowany w następującym znaczeniu: aby uzyskać (dopasowany) model, nie tylko - nazwijmy go „pierwotnym dopasowaniem” - „normalnych” parametrów modelu, ale również hiperparametry muszą zostać naprawione. Z mojego punktu widzenia aplikacji tak naprawdę nie ma dużej różnicy między parametrami a hiperparamerami: oba są częścią modelu i należy je oszacować / zdecydować podczas treningu.
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:
- p
- Ale chyba, że nie zostanie podjęta żadna decyzja, ponieważ wszystkie podziały dały te same parametry, spowoduje to przerwanie niezależności w zewnętrznej pętli: dane testowe każdego podziału już wpłynęły na decyzję, który zestaw parametrów wygrał, ponieważ był to dane treningowe we wszystkich innych podziałach, a zatem zostały użyte w celu optymalizacji parametrów.
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ściowe tunedmodel
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:
- ostatecznym modelem w podejściu 1 będzie
train_naked (all data, hyperparameters from optimization)
- podczas gdy podejście 2 zastosuje
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 kary C
).
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:
> table (rbf1, rbf10)
rbf10
rbf1 correct wrong
correct 124 5
wrong 0 3
> mcnemar.exact(rbf1, rbf10)
Exact McNemar test (with central confidence intervals)
data: rbf1 and rbf10
b = 5, c = 0, p-value = 0.0625
alternative hypothesis: true odds ratio is not equal to 1
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]}
plony
({'kernel': 'linear', 'C': 1}, 0.95238095238095233, 0.97674418604651159)
({'kernel': 'rbf', 'C': 1}, 0.95238095238095233, 0.98449612403100772)
({'kernel': 'linear', 'C': 1}, 1.0, 0.97727272727272729)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.96212121212121215)
Podejście 2:
Oto clf
twój ostateczny model. Z random_state = 2
, rbf z C = 1 wygrywa:
In [310]: clf.grid_scores_
[...snip warning...]
Out[310]:
[mean: 0.97333, std: 0.00897, params: {'kernel': 'linear', 'C': 1},
mean: 0.98000, std: 0.02773, params: {'kernel': 'rbf', 'C': 1},
mean: 0.96000, std: 0.03202, params: {'kernel': 'linear', 'C': 10},
mean: 0.95333, std: 0.01791, params: {'kernel': 'rbf', 'C': 10}]
(dzieje się od około 1 do 5 razy, 1 na 6 razy linear
i rbf
z C = 1
są związane na miejscu 1)