Suréchantillonnage et sous-échantillonnage aléatoires pour la classification déséquilibrée

Tweet Share Share

Dernière mise à jour le 5 janvier 2021

Les ensembles de données déséquilibrés sont ceux où il y a un biais sévère dans la distribution des classes, comme 1:100 ou 1:1000 exemples dans la classe minoritaire par rapport à la classe majoritaire.

Ce biais dans l’ensemble de données de formation peut influencer de nombreux algorithmes d’apprentissage automatique, conduisant certains à ignorer entièrement la classe minoritaire. C’est un problème car c’est typiquement la classe minoritaire sur laquelle les prédictions sont les plus importantes.

Une approche pour aborder le problème du déséquilibre de classe est de rééchantillonner aléatoirement l’ensemble de données d’entraînement. Les deux principales approches de rééchantillonnage aléatoire d’un ensemble de données déséquilibré consistent à supprimer les exemples de la classe majoritaire, appelé sous-échantillonnage, et à dupliquer les exemples de la classe minoritaire, appelé sur-échantillonnage.

Dans ce tutoriel, vous découvrirez le suréchantillonnage et le sous-échantillonnage aléatoires pour la classification déséquilibrée

Après avoir terminé ce tutoriel, vous saurez :

  • Le rééchantillonnage aléatoire fournit une technique naïve pour rééquilibrer la distribution des classes pour un ensemble de données déséquilibré.
  • Le suréchantillonnage aléatoire duplique les exemples de la classe minoritaire dans le jeu de données d’entraînement et peut entraîner un surajustement pour certains modèles.
  • Le sous-échantillonnage aléatoire supprime les exemples de la classe majoritaire et peut entraîner la perte d’informations précieuses pour un modèle.

Démarrez votre projet avec mon nouveau livre Imbalanced Classification with Python, comprenant des tutoriels étape par étape et les fichiers de code source Python pour tous les exemples.

Démarrons.

  • Mise à jour Jan/2021 : Mise à jour des liens pour la documentation API.
Suréchantillonnage et sous-échantillonnage aléatoires pour une classification déséquilibrée

Suréchantillonnage et sous-échantillonnage aléatoires pour une classification déséquilibrée
Photo de RichardBH, certains droits réservés.

Vue d’ensemble du tutoriel

Ce tutoriel est divisé en cinq parties ; ce sont :

  1. Réséchantillonnage aléatoire d’ensembles de données déséquilibrés
  2. Données déséquilibrées-.Learn Library
  3. Suréchantillonnage aléatoire Ensembles de données déséquilibrés
  4. Sous-échantillonnage aléatoire Ensembles de données déséquilibrés
  5. Combinaison du suréchantillonnage et du sous-échantillonnage aléatoires

Réséchantillonnage aléatoire Ensembles de données déséquilibrés

Le rééchantillonnage consiste à créer une nouvelle version transformée de l’ensemble de données d’entraînement dans laquelle les exemples sélectionnés ont une distribution de classe différente.

C’est une stratégie simple et efficace pour les problèmes de classification déséquilibrée.

Appliquer des stratégies de rééchantillonnage pour obtenir une distribution de données plus équilibrée est une solution efficace au problème de déséquilibre

– Une enquête sur la modélisation prédictive sous des distributions déséquilibrées, 2015.

La stratégie la plus simple consiste à choisir des exemples pour l’ensemble de données transformé de manière aléatoire, appelé rééchantillonnage aléatoire.

Il existe deux approches principales du rééchantillonnage aléatoire pour la classification déséquilibrée ; ce sont le suréchantillonnage et le sous-échantillonnage.

  • Suréchantillonnage aléatoire : Dupliquer aléatoirement des exemples dans la classe minoritaire.
  • Sous-échantillonnage aléatoire : Supprimer aléatoirement des exemples dans la classe majoritaire.

Le suréchantillonnage aléatoire consiste à sélectionner aléatoirement des exemples dans la classe minoritaire, avec remplacement, et à les ajouter à l’ensemble de données d’entraînement. Le sous-échantillonnage aléatoire implique de sélectionner aléatoirement des exemples de la classe majoritaire et de les supprimer de l’ensemble de données d’entraînement.

Dans le sous-échantillonnage aléatoire, les instances de la classe majoritaire sont écartées au hasard jusqu’à ce qu’une distribution plus équilibrée soit atteinte.

– Page 45, Apprentissage déséquilibré : Foundations, Algorithms, and Applications, 2013

Ces deux approches peuvent être répétées jusqu’à ce que la distribution de classe souhaitée soit atteinte dans l’ensemble de données d’entraînement, comme une répartition égale entre les classes.

Elles sont appelées méthodes de « rééchantillonnage naïf » car elles ne supposent rien sur les données et aucune heuristique n’est utilisée. Cela les rend simples à mettre en œuvre et rapides à exécuter, ce qui est souhaitable pour les ensembles de données très grands et complexes.

Ces deux techniques peuvent être utilisées pour les problèmes de classification à deux classes (binaires) et les problèmes de classification multi-classes avec une ou plusieurs classes majoritaires ou minoritaires.

Important, la modification de la distribution des classes n’est appliquée qu’à l’ensemble de données d’entraînement. L’intention est d’influencer l’ajustement des modèles. Le rééchantillonnage n’est pas appliqué à l’ensemble de données de test ou de maintien utilisé pour évaluer la performance d’un modèle.

Généralement, ces méthodes naïves peuvent être efficaces, bien que cela dépende des spécificités de l’ensemble de données et des modèles impliqués.

Regardons de plus près chaque méthode et comment les utiliser en pratique.

Bibliothèque imbalanced-Learn

Dans ces exemples, nous utiliserons les implémentations fournies par la bibliothèque Python imbalanced-learn, qui peut être installée via pip comme suit :

1
sudo pip install imbalanced-learn

Vous pouvez confirmer que l’installation a réussi en imprimant la version de la bibliothèque installée :

1
2
3

# vérifier le numéro de version
import imblearn
print(imblearn.__version__)

L’exécution de l’exemple imprimera le numéro de version de la bibliothèque installée ; par exemple :

1
0.5.0

Vous voulez vous lancer dans la classification des déséquilibres ?

Prenez dès maintenant mon cours intensif gratuit de 7 jours par courriel (avec un exemple de code).

Cliquez pour vous inscrire et obtenir également une version Ebook PDF gratuite du cours.

Téléchargez votre mini-cours GRATUIT

Suréchantillonnage aléatoire des ensembles de données déséquilibrés

Le suréchantillonnage aléatoire consiste à dupliquer aléatoirement des exemples de la classe minoritaire et à les ajouter à l’ensemble de données d’entraînement.

Les exemples de l’ensemble de données d’entraînement sont sélectionnés aléatoirement avec remplacement. Cela signifie que les exemples de la classe minoritaire peuvent être choisis et ajoutés au nouvel ensemble de données d’entraînement « plus équilibré » plusieurs fois ; ils sont sélectionnés dans l’ensemble de données d’entraînement original, ajoutés au nouvel ensemble de données d’entraînement, puis retournés ou « remplacés » dans l’ensemble de données original, ce qui permet de les sélectionner à nouveau.

Cette technique peut être efficace pour les algorithmes d’apprentissage automatique qui sont affectés par une distribution asymétrique et où de multiples exemples dupliqués pour une classe donnée peuvent influencer l’ajustement du modèle. Il peut s’agir d’algorithmes qui apprennent itérativement des coefficients, comme les réseaux de neurones artificiels qui utilisent la descente de gradient stochastique. Cela peut également affecter les modèles qui recherchent de bonnes divisions des données, comme les machines à vecteurs de support et les arbres de décision.

Il peut être utile d’ajuster la distribution de la classe cible. Dans certains cas, la recherche d’une distribution équilibrée pour un ensemble de données fortement déséquilibré peut amener les algorithmes affectés à suradapter la classe minoritaire, ce qui entraîne une augmentation de l’erreur de généralisation. L’effet peut être une meilleure performance sur l’ensemble de données de formation, mais une moins bonne performance sur l’ensemble de données de maintien ou de test.

… le suréchantillonnage aléatoire peut augmenter la probabilité d’occurrence du surajustement, car il fait des copies exactes des exemples de la classe minoritaire. De cette façon, un classificateur symbolique, par exemple, pourrait construire des règles qui sont apparemment précises, mais qui couvrent en fait un seul exemple répliqué.

– Page 83, Learning from Imbalanced Data Sets, 2018.

