Sur-échantillonnage (Oversampling) des classes minoritaires avec RandomOverSampler de imblearn

Le sur-échantillonnage (oversampling) des classes minoritaires avec RandomOverSampler de la bibliothèque imblearn est une technique permettant de rééquilibrer un dataset en augmentant le nombre d’exemples dans la classe minoritaire. Cette méthode consiste à générer de nouvelles instances synthétiques de la classe minoritaire, généralement en répliquant aléatoirement les exemples existants.

Fonctions :

  • RandomOverSampler()

    Le RandomOverSampler est utilisé pour effectuer un sur-échantillonnage des classes minoritaires dans un jeu de données déséquilibré. L'objectif est d'augmenter le nombre d'exemples dans la classe minoritaire en répliquant certains exemples existants, ce qui aide à équilibrer la distribution des classes et à améliorer la performance du modèle, notamment pour la classe minoritaire.

    Importation :

    from imblearn.over_sampling import RandomOverSampler

    Attributs :

    Paramètre Description
    sampling_strategy Stratégie de sur-échantillonnage. Peut être 'auto' pour équilibrer les classes, ou un nombre pour spécifier un ratio.
    random_state Contrôle la reproductibilité de l'échantillonnage aléatoire. Par défaut, None.
    replacement Détermine si le sur-échantillonnage est effectué avec ou sans remplacement. Par défaut, False.

    Exemple de code :

    from collections import Counter
    from imblearn.over_sampling import RandomOverSampler
    import numpy as np
    
    # Jeu de données déséquilibré : X contient des exemples, y leurs étiquettes/classes
    X = np.array([[1], [2], [3], [4], [5], [6]])
    y = np.array([0, 0, 0, 1, 1, 1])  # classes équilibrées pour l'exemple, modifions pour déséquilibre
    
    # Créons un déséquilibre volontaire
    y = np.array([0, 0, 0, 0, 1, 1])  # Classe 0 a 4 exemples, classe 1 a 2 exemples
    
    print(f"Répartition avant sur-échantillonnage : {Counter(y)}")
    
    # Initialisation du RandomOverSampler
    ros = RandomOverSampler(random_state=42)
    
    # Application du sur-échantillonnage
    X_resampled, y_resampled = ros.fit_resample(X, y)
    
    print(f"Répartition après sur-échantillonnage : {Counter(y_resampled)}")
    print(f"Données sur-échantillonnées : \n{X_resampled}")
    print(f"Labels sur-échantillonnés : \n{y_resampled}")
    Résultat du code

    Explication du code :

    • Importation des modules : Le code commence par importer Counter de collections pour compter les occurrences, RandomOverSampler de imblearn.over_sampling pour effectuer le sur-échantillonnage, et numpy sous l’alias np pour manipuler les tableaux de données.
    • Création du jeu de données : X est un tableau NumPy contenant des exemples avec une seule caractéristique, et y est un tableau d’étiquettes correspondant à ces exemples. Ici, y contient un déséquilibre volontaire avec 4 exemples de la classe 0 et 2 exemples de la classe 1.
    • Affichage de la répartition initiale : Counter(y) compte combien d’exemples il y a dans chaque classe avant le sur-échantillonnage. Le résultat est affiché pour montrer ce déséquilibre.
    • Initialisation du RandomOverSampler : On crée une instance de RandomOverSampler avec un random_state fixé pour assurer la reproductibilité des résultats.
    • Application du sur-échantillonnage : La méthode fit_resample() est appelée sur l’objet ros, prenant en entrée X et y. Cette méthode génère un nouveau jeu de données X_resampled et y_resampled où la classe minoritaire est augmentée par duplication aléatoire d’exemples.
    • Affichage du résultat : On utilise de nouveau Counter pour montrer la nouvelle répartition équilibrée des classes, puis on affiche les données et labels sur-échantillonnés pour visualiser les modifications.