Exercice 85 / 100

ML — Cross Validation

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

📖 Cours

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 égales2. entraîner sur 4 parties, tester sur la 5e3. répéter en faisant rouler la part test4. 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
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 npfrom sklearn.model_selection import cross_val_scorefrom 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.

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