En tant que tel, pour avoir un aperçu de l’impact de la méthode, il est bon de surveiller les performances sur les ensembles de données de formation et de test après le suréchantillonnage et de comparer les résultats au même algorithme sur l’ensemble de données original.

L’augmentation du nombre d’exemples pour la classe minoritaire, surtout si le skew de la classe était sévère, peut également entraîner une augmentation marquée du coût de calcul lors de l’ajustement du modèle, surtout si l’on considère que le modèle voit les mêmes exemples dans l’ensemble de données d’entraînement encore et encore.

… dans le suréchantillonnage aléatoire, un ensemble aléatoire de copies d’exemples de la classe minoritaire est ajouté aux données. Cela peut augmenter la probabilité d’un surajustement, spécialement pour des taux de suréchantillonnage plus élevés. En outre, il peut diminuer la performance du classificateur et augmenter l’effort de calcul.

– Une enquête sur la modélisation prédictive sous des distributions déséquilibrées, 2015.

Le suréchantillonnage aléatoire peut être mis en œuvre en utilisant la classe RandomOverSampler.

La classe peut être définie et prend un argument sampling_strategy qui peut être défini à « minority » pour équilibrer automatiquement la classe minoritaire avec la ou les classes majoritaires.

Par exemple :

1
2
3

# définir la stratégie de suréchantillonnage
oversample = RandomOverSampler(sampling_strategy=’minority’)

Cela signifie que si la classe majoritaire avait 1 000 exemples et la classe minoritaire 100, cette stratégie suréchantillonnerait la classe minoritaire pour qu’elle ait 1 000 exemples.

Une valeur à virgule flottante peut être spécifiée pour indiquer le ratio des exemples de la classe majoritaire de la minorité dans l’ensemble de données transformé. Par exemple:

1
2
3

# définir la stratégie de suréchantillonnage
oversample = RandomOverSampler(sampling_strategy=0.5)

Ceci garantirait que la classe minoritaire soit suréchantillonnée pour avoir la moitié du nombre d’exemples que la classe majoritaire, pour les problèmes de classification binaire. Cela signifie que si la classe majoritaire avait 1 000 exemples et la classe minoritaire 100, l’ensemble de données transformé aurait 500 exemples de la classe minoritaire.

La classe est comme un objet de transformation scikit-learn en ce sens qu’elle est ajustée sur un ensemble de données, puis utilisée pour générer un nouvel ensemble de données ou un ensemble de données transformé. Contrairement aux transformées scikit-learn, elle changera le nombre d’exemples dans le jeu de données, pas seulement les valeurs (comme un scaler) ou le nombre de caractéristiques (comme une projection).

Par exemple, elle peut être ajustée et appliquée en une seule étape en appelant la fonction fit_sample():

1
2
3

# ajustement et application de la transformation
X_over, y_over = oversample.fit_resample(X, y)

Nous pouvons démontrer ceci sur un simple problème synthétique de classification binaire avec un déséquilibre de classe de 1:100.

1
2
3

# définir l’ensemble de données
X, y = make_classification(n_samples=10000, weights=, flip_y=0)

L’exemple complet de définition de l’ensemble de données et de réalisation d’un suréchantillonnage aléatoire pour équilibrer la distribution des classes est repris ci-dessous.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# exemple de suréchantillonnage aléatoire pour équilibrer la distribution des classes
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import RandomOverSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# summarize class distribution
print(Counter(y))
# définir la stratégie de sur-échantillonnage
oversample = RandomOverSampler(sampling_strategy=’minority’)
# ajuster et appliquer la transformée
X_over, y_over = oversample.fit_resample(X, y)
# résumer la distribution de classe
print(Counter(y_over))

L’exécution de l’exemple crée d’abord le jeu de données, puis résume la distribution des classes. Nous pouvons voir qu’il y a près de 10K exemples dans la classe majoritaire et 100 exemples dans la classe minoritaire.

Puis la transformation de suréchantillon aléatoire est définie pour équilibrer la classe minoritaire, puis ajustée et appliquée au jeu de données. La distribution des classes pour le jeu de données transformé est rapportée montrant que maintenant la classe minoritaire a le même nombre d’exemples que la classe majoritaire.

1
2

Compteur({0 : 9900, 1 : 100})
Compteur({0 : 9900, 1 : 9900})

Cette transformation peut être utilisée dans le cadre d’un Pipeline pour s’assurer qu’elle n’est appliquée au jeu de données d’entraînement que dans le cadre de chaque fractionnement dans une validation croisée k-fold.

Un Pipeline traditionnel de scikit-learn ne peut pas être utilisé ; à la place, un Pipeline de la bibliothèque imbalanced-learn peut être utilisé. Par exemple :

1
2
3
4

# pipeline
étapes =
pipeline = Pipeline(étapes=étapes)

L’exemple ci-dessous fournit un exemple complet d’évaluation d’un arbre de décision sur un ensemble de données déséquilibré avec une distribution de classes 1:100.

Le modèle est évalué à l’aide d’une validation croisée 10 fois répétée à trois reprises, et le suréchantillonnage est effectué sur l’ensemble de données d’entraînement dans chaque pli séparément, en s’assurant qu’il n’y a pas de fuite de données comme cela pourrait se produire si le suréchantillonnage était effectué avant la validation croisée.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# exemple d’évaluation d’un arbre de décision avec suréchantillonnage aléatoire
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.tree import DecisionTreeClassifier
from imblearn.pipeline import Pipeline
from imblearn.over_sampling import RandomOverSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# définir pipeline
steps =
pipeline = Pipeline(steps=steps)
# évaluer pipeline
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
score = mean(scores)
print(‘F1 Score : %.3f’ % score)

L’exécution de l’exemple évalue le modèle d’arbre de décision sur le jeu de données déséquilibré avec suréchantillonnage.

Le modèle et la configuration de rééchantillonnage choisis sont arbitraires, conçus pour fournir un modèle que vous pouvez utiliser pour tester le sous-échantillonnage avec votre jeu de données et votre algorithme d’apprentissage, plutôt que de résoudre de manière optimale le jeu de données synthétique.

Note : Vos résultats peuvent varier compte tenu de la nature stochastique de l’algorithme ou de la procédure d’évaluation, ou des différences de précision numérique. Pensez à exécuter l’exemple plusieurs fois et comparez le résultat moyen.

La stratégie de suréchantillonnage par défaut est utilisée, ce qui équilibre les classes minoritaires avec la classe majoritaire. Le score F1 moyenné sur chaque pli et chaque répétition est rapporté.

1
Score F1 : 0.990

Maintenant que nous sommes familiers avec le suréchantillonnage, regardons le sous-échantillonnage.

Sous-échantillonnage aléatoire des ensembles de données déséquilibrés

Le sous-échantillonnage aléatoire consiste à sélectionner au hasard des exemples de la classe majoritaire à supprimer de l’ensemble de données d’entraînement.

Cela a pour effet de réduire le nombre d’exemples de la classe majoritaire dans la version transformée de l’ensemble de données d’entraînement. Ce processus peut être répété jusqu’à ce que la distribution de classe souhaitée soit atteinte, comme un nombre égal d’exemples pour chaque classe.

Cette approche peut être plus appropriée pour les ensembles de données où il y a un déséquilibre de classe bien qu’un nombre suffisant d’exemples dans la classe minoritaire, un tel modèle utile peut être ajusté.

Une limitation du sous-échantillonnage est que les exemples de la classe majoritaire sont supprimés qui peuvent être utiles, importants, ou peut-être critiques pour ajuster une frontière de décision robuste. Étant donné que les exemples sont supprimés de manière aléatoire, il n’y a aucun moyen de détecter ou de préserver les « bons » exemples ou les exemples plus riches en informations de la classe majoritaire.

… dans le sous-échantillonnage aléatoire (potentiellement), de vastes quantités de données sont écartées. Cela peut être très problématique, car la perte de ces données peut rendre la frontière de décision entre les instances minoritaires et majoritaires plus difficile à apprendre, ce qui entraîne une perte de performance de classification.

– Page 45, Imbalanced Learning : Foundations, Algorithms, and Applications, 2013

La technique de sous-échantillonnage aléatoire peut être mise en œuvre à l’aide de la classe RandomUnderSampler imbalanced-learn.

La classe peut être utilisée comme la classe RandomOverSampler de la section précédente, sauf que les stratégies impactent la classe majoritaire au lieu de la classe minoritaire. Par exemple, définir l’argument sampling_strategy à « majority » sous-échantillonnera la classe majoritaire déterminée par la classe avec le plus grand nombre d’exemples.

1
2
3

# définir la stratégie de sous-échantillonnage
undersample = RandomUnderSampler(sampling_strategy=’majority’)

Par exemple, un jeu de données avec 1 000 exemples dans la classe majoritaire et 100 exemples dans la classe minoritaire sera sous-échantillonné de telle sorte que les deux classes auraient 100 exemples dans le jeu de données d’entraînement transformé.

Nous pouvons également définir l’argument sampling_strategy à une valeur à virgule flottante qui sera un pourcentage relatif à la classe minoritaire, plus précisément le nombre d’exemples dans la classe minoritaire divisé par le nombre d’exemples dans la classe majoritaire. Par exemple, si nous définissons sampling_strategy à 0,5 dans un jeu de données déséquilibré avec 1 000 exemples dans la classe majoritaire et 100 exemples dans la classe minoritaire, alors il y aura 200 exemples pour la classe majoritaire dans le jeu de données transformé (ou 100/200 = 0.5).

1
2
3

# définir la stratégie de sous-échantillonnage
sous-échantillon = RandomUnderSampler(sampling_strategy=0.5)

Ceci pourrait être préféré pour s’assurer que le jeu de données résultant est à la fois assez grand pour ajuster un modèle raisonnable, et que pas trop d’informations utiles de la classe majoritaire ne soient écartées.

Dans le sous-échantillonnage aléatoire, on pourrait tenter de créer une distribution équilibrée des classes en sélectionnant au hasard 90 instances de la classe majoritaire à éliminer. Le jeu de données résultant sera alors composé de 20 instances : 10 instances de classe majoritaire (restées au hasard) et (l’original) 10 instances de classe minoritaire.

– Page 45, Imbalanced Learning : Foundations, Algorithms, and Applications, 2013

La transformation peut ensuite être ajustée et appliquée à un ensemble de données en une seule étape en appelant la fonction fit_resample() et en passant l’ensemble de données non transformé comme arguments.

1
2
3

# ajuster et appliquer la transformation
X_over, y_over = undersample.fit_resample(X, y)

Nous pouvons démontrer ceci sur un jeu de données avec un déséquilibre de classe 1:100.

L’exemple complet est listé ci-dessous.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# exemple de sous-échantillonnage aléatoire pour équilibrer la distribution des classes
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# summarize class distribution
print(Counter(y))
# définir la stratégie de sous-échantillonage
undersample = RandomUnderSampler(sampling_strategy=’majority’)
# ajuster et appliquer la transformée
X_over, y_over = undersample.fit_resample(X, y)
# résumer la distribution de classe
print(Counter(y_over))

L’exécution de l’exemple crée d’abord le jeu de données et rapporte la distribution déséquilibrée des classes.

La transformée est ajustée et appliquée sur le jeu de données et la nouvelle distribution des classes est rapportée. Nous pouvons voir que cette classe majoritaire est sous-échantillonnée pour avoir le même nombre d’exemples que la classe minoritaire.

Le jugement et les résultats empiriques devront être utilisés pour savoir si un jeu de données d’entraînement avec seulement 200 exemples serait suffisant pour entraîner un modèle.

1
2

Compteur({0 : 9900, 1 : 100})
Compteur({0 : 100, 1 : 100})

Cette transformation de sous-échantillonnage peut également être utilisée dans un Pipeline, comme la transformation de sur-échantillonnage de la section précédente.

Cela permet d’appliquer la transformation au jeu de données d’entraînement uniquement en utilisant des schémas d’évaluation tels que la validation croisée k-fold, évitant toute fuite de données dans l’évaluation d’un modèle.

1
2
3
4

# define pipeline
steps =
pipeline = Pipeline(steps=steps)

Nous pouvons définir un exemple d’ajustement d’un arbre de décision sur un ensemble de données de classification déséquilibré avec la transformation de sous-échantillonnage appliquée à l’ensemble de données d’entraînement sur chaque fraction d’une validation croisée 10 fois répétée.

L’exemple complet est repris ci-dessous.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# exemple d’évaluation d’un arbre de décision avec sous-échantillonnage aléatoire
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.tree import DecisionTreeClassifier
from imblearn.pipeline import Pipeline
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# définir pipeline
steps =
pipeline = Pipeline(steps=steps)
# évaluer pipeline
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
score = mean(scores)
print(‘F1 Score : %.3f’ % score)

