La bonne méthode, et ta première compétition
Le danger de se tromper soi-même
Le plus grand risque en machine learning n'est pas de faire un mauvais modèle : c'est de croire qu'un modèle est bon alors qu'il ne l'est pas. Trois pièges guettent tout le monde, débutant comme expert.
La validation croisée
Une seule coupure train/test est bruitée : tu as vu l'arbre et la forêt faire jeu égal sur une coupure, ce qui ne prouve rien. La solution standard :
from sklearn.model_selection import cross_val_score
scores = cross_val_score(modele, X, y, cv=5)
print(scores) # 5 scores
print(scores.mean()) # leur moyenne : la vraie estimation
Exercice : Départager les modèles honnêtement
Avec la validation croisée à 5 parts sur tout le jeu crédit, compare :
moy_logit: la moyenne des 5 scores du pipeline (mise à l'échelle + régression logistique) ;moy_foret: la moyenne des 5 scores d'une forêt aléatoire ;gagnant: le texte"foret"ou"logit"selon la plus haute moyenne.
Voir une solution
import pandas as pd
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
df = pd.read_csv("credit.csv")
X = df[["age", "revenu", "montant", "duree", "retards"]]
y = df["rembourse"]
logit = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000, random_state=0))
foret = RandomForestClassifier(n_estimators=100, random_state=0)
moy_logit = cross_val_score(logit, X, y, cv=5).mean()
moy_foret = cross_val_score(foret, X, y, cv=5).mean()
gagnant = "foret" if moy_foret > moy_logit else "logit"
print(round(moy_logit, 3), round(moy_foret, 3), gagnant)Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Comment se passe une compétition
Tu es prêt pour Zindi (la plateforme africaine) ou Kaggle. Le principe est toujours le même.
La vraie recette gagnante
Les compétitions ne se gagnent presque jamais par un modèle exotique. Elles se gagnent par :
- comprendre les données (le module pandas) : valeurs manquantes, aberrantes, déséquilibres ;
- fabriquer de bonnes caractéristiques (en anglais feature engineering) : une colonne « mensualité = montant / durée » peut valoir plus que n'importe quel modèle sophistiqué ;
- une validation croisée solide pour ne pas se mentir ;
- un bon modèle de base (forêt, gradient boosting), réglé sans excès.
Tu sais déjà faire les quatre.
Exercice : Le protocole complet d'une compétition
Mets tout ensemble, comme pour une vraie soumission. On a séparé le crédit en un train.csv (avec la cible) et un test.csv (sans la cible, comme en compétition). Écris la fonction soumettre(train_csv, test_csv) qui :
- lit le train, sépare
X(les 5 caractéristiques) ety(rembourse) ; - fabrique une caractéristique
effort = montant / (revenu * duree)dans X et dans le test (le même calcul des deux côtés) ; - entraîne une forêt (
n_estimators=100, random_state=0) sur tout le train ; - renvoie la liste des prédictions (
0/1) pour le test, comme une soumission.
Voir une solution
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
def soumettre(train_csv, test_csv):
"""Entraîne une forêt sur le train (avec une caractéristique fabriquée) et prédit le test."""
train = pd.read_csv(train_csv)
test = pd.read_csv(test_csv)
colonnes = ["age", "revenu", "montant", "duree", "retards"]
X = train[colonnes].copy()
y = train["rembourse"]
X["effort"] = X["montant"] / (X["revenu"] * X["duree"])
test = test.copy()
test["effort"] = test["montant"] / (test["revenu"] * test["duree"])
foret = RandomForestClassifier(n_estimators=100, random_state=0)
foret.fit(X, y)
predictions = foret.predict(test[X.columns])
return list(predictions)
pred = soumettre("train.csv", "test.csv")
print(len(pred), "predictions")
print(pred[:10])Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
La suite de ton parcours
Tu sais maintenant mener un projet de machine learning de bout en bout : lire et nettoyer des données, fabriquer des caractéristiques, entraîner et comparer des modèles honnêtement, et soumettre à une compétition. C'est déjà le métier d'analyste ou de data scientist junior.
Pour aller plus loin, trois pistes :
- Le gradient boosting (XGBoost, LightGBM) : la cousine de la forêt qui gagne la majorité des compétitions sur données en tableau. Même esprit, encore plus performant.
- Le deep learning (prochain module) : pour les images, le son et le texte, où les réseaux de neurones écrasent tout le reste. Tu en as déjà le moteur : la descente de gradient.
- La pratique : un vrai projet vaut dix cours. Prends un jeu de données qui te tient à cœur (des données du Cameroun sur data.worldbank.org, un fichier Zindi), pose-toi une question, et réponds-y avec ce que tu sais. Mets tout sur ton GitHub
ml-parcours.