La fuite silencieuse
La fuite signifie que l'information des lignes de test atteint le modèle avant d'être notée. Les formes bruyantes sont faciles à éviter (une variable bâtie sur le cours de demain). La forme silencieuse se cache dans le prétraitement : on choisit les meilleures colonnes, ou on met à l'échelle, ou on comble les trous avec toutes les lignes, et seulement ensuite on découpe pour la validation croisée. Chaque pli de test a déjà influencé le choix, et le score est flatteur. La sélection de variables est le pire coupable, car cent colonnes bruitées en contiennent toujours quelques-unes qui semblent prédictives dans n'importe quel échantillon ; si on les choisit sur toutes les données, les plis de test sont en partie « prédits » par des colonnes choisies parce qu'elles collaient à ces plis mêmes. Le remède structurel est un Pipeline : quand on donne à cross_val_score le pipeline entier, il réajuste l'échelle, la sélection et le modèle sur chaque fenêtre d'entraînement et ne note qu'ensuite la fenêtre de test.
Le lab utilise une question volontairement difficile : les rendements d'hier de 60 autres actifs peuvent-ils prédire si SPY monte aujourd'hui ? Il n'y a presque rien à trouver. L'évaluation avec fuite (SelectKBest(f_classif, k=5) sur toutes les lignes, puis validation croisée TimeSeriesSplit) donne une AUC de 0,534. L'évaluation honnête (normalisation, sélection et régression logistique dans un seul pipeline, réajustés sur chaque fenêtre) donne 0,512. Les 0,022 d'écart sont de la pure fuite. On peut aussi regarder à l'intérieur : cross_validate(modèle, X, y, cv=..., return_estimator=True) renvoie les pipelines ajustés, et estimator.named_steps['select'].get_support(indices=True) liste les colonnes choisies par chacun. Sur les cinq plis, une seule colonne est choisie à chaque fois, ce à quoi ressemble une sélection sur du bruit. Un score calculé avec un pipeline se défend ; un score calculé après « un peu de prétraitement sur tout » non.
- Découper d'abord, apprendre ensuite : mise à l'échelle, sélection et imputation appartiennent toutes à l'intérieur de la boucle de validation croisée.
- Un Pipeline est un garde-fou : donnez à
cross_val_scorele pipeline entier et chaque étape est réajustée sur chaque fenêtre d'entraînement. - Regardez ce que chaque pli a choisi : des colonnes qui changent d'un pli à l'autre sont du bruit, pas du signal.
Lab : ce qui est noté
- L'évaluation avec fuite15 pts
- Le pipeline10 pts
- L'évaluation honnête15 pts
- Ce que chaque pli a choisi20 pts
- La taille de la fuite10 pts
- La comparaison sur données réelles30 pts