SVM pour les classes déséquilibrées

Machine LearningMachine LearningBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous allons apprendre à utiliser les Machines à Vecteurs de Support (SVM) pour des classes déséquilibrées. Nous allons d'abord trouver le plan de séparation avec une SVM simple puis tracer (en traits discontinus) l'hyperplan de séparation avec correction automatique pour les classes déséquilibrées. Nous utiliserons la fonction make_blobs pour créer deux grappes de points aléatoires.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session et nous réglerons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/inspection -.-> lab-49283{{"SVM pour les classes déséquilibrées"}} sklearn/datasets -.-> lab-49283{{"SVM pour les classes déséquilibrées"}} ml/sklearn -.-> lab-49283{{"SVM pour les classes déséquilibrées"}} end

Importation des bibliothèques

Nous allons commencer par importer les bibliothèques nécessaires pour le laboratoire : matplotlib.pyplot, svm, make_blobs et DecisionBoundaryDisplay.

import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
from sklearn.inspection import DecisionBoundaryDisplay

Création des données

Nous allons créer deux grappes de points aléatoires à l'aide de la fonction make_blobs. Nous allons créer une grappe avec 1000 points et une autre avec 100 points. Les centres des grappes seront respectivement [0.0, 0.0] et [2.0, 2.0]. Le paramètre clusters_std contrôle l'écart-type des grappes.

n_samples_1 = 1000
n_samples_2 = 100
centers = [[0.0, 0.0], [2.0, 2.0]]
clusters_std = [1.5, 0.5]
X, y = make_blobs(
    n_samples=[n_samples_1, n_samples_2],
    centers=centers,
    cluster_std=clusters_std,
    random_state=0,
    shuffle=False,
)

Ajuster le modèle

Nous allons ajuster le modèle et obtenir l'hyperplan de séparation à l'aide de la fonction SVC de la bibliothèque svm. Nous utiliserons un noyau linéaire et définirons C sur 1,0.

clf = svm.SVC(kernel="linear", C=1.0)
clf.fit(X, y)

Ajuster le modèle avec des classes pondérées

Nous allons ajuster le modèle et obtenir l'hyperplan de séparation à l'aide de la fonction SVC de la bibliothèque svm. Nous utiliserons un noyau linéaire et définirons class_weight sur {1: 10}. Cela donnera plus de poids à la classe la plus petite.

wclf = svm.SVC(kernel="linear", class_weight={1: 10})
wclf.fit(X, y)

Tracer les échantillons

Nous allons tracer les échantillons à l'aide de la fonction scatter de matplotlib.pyplot.

plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors="k")

Tracer les fonctions de décision pour les deux classifieurs

Nous allons tracer les fonctions de décision pour les deux classifieurs à l'aide de la fonction DecisionBoundaryDisplay de la bibliothèque sklearn.inspection. Nous définirons plot_method sur "contour", colors sur "k" pour le SVM non pondéré et "r" pour le SVM pondéré, levels sur [0], alpha sur 0.5 et linestyles sur ["-"]. Nous définirons également ax sur plt.gca().

ax = plt.gca()
disp = DecisionBoundaryDisplay.from_estimator(
    clf,
    X,
    plot_method="contour",
    colors="k",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

wdisp = DecisionBoundaryDisplay.from_estimator(
    wclf,
    X,
    plot_method="contour",
    colors="r",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

Ajouter une légende

Nous allons ajouter une légende au tracé à l'aide de la fonction legend de matplotlib.pyplot. Nous définirons les étiquettes sur "non pondéré" et "pondéré" respectivement.

plt.legend(
    [disp.surface_.collections[0], wdisp.surface_.collections[0]],
    ["non weighted", "weighted"],
    loc="upper right",
)

Afficher le tracé

Enfin, nous allons afficher le tracé à l'aide de la fonction show de matplotlib.pyplot.

plt.show()

Sommaire

Dans ce laboratoire, nous avons appris à utiliser les Machines à Vecteurs de Support (SVM) pour des classes déséquilibrées. Nous avons utilisé la fonction make_blobs pour créer deux grappes de points aléatoires et créé deux modèles SVM, l'un avec un SVM classique et l'autre avec une correction automatique pour les classes déséquilibrées. Nous avons tracé les échantillons et les fonctions de décision pour les deux classifieurs et ajouté une légende au tracé.