Optimisation des Hyperparamètres
“Automatiser l'art de trouver les bons réglages à ajuster”
Grid Search, Random Search, Optimisation Bayésienne (TPE/GP), Successive Halving et Optuna — avec heatmap interactive C × max_depth.
Prérequis
Concepts Couverts
∑Formules Clés
Recherche par Grille
Recherche exhaustive sur toutes les combinaisons de la grille prédéfinie
Réduction Successive de Moitié
Éliminer progressivement les mauvais candidats, allouer plus de ressources aux prometteurs
Amélioration Attendue
Fonction d'acquisition de l'Optimisation Bayésienne — équilibre exploration vs exploitation
▶Simulation Interactive
Pourquoi les Hyperparamètres Importent
Une forêt aléatoire avec max_depth=5 peut scorer 0,72 AUC. Le même algorithme avec max_depth=12, min_samples_leaf=3, max_features='sqrt' score 0,89 AUC. Cet écart de 17 points est pur réglage des hyperparamètres — l'algorithme n'a pas changé, les données non plus. Les hyperparamètres sont des paramètres non appris à partir des données ; ils contrôlent le processus d'apprentissage lui-même. Les choisir correctement fait souvent la différence entre un modèle médiocre et un modèle prêt pour la production.
Le taux d'apprentissage est le seul hyperparamètre le plus important dans la plupart des modèles basés sur le gradient. Trop élevé = divergence. Trop bas = convergence lente. Le régler en premier.
Grille vs Aléatoire vs Bayésien
La Recherche par Grille évalue chaque combinaison dans le produit cartésien des valeurs de paramètres — correcte mais exponentiellement coûteuse. La Recherche Aléatoire échantillonne n_iter combinaisons aléatoires — étonnamment efficace car la plupart des espaces d'hyperparamètres n'ont que quelques dimensions qui comptent vraiment ; l'échantillonnage aléatoire les couvre mieux que les grilles. L'Optimisation Bayésienne maintient un modèle probabiliste de la surface d'objectif (Processus Gaussien ou TPE) et suggère séquentiellement des configurations qui maximisent l'amélioration attendue — elle apprend des évaluations précédentes et se concentre sur les régions prometteuses.
La Recherche Aléatoire avec n_iter=60 surpasse typiquement la Recherche par Grille avec 5× plus d'évaluations. L'Optimisation Bayésienne surpasse les deux quand les évaluations sont coûteuses.
Boucle d'Optimisation Bayésienne
Ajuster un modèle de substitution (Processus Gaussien) aux observations précédentes (θ, score)
Utiliser la fonction d'acquisition (Amélioration Attendue, UCB) pour sélectionner le prochain θ
AE : explorer où l'incertitude est élevée OU où le gain attendu est élevé
Évaluer l'objectif réel : entraîner le modèle avec θ, calculer le score de VC
Ajouter la nouvelle observation au jeu de données, ré-ajuster le substitut
Répéter jusqu'à épuisement du budget — retourner le meilleur θ trouvé
Recherche par Réduction de Moitié : Vitesse Sans Sacrifice
HalvingGridSearchCV et HalvingRandomSearchCV implémentent la réduction successive de moitié : commencer avec tous les candidats mais des ressources minimales, garder la fraction η supérieure, doubler les ressources, répéter. Une grille de 1024 candidats avec 4 tours de réduction ne nécessite que 1024×1 + 512×2 + 256×4 + 128×8 = 4096 évaluations totales, contre 1024×toutes pour GridSearchCV standard. Cela donne une accélération 10–100× pour les grandes grilles avec une perte de qualité négligeable.
Pour les réseaux de neurones, utiliser Keras Tuner ou Optuna plutôt que la recherche de sklearn — ils supportent les essais parallèles asynchrones, l'intégration d'arrêt anticipé et les espaces de recherche spécifiques aux réseaux.
Les Trois Méthodes dans scikit-learn
from sklearn.model_selection import (GridSearchCV, RandomizedSearchCV, cross_val_score, train_test_split) from sklearn.experimental import enable_halving_search_cv class="tok-comment"># noqa from sklearn.model_selection import HalvingRandomSearchCV from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets import make_classification from scipy.stats import uniform, randint import optuna class="tok-comment"># pour lclass="tok-str">'optimisation bayésienne class="tok-comment"># ── Données d'exemple ────────────────────────────────────────────────── X, y = make_classification(n_samples=class="tok-num">600, n_features=class="tok-num">10, random_state=class="tok-num">42) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=class="tok-num">0.2, random_state=class="tok-num">42) class="tok-comment"># ── Espace de paramètres ─────────────────────────────────────────── grille_params = { class="tok-str">'n_estimators': [class="tok-num">100, class="tok-num">200, class="tok-num">400], class="tok-str">'max_depth': [class="tok-num">3, class="tok-num">5, class="tok-num">7, class="tok-num">9], class="tok-str">'learning_rate': [class="tok-num">0.01, class="tok-num">0.05, class="tok-num">0.1, class="tok-num">0.2], class="tok-str">'subsample': [class="tok-num">0.7, class="tok-num">0.8, class="tok-num">1.0], class="tok-str">'min_samples_leaf': [class="tok-num">1, class="tok-num">3, class="tok-num">5], } class="tok-comment"># ── class="tok-num">1. Recherche par Grille (exhaustive, coûteuse) ───────────────── grille = GridSearchCV(GradientBoostingClassifier(), grille_params, cv=class="tok-num">5, scoring=class="tok-str">'roc_auc', n_jobs=-class="tok-num">1) grille.fit(X_train, y_train) print(fclass="tok-str">"Grille meilleur : {grille.best_score_:.4f} {grille.best_params_}") class="tok-comment"># ── class="tok-num">2. Recherche Aléatoire (rapide, presque aussi bonne) ─────────── dist_params = { class="tok-str">'n_estimators': randint(class="tok-num">50, class="tok-num">500), class="tok-str">'max_depth': randint(class="tok-num">2, class="tok-num">12), class="tok-str">'learning_rate': uniform(class="tok-num">0.005, class="tok-num">0.3), class="tok-str">'subsample': uniform(class="tok-num">0.6, class="tok-num">0.4), } aleatoire = RandomizedSearchCV(GradientBoostingClassifier(), dist_params, n_iter=class="tok-num">60, cv=class="tok-num">5, scoring=class="tok-str">'roc_auc', n_jobs=-class="tok-num">1, random_state=class="tok-num">42) aleatoire.fit(X_train, y_train) print(fclass="tok-str">"Aléatoire meilleur : {aleatoire.best_score_:.4f} {aleatoire.best_params_}") class="tok-comment"># ── class="tok-num">3. Optuna (Bayésien, meilleure qualité) ──────────────────────── def objectif(essai): params = { class="tok-str">'n_estimators': essai.suggest_int(class="tok-str">'n_estimators', class="tok-num">50, class="tok-num">500), class="tok-str">'max_depth': essai.suggest_int(class="tok-str">'max_depth', class="tok-num">2, class="tok-num">12), class="tok-str">'learning_rate': essai.suggest_float(class="tok-str">'learning_rate', class="tok-num">1e-3, class="tok-num">0.3, log=True), class="tok-str">'subsample': essai.suggest_float(class="tok-str">'subsample', class="tok-num">0.5, class="tok-num">1.0), } modele = GradientBoostingClassifier(**params) return cross_val_score(modele, X_train, y_train, cv=class="tok-num">3, scoring=class="tok-str">'roc_auc').mean() etude = optuna.create_study(direction=class="tok-str">'maximize') etude.optimize(objectif, n_trials=class="tok-num">100, n_jobs=class="tok-num">4) print(fclass="tok-str">"Optuna meilleur : {etude.best_value:.4f} {etude.best_params}")
Pièges du Réglage des Hyperparamètres
Le réglage sur l'ensemble de test gonfle les estimations de performance — toujours régler en utilisant uniquement la validation croisée sur les données d'entraînement. Deuxième : la validation croisée imbriquée est nécessaire pour une estimation non biaisée quand la sélection de modèle et le réglage des hyperparamètres sont tous deux appliqués. Troisième : la « malédiction du vainqueur » — avec 1000 configurations aléatoires, la meilleure sera optimiste par hasard. Utiliser un ensemble de retenue pour vérifier. Quatrième : ne pas tout régler simultanément — fixer le taux d'apprentissage d'abord, puis la régularisation, puis l'architecture.
L'overfitting sur l'ensemble de validation est réel. Avec suffisamment d'essais d'hyperparamètres, vous trouverez une configuration qui score bien accidentellement sur vos plis VC mais généralise mal. Toujours faire une évaluation finale sur un vrai ensemble de test retenu.
?Vérification des Connaissances
La progression est sauvegardée dans votre navigateur — aucun compte requis.
Besoin d'un ingénieur IA ou data scientist ?
Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.