Tous les articles

Rendre ses expériences ML reproductibles

Leave-One-Day-Out, métriques pour classes déséquilibrées et optimisation bayésienne des hyperparamètres.

AN
Ali Ncibi
2 min de lecture

Un score isolé ne veut rien dire. En machine learning, la crédibilité d'un résultat tient au protocole qui l'a produit : comment les données ont été découpées, quelles métriques ont été choisies, comment les hyperparamètres ont été réglés. Voici ce que j'applique systématiquement.

Leave-One-Day-Out pour données temporelles

Découper aléatoirement des séries temporelles en train/test, c'est tricher : deux fenêtres consécutives sont fortement corrélées, et le modèle « voit » l'avenir pendant l'entraînement. Sur des données de capteurs enregistrées sur plusieurs semaines, la validation croisée Leave-One-Day-Out est plus honnête : on entraîne sur tous les jours sauf un, on teste sur le jour restant, et on répète pour chaque jour.

from sklearn.model_selection import LeaveOneGroupOut

# Chaque jour forme un groupe : on teste un jour, on entraîne sur les autres
logo = LeaveOneGroupOut()
for train_idx, test_idx in logo.split(X, y, groups=day_of_week):
    ...

Le score final est la moyenne sur tous les jours, ce qui reflète bien la capacité à généraliser à une journée jamais vue.

Des métriques adaptées au déséquilibre

Avec des classes déséquilibrées, l'accuracy ment : prédire systématiquement l'activité majoritaire suffit à obtenir un score flatteur. On lui préfère le F1-score macro (moyenne des F1 par classe) ou pondéré, qui donnent autant de poids à une activité rare qu'à une activité fréquente.

Optimisation bayésienne plutôt que grille

Une recherche par grille explore des combinaisons au hasard, souvent loin de l'optimum. L'optimisation bayésienne — ici via Scikit-Optimize — modélise la fonction objectif par un processus gaussien et concentre les essais là où l'amélioration attendue est la plus forte.

from skopt import gp_minimize

result = gp_minimize(
    func=objective,          # fonction qui entraîne et évalue le modèle
    dimensions=[(1e-4, 1e-1, "log-uniform"), (16, 256)],
    n_calls=30,
)

Le gain n'est pas cosmétique : à budget d'essais égal, on atteint de meilleurs modèles, et chaque expérience devient comparable à la suivante. C'est exactement ce qu'on attend d'une recherche qui veut convaincre.