Apprendre dans fit, appliquer dans transform
Un transformateur est un estimateur avec une seconde tâche. fit(X) apprend des nombres à partir des données (une moyenne, un quantile, un vocabulaire), les stocke dans des attributs qui finissent par un tiret bas et renvoie self. transform(X) applique ensuite ces nombres stockés à n'importe quelles données, nouvelles ou anciennes, sans les regarder pour décider quoi que ce soit. Cette séparation est tout l'intérêt : les nombres sont appris une fois sur les lignes d'entraînement, et les lignes de test sont seulement transformées. Un winsoriseur est un bon premier exemple. fit apprend un quantile inférieur et un supérieur par colonne, et transform écrête avec np.clip entre les deux. Si transform recalculait les quantiles sur les données reçues, chaque jeu serait écrêté à sa propre étendue et l'information d'entraînement n'arriverait jamais au test. Héritez de TransformerMixin et BaseEstimator et vous obtenez aussi fit_transform et la mécanique des paramètres gratuitement.
Les vraies tables mêlent nombres et catégories ; scikit-learn offre donc ColumnTransformer([(nom, transformateur, colonnes), ...]) : chaque branche traite ses colonnes et les sorties sont collées côte à côte. Ici la branche numérique est make_pipeline(Winsorizer(0.02, 0.98), StandardScaler()) et la branche catégorielle OneHotEncoder(handle_unknown='ignore'), qui transforme une catégorie inconnue en ligne de zéros au lieu d'une erreur. sparse_threshold=0 impose un tableau dense. Pour nommer les colonnes de sortie, chaque étape doit répondre à get_feature_names_out, d'où l'obligation de l'implémenter dans votre winsoriseur : il renvoie simplement les noms reçus. La règle d'or est d'appeler fit_transform sur les lignes d'entraînement et seulement transform sur celles de test. Sur le panel d'actions (26 symboles, 10 296 lignes), la coupure au 1er janvier 2023 laisse 5 564 lignes d'entraînement et 4 732 de test, et environ 2,2 % des valeurs de momentum du test sortent de l'intervalle 2 %–98 % d'entraînement et sont écrêtées aux bornes d'entraînement.
- Apprendre une fois, appliquer partout :
fitstocke des nombres sur les lignes d'entraînement,transformne fait que les appliquer. - Un préprocesseur, deux branches :
ColumnTransformerenvoie nombres et catégories à leurs propres étapes ;handle_unknown="ignore"survit aux nouvelles catégories. - Implémenter tout le contrat : un transformateur qui ne sait pas nommer ses colonnes de sortie casse
get_feature_names_outpour tout le pipeline.
Lab : ce qui est noté
- Le constructeur5 pts
- Fit et transform20 pts
- Noms de variables et pipelines10 pts
- Le préprocesseur à deux branches15 pts
- Couper par date10 pts
- Ajuster sur le passé seulement10 pts
- L'étude du panel30 pts