Informed Methods: Bayesiaanse statistiek

Hyperparameter Tuning in Python

Alex Scriven

Data Scientist

Introductie Bayes

 

Bayes-regel:

Een statistische methode om met nieuwe bewijzen onze overtuigingen over een uitkomst iteratief bij te werken

  • Sluit intuïtief aan bij informeerd zoeken: je wordt beter naarmate je meer bewijs krijgt.
Hyperparameter Tuning in Python

Bayes-regel

De Bayes-regel heeft de vorm:

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

  • LHS = de kans op A, gegeven dat B is opgetreden. B is nieuw bewijs.

    • Dit heet de 'posterior'
  • RHS is hoe we dit berekenen.

  • P(A) is de 'prior': de initiële hypothese over de gebeurtenis. Die verschilt van P(A|B); P(A|B) is de kans gegeven nieuw bewijs.
Hyperparameter Tuning in Python

Bayes-regel

 

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

  • P(B) is de 'marginale waarschijnlijkheid': de kans op het waargenomen nieuwe bewijs
  • P(B|A) is de 'likelihood': de kans op het bewijs, gegeven de gebeurtenis die ons interesseert.

Dit kan verwarrend zijn, maar we gebruiken een klassiek medisch voorbeeld.

Hyperparameter Tuning in Python

Bayes in de geneeskunde

 

Een medisch voorbeeld:

  • 5% van de bevolking heeft een bepaalde ziekte
    • P(D)
  • 10% van de mensen is predisposed
    • P(Pre)
  • 20% van de mensen met de ziekte is predisposed
    • P(Pre|D)
Hyperparameter Tuning in Python

Bayes in de geneeskunde

Wat is de kans dat een willekeurig persoon de ziekte heeft?

$$ P(D) = 0.05 $$

Dit is onze prior; we hebben nog geen bewijs.

Wat is de kans dat een gepredisponeerd persoon de ziekte heeft?

$$ 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 $$

Hyperparameter Tuning in Python

Bayes bij hyperparametertuning

We passen deze logica toe op hyperparametertuning:

  • Kies een hyperparametercombinatie
  • Bouw een model
  • Verzamel nieuwe bewijzen (de score van het model)
  • Update je overtuigingen en kies de volgende ronde betere hyperparameters

Bayesiaanse hyperparametertuning is nieuw maar populair bij grotere, complexere tuningtaken, omdat het daar goed optimale combinaties vindt

Hyperparameter Tuning in Python

Bayesiaanse hyperparametertuning met Hyperopt

 

Introductie van het pakket Hyperopt.

Voor bayesiaanse hyperparametertuning moeten we:

  1. Het domein instellen: onze grid (met een twist)
  2. Het optimalisatie-algoritme instellen (standaard TPE)
  3. Doelfunctie om te minimaliseren: we gebruiken 1-Accuracy
Hyperparameter Tuning in Python

Hyperopt: stel het domein (grid) in

Veel opties om de grid te zetten:

  • Simpele getallen
  • Kiezen uit een lijst
  • Verdelingswaarden

Hyperopt gebruikt geen puntwaarden op de grid; elk punt geeft kansen voor elke hyperparametervalue.

We gebruiken een eenvoudige uniforme verdeling; er zijn er meer in de documentatie.

Hyperparameter Tuning in Python

Het domein

 

Stel de grid in:

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),
}
Hyperparameter Tuning in Python

De doelfunctie

De doelfunctie voert het algoritme uit:

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
Hyperparameter Tuning in Python

Voer het algoritme uit

 

Voer het algoritme uit:

best_result = fmin(
            fn=objective,
            space=space,
            max_evals=500, 
            rstate=np.random.default_rng(42),
            algo=tpe.suggest)
Hyperparameter Tuning in Python

Laten we oefenen!

Hyperparameter Tuning in Python

Preparing Video For Download...