Aller au contenu principal

Cours · L3

Data Science & ML

Progression du module

Points d’expérience : XPSérie de jours consécutifs : · —Progression du module : — / —compris

#Data Science & Machine Learning

La donnée brute ne se transforme pas en valeur par magie: il faut la comprendre, la nettoyer, la représenter, puis entraîner des modèles qui généralisent au-delà de l'échantillon. Le cycle est itératif: formuler un problème, préparer les données, choisir une famille de modèles, évaluer honnêtement, puis améliorer le pipeline.

#Prérequis et objectifs

Prérequis: Python (tableaux NumPy, DataFrames pandas), statistiques descriptives (moyenne, variance, corrélation), et le module « Probabilités et statistiques » pour les lois usuelles.

Objectifs d'apprentissage du module:

  • dérouler le pipeline ML complet, du problème métier au déploiement, sans fuite de données;
  • choisir et justifier une métrique d'évaluation adaptée aux coûts d'erreur du problème;
  • distinguer apprentissage supervisé, non supervisé et profond, et savoir quand chacun est indiqué;
  • reconnaître les sources de fuite (préprocessing, target encoding, split temporel) et les prévenir;
  • structurer un TP reproductible: protocole figé, graines fixes, résultats observables.

#Le pipeline ML en un coup d'œil

Problème
Définir l'objectif métier et la métrique
Données
Collecter, nettoyer, explorer (EDA)
Features
Transformer, sélectionner, encoder
Modèle
Entraîner, valider, tuner les hyperparamètres
Évaluation
Test set, métriques, analyse d'erreurs
Déploiement
Servir, monitorer, itérer

#Rigueur expérimentale

On insiste sur la rigueur expérimentale: séparation stricte entraînement/validation/test, métriques adaptées au contexte, et vigilance face aux fuites de données. Un modèle performant est un tout: preprocessing, architecture, hyperparamètres et procédure d'évaluation.

La question qui gouverne tout le module est « qui a le droit de voir quoi ». Toute information issue des données de test qui influence l'entraînement ou le choix des hyperparamètres biais l'estimation de généralisation, et le biais va presque toujours dans le sens d'une performance surestimée.

#Séparation train/val/test

pythonpython

1from sklearn.model_selection import train_test_split2 3# Séparation classique 70/15/154X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)5X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)6 7print(f"Train: {len(X_train)}, Val: {len(X_val)}, Test: {len(X_test)}")

Rôles: le train sert à ajuster les paramètres, la validation à choisir les hyperparamètres et le modèle, le test à estimer la généralisation une seule fois, à la fin. Réutiliser le test pour choisir entre deux modèles revient à l'exploiter comme une validation, et le score n'est plus une estimation honnête.

Chargement de l’éditeur...

Observation attendue: environ 700/150/150 exemples, et des proportions de classes proches entre train et test (50% environ ici, car le seuil 0 découpe le plan en deux moitiés). Un écart marqué de proportions signalerait qu'un split stratifié serait préférable.

#Métriques courantes

Le choix de la métrique dépend du problème métier. En classification binaire, l'accuracy peut être trompeuse sur des classes déséquilibrées: prédire systématiquement la classe majoritaire donne 99% d'accuracy sur un jeu à 99/1, et zéro utilité. On préfère alors précision, rappel, F1 ou AUC-ROC. En régression, MAE et RMSE mesurent l'erreur moyenne, mais le RMSE pénalise davantage les grosses erreurs (il élève les écarts au carré avant de moyenner).

#Exemple: classification simple

Chargement de l’éditeur...

#Exercice observable: le piège de l'accuracy

Reprenez le playground ci-dessus en remplaçant la génération par make_classification(..., weights=[0.95, 0.05], random_state=42) (classes déséquilibrées 95/5). Ajoutez une baseline naïve qui prédit toujours la classe majoritaire:

pythonpython

1from sklearn.dummy import DummyClassifier2baseline = DummyClassifier(strategy="most_frequent").fit(X_train, y_train)3print(f"Accuracy baseline naïve: {baseline.score(X_test, y_test):.2%}")

Comparez les deux accuracys, puis comparez les rappels (colonne recall du classification_report). Résultat attendu: la baseline affiche une accuracy d'environ 95% (elle reflète seulement la prévalence de la classe majoritaire) mais un rappel de 0 sur la classe minoritaire, tandis que le modèle entraîné sacrifie un peu d'accuracy pour un rappel nettement supérieur. C'est la démonstration observable que l'accuracy seule ne mesure pas l'utilité d'un classifieur déséquilibré.

#Quiz

Pourquoi séparer les données en train/validation/test plutôt que juste train/test?
Pourquoi séparer les données en train/validation/test plutôt que juste train/test?

Plan du cours · 12 sections

Sections du cours