Comment utiliser SMOTE pour les données déséquilibrées dans R (avec exemple)



Souvent, lorsque l’on travaille avec des algorithmes de classification en apprentissage automatique, les classes de l’ensemble de données seront déséquilibrées.

Par exemple:

  • Un ensemble de données contenant des informations indiquant si les joueurs universitaires sont repêchés ou non dans la NBA pourrait avoir 98 % des joueurs non repêchés et 2 % le sont.
  • Un ensemble de données contenant des informations indiquant si les patients ont ou non un cancer pourrait contenir 99 % de patients sans cancer et seulement 1 % avec un cancer.
  • Un ensemble de données contenant des informations sur la fraude bancaire peut contenir 96 % de transactions légitimes et 4 % frauduleuses.

En raison de ces classes déséquilibrées, le modèle prédictif que vous construisez risque de ne pas fonctionner correctement sur la classe minoritaire.

Pire encore, la classe minoritaire est souvent celle que nous souhaitons le plus prédire.

Une façon de résoudre ce problème de déséquilibre consiste à utiliser la technique de suréchantillonnage des minorités synthétiques , souvent abrégée SMOTE .

Cette technique consiste à créer un nouvel ensemble de données en suréchantillonnant les observations de la classe minoritaire, ce qui produit un ensemble de données comportant des classes plus équilibrées.

Le moyen le plus simple d’utiliser SMOTE dans R consiste à utiliser la fonction SMOTE() du package DMwR .

Cette fonction utilise la syntaxe de base suivante :

SMOTE(form, data, perc.over = 200, perc.under = 200, ...)

où:

  • form : Une formule décrivant le modèle que vous souhaitez adapter
  • data : Nom de la trame de données
  • perc.over : Nombre qui détermine combien de cas supplémentaires de la classe minoritaire sont générés
  • perc.under : Nombre qui détermine combien de cas supplémentaires de la classe majoritaire sont générés

L’exemple suivant montre comment utiliser cette fonction dans la pratique.

Exemple : Comment utiliser SMOTE dans R

Supposons que nous ayons l’ensemble de données suivant avec 100 observations dans R dans lequel 90 ont une classe « Oui » et 10 ont une classe « Non » pour la variable de réponse :

#make this example reproducible
set.seed(0)

#create data frame with one response variable and two predictor variables
df <- data.frame(y=rep(as.factor(c('Yes', 'No')), times=c(90, 10)),
                 x1=rnorm(100),
                 x2=rnorm(100))

#view first six rows of data frame
head(df)

    y         x1         x2
1 Yes  1.2629543  0.7818592
2 Yes -0.3262334 -0.7767766
3 Yes  1.3297993 -0.6159899
4 Yes  1.2724293  0.0465803
5 Yes  0.4146414 -1.1303858
6 Yes -1.5399500  0.5767188
 
#view distribution of response variable
table(df$y)

 No Yes 
 10  90

Il s’agit d’un exemple classique d’un ensemble de données déséquilibré, car la variable de réponse que nous prédisons comporte 90 observations ayant une classe « Oui » et seulement 10 observations ayant une classe « Non ».

Pour créer un ensemble de données plus équilibré, nous pouvons utiliser la fonction SMOTE() du package DMwR :

library(DMwR)

#use SMOTE to create new dataset that is more balanced
new_df <- SMOTE(y ~ ., df, perc.over = 2000, perc.under = 400)

#view distribution of response variable in new dataset
table(new_df$y)

 No Yes 
210 800

L’ensemble de données résultant contient 210 observations avec « Non » comme classe et 800 observations avec « Oui » comme classe.

Voici exactement comment la fonction SMOTE a produit ce nouvel ensemble de données :

  • L’argument perc.over précisait que nous souhaitions ajouter 2 000/100 (soit 20) fois le nombre d’observations minoritaires existantes à l’ensemble de données. Étant donné que 10 observations existaient dans l’ensemble de données d’origine, nous avons ajouté 20*10 = 200 observations minoritaires supplémentaires .
  • L’argument perc.under précisait que nous souhaitions rendre le nombre d’observations majoritaires égal à 400/100 (soit 4) fois le nombre d’observations minoritaires ajoutées aux observations minoritaires existantes. Puisque 200 observations minoritaires supplémentaires ont été ajoutées, nous avons rendu le nombre d’observations majoritaires égal à 200 * 4 = 800 observations majoritaires .

Le résultat final est un ensemble de données qui contient toujours plus de classes majoritaires, mais qui reste plus équilibré que l’ensemble de données d’origine.

Vous pouvez maintenant adapter l’algorithme de classification de votre choix à ce nouvel ensemble de données, qui devrait mieux fonctionner sur la classe minoritaire puisqu’il y a plus d’observations de la classe minoritaire dans ce nouvel ensemble de données.

Remarque : N’hésitez pas à jouer avec les arguments perc.over et perc.under dans la fonction SMOTE pour obtenir un ensemble de données adapté à vos besoins.

Ressources additionnelles

Les didacticiels suivants expliquent comment effectuer d’autres tâches courantes dans R :

Comment créer des tableaux récapitulatifs dans R
Comment normaliser les données dans R
Comment supprimer les valeurs aberrantes dans R

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *