Sur-échantillonnage avec SMOTE

Le sur-échantillonnage avec SMOTE (Synthetic Minority Over-sampling Technique) génère des exemples synthétiques en interpolant entre les instances de la classe minoritaire, au lieu de simplement dupliquer les données. Cela permet de mieux équilibrer les classes et d’améliorer la performance des modèles de machine learning sur des ensembles de données déséquilibrés.

Fonctions :

  • SMOTE (Synthetic Minority Over-sampling Technique)

    SMOTE (Synthetic Minority Over-sampling Technique) est une méthode avancée de sur-échantillonnage des classes minoritaires. Contrairement à RandomOverSampler, qui duplique simplement les exemples existants, SMOTE génère de nouvelles instances synthétiques en créant des points de données intermédiaires entre les exemples minoritaires existants. Cette technique est particulièrement utile pour éviter l'overfitting et générer des données plus représentatives pour les classes minoritaires.

    Importation :

    from imblearn.over_sampling import SMOTE

    Attributs :

    Paramètre Type Description Valeur par défaut
    sampling_strategy str, int ou dict Stratégie de sur-échantillonnage. Peut être 'auto' pour équilibrer les classes ou un nombre pour spécifier un ratio. auto
    random_state int, optionnel Contrôle la reproductibilité de l'échantillonnage aléatoire. None
    k_neighbors int Le nombre de voisins pour la génération des nouveaux échantillons. 5
    n_jobs int, optionnel Le nombre de jobs parallèles à utiliser pour l'échantillonnage. None

    Exemple de code :

    from collections import Counter
    from imblearn.over_sampling import SMOTE
    from sklearn.datasets import make_classification
    
    # Création d'un jeu de données déséquilibré
    X, y = make_classification(n_classes=2, class_sep=2,
                               weights=[0.1, 0.9], n_samples=1000, random_state=42)
    
    print("Répartition avant SMOTE :", Counter(y))
    
    # Application de SMOTE pour équilibrer les classes
    smote = SMOTE(random_state=42)
    X_res, y_res = smote.fit_resample(X, y)
    
    print("Répartition après SMOTE :", Counter(y_res))
    Résultat du code

    Explication du code :

    • Import des bibliothèques : Le code importe SMOTE depuis imblearn.over_sampling pour l’oversampling, make_classification de sklearn.datasets pour générer un jeu de données synthétique, et Counter de collections pour compter la répartition des classes.
    • Création d’un jeu de données déséquilibré : La fonction make_classification() génère un jeu de données avec 2 classes, dont la classe minoritaire représente 10% des exemples (paramètre weights=[0.1, 0.9]). Les données sont stockées dans X (caractéristiques) et y (labels).
    • Affichage de la répartition initiale : Counter(y) affiche le nombre d’exemples dans chaque classe avant application de SMOTE.
    • Application de SMOTE : Une instance de SMOTE est créée avec un random_state pour garantir la reproductibilité. La méthode fit_resample() génère des exemples synthétiques de la classe minoritaire, équilibrant ainsi le jeu de données.
    • Affichage de la nouvelle répartition : Counter(y_res) affiche la répartition des classes après application de SMOTE, montrant que les classes sont désormais équilibrées.