Méthodes éclairées : statistiques bayésiennes

Ajustement des hyperparamètres en Python

Alex Scriven

Data Scientist

Introduction à Bayes

 

Règle de Bayes :

Méthode statistique qui utilise de nouvelles données pour mettre à jour, de façon itérative, nos croyances sur un résultat

  • Correspond naturellement à une recherche éclairée : on s'améliore à mesure que l'on obtient des preuves.
Ajustement des hyperparamètres en Python

Règle de Bayes

La règle de Bayes s'écrit :

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

  • Côté gauche : la probabilité de A sachant que B est survenu. B représente une nouvelle preuve.

    • C'est le « postérieur ».
  • Côté droit : la façon de le calculer.

  • P(A) est l'« antérieur » (prior) : l'hypothèse initiale sur l'événement. Il diffère de P(A|B), qui est la probabilité étant donné la nouvelle preuve.
Ajustement des hyperparamètres en Python

Règle de Bayes

 

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

  • P(B) est la « vraisemblance marginale » : la probabilité d'observer cette nouvelle preuve.
  • P(B|A) est la « vraisemblance » : la probabilité d'observer la preuve, étant donné l'événement qui nous intéresse.

Cela peut sembler déroutant ; illustrons-le par l'exemple courant d'un diagnostic médical.

Ajustement des hyperparamètres en Python

Bayes en médecine

 

Un exemple médical :

  • 5 % des personnes dans la population générale ont une certaine maladie
    • P(D)
  • 10 % des personnes sont prédisposées
    • P(Pre)
  • 20 % des personnes atteintes sont prédisposées
    • P(Pre|D)
Ajustement des hyperparamètres en Python

Bayes en médecine

Quelle est la probabilité qu'une personne ait la maladie ?

$$ P(D) = 0.05 $$

C'est tout simplement notre antérieur, faute de preuve.

Quelle est la probabilité qu'une personne prédisposée ait la maladie ?

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

Ajustement des hyperparamètres en Python

Bayes pour l'ajustement d'hyperparamètres

On peut appliquer cette logique à l'ajustement d'hyperparamètres :

  • Choisir une combinaison d'hyperparamètres
  • Construire un modèle
  • Obtenir de nouvelles preuves (le score du modèle)
  • Mettre à jour nos croyances et choisir de meilleurs hyperparamètres au prochain tour

L'ajustement bayésien d'hyperparamètres est récent, mais populaire pour les tâches plus vastes et complexes : il trouve efficacement des combinaisons optimales dans ces contextes.

Ajustement des hyperparamètres en Python

Ajustement bayésien avec Hyperopt

 

Présentation du paquet Hyperopt.

Pour effectuer un ajustement bayésien des hyperparamètres, il faut :

  1. Définir le domaine : notre grille (avec une petite variante)
  2. Choisir l'algorithme d'optimisation (TPE par défaut)
  3. Définir la fonction objectif à minimiser : nous utiliserons 1-Accuracy
Ajustement des hyperparamètres en Python

Hyperopt : définir le domaine (grille)

Plusieurs façons de définir la grille :

  • Nombres simples
  • Choix dans une liste
  • Distribution de valeurs

Hyperopt n'utilise pas des points fixes sur la grille ; chaque point représente plutôt des probabilités pour chaque valeur d'hyperparamètre.

Nous utiliserons une distribution uniforme simple, mais consultez la documentation pour d'autres options.

Ajustement des hyperparamètres en Python

Le domaine

 

Configurer la grille :

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),
}
Ajustement des hyperparamètres en Python

La fonction objectif

La fonction objectif exécute l'algorithme :

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
Ajustement des hyperparamètres en Python

Exécuter l'algorithme

 

Exécuter l'algorithme :

best_result = fmin(
            fn=objective,
            space=space,
            max_evals=500, 
            rstate=np.random.default_rng(42),
            algo=tpe.suggest)
Ajustement des hyperparamètres en Python

Passons à la pratique !

Ajustement des hyperparamètres en Python

Preparing Video For Download...