Tout savoir Cross-validation

En Machine Learning, un modèle entraîné sur un dataset spécifique est capable de prédire efficacement les étiquettes des éléments qu’il contient. Cela devient plus compliqué lorsqu’il s’agit de formuler des prédictions à partir de nouveaux ensembles. Il est donc crucial d’intégrer au processus d’entraînement des étapes de validation. Une des techniques employées le plus souvent est la cross-validation.

Qu’est-ce que la cross-validation ?

La cross-validation, ou validation croisée, est une méthode d’évaluation des compétences d’un modèle de Machine Learning. Dans cette approche basée sur le rééchantillonnage, l’ensemble de données est divisé en multiples portions, que l’on appelle des plis, ou folds. Plusieurs cycles d’apprentissage et de test vont ensuite s’enchaîner, en variant les combinaisons de ces plis.

La validation croisée garantit que le modèle est testé sur plusieurs ensembles de données différents, réduisant ainsi les biais liés à une seule division des données. Elle évalue donc plus efficacement la capacité du modèle à généraliser. Elle s’avère particulièrement utile sur un dataset de petite taille. Elle permet de maximiser l’utilisation des données disponibles.

À quoi sert la cross-validation ?

La validation croisée est essentielle en Machine Learning, car elle permet d’évaluer, améliorer et comparer les modèles. Elle contribue à garantir des modèles performants et solides.

Estimer la performance du modèle de Machine Learning

La cross-validation fournit une évaluation plus fiable qu’avec un test classique. En effet, une seule division du dataset ne permettrait pas d’obtenir des résultats d’entraînements et de tests suffisants. Elle permet d’obtenir une bonne estimation de la manière dont le modèle va se comporter face à des données inconnues.

Détecter l’overfitting, ou surapprentissage

La technique de l’overfitting est également adaptée pour identifier les signes de surapprentissage. Si la performance sur l’ensemble de tests est nettement inférieure à celle sur l’ensemble d’entraînement, cela peut indiquer un surapprentissage. 

Optimiser les hyperparamètres

La combinaison de validation croisée et recherche d’hyperparamètres permet de déterminer les paramètres les plus adaptés au modèle. C’est un excellent moyen de trouver une configuration optimale maximisant la performance de la prédiction.

Évaluer la stabilité des résultats

Le processus d’itération de la cross-validation, au travers de différentes partitions aléatoires des données, permet d’évaluer la stabilité des résultats du modèle. Vous pouvez ainsi vérifier la cohérence des performances, et vous assurer notamment que les variations liées à la répartition des données sont minimes.

Comparer des modèles

La validation croisée permet de comparer de manière très objective les performances de plusieurs modèles. Vous pouvez tester différents algorithmes ou architectures de modèles, afin de déterminer les méthodes adaptées à votre problématique.

Quels sont les différents types de cross-validation ?

Il existe plusieurs techniques de validation croisée. Le choix va s’orienter en fonction de la situation et des objectifs poursuivis.

Train-test split

Le Train-test split consiste à diviser de manière aléatoire l’ensemble de données en deux parties distinctes. 70 à 80 % des données sont utilisées pour former le modèle d’apprentissage automatique. Les 20 à 30 % restants sont réservés à la validation croisée. C’est une méthode réputée pour sa fiabilité et son efficacité, mais qui n’est pas forcément adaptée dans le cas d’un nombre de données restreint ?

K-Fold Cross-Validation (K-Fold CV)

L’ensemble de données est divisé en k plis de données, de tailles quasiment égales. Le modèle est ensuite formé k fois. À chaque itération, l’un des k plis est utilisé comme ensemble de tests, tandis que les autres servent d’ensemble d’entraînement. Les performances sont mesurées à chaque itération. Une moyenne est ensuite calculée de manière à obtenir une évaluation globale de la performance du modèle.

Stratified K-Fold Cross-Validation

La méthode K-Fold stratifiée garantit une répartition des classes dans chaque pli proportionnelle à celle du dataset complet. Elle s’avère utile lorsque les classes ne sont pas équilibrées. Elle évite la sous-représentation de certaines classes dans l’ensemble de test.

Time Series Cross-Validation

Comme son nom anglais l’indique, cette technique est spécifiquement conçue pour les séries temporelles. Elle tient compte de la séquence temporelle des données. Celles-ci sont divisées de manière séquentielle, afin que les données d’entraînement précèdent toujours les données de test dans le temps.

Quelles sont les étapes de mise en œuvre de la cross-validation ?

La validation croisée repose en général sur trois étapes clés :

  • mettre de côté une partie de l’échantillon ; 
  • entraîner le modèle à partir du reste des données ; 
  • tester le modèle en utilisant la portion de dataset n’ayant pas servi à l’entraînement.

Les étapes de cross-validation avec la méthode K-Fold

La validation croisée K-Fold est une des techniques d’évaluation les plus populaires. Typiquement, ses étapes de mise en œuvre sont :

  • préparation des données et division en deux ensembles, un pour l’entraînement et un pour le test ; 
  • sélection du nombre de plis (K) à utiliser ; 
  • division des données en K plis de taille égale, qui serviront successivement comme ensemble de test pendant une itération ; 
  • mise en place d’une boucle qui effectuera K itérations de validation croisée ;
  • entraînement du modèle sur un ensemble spécifique à chaque itération de la boucle ; 
  • évaluation du modèle.

