Exercice 85 / 100

ML — Cross Validation

Évalue un modèle avec la validation croisée

La cross-validation (validation croisée) évalue un modèle de manière plus robuste qu'un simple train/test split. On découpe les données en k "folds" et on entraîne k fois.

Principe (k-Fold)

Pour k = 5

1. découper en 5 parties égales 2. entraîner sur 4 parties, tester sur la 5e 3. répéter en faisant rouler la part test 4. moyenner les 5 scores obtenus
La validation croisée ne se contente pas d'un découpage : elle entraîne k fois en faisant rouler la part réservée au test, si bien que chaque ligne sert une fois d'arbitre, puis moyenne les k scores obtenus

Avantages

- chaque exemple sert au moins une fois au test - on a une estimation moins bruitée (moyenne ± écart-type) - particulièrement utile pour les PETITS datasets

cross_val_score : la fonction la plus simple

from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')

Renvoie un array de k scores. Métriques disponibles : 'accuracy', 'precision', 'recall', 'f1', 'roc_auc', 'r2', 'neg_mean_squared_error', etc.

Interprétation

print(f'Scores: {scores}') print(f'Moyenne: {scores.mean():.4f}') print(f'Std: {scores.std():.4f}') print(f'IC 95% approx: [{scores.mean()-2*scores.std():.4f}, {scores.mean()+2*scores.std():.4f}]')

Si la std est élevée → modèle instable selon le découpage → besoin de plus de données ou modèle moins variable.

Exemple complet

import numpy as np from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression
np.random.seed(42) X = np.random.randn(200, 3) y = (X[:, 0] + 0.5 * X[:, 1] > 0).astype(int)
model = LogisticRegression() scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f'Scores par fold: {scores}') print(f'Moyenne: {scores.mean():.4f}') print(f'Std: {scores.std():.4f}')

Variantes

KFold(n_splits=5, shuffle=True, random_state=42) StratifiedKFold (classification : préserve la proportion des classes) TimeSeriesSplit (séries temporelles : pas de fuite du futur vers le passé)
LeaveOneOut
extrême : un seul exemple en test à chaque tour

cv=5 est le défaut classique. cv=10 si tu as le temps de calcul. Pour comparer 2 modèles, regarde la différence des moyennes ET l'overlap des écarts-types.

exercise.py

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →