Exercice 100 / 100

Projet — ML Pipeline complet

ConsigneDe la donnée brute à la prédiction : pipeline ML end-to-end

📖 Cours

Pipeline ML end-to-end : de la donnée brute à la prédiction. Met en pratique tout ce qu'on a vu (prétraitement, split, modèle, évaluation).

Les étapes universelles

1. CHARGEMENT / GÉNÉRATION des données2. EDA rapide3. SPLIT train/test (test set MIS DE CÔTÉ — touché qu'à la fin)4. PRÉTRAITEMENT dans un pipeline (scaling, encoding, imputation)5. MODÈLE avec ses hyperparamètres6. ÉVALUATION par cross-validation sur le train7. ENTRAÎNEMENT final sur 100% du train8. ÉVALUATION FINALE sur le test set9. INTERPRÉTATION (feature importance, erreurs)
Le trajet complet d'un projet : couper le test de côté, enfermer le prétraitement et le modèle dans un pipeline, régler et mesurer par validation croisée sur le train seul, et ne toucher au test qu'une fois, tout à la fin
Le trajet complet d'un projet : couper le test de côté, enfermer le prétraitement et le modèle dans un pipeline, régler et mesurer par validation croisée sur le train seul, et ne toucher au test qu'une fois, tout à la fin

Exemple complet : prédire la réussite étudiante

import numpy as np, pandas as pdfrom sklearn.model_selection import train_test_split, cross_val_scorefrom sklearn.preprocessing import StandardScalerfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import classification_reportfrom sklearn.pipeline import Pipeline
np.random.seed(42)n = 500df = pd.DataFrame({ 'heures': np.random.uniform(1, 15, n), 'exercices': np.random.randint(5, 100, n), 'note_prev': np.random.uniform(0, 20, n), 'absences': np.random.randint(0, 20, n),})df['reussite'] = ((df['heures']*2 + df['exercices']*0.3 + df['note_prev']*3 - df['absences']*5 + np.random.normal(0, 10, n)) > 50).astype(int)
# 1. SplitX = df.drop('reussite', axis=1)y = df['reussite']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 2. Pipelinepipe = Pipeline([ ('scaler', StandardScaler()), ('rf', RandomForestClassifier(n_estimators=100, random_state=42))])
# 3. Cross-validation sur le TRAIN seulementcv_scores = cross_val_score(pipe, X_train, y_train, cv=5)print(f'CV Accuracy: {cv_scores.mean():.4f} (+/- {cv_scores.std():.4f})')
# 4. Fit final + éval sur TEST holdoutpipe.fit(X_train, y_train)y_pred = pipe.predict(X_test)print(f'Test Accuracy: {pipe.score(X_test, y_test):.4f}')print(classification_report(y_test, y_pred))
# 5. Interprétation : feature importanceimportances = pipe.named_steps['rf'].feature_importances_for name, imp in sorted(zip(X.columns, importances), key=lambda x: -x[1]): print(f' {name}: {imp:.3f}')

Améliorations possibles

- GridSearchCV / RandomizedSearchCV : recherche d'hyperparamètres- StratifiedKFold : préserver les proportions des classes en CV- feature engineering : créer de nouvelles variables- autres modèles : XGBoost, LightGBM, neural nets- calibration de probabilité (CalibratedClassifierCV)- métriques métier (ROC-AUC, lift...)

Mise en production

# Sauvegarder le pipeline entraînéimport joblibjoblib.dump(pipe, 'model.pkl')
# Recharger plus tardpipe = joblib.load('model.pkl')pipe.predict(X_new)

Tu viens de boucler 100 leçons couvrant Python de zéro jusqu'au ML complet. Pour aller plus loin : Kaggle (compétitions), papers (arxiv-sanity), libs avancées (PyTorch, TensorFlow, MLflow, Airflow).

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