Informerade metoder: Bayesiansk statistik

Hyperparameterjustering i Python

Alex Scriven

Data Scientist

Introduktion till Bayes

 

Bayes sats:

En statistisk metod där ny evidens används för att iterativt uppdatera våra uppfattningar om ett visst utfall

  • Passar intuitivt med idén om informerad sökning – vi blir bättre ju mer evidens vi samlar in.
Hyperparameterjustering i Python

Bayes sats

Bayes sats har formen:

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

  • VL = sannolikheten för A, givet att B har inträffat. B är ny evidens.

    • Detta kallas 'posteriorn'
  • HL visar hur vi beräknar detta.

  • P(A) är 'priorn' – den initiala hypotesen om händelsen. Den skiljer sig från P(A|B), som är sannolikheten givet ny evidens.
Hyperparameterjustering i Python

Bayes sats

 

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

  • P(B) är 'marginallikelihooden' – sannolikheten att observera den nya evidensen
  • P(B|A) är 'likelihooden' – sannolikheten att observera evidensen givet den händelse vi bryr oss om.

Detta kan verka förvirrande, men låt oss använda ett vanligt exempel med medicinsk diagnos för att illustrera.

Hyperparameterjustering i Python

Bayes inom medicin

 

Ett medicinskt exempel:

  • 5 % av befolkningen har en viss sjukdom
    • P(D)
  • 10 % av befolkningen är predisponerade
    • P(Pre)
  • 20 % av de sjuka är predisponerade
    • P(Pre|D)
Hyperparameterjustering i Python

Bayes inom medicin

Vad är sannolikheten att en slumpmässig person har sjukdomen?

$$ P(D) = 0.05 $$

Detta är helt enkelt vår prior – vi har ingen evidens.

Vad är sannolikheten att en predisponerad person har sjukdomen?

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

Hyperparameterjustering i Python

Bayes vid hyperparameterjustering

Vi kan tillämpa samma logik på hyperparameterjustering:

  • Välj en kombination av hyperparametrar
  • Träna en modell
  • Samla ny evidens (modellens poäng)
  • Uppdatera våra uppfattningar och välj bättre hyperparametrar i nästa omgång

Bayesiansk hyperparameterjustering är relativt ny men populär för större och mer komplexa uppgifter, där den är effektiv för att hitta optimala hyperparameterkombinationer

Hyperparameterjustering i Python

Bayesiansk hyperparameterjustering med Hyperopt

 

Introduktion till paketet Hyperopt.

För bayesiansk hyperparameterjustering behöver vi:

  1. Definiera domänen: vårt rutnät (med en liten twist)
  2. Välja optimeringsalgoritm (använd standard-TPE)
  3. Definiera en målfunktion att minimera: vi använder 1 minus noggrannhet
Hyperparameterjustering i Python

Hyperopt: Definiera domänen (rutnätet)

Många alternativ för att definiera rutnätet:

  • Enkla tal
  • Välj från en lista
  • Fördelning av värden

Hyperopt använder inte punktvärden i rutnätet – varje punkt representerar istället sannolikheter för varje hyperparametervärde.

Vi använder en enkel likformig fördelning, men det finns många fler i dokumentationen.

Hyperparameterjustering i Python

Domänen

 

Definiera rutnätet:

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),
}
Hyperparameterjustering i Python

Målfunktionen

Målfunktionen kör algoritmen:

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
Hyperparameterjustering i Python

Kör algoritmen

 

Kör algoritmen:

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

Nu kör vi en övning!

Hyperparameterjustering i Python

Preparing Video For Download...