Exercice 90 / 100

ML — Pipeline

Crée un pipeline complet avec preprocessing et modèle

Un Pipeline enchaîne plusieurs étapes (prétraitement + modèle) comme un seul "objet". Évite les fuites de données et simplifie le code.

Problème sans pipeline

Si tu standardises avant le train/test split, le test connaît les stats du train → fuite de données. Si tu standardises séparément train/test, tes valeurs ne sont pas alignées.

Le pipeline résout ça : il fitte le scaler uniquement sur le train, puis l'applique au test.

Un pipeline enchaîne les étapes dans un seul objet : les transformations d'abord, le modèle en dernier, et l'ensemble s'ajuste sur le train seul, ce qui empêche le test de fuiter dans l'apprentissage

Créer un pipeline

from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression
pipe = Pipeline([ ('scaler', StandardScaler()), ('classifier', LogisticRegression()) ])

Format : liste de tuples (nom, estimateur). Le dernier doit être le modèle, les précédents transforment les données.

Utilisation

Pipeline a les mêmes méthodes que n'importe quel modèle :

pipe.fit(X_train, y_train) pipe.predict(X_test) pipe.score(X_test, y_test) cross_val_score(pipe, X, y, cv=5)

Accéder à une étape :

pipe.named_steps['classifier'] → le LogisticRegression pipe.named_steps['scaler'] → le StandardScaler

Exemple complet

import numpy as np from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score
np.random.seed(42) X = np.random.randn(200, 3) * [1, 100, 0.01] # features d'amplitudes très différentes y = (X[:, 0] + X[:, 1]/100 > 0).astype(int)
pipe = Pipeline([ ('scaler', StandardScaler()), ('clf', LogisticRegression()) ])
scores = cross_val_score(pipe, X, y, cv=5) print(f'Pipeline accuracy: {scores.mean():.4f} (+/- {scores.std():.4f})')
pipe.fit(X, y) print(f'Predictions: {pipe.predict(X[:5])}')

ColumnTransformer : appliquer des prétraitements DIFFÉRENTS par colonne

from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder, StandardScaler
preproc = ColumnTransformer([ ('num', StandardScaler(), ['age', 'salaire']), ('cat', OneHotEncoder(), ['ville', 'dept']), ])
pipe = Pipeline([('preproc', preproc), ('clf', RandomForestClassifier())])

Toujours emballer un projet ML en pipeline avant la mise en prod. Garantit la cohérence train/inférence.

exercise.py

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →