Metody oparte na wiedzy: statystyka bayesowska

Strojenie hiperparametrów w Pythonie

Alex Scriven

Data Scientist

Wprowadzenie do reguły Bayesa

 

Reguła Bayesa:

Metoda statystyczna wykorzystująca nowe dowody do iteracyjnej aktualizacji przekonań na temat pewnego zdarzenia

  • Intuicyjnie pasuje do idei świadomego przeszukiwania – im więcej dowodów, tym lepsze wyniki.
Strojenie hiperparametrów w Pythonie

Reguła Bayesa

Reguła Bayesa ma postać:

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • Lewa strona = prawdopodobieństwo A pod warunkiem zajścia B. B to nowy dowód.

    • Nazywana jest „prawdopodobieństwem posteriori"
  • Prawa strona pokazuje sposób obliczenia.

  • P(A) to „prior" – wstępna hipoteza o zdarzeniu. Różni się od P(A|B), które uwzględnia nowe dowody.
Strojenie hiperparametrów w Pythonie

Reguła Bayesa

 

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • P(B) to „prawdopodobieństwo brzegowe" – prawdopodobieństwo zaobserwowania nowego dowodu
  • P(B|A) to „wiarygodność" – prawdopodobieństwo zaobserwowania dowodu przy założeniu zajścia zdarzenia.

Może to być mylące – posłużmy się klasycznym przykładem diagnozy medycznej.

Strojenie hiperparametrów w Pythonie

Bayes w medycynie

 

Przykład medyczny:

  • 5% populacji ogólnej choruje na pewną chorobę
    • P(D)
  • 10% osób jest predysponowanych
    • P(Pre)
  • 20% chorych jest predysponowanych
    • P(Pre|D)
Strojenie hiperparametrów w Pythonie

Bayes w medycynie

Jakie jest prawdopodobieństwo, że dana osoba jest chora?

$$ P(D) = 0.05 $$

To po prostu nasz prior – nie mamy jeszcze żadnych dowodów.

Jakie jest prawdopodobieństwo, że osoba predysponowana jest chora?

$$ P(D \mid Pre) = \frac{P(Pre \mid D) \, P(D)}{P(pre)} $$

$$ P(D \mid Pre) = \frac{0.2 \, * 0.05}{0.1} = 0.1 $$

Strojenie hiperparametrów w Pythonie

Bayes w strojeniu hiperparametrów

Tę logikę możemy zastosować do strojenia hiperparametrów:

  • Wybierz kombinację hiperparametrów
  • Zbuduj model
  • Uzyskaj nowe dowody (wynik modelu)
  • Zaktualizuj przekonania i wybierz lepsze hiperparametry

Bayesowskie strojenie hiperparametrów jest stosunkowo nowe, ale popularne przy złożonych zadaniach – dobrze sprawdza się w wyszukiwaniu optymalnych kombinacji

Strojenie hiperparametrów w Pythonie

Bayesowskie strojenie hiperparametrów z Hyperopt

 

Wprowadzenie pakietu Hyperopt.

Aby przeprowadzić bayesowskie strojenie hiperparametrów, należy:

  1. Zdefiniować domenę: siatkę (z pewną modyfikacją)
  2. Wybrać algorytm optymalizacji (domyślnie TPE)
  3. Zdefiniować funkcję celu do minimalizacji: użyjemy 1-dokładność
Strojenie hiperparametrów w Pythonie

Hyperopt: definiowanie domeny (siatki)

Wiele opcji definiowania siatki:

  • Pojedyncze liczby
  • Wybór z listy
  • Rozkład wartości

Hyperopt nie używa punktowych wartości na siatce – każdy punkt reprezentuje prawdopodobieństwa dla poszczególnych wartości hiperparametrów.

Skorzystamy z prostego rozkładu jednostajnego, ale dostępnych jest znacznie więcej opcji – zob. dokumentację.

Strojenie hiperparametrów w Pythonie

Domena

 

Definicja siatki:

space = {
    'max_depth': hp.quniform('max_depth', 2, 10, 2),
    'min_samples_leaf': hp.quniform('min_samples_leaf', 2, 8, 2),
    'learning_rate': hp.uniform('learning_rate', 0.01, 1, 55),
}
Strojenie hiperparametrów w Pythonie

Funkcja celu

Funkcja celu uruchamia algorytm:

def objective(params):
    params = {'max_depth': int(params['max_depth']),
        'min_samples_leaf': int(params['min_samples_leaf']),
        'learning_rate': params['learning_rate']}
    gbm_clf = GradientBoostingClassifier(n_estimators=500, **params)

best_score = cross_val_score(gbm_clf, X_train, y_train, scoring='accuracy', cv=10, n_jobs=4).mean() loss = 1 - best_score
write_results(best_score, params, iteration) return loss
Strojenie hiperparametrów w Pythonie

Uruchomienie algorytmu

 

Uruchomienie algorytmu:

best_result = fmin(
            fn=objective,
            space=space,
            max_evals=500, 
            rstate=np.random.default_rng(42),
            algo=tpe.suggest)
Strojenie hiperparametrów w Pythonie

Czas na ćwiczenia!

Strojenie hiperparametrów w Pythonie

Preparing Video For Download...