Les étapes de cross-validation avec la méthode Train-Test Split

La méthode Train-Test Split est une technique de validation assez simple. Nettoyez et transformez vos données si nécessaire, puis divisez-les en 2 ensembles. 70-80 % des données sont pour l’entraînement et 20-30 % pour le test. Utilisez l’ensemble d’entraînement pour former votre modèle.

Les caractéristiques sont utilisées pour entraîner le modèle, et les étiquettes correspondantes pour guider l’apprentissage. Une fois le modèle formé, utilisez l’ensemble de tests pour en évaluer la performance. Analysez alors les métriques de performance obtenues pour évaluer la qualité globale du modèle. 

Quels sont les avantages et les limites de la cross-validation ?

La validation croisée est un moyen efficace d’écarter les risques d’overfitting. C’est également un outil efficace pour comparer différents modèles et sélectionner celui qui affiche en moyenne la meilleure performance. Utilisée pour ajuster les hyperparamètres d’un modèle, elle permet de choisir les valeurs générant les meilleures performances sur l’ensemble de validation. Cette méthode est plus efficiente en termes d’utilisation des données que les techniques de validation classiques.

Elle présente néanmoins certaines limites, notamment son coût informatique. C’est le cas lorsque le nombre de plis est important ou  le modèle est complexe et nécessite une longue période d’apprentissage. Elle peut également s’avérer très chronophage, en particulier s’il y a de nombreux hyperparamètres à régler ou si plusieurs modèles doivent être comparés. Enfin, le choix du nombre de folds dans la validation croisée peut avoir un impact sur le compromis biais-variance. 

Comment apprendre à utiliser la cross-validation ?

La validation croisée est une technique qui s’acquiert dans un programme de formation en Intelligence artificielle ou en Machine Learning. On y enseigne toutes les notions de base requises pour un parcours de Machine Learning Engineer, de Data Analyst ou de Data Scientist. Il existe également de nombreuses ressources en ligne, comme des tutoriels, des articles ou des exercices pratiques pour mieux appréhender et appliquer les principes de cette méthode.   

Exemples d’utilisation de la cross-validation

Imaginons un modèle de Machine Learning pour la prédiction du temps d’attente téléphonique. Nous allons procéder à la validation croisée en utilisant Python.

Exemple 1 : validation croisée avec la méthode StratifiedKFold

import numpy as np

from sklearn.model_selection import StratifiedKFold

from sklearn.linear_model import LinearRegression

from sklearn.metrics import mean_squared_error

# Exemple de données fictives 

np.random.seed (42)

n_samples = 1000

features = np.random.rand (n_samples, 3) # Trois caractéristiques fictives

wait_times = 5 + 2 * features[:, 0] + 3 * features[:, 1] + np.random.randn(n_samples) # Temps d’attente fictif

# Initialisation du modèle de régression linéaire

model = LinearRegression()

# Initialisation d’une instance de StratifiedKFold où K=5 

stratkf = StratifiedKFold (n_splits=5, shuffle=True, random_state=42)

# Initialisation d’une liste de stockage des scores (MSE) de chaque itération

scores = []

# Boucle de validation croisée

for train_index, test_index in stratkf.split(features, wait_times):

X_train, X_test = features[train_index], features[test_index]

y_train, y_test = wait_times[train_index], wait_times[test_index]

# Entraînement du modèle

model.fit(X_train, y_train)

# Prédictions sur l’ensemble de test

y_pred = model. predict (X_test)

# Calcul du score (MSE) du modèle pour cette itération

mse = mean_squared_error (y_test, y_pred)

# Ajout du score à la liste

scores. append (mse)

# Calcul du MSE moyen sur toutes les itérations de la validation croisée

mean_mse = np.mean (scores)

# MSE moyen

print(« Moyenne de l’erreur quadratique moyenne [MSE] de la validation croisée : », mean_mse)

Exemple 2 : validation croisée avec la méthode Train-Test Split

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LinearRegression

from sklearn.metrics import mean_squared_error

# Exemple de données fictives

np.random.seed (42)

n_samples = 1000

features = np.random.rand (n_samples, 3) # Trois caractéristiques fictives

wait_times = 5 + 2 * features[:, 0] + 3 * features[:, 1] + np.random.randn(n_samples) # Temps d’attente fictif

# Division des données en ensembles d’entraînement (80 % des données) et de tests (20 % des données)

X_train, X_test, y_train, y_test = train_test_split (features, wait_times, test_size=0.2, random_state=42)

# Initialisation d’un modèle de régression linéaire

model = LinearRegression()

# Entraînement du modèle

model.fit (X_train, y_train)

# Prédictions sur l’ensemble de tests

y_pred = model. predict (X_test)

# Calcul du score (MSE) du modèle

mse = mean_squared_error (y_test, y_pred)

# Affichage du MSE

print(« Erreur quadratique moyenne [MSE] sur l’ensemble de tests : », mse)

La validation croisée est un outil puissant avec lequel tout data scientist ou expert IA devrait être familiarisé. Dans la vie réelle, il est inconcevable de finaliser un projet de Machine Learning sans avoir procédé à la validation croisée du modèle.