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.
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 obtenusAvantages
- 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 datasetsfrom sklearn.model_selection import cross_val_scorescores = 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.
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.
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegressionnp.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}')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é)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 →