W CrossValidated znajduje się wiele wątków na temat wyboru modelu i weryfikacji krzyżowej. Tu jest kilka:
- Walidacja wewnętrzna i zewnętrzna oraz wybór modelu
- @ DikranMarsupial w górę odpowiedzi do wyboru funkcji i walidacji krzyżowej
Jednak odpowiedzi na te wątki są dość ogólne i głównie podkreślają problemy ze szczególnym podejściem do weryfikacji krzyżowej i wyboru modelu.
Aby wszystko było jak najbardziej konkretne , powiedzmy na przykład, że pracujemy z maszyną SVM z jądrem RBF: oraz że mam zestaw danych funkcjiXi etykiety, i że chcę
- Znajdź najlepsze możliwe wartości mojego modelu ( i )
- Trenuj SVM z moim zestawem danych (do ostatecznego wdrożenia)
- Oszacuj błąd uogólnienia i niepewność (wariancję) wokół tego błędu
Aby to zrobić, osobiście przeszukałem siatkę, np. Wypróbowałem każdą możliwą kombinację i . Dla uproszczenia możemy przyjąć następujące zakresy:
Mówiąc dokładniej, korzystając z mojego pełnego zestawu danych, wykonuję następujące czynności:
- Dla każdej pary ( , γ ) wykonuję powtarzane iteracje (np. 100 losowych powtórzeń) K- krotnej walidacji krzyżowej (np. K = 10 ) w moim zbiorze danych, tj. Trenuję moją SVM na fałdach K - 1 i oceniam błąd na lewej zakładce, iterując wszystkie fałdy K. Ogólnie zbieram 100 x 10 = 1000 błędów testowych.
- Dla każdej takiej ( , γ ) pary, to obliczyć średnią i wariancję 1000-tych testowych Błędy jj, M , Ď M .
Teraz chcę wybrać najlepszy model (najlepsze parametry jądra), którego użyłbym do wyszkolenia mojej ostatecznej SVM na pełnym zbiorze danych. Rozumiem, że wybór modelu o najniższej średniej błędu i wariancji i σ M byłby właściwym wyborem, a μ M tego modelu to σ M, to moje najlepsze oszacowania błędu i wariancji błędu uogólnienia modelu podczas treningu z pełny zestaw danych.
ALE po przeczytaniu odpowiedzi w powyższych wątkach mam wrażenie, że ta metoda wyboru najlepszego SVM do wdrożenia i / lub oszacowania jego błędu (wydajności uogólnienia) jest wadliwa i istnieją lepsze sposoby wyboru najlepszy SVM i zgłaszanie jego błędu. Jeśli tak, jakie one są? Proszę o konkretną odpowiedź.
Trzymając się tego problemu, jak konkretnie mogę wybrać najlepszy model i właściwie oszacować jego błąd generalizacji ?
źródło
Odpowiedzi:
Mój artykuł w JMLR zajmuje się dokładnie tym pytaniem i pokazuje, dlaczego procedura zaproponowana w tym pytaniu (lub co najmniej jednym bardzo podobnym) skutkuje optymistycznie stronniczymi szacunkami wydajności:
Gavin C. Cawley, Nicola LC Talbot, „O nadmiernym dopasowaniu w wyborze modelu i późniejszym odchyleniu w selekcji w ocenie wydajności”, Journal of Machine Learning Research, 11 (lipiec): 2079-2107, 2010. ( www )
Kluczową rzeczą do zapamiętania jest to, że walidacja krzyżowa jest techniką szacowania wydajności uogólnienia dla metody generowania modelu, a nie samego modelu. Jeśli więc wybór parametrów jądra jest częścią procesu generowania modelu, musisz również zweryfikować krzyżowo proces wyboru modelu, w przeciwnym razie skończysz z optymistycznie tendencyjnym oszacowaniem wydajności (tak jak stanie się z proponowaną przez ciebie procedurą).
Załóżmy, że masz funkcję fit_model, która pobiera zestaw danych składający się z atrybutów X i pożądanych odpowiedzi Y, i który zwraca dopasowany model dla tego zestawu danych, w tym strojenie hiperparametrów (w tym przypadku parametry jądra i regularyzacji). To dostrajanie hiper-parametrów można wykonać na wiele sposobów, na przykład minimalizując błąd weryfikacji krzyżowej w stosunku do X i T.
Krok 1 - Dopasuj model do wszystkich dostępnych danych, używając funkcji fit_model. To daje model, którego będziesz używać podczas pracy.
Krok 2 - Ocena wydajności. Wykonaj wielokrotną weryfikację krzyżową przy użyciu wszystkich dostępnych danych. W każdym folderze dane są dzielone na zestaw szkoleniowy i zestaw testowy. Dopasuj model za pomocą zestawu treningowego (zapisz wartości hiperparametrów dla dopasowanego modelu) i oceń wydajność zestawu testowego. Użyj średniej dla wszystkich zestawów testowych jako oszacowania wydajności (i być może przyjrzyj się także rozkładowi wartości).
Krok 3 - Zmienność ustawień hiperparametrów - wykonaj analizę wartości hiperparametrów zebranych w kroku 3. Należy jednak zauważyć, że w hiperparametrach nie ma nic specjalnego, są to tylko parametry modelu, które zostały oszacowane (pośrednio ) z danych. Są one traktowane raczej jako hiperparametry niż parametry dla wygody obliczeniowej / matematycznej, ale nie musi tak być.
The problem with using cross-validation here is that the training and test data are not independent samples (as they share data) which means that the estimate of the variance of the performance estimate and of the hyper-parameters is likely to be biased (i.e. smaller than it would be for genuinely independent samples of data in each fold). Rather than repeated cross-validation, I would probably use bootstrapping instead and bag the resulting models if this was computationally feasible.
The key point is that to get an unbiased performance estimate, whatever procedure you use to generate the final model (fit_model) must be repeated in its entirety independently in each fold of the cross-validation procedure.
źródło
rather than repeated cross-validation you would go for bootstrapping
- What is exactly the difference? Both involve multiple repetitions of dividing the data intotrain
andtest
and then training intrain
and evaluating intest
, don't they?Using a SVM with fixed hyperparameters (γ and C ) is a machine learning algorithm.
A procedure that optimizes these hyperparameters and trains a SVM with these is also just a machine learning algorithm. Instead of only optimizing the internal parameters of the SVM (the support vectors) it also optimizes the hyperparameters.
Now you have two problems [that can be solved independently]:
How to perform hyperparameter optimization/model selection?
How to estimate generalization error of a machine learning algorithm?
Read Cross-validation misuse (reporting performance for the best hyperparameter value) to make sure that you don't mix them up.
A specific (probably not optimal) solution to the concrete problem of your question:
Here,
model
would be your "best model" andloss_CV
a "proper estimate of its generalization error" (although biased upward, but you cannot have the cake and eat it too).źródło