Exercice 100 / 100

Projet — ML Pipeline complet

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

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ées 2. EDA rapide 3. 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ètres 6. ÉVALUATION par cross-validation sur le train 7. ENTRAÎNEMENT final sur 100% du train 8. ÉVALUATION FINALE sur le test set 9. 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

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

import numpy as np, pandas as pd from sklearn.model_selection import train_test_split, cross_val_score from sklearn.preprocessing import StandardScaler from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report from sklearn.pipeline import Pipeline
np.random.seed(42) n = 500 df = 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. Split X = 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. Pipeline pipe = Pipeline([ ('scaler', StandardScaler()), ('rf', RandomForestClassifier(n_estimators=100, random_state=42)) ])
# 3. Cross-validation sur le TRAIN seulement cv_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 holdout pipe.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 importance importances = 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 joblib joblib.dump(pipe, 'model.pkl')
# Recharger plus tard pipe = 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).

exercise.py

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