Sous-échantillonnage avec NearMiss

Le sous-échantillonnage avec NearMiss est une technique qui consiste à réduire le nombre d’exemples de la classe majoritaire en sélectionnant les instances les plus proches des exemples de la classe minoritaire. Cela permet d’équilibrer les classes tout en conservant les exemples les plus informatifs de la classe majoritaire pour l’apprentissage du modèle.

Fonctions :

  • NearMiss()

    NearMiss est une technique de sous-échantillonnage utilisée pour équilibrer les classes en réduisant la taille de la classe majoritaire. Contrairement à un sous-échantillonnage aléatoire, NearMiss sélectionne les échantillons de la classe majoritaire en fonction de leur proximité avec les échantillons de la classe minoritaire. Il existe plusieurs versions de NearMiss qui diffèrent dans la manière dont les échantillons sont sélectionnés : Version 1 : Choisit les échantillons de la classe majoritaire les plus proches des échantillons de la classe minoritaire (en termes de distance). Version 2 : Choisit les échantillons de la classe majoritaire qui ont le plus petit nombre de voisins parmi les échantillons de la classe minoritaire. Version 3 : Une combinaison des deux premières versions.

    Importation :

    from imblearn.under_sampling import NearMiss

    Attributs :

    Paramètre Description
    sampling_strategy Stratégie de sous-échantillonnage. 'auto' pour réduire la classe majoritaire à la taille de la classe minoritaire.
    version Version de l'algorithme NearMiss à utiliser : 1, 2, ou 3. Par défaut, 1.
    n_neighbors Nombre de voisins à utiliser pour la recherche de proximité. Par défaut, 3.
    random_state Contrôle la reproductibilité de l'échantillonnage. Par défaut, None.

    Exemple de code :

    from imblearn.under_sampling import NearMiss
    from sklearn.datasets import make_classification
    from collections import Counter
    
    # Création d'un jeu de données déséquilibré
    X, y = make_classification(n_classes=2, class_sep=2, 
                               weights=[0.9, 0.1], n_informative=3, 
                               n_redundant=1, flip_y=0, 
                               n_features=5, n_clusters_per_class=1, 
                               n_samples=200, random_state=42)
    
    print(f"Répartition avant NearMiss : {Counter(y)}")
    
    # Application de NearMiss (undersampling)
    nm = NearMiss(version=1)
    X_res, y_res = nm.fit_resample(X, y)
    
    print(f"Répartition après NearMiss : {Counter(y_res)}")
    Résultat du code

    Explication du code :

    • Import des modules : Le code importe NearMiss pour l’undersampling depuis imblearn.under_sampling, make_classification pour générer un jeu de données synthétique, et Counter pour compter la répartition des classes.
    • Création d’un jeu de données déséquilibré : make_classification() génère un dataset avec deux classes dont la classe minoritaire ne représente que 10 % des exemples (weights=[0.9, 0.1]).
    • Affichage de la répartition initiale : Counter(y) montre le nombre d’exemples dans chaque classe avant le sous-échantillonnage.
    • Application de NearMiss : Une instance de NearMiss est créée (ici version=1). La méthode fit_resample() réduit la classe majoritaire en sélectionnant les exemples les plus proches de la classe minoritaire, équilibrant ainsi le dataset.
    • Affichage de la nouvelle répartition : Counter(y_res) affiche la répartition des classes après le sous-échantillonnage, montrant que les classes sont désormais équilibrées.