ConsigneCré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.
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.
from sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LogisticRegressionpipe = 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.
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 StandardScalerimport numpy as npfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import cross_val_scorenp.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])}')from sklearn.compose import ColumnTransformerfrom sklearn.preprocessing import OneHotEncoder, StandardScalerpreproc = 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 →