Preprocessing et Feature Engineering: booster les performances d'un modèle IA

Auteur: Mohamed CHINY Durée necessaire pour le cours de Preprocessing et Feature Engineering: booster les performances d'un modèle IA Niveau recommandé pour le cours de Preprocessing et Feature Engineering: booster les performances d'un modèle IA Supports vidéo non disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Leçon 17: Oversampling: rééquilibrer les données pour améliorer les prédictions

Toutes les leçons

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.