Preprocessing et Feature Engineering: booster les performances d'un modèle IA

Auteur: Mohamed CHINY Durée necessaire pour le cours de Preprocessing et Feature Engineering: booster les performances d'un modèle IA Niveau recommandé pour le cours de Preprocessing et Feature Engineering: booster les performances d'un modèle IA Supports vidéo non disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Leçon 18: Traitement sélectif des variables: maîtriser le ColumnTransformer

Toutes les leçons

Preprocessing et Feature Engineering: booster les performances d'un modèle IA

Automatiser le preprocessing grâce au traitement sélectif

Qu'est ce que le traitement sélectif?

Le traitement sélectif est une étape essentielle du prétraitement des données (preprocessing) en machine learning. Il consiste à appliquer des transformations différentes selon la nature des colonnes d’un jeu de données.

Dans le dataset Titanic par exemple, les variables numériques comme Age ou Fare peuvent être normalisées avec un MinMaxScaler, tandis que les variables catégorielles comme Sex, Pclass ou Embarked sont encodées avec un OneHotEncoder. Cette approche garantit que chaque type de donnée est traité de manière adaptée, tout en produisant une matrice homogène prête à être utilisée par les algorithmes d’apprentissage.

ColumnTransformer: un outil de prétraitement structuré

Le ColumnTransformer est l’outil de scikit‑learn qui implémente ce traitement sélectif. Il permet de définir, dans un seul objet, l’ensemble des transformations à appliquer aux colonnes choisies, puis de les exécuter de manière cohérente sur les jeux d’entraînement et de test.

Utilisé seul ou intégré dans un Pipeline, il constitue la base d’un pipeline de prétraitement des variables qui assure reproductibilité, modularité et robustesse dans le processus de machine learning.

Dans un pipeline complet, le ColumnTransformer s’intègre comme une étape clé du flux de traitement. Il assure la cohérence entre l’entraînement et le test, en appliquant exactement les mêmes transformations aux données nouvelles qu’à celles utilisées pour construire le modèle. Cela évite les erreurs de manipulation manuelle et rend le processus reproductible, modulable et robuste. En pratique, on parle donc de pipeline de prétraitement des variables, qui constitue la base d’un pipeline de machine learning de bout en bout.

Mise en pratique du traitement sélectif avec ColumnTransformer et le dataset Titanic

Avec le dataset Titanic, on peut illustrer comment appliquer des transformations adaptées à chaque type de variable: les colonnes numériques comme Age et Fare sont normalisées grâce à un MinMaxScaler, tandis que les colonnes catégorielles telles que Sex, Pclass et Embarked sont encodées via un OneHotEncoder.

Je propose ce code:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer

titanic=pd.read_csv("titanic.csv").dropna(
   subset=["Age", "Fare", "Sex", "Pclass", "Embarked", "Survived"]
)

X = titanic[["Age", "Fare", "Sex", "Pclass", "Embarked"]]
y = titanic["Survived"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Colonnes numériques et catégorielles
num_cols = ["Age", "Fare"]
cat_cols = ["Sex", "Pclass", "Embarked"]

# Définir le ColumnTransformer
preprocessor = ColumnTransformer(
   transformers=[
      ("num", MinMaxScaler(), num_cols),
      ("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols)
   ]
)

# Fit sur X_train
preprocessor.fit(X_train)

# Transformer X_train et X_test
X_train_transformed = preprocessor.transform(X_train)
X_test_transformed = preprocessor.transform(X_test)

X_train_transformed[:3]
Dans ce qui suit, je vais expliquer uniquement les portions inédites du code:

On commence par importer ColumnTransformer (l’outil qui permet de mettre en place le traitement sélectif des variables):
from sklearn.compose import ColumnTransformer
En pratique, ColumnTransformer est une classe de scikit‑learn qui sert à définir quelles transformations appliquer à chaque groupe de colonnes (numériques, catégorielles, etc.).

On passe directement au bloc de code définit un ColumnTransformer qui applique un traitement sélectif aux colonnes du dataset:
preprocessor = ColumnTransformer(
   transformers=[
      ("num", MinMaxScaler(), num_cols),
      ("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols)
   ]
)
La variable preprocessor représente l’objet principal de type ColumnTransformer. Il regroupe toutes les étapes de prétraitement qu'on veut appliquer aux données. Une fois défini, on peut l’entraîner sur le jeu d’entraînement et l’appliquer aussi bien sur les données d’entraînement que de test.

La varaible transformers est l’argument qu'on passes au ColumnTransformer. Il s’agit d’une liste de tuples qui décrit, pour chaque groupe de colonnes, quelle transformation appliquer. Chaque tuple suit la forme (nom, transformateur, colonnes):
  • La partie ("num", MinMaxScaler(), num_cols) indique que les colonnes numériques (Age, Fare) seront normalisées avec un MinMaxScaler, ce qui ramène leurs valeurs dans une plage comprise entre 0 et 1.
  • La partie ("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols) précise que les colonnes catégorielles (Sex, Pclass, Embarked) seront encodées en variables binaires grâce au OneHotEncoder, avec l’option handle_unknown="ignore" pour éviter les erreurs si une nouvelle catégorie apparaît dans les données de test.

On entraîne le préprocesseur sur les données d’entraînement:
preprocessor.fit(X_train)
Cette étape permet au MinMaxScaler de calculer les bornes min/max des colonnes numériques et au OneHotEncoder d’apprendre les catégories présentes dans les colonnes catégorielles.

On applique ensuite les transformations:
X_train_transformed = preprocessor.transform(X_train)
X_test_transformed = preprocessor.transform(X_test)
Sur X_train, on obtient une version transformée prête pour l’entraînement du modèle, et sur X_test, on applique exactement les mêmes règles, ce qui garantit la cohérence et évite toute fuite d’information.

En fin, on affiche la première ligne du jeu d’entraînement après application du traitement sélectif avec le ColumnTransformer:
X_train_transformed[0]
Ce qui donne ce résultat:
[0.40939935, 0.05416439, 1. , 0. , 0. ,1. , 0. , 0. , 0. , 1.]
Les deux premières valeurs de chaque ligne correspondent aux colonnes numériques (Age et Fare) qui ont été normalisées par le MinMaxScaler. On obtient donc des nombres compris entre 0 et 1, reflétant la position relative de chaque valeur par rapport au minimum et au maximum de la colonne.

Les huit valeurs suivantes correspondent aux colonnes catégorielles (Sex, Pclass, Embarked) qui ont été encodées en variables binaires par le OneHotEncoder. Chaque catégorie est représentée par une colonne distincte, avec un 1 indiquant la présence de la catégorie et des 0 pour les autres.
Je vous renvoie vers ma leçon sur le One-Hot Encoding pour mieux comprendre le mécanisme de ce type de préprocessing. Cette étape est fondamentale pour transformer les variables catégorielles en représentations numériques exploitables par les modèles de machine learning.