Optimisation des hyperparamètres en Python
Alex Scriven
Data Scientist
Règle de Bayes :
Une méthode statistique qui utilise de nouvelles preuves pour mettre à jour itérativement 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)} $$
Membre de gauche = la probabilité de A, sachant que B est survenu. B est une nouvelle preuve.
Le membre de droite indique comment la calculer.
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
Cela peut sembler déroutant ; prenons un exemple classique de diagnostic médical.
Un exemple médical :
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 $$
On peut appliquer cette logique au réglage d'hyperparamètres :
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.
Présentation du package Hyperopt.
Pour effectuer un réglage bayésien des hyperparamètres, il faut :
De nombreuses façons de définir la grille :
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.
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
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