L’exécution de l’exemple évalue le modèle d’arbre de décision sur le jeu de données déséquilibré avec sous-échantillonnage.

Le modèle et la configuration de rééchantillonnage choisis sont arbitraires, conçus pour fournir un modèle que vous pouvez utiliser pour tester le sous-échantillonnage avec votre jeu de données et votre algorithme d’apprentissage plutôt que de résoudre de manière optimale le jeu de données synthétique.

Note : Vos résultats peuvent varier compte tenu de la nature stochastique de l’algorithme ou de la procédure d’évaluation, ou des différences de précision numérique. Pensez à exécuter l’exemple plusieurs fois et comparez le résultat moyen.

La stratégie de sous-échantillonnage par défaut est utilisée, ce qui équilibre les classes majoritaires avec la classe minoritaire. Le score F1 moyenné sur chaque pli et chaque répétition est rapporté.

1
Score F1 : 0.889

Combinaison du suréchantillonnage et du sous-échantillonnage aléatoires

Des résultats intéressants peuvent être obtenus en combinant à la fois le suréchantillonnage et le sous-échantillonnage aléatoires.

Par exemple, une quantité modeste de suréchantillonnage peut être appliquée à la classe minoritaire pour améliorer le biais vers ces exemples, tout en appliquant également une quantité modeste de sous-échantillonnage à la classe majoritaire pour réduire le biais sur cette classe.

Cela peut permettre d’améliorer les performances globales par rapport à l’exécution de l’une ou l’autre des techniques de manière isolée.

Par exemple, si nous avions un ensemble de données avec une distribution de classes de 1:100, nous pourrions d’abord appliquer le suréchantillonnage pour augmenter le ratio à 1:10 en dupliquant les exemples de la classe minoritaire, puis appliquer le sous-échantillonnage pour améliorer encore le ratio à 1:2 en supprimant les exemples de la classe majoritaire.

Ceci pourrait être mis en œuvre à l’aide de imbalanced-learn en utilisant un RandomOverSampler avec une stratégie_d’échantillonnage fixée à 0,1 (10%), puis en utilisant un RandomUnderSampler avec une stratégie_d’échantillonnage fixée à 0,5 (50%). Par exemple :

1
2
3
4
5
6
7
8
9

# définir la stratégie de suréchantillonnage
over = RandomOverSampler(stratégie d’échantillonnage=0,1)
# ajuster et appliquer la transformée
X, y = over.fit_resample(X, y)
# définir la stratégie de sous-échantillonnage
under = RandomUnderSampler(stratégie d’échantillonnage=0.5)
# ajuster et appliquer la transformation
X, y = under.fit_resample(X, y)

Nous pouvons faire la démonstration sur un jeu de données synthétique avec une distribution de classe 1:100. L’exemple complet est repris ci-dessous :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# exemple de combinaison du sur-échantillonnage et du sous-échantillonnage aléatoires pour des données déséquilibrées
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# summarize class distribution
print(Counter(y))
# définir la stratégie de suréchantillonnage
over = RandomOverSampler(sampling_strategy=0.1)
# ajuster et appliquer la transformée
X, y = over.fit_resample(X, y)
# résumer la distribution de la classe
print(Counter(y)).
# définir la stratégie de sous-échantillonnage
under = RandomUnderSampler(sampling_strategy=0.5)
# ajuster et appliquer la transformée
X, y = under.fit_resample(X, y)
# résumer la distribution de classe
print(Counter(y))

L’exécution de l’exemple crée d’abord l’ensemble de données synthétiques et résume la distribution de classe, montrant une distribution de classe approximative de 1:100.

Puis le suréchantillonnage est appliqué, augmentant la distribution d’environ 1:100 à environ 1:10. Enfin, un sous-échantillonnage est appliqué, améliorant encore la distribution des classes de 1:10 à environ 1:2

1
2
3

Compteur({0 : 9900, 1 : 100})
Counter({0 : 9900, 1 : 990})
Counter({0 : 1980, 1 : 990})

Nous pourrions également vouloir appliquer cette même approche hybride lors de l’évaluation d’un modèle en utilisant la validation croisée k-fold.

Cela peut être réalisé en utilisant un Pipeline avec une séquence de transformations et se terminant par le modèle qui est évalué ; par exemple :

