Grid Search vs Random Search vs Bayesian Optimization – porównanie na praktycznych przykładach
Porównanie Grid Search, Random Search i Bayesian Optimization w strojenie hiperparametrów – teoria i praktyka z kodem w Pythonie.
Artykuł przeznaczony dla osób uczących się uczenia maszynowego oraz praktyków pracujących w Pythonie, którzy chcą dobrać i porównać metody strojenia hiperparametrów.
Z tego artykułu dowiesz się
- Czym są hiperparametry i jak ich dobór wpływa na overfitting, underfitting oraz jakość predykcji?
- Jak działają Grid Search, Random Search i Bayesian Optimization oraz jakie mają zalety i wady?
- Kiedy wybrać każdą z metod strojenia hiperparametrów i jak zaimplementować je w Pythonie (scikit-learn, scikit-optimize, optuna)?
Wprowadzenie do strojenia hiperparametrów
Strojenie hiperparametrów to kluczowy etap procesu budowy modeli uczenia maszynowego, który może znacząco wpłynąć na jakość i skuteczność końcowych rozwiązań. Hiperparametry to te parametry modelu, które nie są bezpośrednio uczone podczas treningu, lecz muszą być określone z góry — przykładowo: współczynnik uczenia, liczba warstw w sieci neuronowej czy liczba sąsiadów w algorytmie KNN.
Odpowiedni dobór hiperparametrów pozwala zoptymalizować działanie modelu względem konkretnego zadania, takiego jak klasyfikacja, regresja czy analiza szeregów czasowych. Niewłaściwie dobrane wartości mogą prowadzić do nadmiernego dopasowania (overfitting), niedouczenia (underfitting) lub po prostu niskiej skuteczności predykcji.
Istnieje wiele metod automatyzacji procesu strojenia, z których najpopularniejsze to:
- Grid Search – metoda polegająca na przeszukiwaniu wszystkich możliwych kombinacji zdefiniowanych hiperparametrów,
- Random Search – technika oparta na losowym dobieraniu kombinacji parametrów z określonych rozkładów,
- Bayesian Optimization – zaawansowane podejście wykorzystujące model probabilistyczny do przewidywania, które kombinacje hiperparametrów warto sprawdzić w kolejnych krokach.
Każda z tych metod ma swoje mocne i słabe strony, które sprawiają, że sprawdzają się one lepiej lub gorzej w zależności od konkretnego problemu, dostępnych zasobów obliczeniowych oraz liczby parametrów do przeszukania. Wybór odpowiedniej techniki strojenia może znacząco skrócić czas eksperymentów i poprawić końcową jakość modelu.
Grid Search – opis, zalety i wady
Grid Search to jedna z najprostszych i najczęściej wykorzystywanych metod strojenia hiperparametrów w uczeniu maszynowym. Polega ona na przeszukiwaniu z góry zdefiniowanej siatki możliwych wartości hiperparametrów i ocenie każdej możliwej kombinacji w celu znalezienia tej, która daje najlepsze wyniki według przyjętej metryki jakości.
Podczas stosowania Grid Search użytkownik definiuje zakres wartości dla każdego hiperparametru. Algorytm tworzy następnie kartezjański iloczyn tych wartości, a następnie testuje każdy zestaw parametrów przy użyciu wybranej strategii walidacyjnej, najczęściej k-krotnej walidacji krzyżowej.
Podczas szkoleń Cognity ten temat wraca regularnie – dlatego zdecydowaliśmy się go omówić również tutaj.
Zalety Grid Search:
- Łatwość implementacji i zrozumienia – Grid Search jest intuicyjny i łatwy do zaimplementowania, nawet dla osób początkujących w uczeniu maszynowym.
- Deterministyczność – metoda gwarantuje powtarzalność wyników, ponieważ testowana jest każda możliwa kombinacja parametrów w określonej siatce.
- Dokładność przeszukiwania – systematyczne podejście pozwala na pełne pokrycie przestrzeni parametrów w zadanym zakresie, co może być korzystne, gdy znamy ograniczony zestaw sensownych wartości.
Wady Grid Search:
- Wysoka złożoność obliczeniowa – liczba kombinacji rośnie wykładniczo wraz z liczbą parametrów i wartości w siatce, co może prowadzić do bardzo długich czasów trenowania modeli.
- Niska efektywność – Grid Search testuje każdą kombinację równomiernie, nawet jeśli niektóre z nich są mało prawdopodobne, by dawać dobre wyniki.
- Brak adaptacji – metoda nie wykorzystuje informacji z wcześniejszych iteracji, przez co nie potrafi skupić się na obiecujących obszarach przestrzeni hiperparametrów.
Grid Search sprawdza się dobrze w przypadku małych przestrzeni parametrów lub gdy mamy do czynienia z modelami o niewielkiej liczbie hiperparametrów. Jednak w bardziej złożonych scenariuszach może być nieoptymalny pod względem zasobów i czasu.
Random Search – opis, zalety i wady
Random Search to jedna z najprostszych, a zarazem bardzo skutecznych metod strojenia hiperparametrów w modelach uczenia maszynowego. Zamiast systematycznego przeszukiwania całej przestrzeni parametrów (jak ma to miejsce w Grid Search), Random Search losowo wybiera kombinacje hiperparametrów z określonych zakresów i sprawdza ich skuteczność. Dzięki temu w wielu przypadkach pozwala szybciej znaleźć dobre ustawienia modelu, zwłaszcza gdy tylko część parametrów znacząco wpływa na jakość wyników. Jeśli chcesz nauczyć się, jak skutecznie stosować Random Search i inne techniki optymalizacji w praktyce, sprawdź Kurs Machine Learning i Deep Learning w języku Python – modelowanie, optymalizacja, analiza danych.
W praktyce metoda ta polega na określeniu rozkładów prawdopodobieństwa dla poszczególnych hiperparametrów (np. rozkład jednostajny lub logarytmiczny) i liczby iteracji, które zostaną wykonane. Dla każdego przebiegu losowana jest nowa konfiguracja i oceniana za pomocą wybranej metryki walidacyjnej.
Zalety Random Search
- Efektywność czasowa: Liczba sprawdzanych konfiguracji jest pod pełną kontrolą, co może być kluczowe przy ograniczonych zasobach obliczeniowych.
- Lepsze pokrycie przestrzeni: Losowe próbkowanie pozwala objąć większy fragment przestrzeni parametrów, szczególnie jeśli tylko kilka hiperparametrów wpływa realnie na jakość modelu.
- Łatwość implementacji: Metoda jest prosta do zaimplementowania i zrozumienia, bez potrzeby budowania modeli probabilistycznych.
Wady Random Search
- Brak wykorzystania wiedzy z poprzednich prób: Każda próba jest niezależna od poprzednich, co oznacza brak „uczenia się” w trakcie procesu optymalizacji.
- Brak gwarancji znalezienia optimum: Losowy charakter może sprawić, że dobre kombinacje zostaną pominięte, szczególnie przy niewielkiej liczbie iteracji.
- Może wymagać wielu prób przy dużej liczbie hiperparametrów: Skuteczność metody spada wraz ze wzrostem wymiaru przestrzeni parametrów.
Przykład użycia (Python, scikit-learn)
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from scipy.stats import randint
param_dist = {
'n_estimators': randint(50, 200),
'max_depth': randint(3, 20),
'min_samples_split': randint(2, 11)
}
clf = RandomForestClassifier()
random_search = RandomizedSearchCV(clf, param_distributions=param_dist, n_iter=20, cv=5)
random_search.fit(X_train, y_train)
Jak pokazuje powyższy przykład, Random Search pozwala w prosty sposób przetestować losowe kombinacje hiperparametrów i znaleźć te najlepiej działające w zadaniu klasyfikacyjnym.
Bayesian Optimization – opis, zalety i wady
Bayesian Optimization to zaawansowana metoda strojenia hiperparametrów, która wykorzystuje podejście probabilistyczne do inteligentnego eksplorowania przestrzeni parametrów. Celem tej techniki jest maksymalizacja (lub minimalizacja) funkcji celu przy minimalnej liczbie jej wywołań, co czyni ją szczególnie użyteczną w przypadkach, gdy każde trenowanie modelu jest kosztowne obliczeniowo.
W odróżnieniu od metod Grid Search i Random Search, które nie wykorzystują informacji z poprzednich iteracji, Bayesian Optimization buduje model probabilistyczny (najczęściej Gaussian Process), który estymuje funkcję celu. Na podstawie tego modelu wybierane są kolejne punkty do ewaluacji w sposób maksymalizujący tzw. funkcję akwizycji, co pozwala efektywniej prowadzić eksplorację.
W Cognity mamy doświadczenie w pracy z zespołami, które wdrażają to rozwiązanie – dzielimy się tym także w artykule.
Zalety
- Efektywność obliczeniowa: Znacznie redukuje liczbę potrzebnych ewaluacji w porównaniu do metod losowych lub siatki.
- Inteligentna eksploracja: Przewiduje, gdzie szukać najlepszych wartości hiperparametrów, zamiast testować je losowo lub systematycznie.
- Przydatność przy kosztownych modelach: Idealna w przypadku drogich operacji trenowania, np. w głębokim uczeniu lub modelach ensemble.
Wady
- Złożoność implementacyjna: Trudniejsza do zrozumienia i zaimplementowania niż proste wyszukiwania siatką lub losowe.
- Wydajność w wysokowymiarowych przestrzeniach: Skuteczność maleje przy bardzo wielu hiperparametrach – Gaussian Process staje się mniej dokładny.
- Wymaga dodatkowych bibliotek: Zazwyczaj opiera się na zewnętrznych narzędziach jak
scikit-optimize,HyperoptczyBayesSearchCV.
Przykład użycia w Pythonie (z wykorzystaniem scikit-optimize)
from skopt import BayesSearchCV
from sklearn.ensemble import RandomForestClassifier
opt = BayesSearchCV(
estimator=RandomForestClassifier(),
search_spaces={
'n_estimators': (10, 200),
'max_depth': (1, 30),
'min_samples_split': (2, 20)
},
n_iter=30,
cv=3
)
opt.fit(X_train, y_train)
W powyższym przykładzie Bayesian Optimization umożliwia znalezienie optymalnych parametrów dla klasyfikatora Random Forest, oszczędzając czas i zasoby w porównaniu do wyczerpującego przeszukiwania siatką.
Porównanie metod pod względem efektywności i jakości wyników
Strojenie hiperparametrów to kluczowy etap w procesie budowania modeli uczenia maszynowego. Wybór odpowiedniej metody optymalizacji wpływa nie tylko na jakość predykcji, ale również na czas i zasoby obliczeniowe wymagane do uzyskania satysfakcjonujących rezultatów. Poniżej przedstawiono porównanie trzech popularnych podejść: Grid Search, Random Search i Bayesian Optimization – pod kątem efektywności oraz jakości uzyskiwanych wyników.
| Cecha | Grid Search | Random Search | Bayesian Optimization |
|---|---|---|---|
| Czas obliczeń | Wysoki – przeszukuje całą siatkę | Średni – losowy wybór próbki | Niski/średni – inteligentne wybieranie kolejnych punktów |
| Efektywność eksploracji przestrzeni | Niska – może pominąć wartości między punktami siatki | Średnia – większa różnorodność badanych punktów | Wysoka – wykorzystuje wcześniejsze wyniki do przewidywania kolejnych prób |
| Jakość wynikowego modelu | Wysoka (jeśli siatka jest odpowiednio gęsta) | Porównywalna lub wyższa niż Grid Search przy mniejszej liczbie prób | Najwyższa – mniejsza liczba prób prowadzi często do lepszego modelu |
| Skalowalność do dużej liczby hiperparametrów | Niska – eksplozja kombinacji siatki | Lepsza – ograniczona tylko liczbą prób | Wysoka – efektywne przeszukiwanie dużych przestrzeni |
| Wymagania implementacyjne | Niskie – łatwe do wdrożenia | Niskie – proste w użyciu | Wyższe – wymaga bibliotek i znajomości metod optymalizacji |
Przykład zastosowania w języku Python (dla klasyfikatora SVM):
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from skopt import BayesSearchCV
from sklearn.svm import SVC
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
param_dist = {'C': [0.01, 0.1, 1, 10, 100], 'kernel': ['linear', 'rbf', 'poly']}
svc = SVC()
# Grid Search
grid_search = GridSearchCV(svc, param_grid, cv=5)
grid_search.fit(X, y)
# Random Search
random_search = RandomizedSearchCV(svc, param_dist, n_iter=10, cv=5)
random_search.fit(X, y)
# Bayesian Optimization
bayes_search = BayesSearchCV(svc, param_dist, n_iter=10, cv=5)
bayes_search.fit(X, y)
W praktyce wybór metody zależy od dostępnych zasobów, skali problemu oraz oczekiwanej dokładności modelu. Bayesian Optimization często przewyższa pozostałe podejścia w kontekście liczby prób potrzebnych do znalezienia optymalnych parametrów, co czyni ją atrakcyjnym wyborem w bardziej złożonych zadaniach. Jeśli chcesz nauczyć się stosować te techniki w praktyce, warto rozważyć udział w Kursie Uczenie maszynowe z wykorzystaniem Pythona.
Praktyczne przykłady zastosowania (z kodem w Pythonie)
W tej sekcji przedstawimy praktyczne zastosowanie trzech popularnych metod strojenia hiperparametrów: Grid Search, Random Search i Bayesian Optimization. Na potrzeby porównania użyjemy prostego klasyfikatora – RandomForestClassifier z biblioteki scikit-learn i zbioru danych Breast Cancer. Dzięki temu uzyskamy jasny obraz różnic w implementacji oraz podejściu do eksploracji przestrzeni hiperparametrów.
1. Przygotowanie danych
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# Wczytanie danych
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
data.data, data.target, test_size=0.3, random_state=42
)
2. Grid Search
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [50, 100, 150],
'max_depth': [3, 5, 10]
}
grid_search = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=3)
grid_search.fit(X_train, y_train)
print("Grid Search Accuracy:", accuracy_score(y_test, grid_search.best_estimator_.predict(X_test)))
3. Random Search
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_dist = {
'n_estimators': randint(50, 200),
'max_depth': randint(3, 20)
}
random_search = RandomizedSearchCV(RandomForestClassifier(random_state=42), param_distributions=param_dist, n_iter=10, cv=3, random_state=42)
random_search.fit(X_train, y_train)
print("Random Search Accuracy:", accuracy_score(y_test, random_search.best_estimator_.predict(X_test)))
4. Bayesian Optimization (z użyciem optuna)
import optuna
from sklearn.model_selection import cross_val_score
def objective(trial):
n_estimators = trial.suggest_int('n_estimators', 50, 200)
max_depth = trial.suggest_int('max_depth', 3, 20)
clf = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, random_state=42)
return cross_val_score(clf, X_train, y_train, cv=3).mean()
study = optuna.create_study(direction='maximize', study_name="RF_Optimization")
study.optimize(objective, n_trials=20)
# Trenowanie modelu z najlepszymi parametrami
best_params = study.best_params
clf_best = RandomForestClassifier(**best_params, random_state=42)
clf_best.fit(X_train, y_train)
print("Bayesian Optimization Accuracy:", accuracy_score(y_test, clf_best.predict(X_test)))
5. Porównanie metod
| Metoda | Czas wyszukiwania | Wynik (Accuracy) | Liczba przetestowanych kombinacji |
|---|---|---|---|
| Grid Search | średni | ~0.95 | 9 (3x3) |
| Random Search | niskie/średnie | ~0.96 | 10 (losowe) |
| Bayesian Optimization | niski | ~0.97 | 20 (inteligentna eksploracja) |
Jak widać, każda z metod ma swoje mocne strony. Grid Search gwarantuje pełne przeszukiwanie siatki, Random Search jest szybszy i bardziej elastyczny, natomiast Bayesian Optimization wykorzystuje wiedzę z poprzednich prób do inteligentnego wyboru kolejnych wartości, co często skutkuje lepszym wynikiem przy mniejszej liczbie iteracji.
Kiedy wybrać daną metodę – rekomendacje
Wybór odpowiedniej metody strojenia hiperparametrów w dużej mierze zależy od charakterystyki problemu, dostępnych zasobów obliczeniowych oraz oczekiwanej jakości wyników. Poniżej przedstawiamy ogólne rekomendacje dotyczące zastosowania Grid Search, Random Search i Bayesian Optimization.
- Grid Search sprawdzi się najlepiej w sytuacjach, gdy przestrzeń hiperparametrów jest niewielka, a użytkownik chce mieć pełną kontrolę nad testowanymi wartościami. Jest to dobry wybór przy ograniczonej liczbie hiperparametrów i niewielkich możliwościach obliczeniowych.
- Random Search będzie bardziej efektywny w przypadku większych przestrzeni hiperparametrów lub gdy nie wiadomo, które hiperparametry mają największy wpływ na wynik. Dzięki losowemu próbkowaniu może szybciej znaleźć dobre kombinacje przy mniejszym nakładzie obliczeniowym.
- Bayesian Optimization to najlepszy wybór, gdy koszty pojedynczego treningu modelu są wysokie, a celem jest szybkie znalezienie optymalnych ustawień. Sprawdza się zwłaszcza w bardziej złożonych projektach, gdzie każda iteracja ma duże znaczenie i konieczne jest inteligentne przeszukiwanie przestrzeni.
W praktyce dobór metody warto dostosować nie tylko do samego algorytmu, ale też do ograniczeń technicznych, czasu dostępnego na eksperymenty oraz wymagań biznesowych co do jakości modelu.
Wprowadzenie do strojenia hiperparametrów
Strojenie hiperparametrów to kluczowy etap w procesie budowy modeli uczenia maszynowego. Hiperparametry to parametry nieustalane przez sam model w czasie treningu, lecz definiowane przez użytkownika przed rozpoczęciem procesu uczenia. Ich odpowiedni dobór może znacząco wpłynąć na jakość predykcji oraz efektywność działania modelu.
Istnieje wiele metod optymalizacji hiperparametrów, spośród których trzy najpopularniejsze to:
- Grid Search – metoda polegająca na przeszukiwaniu przestrzeni hiperparametrów w sposób wyczerpujący, sprawdzając każdą możliwą kombinację w określonym zakresie.
- Random Search – technika losowego próbkowania wartości hiperparametrów, która pozwala na szybsze znalezienie satysfakcjonujących wyników bez konieczności testowania każdej kombinacji.
- Bayesian Optimization – podejście probabilistyczne, które modeluje funkcję celu i wybiera kolejne kombinacje hiperparametrów w sposób ukierunkowany, maksymalizując prawdopodobieństwo poprawy wyników.
Każda z tych metod ma swoje unikalne cechy, zastosowania i ograniczenia. Wybór odpowiedniej techniki zależy od wielu czynników, takich jak dostępna moc obliczeniowa, liczba hiperparametrów, czas treningu modelu oraz wymagany poziom dokładności. W Cognity łączymy teorię z praktyką – dlatego ten temat rozwijamy także w formie ćwiczeń na szkoleniach.