Ajustement des hyperparamètres en Python
Alex Scriven
Data Scientist
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
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ôté droit : la façon de le calculer.
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
Cela peut sembler déroutant ; illustrons-le par l'exemple courant d'un diagnostic médical.
Un exemple médical :
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 $$
On peut appliquer cette logique à l'ajustement d'hyperparamètres :
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.
Présentation du paquet Hyperopt.
Pour effectuer un ajustement bayésien des hyperparamètres, il faut :
Plusieurs façons de définir la grille :
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.
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),
}
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_scorewrite_results(best_score, params, iteration) return loss
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