Visualisation des classes avant et après échantillonnage
Dans le cadre de la gestion des données déséquilibrées, l’échantillonnage est une technique clé pour améliorer la qualité de l’apprentissage automatique. Cependant, pour bien comprendre l’impact de ces méthodes, il est essentiel de visualiser la distribution des classes avant et après échantillonnage.
Pourquoi visualiser la distribution des classes ?
La visualisation permet d’avoir une intuition claire sur la proportion des classes dans le jeu de données. Elle aide à :
- Comprendre le déséquilibre initial.
- Mesurer l’effet de l’échantillonnage (suréchantillonnage ou sous-échantillonnage).
- Détecter des anomalies ou des erreurs dans le traitement des données.
- Communiquer les résultats efficacement aux parties prenantes.
Types d’échantillonnage et leurs effets visuels
Les deux principales méthodes sont :
- Suréchantillonnage (par exemple SMOTE) : consiste à augmenter la quantité d’exemples dans la classe minoritaire.
- Sous-échantillonnage : consiste à réduire le nombre d’exemples dans la classe majoritaire.
Visualiser la distribution avant et après échantillonnage montre clairement comment l’équilibre s’améliore ou parfois se dégrade si le choix est mal fait.
Exemple pratique en Python avec matplotlib
Voici un exemple simple illustrant la distribution des classes avant et après suréchantillonnage avec la technique SMOTE.
import matplotlib.pyplot as plt
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
# Création d'un jeu de données déséquilibré
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2,
n_redundant=0, n_clusters_per_class=1,
weights=[0.9, 0.1], flip_y=0, random_state=42)
# Visualisation avant échantillonnage
counter_before = Counter(y)
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
# Visualisation après suréchantillonnage
counter_after = Counter(y_resampled)
# Tracé
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
axes[0].bar(counter_before.keys(), counter_before.values(), color=['blue', 'orange'])
axes[0].set_title('Distribution avant échantillonnage')
axes[0].set_xticks([0, 1])
axes[0].set_xticklabels(['Classe majoritaire', 'Classe minoritaire'])
axes[0].set_ylabel('Nombre d\'exemples')
axes[1].bar(counter_after.keys(), counter_after.values(), color=['blue', 'orange'])
axes[1].set_title('Distribution après suréchantillonnage (SMOTE)')
axes[1].set_xticks([0, 1])
axes[1].set_xticklabels(['Classe majoritaire', 'Classe minoritaire'])
plt.tight_layout()
plt.show()
Ce code génère deux graphiques côte à côte qui montrent très clairement comment le nombre d’exemples de la classe minoritaire augmente pour équilibrer la distribution.
Interprétation des visualisations
Avant échantillonnage, on observe généralement une barre très haute pour la classe majoritaire et une barre basse pour la classe minoritaire, traduisant un déséquilibre marqué. Après application de SMOTE ou d’autres techniques, les hauteurs des barres sont beaucoup plus proches, indiquant un jeu de données plus équilibré.
Cette étape visuelle est souvent accompagnée d’évaluations statistiques mais reste essentielle pour s’assurer que l’échantillonnage a produit l’effet escompté.
Autres types de visualisations utiles
- Diagrammes en secteurs (pie charts) pour voir la proportion en pourcentage.
- Diagrammes de dispersion (scatter plots)</strong pour observer la distribution spatiale des classes dans l’espace des features.
- Histogrammes empilés pour des données multi-classes.
Conclusion
Visualiser les distributions des classes avant et après échantillonnage est une pratique recommandée pour mieux comprendre les données, évaluer l’impact des techniques d’échantillonnage et communiquer efficacement avec les équipes. Cela permet de prévenir des choix erronés et d’optimiser la performance finale des modèles.