Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Pipeline sklearn : tout enchainer
Tu normalises tes donnees, tu selectionnes les features, tu entraines le modele, et a chaque etape tu risques d'introduire un bug subtil : appliquer le scaler sur le test set avant le fit, oublier une transformation... Le Pipeline de sklearn resout tout ca en enchainant les etapes dans un seul objet qui empeche le data leakage.
Le Pipeline de sklearn chaine toutes les étapes en un seul objet. Quand tu appelles .fit(), il applique chaque étape dans l'ordre. Quand tu appelles .predict(), il transforme les données puis predit.
Avantage crucial : le Pipeline garantit qu'il n'y a pas de data leakage. Le scaler est fit uniquement sur le train set.
Écris une fonction créer_pipeline(X_train, y_train, X_test, y_test, k_features=5) qui crée un pipeline StandardScaler + SelectKBest + LogisticRegression, l'entraine et renvoie : 'accuracy' : accuracy sur le test set 'pipeline' : l'objet pipeline entraine
Tests (4/4)
Accuracy entre 0 et 1
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=15, n_informative=5, random_state=42)
result = créer_pipeline(X[:150], y[:150], X[150:], y[150:])
assert 0 <= result['accuracy'] <= 1
Pipeline a 3 étapes
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=10, random_state=42)
result = créer_pipeline(X[:150], y[:150], X[150:], y[150:])
assert len(result['pipeline'].steps) == 3
Pipeline peut predire
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=10, random_state=42)
result = créer_pipeline(X[:150], y[:150], X[150:], y[150:])
preds = result['pipeline'].predict(X[150:])
assert len(preds) == 50
K features different
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=20, n_informative=3, random_state=42)
result = créer_pipeline(X[:150], y[:150], X[150:], y[150:], k_features=3)
assert result['pipeline'].named_steps['selector'].k == 3
Indices (3 disponibles)
Solution officielle
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
def creer_pipeline(X_train, y_train, X_test, y_test, k_features=5):
pipe = Pipeline([
('scaler', StandardScaler()),
('selector', SelectKBest(score_func=f_classif, k=k_features)),
('model', LogisticRegression(max_iter=1000, random_state=42)),
])
pipe.fit(X_train, y_train)
return {
'accuracy': float(pipe.score(X_test, y_test)),
'pipeline': pipe,
}