Méthodes informées : statistiques bayésiennes

Optimisation des hyperparamètres en Python

Alex Scriven

Data Scientist

Introduction à Bayes

 

Règle de Bayes :

Une méthode statistique qui utilise de nouvelles preuves pour mettre à jour itérativement nos croyances sur un résultat

  • Correspond intuitivement à l'idée d'une recherche informée. On s'améliore au fil des preuves.
Optimisation 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)} $$

  • Membre de gauche = la probabilité de A, sachant que B est survenu. B est une nouvelle preuve.

    • C'est le « postérieur »
  • Le membre de droite indique comment la calculer.

  • P(A) est l'« a priori ». L'hypothèse initiale sur l'événement. Différent de P(A|B), qui est la probabilité étant donné la nouvelle preuve.
Optimisation 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 » : probabilité d'observer la preuve, étant donné l'événement qui nous intéresse.

Cela peut sembler déroutant ; prenons un exemple classique de diagnostic médical.

Optimisation 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 malades sont prédisposées
    • P(Pre|D)
Optimisation des hyperparamètres en Python

Bayes en médecine

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

$$ P(D) = 0.05 $$

C'est simplement notre a priori, 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 $$

Optimisation des hyperparamètres en Python

Bayes pour le réglage des hyperparamètres

On peut appliquer cette logique au réglage 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 tour suivant

Le réglage bayésien des hyperparamètres est récent mais populaire pour des tâches plus vastes et complexes, car il trouve efficacement des combinaisons optimales dans ces contextes.

Optimisation des hyperparamètres en Python

Réglage bayésien avec Hyperopt

 

Présentation du package Hyperopt.

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

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

Hyperopt : définir le domaine (grille)

De nombreuses façons de définir la grille :

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

Hyperopt n'utilise pas de valeurs ponctuelles : chaque point représente des probabilités pour chaque valeur d'hyperparamètre.

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

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

Exécuter l'algorithme

 

Lancer l'algorithme :

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

Passons à la pratique !

Optimisation des hyperparamètres en Python

Preparing Video For Download...