Mam zestaw danych zawierający 140000 przykładów i 30 funkcji, dla których uczę kilku klasyfikatorów do klasyfikacji binarnej (SVM, regresja logistyczna, losowy las itp.)
W wielu przypadkach dostrajanie hiperparametrów w całym zbiorze danych przy użyciu wyszukiwania siatkowego lub losowego jest zbyt kosztowne pod względem czasowym.
Zacząłem stosować następującą technikę
- Podpróbka mojego zestawu danych
- Użyj uzyskanej frakcji, aby dostroić hiperparametry
- Za pomocą uzyskanych parametrów wytrenuj model przy użyciu całego zestawu danych
Aby ocenić każdy zestaw parametrów, w drugim etapie użycia I sklearn
„S GridSearchCV
z CV = 10. Aby ocenić ostateczny model, który tworzę w trzecim etapie używam sklearn
„s cross_val_predict
. W tym sensie oceniam moje modele, pozostawiając 10% procent danych, trenuję resztę i mierzę dokładność predykcyjną na 10%, iteracyjnie 10 razy, a następnie biorąc średnią wyników.
Niepokoiło mnie to, że dokładność prognoz, którą uzyskuję ze szkolenia na całym zestawie danych, jest bardzo zbliżona do oceny, którą otrzymuję, gdy dostrajam parametry w celu uzyskania najlepszego zestawu parametrów (każdy testowany zestaw parametrów generuje wynik uzyskany ze średniej 10- wyniki walidacji krzyżowej).
W większości przypadków dokładność cross_val_predict
mierzona za pomocą wszystkich przykładów szkolenia (cały zestaw danych) jest nieco wyższa niż wynik oceny najlepszych parametrów.
Aby to zilustrować tutaj, jest ocena zestawu parametrów (w mniejszym zestawie danych niż to, co opisałem powyżej, ale efekt jest taki sam)
Best parameters set found on development set:
{'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
Scores for all sets of parameters
0.851 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.5}
0.852 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.1}
0.829 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.001}
0.853 (+/-0.006) for {'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
...
A oto uśrednione wyniki (z cross_val_predict
), które otrzymałem ze szkolenia na całym zestawie danych przy użyciu najlepszych parametrów
precision recall f1-score support
0 0.86 0.85 0.86 15417
1 0.86 0.87 0.87 16561
avg / total 0.86 0.86 0.86 31978
acc score: 0.863750078179
roc au score: 0.863370490059
[[13147 2270]
[ 2087 14474]]
Jak widać szkolenie na całym zestawie danych poprawia wyniki. Zweryfikowałem również, że źle dostrojony model (np. Używając wartości domyślnych lub wartości losowych dla C
i gamma
) prowadzi do znacznie gorszej dokładności prognoz.
Ogólnie uważam, że dostrajanie hiperparametrów w podzbiorze nie jest idealne, ale może potencjalnie prowadzić do stosunkowo dobrych wyników bez konieczności zbyt długiego oczekiwania. Na przykład przed użyciem tego podejścia użyłem optunity
pakietu do strojenia hiperparametru w całym zestawie danych. Ta procedura zajęłaby 3-5 dni i przyniosła wyniki, które albo miały bardzo dobrą precyzję, albo naprawdę dobre przywołanie, ale nie oba, więc chociaż dla każdej klasy albo precyzja, albo przywołanie były naprawdę wysokie (wyższe niż jakakolwiek inna klasyfikatory osiągnęły) pomiar f1 był naprawdę niski. Przeciwnie, zastosowanie późniejszego podejścia prowadzi do kilku godzin treningu i lepszego pomiaru F1.
Moje obawy to:
Czy ograniczam moją dokładność klasyfikacji? Czy unikam używania całej mocy predykcji, jaką może zaoferować mój zestaw danych, dostrajając tylko w podzbiorze? Jeśli dzieje się taka szkoda w wydajności, czy jest w jakiś sposób ograniczona przez jakiś czynnik?