1
2
3
4
5
6

# define pipeline
over = RandomOverSampler(sampling_strategy=0.1)
under = RandomUnderSampler(sampling_strategy=0.5)
steps =
pipeline = Pipeline(steps=steps)

Nous pouvons le démontrer avec un modèle d’arbre de décision sur le même ensemble de données synthétiques.

L’exemple complet est repris ci-dessous.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# exemple d’évaluation d’un modèle avec sur- et sous-échantillonnage aléatoire
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.tree import DecisionTreeClassifier
from imblearn.pipeline import Pipeline
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# define pipeline
over = RandomOverSampler(sampling_strategy=0.1)
under = RandomUnderSampler(sampling_strategy=0.5)
steps =
pipeline = Pipeline(steps=steps)
# evaluate pipeline
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
score = mean(scores)
print(‘F1 Score : %.3f’ % score)

L’exécution de l’exemple évalue un modèle d’arbre de décision à l’aide d’une validation croisée k-fold répétée où l’ensemble de données d’entraînement est transformé, d’abord en utilisant le suréchantillonnage, puis le sous-échantillonnage, pour chaque fractionnement et répétition effectués. Le score F1 moyenné sur chaque pli et chaque répétition est rapporté.

Note : Vos résultats peuvent varier compte tenu de la nature stochastique de l’algorithme ou de la procédure d’évaluation, ou des différences de précision numérique. Envisagez d’exécuter l’exemple plusieurs fois et comparez le résultat moyen.

Le modèle et la configuration de rééchantillonnage choisis sont arbitraires, conçus pour fournir un modèle que vous pouvez utiliser pour tester le sous-échantillonnage avec votre ensemble de données et votre algorithme d’apprentissage plutôt que de résoudre de manière optimale l’ensemble de données synthétique.

1
F1 Score : 0.985

Lectures complémentaires

Cette section fournit plus de ressources sur le sujet si vous cherchez à approfondir.

Livres

  • Chapitre 5 Méthodes de prétraitement au niveau des données, Apprentissage à partir d’ensembles de données déséquilibrés, 2018.
  • Chapitre 3 Ensembles de données déséquilibrés : De l’échantillonnage aux classificateurs, Apprentissage déséquilibré : Foundations, Algorithms, and Applications, 2013.

Papers

  • A Study Of The Behavior Of Several Methods For Balancing Machine Learning Training Data, 2004.
  • A Survey of Predictive Modelling under Imbalanced Distributions, 2015.

API

  • Documentation sur l’apprentissage déséquilibré.
  • imblearn.over_sampling.RandomOverSampler API.
  • imblearn.pipeline.Pipeline API.
  • imblearn.under_sampling.RandomUnderSampler API.

Articles

  • Suréchantillonnage et sous-échantillonnage en analyse de données, Wikipédia.

Sommaire

Dans ce tutoriel, vous avez découvert le suréchantillonnage et le sous-échantillonnage aléatoires pour la classification déséquilibrée

Spécifiquement, vous avez appris :

  • Le rééchantillonnage aléatoire fournit une technique naïve pour rééquilibrer la distribution des classes pour un ensemble de données déséquilibré.
  • Le suréchantillonnage aléatoire duplique les exemples de la classe minoritaire dans le jeu de données d’entraînement et peut entraîner un surajustement pour certains modèles.
  • Le sous-échantillonnage aléatoire supprime des exemples de la classe majoritaire et peut entraîner la perte d’informations précieuses pour un modèle.

Avez-vous des questions ?
Posez vos questions dans les commentaires ci-dessous et je ferai de mon mieux pour y répondre.

Maîtrisez la classification déséquilibrée !

Classification déséquilibrée avec Python

Développez des modèles d’apprentissage déséquilibrés en quelques minutes

….avec seulement quelques lignes de code python

Découvrez comment dans mon nouvel Ebook :
Classification déséquilibrée avec Python

Il fournit des tutoriels d’auto-apprentissage et des projets de bout en bout sur :
Les métriques de performance, les méthodes de sous-échantillonnage, SMOTE, le déplacement des seuils, le calibrage des probabilités, les algorithmes sensibles aux coûts
et bien plus encore…

Mettre les méthodes de classification déséquilibrées au service de vos projets d’apprentissage automatique

Voir ce qu’il y a dedans

Tweet Partager Partager

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.