Recherche exhaustive d'hyperparamètres optimaux par validation croisée
Principe de recherche par grille avec validation croisée
La
recherche par grille avec validation croisée (Grid Search Cross-validation) consiste à tester automatiquement plusieurs combinaisons d’hyperparamètres d’un modèle afin de trouver la configuration la plus performante. Plutôt que de choisir ces paramètres au hasard, on définit une grille (par exemple différentes profondeurs maximales, critères de division ou tailles minimales d’échantillons). Le modèle est ensuite entraîné et évalué sur chaque combinaison grâce à la validation croisée, ce qui permet d’obtenir une estimation fiable de la performance pour chaque option.
Recherche par grille avec la méthode GridSearchCV de scikit-learn
GridSearchCV est une méthode de la bibliothèque scikit‑learn qui permet d’optimiser automatiquement les hyperparamètres d’un modèle. Plutôt que de tester manuellement différentes valeurs, on définit une grille de paramètres possibles. GridSearchCV va alors entraîner et évaluer le modèle pour chaque combinaison de paramètres en utilisant la validation croisée, ce qui garantit une estimation fiable des performances.
Prenons l’exemple d’un arbre de décision appliqué aux données du Titanic. On peut demander à GridSearchCV de comparer des arbres avec une profondeur maximale de 2, 3, 4 ou 5, et avec deux critères de division différents (gini ou entropy). Pour chaque configuration, le modèle est testé sur plusieurs découpages des données, puis les scores sont moyennés. À la fin, GridSearchCV indique automatiquement la combinaison la plus performante (par exemple, un arbre de profondeur 4 utilisant le critère entropy). Ainsi, on obtient un modèle optimisé sans avoir à essayer manuellement chaque paramètre, ce qui rend le processus d’ajustement plus systématique et efficace.
Classer les survivants du Titanic avec GridSearchCV
Classer les survivants du Titanic avec GridSearchCV consiste à entraîner un modèle de classification (un arbre de décision dans notre cas), tout en optimisant automatiquement ses paramètres. Au lieu de choisir arbitrairement la profondeur de l’arbre ou le critère de division, GridSearchCV teste plusieurs combinaisons possibles sur différents découpages du jeu de données grâce à la validation croisée. Chaque configuration est évaluée, et la meilleure est sélectionnée selon la performance moyenne obtenue.
Je propose le code suivante:
import pandas as pd
from sklearn.model_selection import StratifiedKFold, GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, make_scorer
df = pd.read_csv("titanic.csv")
df = df[["Survived", "Pclass", "Sex", "Age", "SibSp", "Parch", "Fare"]].dropna()
df["Sex"] = df["Sex"].map({"male": 0, "female": 1})
X = df.drop("Survived", axis=1)
y = df["Survived"]
clf = DecisionTreeClassifier(random_state=42)
# Définir la grille d’hyperparamètres
param_grid = {
'max_depth': [2, 3, 4, 5, None],
'criterion': ['gini', 'entropy'],
'min_samples_split': [2, 5, 10]
}
# Définir la validation croisée
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# GridSearchCV
grid_search = GridSearchCV(
estimator=clf,
param_grid=param_grid,
scoring=make_scorer(accuracy_score),
cv=cv,
n_jobs=-1
)
grid_search.fit(X, y)
print("Meilleurs paramètres :", grid_search.best_params_)
print(f"Meilleure exactitude : {grid_search.best_score_:.2f}")
En plus de
StratifiedKFold qu'on a eu l'occasion de voir dans la leçon précédente, on importe le module
GridSearchCV qui exécute une recherche par grille avec validation croisée en testant automatiquement toutes les combinaisons d’hyperparamètres que l'on aura défini par la suite:
from sklearn.model_selection import StratifiedKFold, GridSearchC
Ensuite, on définit la grille d’hyperparamètres (sous forme d'un dictionnaire Python) que GridSearchCV va explorer pour optimiser notre modèle d’arbre de décision :
# Définir la grille d’hyperparamètres
param_grid = {
'max_depth': [2, 3, 4, 5, None],
'criterion': ['gini', 'entropy'],
'min_samples_split': [2, 5, 10]
}
Voyons rapidement ce que ces hyperparamètres sigifient:
- 'max_depth': [2, 3, 4, 5, None]: La profondeur maximale de l’arbre. Tester différentes valeurs (2, 3, 4, 5, ou illimitée avec None) permet de comparer des arbres plus simples ou plus complexes.
- 'criterion': ['gini', 'entropy']: La mesure utilisée pour choisir les divisions dans l’arbre. Ici, on compare deux critères classiques qui sont gini et entropy (qu'on a déjà vus dans la leçon consacrée au modèle d'arbre de décision).
- 'min_samples_split': [2, 5, 10]: Le nombre minimum d’échantillons requis pour diviser un nœud. Des valeurs plus élevées évitent de trop fragmenter l’arbre et limitent le surapprentissage.
Concernant la validation croisée, on utilise le même code que dans la leçon précédente:
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
Ensuite, on met en place un objet GridSearchCV qui va optimiser le modèle à base d'arbre de décision en testant toutes les combinaisons d’hyperparamètres définies:
# GridSearchCV
grid_search = GridSearchCV(
estimator=clf,
param_grid=param_grid,
scoring=make_scorer(accuracy_score),
cv=cv,
n_jobs=-1
)
Voyobs rapidement les paramègres de la fonction GridSearchCV:
- estimator=clf: le modèle de base que l'on cherche à optimiser (arbre de décision dans notre cas).
- param_grid=param_grid: La grille d’hyperparamètres que nous avons définie (max_depth, criterion, min_samples_split).
- scoring=make_scorer(accuracy_score): La métrique utilisée pour comparer les modèles. Encore une fois, on va se contenter de l’exactitude (Accuracy score).
- cv=cv: La stratégie de validation croisée (ici un StratifiedKFold en 5 folds exactement comme la dernière fois).
- n_jobs=-1: Permet d’utiliser tous les cœurs du processeur pour accélérer le calcul.
Concrètement, GridSearchCV va entraîner notre modèle pour chaque combinaison de paramètres, évaluer les performances en validation croisée, puis retenir la meilleure configuration.
Après exécution du code, on obtient ce résultat:
Meilleurs paramètres : {'criterion': 'gini', 'max_depth': 3, 'min_samples_split': 2}
Meilleure exactitude : 0.81
Les résultats indiquent que l’arbre de décision le plus performant pour prédire la survie des passagers du Titanic utilise le critère gini, une profondeur maximale de 3 niveaux et un minimum de 2 échantillons pour diviser un nœud. Avec cette configuration, le modèle atteint une exactitude moyenne de 81%, ce qui signifie qu’il parvient à classer correctement environ huit passagers sur dix. Cela montre que des paramètres relativement simples suffisent à obtenir une bonne performance tout en évitant le surapprentissage.