Jeux de données déséquilibrés : stratégies complètes pour les gérer efficacement
Comprendre les datasets déséquilibrés et maîtriser toutes les techniques pour entraîner des modèles fiables en classification.
Dans le domaine de l’apprentissage automatique, les jeux de données déséquilibrés constituent un défi quotidien. Lorsque une classe représente 99 % des exemples et l’autre seulement 1 %, les algorithmes standards échouent souvent à détecter les cas rares. Cet article vous guide pas à pas pour identifier le problème, choisir les bonnes métriques et appliquer les techniques les plus efficaces.
Qu’est-ce qu’un dataset déséquilibré et pourquoi pose-t-il problème ?
Un dataset est déséquilibré lorsque la distribution des classes est très inégale. Les exemples concrets abondent : détection de fraude bancaire (0,1 % de fraudes), diagnostic de maladies rares, prédiction de churn client, filtrage de spam ou détection de défauts sur une chaîne industrielle. Dans tous ces cas, le modèle « triche » en prédisant systématiquement la classe majoritaire, obtenant une accuracy élevée tout en manquant complètement les cas critiques.
Le piège de l’accuracy et les métriques à privilégier
L’accuracy est trompeuse car elle masque les erreurs sur la classe minoritaire. Il faut utiliser la matrice de confusion, la précision, le rappel, le score F1, la balanced accuracy, le coefficient de Cohen kappa et surtout la PR-AUC (plus pertinente que la ROC-AUC quand les classes sont très déséquilibrées). On privilégie le rappel lorsque les faux négatifs sont coûteux (maladie non détectée) et la précision lorsque les faux positifs le sont (alarme inutile).
Techniques de ré-échantillonnage : oversampling et undersampling
L’oversampling consiste à augmenter la classe minoritaire : duplication simple, SMOTE, ADASYN ou Borderline-SMOTE. L’undersampling réduit la classe majoritaire via Random Undersampling, Tomek Links, NearMiss ou Edited Nearest Neighbours (ENN). Les combinaisons comme SMOTETomek ou SMOTEENN offrent souvent un bon compromis. Attention toutefois au risque de surapprentissage avec l’oversampling et à la perte d’information avec l’undersampling.
Approches au niveau de l’algorithme
Plutôt que de modifier les données, on peut agir sur l’algorithme lui-même. La plupart des bibliothèques permettent d’utiliser le paramètre class_weight ou cost-sensitive learning. L’ajustement du seuil de décision (threshold moving) après l’entraînement est simple et efficace. Enfin, la Focal Loss, populaire en détection d’objets, réduit l’influence des exemples faciles et concentre l’apprentissage sur les cas difficiles.
Méthodes ensemblistes adaptées aux données déséquilibrées
Les méthodes ensemblistes spécialisées combinent plusieurs classifieurs entraînés sur des sous-ensembles équilibrés. BalancedRandomForest, EasyEnsemble, RUSBoost et BalancedBagging sont des implémentations robustes qui intègrent nativement le ré-échantillonnage et améliorent généralement la détection de la classe rare.
Quand passer au cadre détection d’anomalie ?
Lorsque la classe positive représente moins de 1 % des données, les techniques de classification supervisée atteignent leurs limites. Il devient pertinent de reformuler le problème en détection d’anomalie ou d’outlier avec des algorithmes comme Isolation Forest, One-Class SVM ou Autoencoders, qui apprennent uniquement sur la classe majoritaire.
Bonnes pratiques de validation pour éviter les fuites de données
Le resampling ne doit jamais être appliqué sur l’ensemble de test ou de validation. Utilisez toujours un pipeline (imblearn.Pipeline) qui applique SMOTE uniquement sur les folds d’entraînement. La stratified k-fold préserve la proportion de classes dans chaque pli. Ces précautions évitent une fuite de données et des performances surestimées.
Exemple concret de code avec imbalanced-learn
from sklearn.datasets import make_classification
from sklearn.model_selection import StratifiedKFold, cross_val_predict
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from imblearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
X, y = make_classification(n_classes=2, weights=[0.95, 0.05], n_samples=5000, random_state=42)
pipe = Pipeline([
('smote', SMOTE(random_state=42)),
('clf', RandomForestClassifier(class_weight='balanced', random_state=42))
])
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
y_pred = cross_val_predict(pipe, X, y, cv=cv)
print(classification_report(y, y_pred))
- Vérifier toujours la distribution des classes avant toute modélisation.
- Choisir les métriques en fonction du coût métier des erreurs.
- Appliquer le resampling exclusivement dans le pipeline d’entraînement.
- Tester plusieurs techniques (SMOTE, class_weight, threshold tuning) et comparer les PR-AUC.
- Utiliser la validation croisée stratifiée pour garantir des résultats fiables.
- Documenter le choix final et ses hypothèses pour la reproductibilité.
En appliquant ces bonnes pratiques, vous transformerez un dataset déséquilibré en un atout plutôt qu’en un obstacle. La clé réside dans la combinaison judicieuse des métriques adaptées, du resampling contrôlé et des algorithmes cost-sensitive. Testez ces approches sur vos propres données et mesurez l’amélioration concrète du rappel et de la PR-AUC.
💬 Une question ou envie d'aller plus loin ? Rejoins la communauté sur Discord : https://discord.gg/GwhUKccQcM