#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
#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
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.
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
#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:
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é.