ML Learning Hub
Appliquéintermédiaire

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.

40 min
9 diagrammes
7 Concepts Couverts

Prérequis

Model Evaluation
Gradient Boosting

Concepts Couverts

GridSearchCVRandomizedSearchCVBayesian OptimisationOptunaSuccessive HalvingCV ScoreOverfitting to Validation

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

Loading visualization…
🎯

Pourquoi les Hyperparamètres Importent

motivation

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

comparison

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

algorithm
1

Ajuster un modèle de substitution (Processus Gaussien) aux observations précédentes (θ, score)

2

Utiliser la fonction d'acquisition (Amélioration Attendue, UCB) pour sélectionner le prochain θ

3

AE : explorer où l'incertitude est élevée OU où le gain attendu est élevé

4

Évaluer l'objectif réel : entraîner le modèle avec θ, calculer le score de VC

5

Ajouter la nouvelle observation au jeu de données, ré-ajuster le substitut

6

Répéter jusqu'à épuisement du budget — retourner le meilleur θ trouvé

🔬

Recherche par Réduction de Moitié : Vitesse Sans Sacrifice

deepdive

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

code
python56 lines
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

pitfall

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.