Cet article est le troisième de notre série consacrée aux données déséquilibrées. Nous vous conseillons de lire l’article précédent sur le SMOTE avant d’aborder celui-ci.
Quelques rappels : le SMOTE, acronyme pour Synthetic Minority Oversampling TEchnique [1], est une méthode de suréchantillonnage des observations minoritaires. Il consiste à générer de nouveaux individus minoritaires qui ressemblent aux autres, sans être strictement identiques. Cela permet de densifier de façon homogène la population d’individus minoritaires.
Dans le précédent article nous n’avons considéré que des variables numériques car le SMOTE classique ne permet pas de traiter les variables catégorielles. Pour traiter des données mixtes (mixed data), c’est-à-dire contenant à la fois des variables numériques et catégorielles, il faut utiliser une variante : le SMOTE-NC, pour SMOTE-Nominal Continuous.
L’erreur à ne pas faire : encoder les catégorielles
Une pratique malheureusement fréquente est à éviter absolument : il ne faut pas encoder les catégorielles sous forme de numériques, que ce soit par du label encoding, du one-hot encoding ou d’autres encoders.
Encoder les catégorielles pour pouvoir ensuite appliquer le SMOTE classique est très pratique, certes, mais cela génère un traitement erroné de ces variables [2] (p.72). L’algorithme SMOTE-NC permet de traiter les variables catégorielles de façon plus adaptée, sans avoir à réaliser de preprocessing au préalable.
Quelles différences entre SMOTE et SMOTE-NC ?
Les deux étapes où la prise en compte des variables catégorielles nécessite des modifications sont le calcul des distances et la création d’un individu synthétique.
Pour trouver les k plus proches voisins de l’observation minoritaire initiale, le calcul de la distance entre deux individus se fait en deux étapes :
- Calcul de la distance euclidienne à partir des variables numériques.
- Pour chaque variable catégorielle, augmentation de la distance selon les deux cas suivants :
- Si les 2 individus ont la même modalité pour cette catégorielle, alors on augmente la distance de 0.
- Si les 2 individus ont une modalité différente, alors on augmente la distance de D.
D est défini comme la médiane des écart-types des variables numériques. Cette valeur permet d’avoir une distance qui soit cohérente entre les variables numériques et catégorielles.
La formule suivante résume la distance entre deux individus avec une combinaison de variables numériques et catégorielles :
\begin{equation*}
\text{dist}(X_i, X_j) = \sqrt{\sum_{k=1}^{K_{num}}(X_k^i – X_k^j)^2} + D \sum_{k=K_{num}+1}^{K_{cat}} 1_{ \{ X_k^i = X_k^j \} }
\end{equation*}
Où $D = \text{median}_{1 \leq k\leq K_{num}}(\sigma_k)$.
Une fois les plus proches voisins identifiés, la création de l’individu synthétique est réalisée de la façon suivante :
- Pour les variables numériques, le SMOTE-NC calcule les valeurs de la même façon que le SMOTE.
- Pour chaque variable catégorielle, la modalité du nouvel individu correspond à la modalité la plus fréquente parmi ses k plus proches voisins.
Résumons l’algorithme SMOTE-NC avec la vidéo suivante :
Figure 1. Création d’un individu synthétique avec deux variables numériques et une variable catégorielle.
Les variables V1 et V2 en abscisse et en ordonnée sont numériques. La variable catégorielle indiquant le genre est indiquée par les icônes à côté de chaque point.
Pour chaque individu synthétique généré, l’algorithme opère les étapes suivantes :
- Sélectionner aléatoirement un individu minoritaire “initiale”.
- Identifier ses k plus proches voisins parmi les individus minoritaires.
- Choisir aléatoirement l’un des k plus proches voisins.
- Générer aléatoirement un coefficient 0<<1.
- Pour les variables numériques, créer le nouvel individu entre l’observation initiale et le plus proche voisin choisi selon la valeur du coefficient .
- Pour les variables catégorielles, attribuer la modalité qui est majoritaire parmi les k plus proches voisins.
Utiliser SMOTE-NC avec Python ou R
Pour appliquer le SMOTE-NC à un jeu de données, nous utilisons son implémentation Python avec le package imbalanced-learn : imblearn.over_sampling.SMOTENC [3]. Sous R, une implémentation de la variante SMOTE-NC est disponible depuis 2021 dans le package RSBID : SMOTE_NC [4].
Le code Python pour “smoter” des données mixtes est quasiment le même que pour des données numériques :
- La définition d’une instance de SMOTENC avec les paramètres définis par l’utilisateur :
- categorical_features, qui précise les indices des variables catégorielles
- k_neighbors, le nombre de plus proches voisins
- sampling_strategy, le taux d’observations minoritaires à atteindre
- L’utilisation de la fonction fit_resample sur les données X et y.
# Importation du package
from imblearn.over_sampling import SMOTENC
# Définition de l'instance SMOTE où 1 désigne la colonne catégorielle
sm = SMOTENC(categorical_features=[1], sampling_strategy=0.1, k_neighbors=2)
# Application du SMOTE aux données
X_res, y_res = sm.fit_resample(X, y)
Le résultat sur un jeu de données contenant une variable numérique et une variable catégorielle est le suivant (avec k = 2 et os = 0.1) :
Figure 2. Application du SMOTE-NC à une variable numérique et une variable catégorielle. Les points bleus sont les individus majoritaires, les triangles verts sont les individus minoritaires et les triangles violets sont les individus synthétiques générés par SMOTE-NC.
De même que SMOTE, SMOTE-NC permet de densifier le signal en créant de nouveaux individus entre les individus originaux. Quelques individus sont également générés dans des zones qui sont moins pertinentes. Ces points sont générés du fait de la présence de quelques individus minoritaires isolés.
Réduire le surapprentissage grâce au SMOTE-NC
De la même façon que le SMOTE, l’utilisation du SMOTE-NC permet de réduire le surapprentissage du modèle. Pour le montrer, considérons – comme dans l’article précédent – les prédictions d’un modèle entraîné sur les données brutes :
Figure 3. Surapprentissage du modèle sans utilisation du SMOTE-NC. La couleur rouge désigne les zones de fortes probabilités prédites par le modèle entraîné sur les données Train. En s’entraînant sur les données brutes, le modèle apprend des zones de prédiction très limitées et a une faible performance sur les données Test.
Le modèle prédit à nouveau une probabilité uniforme très faible sur la majorité de l’espace; à l’exception de quelques zones très réduites, celles où sont situées les données Train : il surapprend les données Train.
Considérons à présent les prédictions d’un modèle entraîné sur les données rééchantillonnées par SMOTE-NC :
Figure 4. Diminution visible du surapprentissage grâce au SMOTE-NC. Sur les données ré-échantillonnées, le modèle apprend des bandes de prédiction plus larges pour chaque catégorie.
Les zones de forte probabilité prédite par le modèle sont à présent plus larges, et permettent de couvrir l’espace dans lequel se trouvent les données Test. Le modèle obtient une performance similaire sur Train et Test : il ne surapprend presque plus.
On confirme avec la métrique d’AUC Precision-Recall que le modèle entraîné sur les données ré-échantillonnées via le SMOTE-NC a une meilleure performance sur les données de test :
Figure 5. Augmentation des performances du modèle grâce au SMOTE-NC.
Le gain de performance est plus faible que dans l’exemple présenté pour le SMOTE, mais reste significatif.
Conclusion
Le SMOTE est une technique très utile pour rééquilibrer les données numériques en entrée d’un modèle de Machine Learning. Il permet de réduire la variance du modèle en densifiant les individus minoritaires de façon homogène et peut améliorer significativement les performances de vos modèles.
Grâce à la variante SMOTE Nominal Continuous, il est aussi possible de rééquilibrer des données mixtes. Cet algorithme est très proche du SMOTE mais intègre les adaptations nécessaires pour intégrer des variables catégorielles.
L’article suivant de cette série détaille un autre point essentiel : le traitement des variables discrètes dans le SMOTE.
Références :
N. V. Chawla, K. W. Bowyer, L. O. Hall, et W. P. Kegelmeyer, « SMOTE: Synthetic Minority Over-sampling Technique », J. Artif. Intell. Res., vol. 16, p. 321‑357, juin 2002.
C. Tremblay, « Mémoire présenté devant l’ENSAE ParisTech pour l’obtention du diplôme de la filière Actuariat et l’admission à l’Institut des Actuaires le 22/02/2017 », p. 123.
« SMOTENC — Version 0.8.1 ». https://imbalanced-learn.org/stable/references/generated/imblearn.over_sampling.SMOTENC.html
« SMOTE_NC: Synthetic Minority Over-sampling TEchnique-Nominal Continuous in dongyuanwu/RSBID: Resampling Strategies for Binary Imbalanced Datasets ». https://rdrr.io/github/dongyuanwu/RSBID/man/SMOTE_NC.html