Introduction à l'intelligence artificielle: comprendre le Machine Learning

Auteur: Mohamed CHINY Durée necessaire pour le cours de Introduction à l'intelligence artificielle: comprendre le Machine Learning Niveau recommandé pour le cours de Introduction à l'intelligence artificielle: comprendre le Machine Learning Supports vidéo non disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Page 22: Recherche par grille avec validation croisée (GridSearchCV)

Toutes les pages

Introduction à l'intelligence artificielle: comprendre le Machine Learning

Page 1
Intelligence artificielle: Définition, histoire et évolution
Page 2
Types d'apprentissage: supervisé, non supervisé et par renforcement
Page 3
Qu'est-ce qu'un dataset? Tout commence par les données
Page 4
Analyse exploratoire des données (EDA)
Page 5
Apprentissage supervisé - La régression
Page 6
Apprentissage supervisé - La classification
Page 7
Comment un modèle de Machine Learning apprend-il?
Page 8
Régression linéaire simple avec NumPy, scikit-learn et Matplotlib
Page 9
Régression linéaire multiple avec les DataFrames de Pandas
Page 10
Séparation du jeu de données en ensembles d'entraînement et de test
Page 11
Régression linéaire multiple avec découpage des données en train set et test set
Page 12
Classification supervisée avec la régression logistique
Page 13
Naive Bayes pour la classification: un modèle probabiliste génératif
Page 14
k-Nearest Neighbors (k-NN): Algorithme de classification non paramétrique basé sur les distances
Page 15
L'arbre de décision (decision tree): un outil puissant de classification
Page 16
Classification avec les Support Vector Machines (SVM)
Page 17
L'ensemble learning - Combiner plusieurs modèles pour une performance accrue
Page 18
Le Boosting: principe et mise en pratique avec XGBoost
Page 19
Random Forest, une application du Bagging en Ensemble Learning
Page 20
Le stacking: unir des modèles différents pour plus de performance
Page 21
La validation croisée: découper les données pour un meilleur apprentissage du modèle
Page 22
Recherche par grille avec validation croisée (GridSearchCV)

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.          
         
Page 22
Recherche par grille avec validation croisée (GridSearchCV)