Exercice 90 / 100

ML — Pipeline

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

📖 Cours

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, la moyenne et l'écart-type sont calculés sur toutes les lignes, celles du test comprises : l'information du test passe alors dans les données d'entraînement → fuite de données. (Transformer le test avec les statistiques du train, à l'inverse, est exactement ce qu'il faut faire.) 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
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 Pipelinefrom sklearn.preprocessing import StandardScalerfrom 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 LogisticRegressionpipe.named_steps['scaler'] → le StandardScaler

Exemple complet

import numpy as npfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LogisticRegressionfrom 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érentesy = (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 ColumnTransformerfrom 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.

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