Train, validation et test
Donner à chaque donnée un rôle unique.
Trois rôles
Train : ajuste paramètres et transformations. Validation : choisit hyperparamètres et modèles. Test : juge final, vu une seule fois, jamais pour choisir. Mélanger val et test = s'auto-congratuler.
Pratique
Le découpage dépend de la question. Pour un nouveau client, les commandes d'un même client ne doivent pas se retrouver des deux côtés. Pour prédire des semaines futures, on découperait plutôt par date. Un tirage aléatoire ligne par ligne peut donner un score trop optimiste quand des observations se ressemblent.
Sur data/colis_propres.csv, créé dans l'atelier de nettoyage, gardez 20 % des clients pour le test. Le même découpage servira à la régression et à la classification :
import pandas as pd
from sklearn.model_selection import GroupShuffleSplit
df = pd.read_csv("data/colis_propres.csv")
decoupage = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
train_idx, test_idx = next(decoupage.split(df, groups=df["client_id"]))
train, test = df.iloc[train_idx].copy(), df.iloc[test_idx].copy()
assert set(train["client_id"]).isdisjoint(test["client_id"])
print(len(train), len(test), train["retard"].mean(), test["retard"].mean())
GroupShuffleSplit réserve ici des clients, pas exactement 20 % des lignes ; comparez aussi la proportion de retards de chaque côté. Gardez les indices du test pour la seule évaluation finale. Pour choisir un modèle sur le train, GroupKFold fera des plis de validation sans mélanger les clients. Les transformations apprises, comme l'imputation du poids, iront dans le pipeline et seront ajustées séparément dans chaque pli.
Si votre objectif est la généralisation aux mois futurs, faites un découpage chronologique à la place et expliquez pourquoi. Un seul protocole explicite vaut mieux qu'un score obtenu en essayant plusieurs découpages après avoir vu le test.