ParcoursOuvrir l'appli

La bonne méthode, et ta première compétition

Machine learning classique · 60 min

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 :

  1. comprendre les données (le module pandas) : valeurs manquantes, aberrantes, déséquilibres ;
  2. 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é ;
  3. une validation croisée solide pour ne pas se mentir ;
  4. 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 :

  1. lit le train, sépare X (les 5 caractéristiques) et y (rembourse) ;
  2. fabrique une caractéristique effort = montant / (revenu * duree) dans X et dans le test (le même calcul des deux côtés) ;
  3. entraîne une forêt (n_estimators=100, random_state=0) sur tout le train ;
  4. 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 :