Oversampling et augmentation de données: renforcer les classes minoritaires
Equilibrage, oversampling et augmentation de données
L’
équilibrage des données regroupe les techniques destinées à corriger un déséquilibre entre classes dans un dataset. Ce problème apparaît lorsque certaines catégories (classe majoritaire) sont beaucoup plus représentées que d’autres (classe minoritaire). Dans ce cas, les modèles de machine learning privilégient la classe dominante, ce qui fausse les prédictions et rend des métriques comme l’accuracy peu pertinentes.
Parmi les méthodes d’équilibrage, l’
oversampling consiste à augmenter artificiellement la taille de la classe minoritaire, soit en dupliquant des exemples existants, soit en générant de nouveaux exemples synthétiques (par interpolation ou variantes comme SMOTE et ADASYN). L’objectif est de donner au modèle une meilleure capacité d’apprentissage sur les classes rares et de réduire le biais, ce qui améliore la détection des cas minoritaires et renforce des métriques comme le rappel et le F1-score.
De son côté, l’
augmentation des données (data augmentation) est un concept plus large: elle vise à enrichir ou diversifier un dataset, que ce soit pour équilibrer les classes ou pour rendre le modèle plus robuste face à la variabilité. Par exemple, en vision par ordinateur, on applique des transformations (rotation, recadrage, ajout de bruit...), tandis qu’en NLP, on utilise des paraphrases ou des synonymes. L’augmentation peut donc servir à l’équilibrage, mais elle dépasse ce cadre en améliorant la généralisation du modèle.
Des variantes avancées de l’oversampling, comme SMOTE (Synthetic Minority Oversampling Technique) et ADASYN (Adaptive Synthetic Sampling) génèrent des exemples synthétiques de la classe minoritaire plutôt que de simplement dupliquer des données existantes, ce qui permet d’enrichir la diversité et de mieux définir les frontières de décision. Toutefois, afin de garder cette leçon centrée sur les principes fondamentaux de l’équilibrage, nous n’allons pas détailler ces variantes ici. Elles seront abordées dans une leçon ultérieure consacrée aux techniques avancées d’oversampling.
Oversampling et équilibrage appliqué au dataset Telco Customer Churn
Dataset Telco Customer Churn
Le
Telco Customer Churn dataset, proposé par IBM, est un jeu de données de référence utilisé pour étudier le phénomène de désabonnement des clients dans le secteur des télécommunications.
Chaque ligne du dataset représente un client et contient des informations variées: données démographiques (sexe, situation familiale), services souscrits (téléphonie, internet, options supplémentaires), ainsi que des détails contractuels et financiers (type de contrat, méthode de paiement, charges mensuelles, ancienneté). La variable cible, appelée
Churn, indique si le client a quitté l’entreprise ou non, ce qui en fait un problème typique de classification binaire.
Ce dataset est particulièrement intéressant pour l’enseignement car il illustre plusieurs défis pratiques du machine learning: la nécessité de prétraiter et encoder des variables hétérogènes, l’importance de choisir des métriques adaptées (comme le F1-score ou l’AUC) plutôt que l’accuracy, et surtout la gestion du déséquilibre des classes. En effet, la proportion de clients ayant quitté l’entreprise est relativement faible, ce qui en fait un excellent cas d’étude pour appliquer des techniques d’oversampling et d’équilibrage des données tout en comparant différents modèles de classification.
Le jeu de données Telco Customer Churn est un ensemble de données fictives conçu initialement pour illustrer les capacités d’analyse de données et d’apprentissage automatique de la plateforme
IBM Cognos Analytics. Ce dataset est donc utilisé à des fins pédagogiques et de démonstration, et ne reflète pas directement les données réelles d’une entreprise de télécommunications.
Vous pouvez
télécharger le jeu de données Telco Customer Churn directement sur Kaggle, où il est disponible pour l’exploration et les projets de machine learning.
Oversampling pour équilibrer les classes de churn
Commençons par charger la dataset et voir un aperçu sur le nombre d'échantillons par classe de Churn:
import pandas as pd
data=pd.read_csv("Telco-Customer-Churn.csv")
data["Churn"].value_counts()
Cela affiche:
Churn
No 5174
Yes 1869
Name: count, dtype: int64
La distribution des classes dans le dataset montre un déséquilibre marqué. En effet, sur un total de 7043 clients, 5174 n’ont pas quitté l’entreprise (Churn = No), tandis que seulement 1869 ont résilié leur contrat (Churn = Yes). Cela signifie que la classe majoritaire représente environ 73% des observations, contre 27% pour la classe minoritaire.
Ce déséquilibre peut conduire un modèle de machine learning à privilégier la prédiction "No Churn" et à ignorer les cas de désabonnement, ce qui fausse l’évaluation si l’on se limite à l’accuracy. D’où l’importance d’utiliser des techniques d’équilibrage des données et des métriques adaptées (recall, F1-score, AUC) pour mieux capturer et prédire les comportements des clients qui quittent l’entreprise.
Maintenant, appliquons l'oversampling pour équilibrer les classes en augmentant la classe minoritaire Churn = Yes:
c_minoritaire=data[data["Churn"]=="Yes"]
c_majoritaire=data[data["Churn"]=="No"]
c_minoritaire_augmentee=c_minoritaire.sample(5174,replace=True)
len(c_minoritaire_augmentee)
Nous avons séparée les données en deux sous-ensembles selon la valeur de la variable cible
Churn:
- c_minoritaire = data[data["Churn"]=="Yes"]: extrait toutes les lignes où le client a quitté l’entreprise (classe minoritaire avec 1869 échantillons).
- c_majoritaire = data[data["Churn"]=="No"]: extrait toutes les lignes où le client n'a pas quitté l’entreprise (classe majoritaire avec 5174 échantillons).
Donc, nous avons généré deux sous-ensembles de données en utilisant la technique du
boolean indexing que nous avons déjà utilisé auparavant: l’un contient les échantillons de la classe minoritaire (Churn = Yes) et l’autre regroupe les échantillons de la classe majoritaire (Churn = No). Cette approche permet de filtrer directement les lignes du dataset en fonction d’une condition logique appliquée sur la colonne cible.
Ensuite, on crée une version augmentée de la classe minoritaire en tirant aléatoirement 5174 échantillons à partir de
c_minoritaire à l'aide de la méthode
sample.
Comme l’argument replace=True est activé, les mêmes lignes peuvent être sélectionnées plusieurs fois (échantillonnage avec remise). Cela permet de gonfler artificiellement la taille de la classe minoritaire pour qu’elle atteigne le même nombre d’exemples que la classe majoritaire (5174), réalisant ainsi un oversampling qui équilibre les deux classes dans le dataset.
Le code précédent donne le résultat suivant:
5174
On voit clairement que la version augmentée de la classe minoritaire compte désormais autant d'éléments que la classe majoritaire (c'est à dire 5174 échantillons).
Il est temps de concaténer les deux datasets
c_minoritaire_augmentee et
c_majoritaire:
data=pd.concat([c_minoritaire_augmentee,c_majoritaire]).sample(frac=1,random_state=42)
En concaténant les données de la classe minoritaire augmentée avec celles de la classe majoritaire (à l'aide de la méthode
concat de Pandas, on obtient un ensemble où les deux classes sont représentées de manière équivalente. Ensuite, l’utilisation de
sample(frac=1, random_state=42) mélange aléatoirement toutes les lignes (
frac=1) pour éviter que les observations générées soient regroupées et que le modèle apprenne un ordre artificiel. Le paramètre
random_state=42 garantit que ce mélange reste reproductible.
Le résultat final est donc un dataset équilibré et correctement réparti, prêt à être utilisé pour l’entraînement du modèle de prédiction du churn.
Affichons le nombre d’occurrences de chaque classe dans la colonne Churn:
data["Churn"].value_counts()
On obtient:
Churn
No 5174
Yes 5174
Name: count, dtype: int64
Bien que cette technique d’oversampling soit relativement simple par rapport à des méthodes plus avancées comme SMOTE, elle permet généralement d’obtenir de bons résultats en pratique et constitue une première approche efficace pour traiter le déséquilibre des classes.