Data Science & ML · L3 · Section 1/12
Pipeline et features
Progression
#Pipeline et Feature Engineering
Le feature engineering est souvent ce qui différencie un modèle médiocre d'un excellent modèle. Un bon pipeline de préparation des données est reproductible, sans fuite, et adapté au problème.
#Prérequis et objectifs
Prérequis: Python et pandas (DataFrame, types, valeurs manquantes), page d'index du module pour les rôles de train/val/test.
Objectifs d'apprentissage:
- ordonner correctement les étapes du pipeline: split avant tout preprocessing ajusté sur les données;
- choisir une stratégie de valeurs manquantes et une stratégie d'encodage selon le modèle et le contexte;
- sélectionner un scaler en fonction de la sensibilité du modèle et des valeurs aberrantes;
- encapsuler le tout dans un
Pipelinescikit-learn qui garantit l'absence de fuite en validation croisée; - créer des features dérivées (interactions, transformations, agrégats, temps) sans introduire d'information du futur.
#Pipeline ML typique
Le point d'ordre qui résume tout: le split précède tout calcul de statistiques sur les données (moyenne, médiane, fréquences, vocabulaire). Ce qui est ajusté sur le train s'applique au val/test; jamais l'inverse.
#Gestion des valeurs manquantes
Plusieurs stratégies selon le contexte:
Suppression: acceptable si peu de valeurs manquantes et données suffisantes; dangereuse si les lignes incomplètes sont précisément les cas intéressants (les clients les plus récents ont moins d'historique).
Imputation moyenne/médiane: rapide, mais ignore les relations entre features; la médiane résiste aux valeurs aberrantes.
Imputation par modèle (KNN, régression): plus fidèle, mais plus coûteuse et à ajuster sur le train uniquement, comme tout le reste.
Indicateur de missing: parfois, le fait qu'une valeur soit manquante est informatif en soi (un champ non renseigné peut signaler un profil d'utilisateur différent).
Observation: l'imputer apprend les médianes de chaque colonne (imputer.statistics_) et les réutilise. En pipeline réel, ce fit se fait sur le train et le transform seul s'applique au test: les médianes du test n'ont pas le droit d'influencer l'imputation.
#Encodage des variables catégorielles
Les modèles ML ne comprennent que des nombres. Transformer les catégories en nombres est essentiel, mais chaque encodage encode une hypothèse:
One-Hot Encoding: crée une colonne binaire par catégorie. N'impose aucun ordre; attention à la colinéarité (drop='first') et à l'explosion du nombre de colonnes pour les cardinalités élevées.
Label Encoding: assigne un entier à chaque catégorie. Ok pour les arbres (ils coupent par seuil, l'entier n'est qu'un identifiant), trompeur pour les modèles linéaires qui liraient un ordre et une distance entre les entiers.
Target Encoding: encode par la moyenne de la cible par catégorie. Puissant pour les cardinalités élevées, mais manipule la variable cible: risque de fuite maximal.
Ordinal Encoding: pour les catégories réellement ordonnées (S < M < L), encode l'ordre explicite.
Exercice observable: appliquez un LabelEncoder sur la colonne « couleur » et examinez le résultat: bleu=0, rouge=1, vert=2 (ordre alphabétique arbitraire). Un modèle linéaire en déduira que « vert » est deux fois « rouge ». Vérification: cet ordre n'existe pas dans les données; c'est un artefact de l'encodage. C'est précisément pourquoi le one-hot est le choix par défaut pour les catégories nominales.
#Scaling des features
Les modèles basés sur la distance (KNN, SVM) et les réseaux de neurones sont sensibles à l'échelle des features. Les arbres et les forêts ne le sont pas: ils coupent par seuil, l'échelle est sans effet.
StandardScaler: centre (moyenne=0) et réduit (écart-type=1). Le choix par défaut pour la plupart des cas.
MinMaxScaler: ramène dans [0, 1]. Sensible aux valeurs aberrantes, qui écrasent tout le reste de la plage.
RobustScaler: utilise médiane et écart interquartile. Résiste aux valeurs aberrantes.
Observation attendue: la ligne aberrante écrase le MinMax (les salaires normaux se retrouvent tous écrasés près de 0), tandis que le Robust garde une plage utile pour les valeurs normales. Exercice: supprimez la dernière ligne et relancez; les trois scalers redeviennent comparables. Conclusion pratique: le choix du scaler dépend de vos données, pas d'une règle universelle, et un describe() par colonne doit précéder ce choix.
#Pipeline scikit-learn
Utiliser un Pipeline garantit que le preprocessing est appliqué correctement pendant l'entraînement ET l'inférence.
#Feature creation
Créer de nouvelles features à partir des existantes peut améliorer significativement le modèle:
Interactions: produit ou ratio de features (surface = longueur × largeur); utile quand l'effet d'une variable dépend d'une autre.
Transformations: log (aplatit les distributions asymétriques et les écarts d'échelle), racine carrée, polynômes.
Agrégations: moyennes, comptages par groupe (nombre d'achats par client); l'agrégat se calcule sur des données passées uniquement.
Features temporelles: jour de la semaine, mois, saison, durée depuis un événement; le calendrier futur est connu, mais toute feature construite « à date » doit n'utiliser que le passé (voir la page « Séries temporelles »).
Deux garde-fous: chaque feature créée doit être justifiable en une phrase (pourquoi cette quantité aiderait-elle?), et la liste des features doit rester documentée, car elle fait partie du contrat du modèle en production.