SVM à une classe pour la détection de nouveautés

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

Ce laboratoire vous guidera à travers un exemple d'utilisation de la SVM à une classe pour la détection de nouveautés. La SVM à une classe est un algorithme non supervisé qui apprend une fonction de décision pour la détection de nouveautés : la classification de nouvelles données comme similaires ou différentes de l'ensemble d'entraînement.

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 la pratique.

Parfois, vous devrez 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 votre feedback après la session, et nous résoudrons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49233{{"SVM à une classe pour la détection de nouveautés"}} end

Importez les bibliothèques nécessaires et générez des données

La première étape consiste à importer les bibliothèques nécessaires et à générer des données. Nous utiliserons numpy et matplotlib pour générer et visualiser les données, et scikit-learn pour construire le modèle de SVM à une classe.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm

## Générez les données d'entraînement
X = 0.3 * np.random.randn(100, 2)
X_train = np.r_[X + 2, X - 2]

## Générez quelques observations nouvelles régulières
X = 0.3 * np.random.randn(20, 2)
X_test = np.r_[X + 2, X - 2]

## Générez quelques observations nouvelles anormales
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))

Ajustez le modèle de SVM à une classe

Ensuite, nous allons ajuster le modèle de SVM à une classe sur les données générées.

## Ajustez le modèle
clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)
clf.fit(X_train)

## Prédisez les étiquettes pour les données d'entraînement, les observations nouvelles régulières et les observations nouvelles anormales
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

Calculez le nombre d'erreurs

Nous allons calculer le nombre d'erreurs commises par le modèle sur les données d'entraînement, les observations nouvelles régulières et les observations nouvelles anormales.

## Comptez le nombre d'erreurs
n_error_train = y_pred_train[y_pred_train == -1].size
n_error_test = y_pred_test[y_pred_test == -1].size
n_error_outliers = y_pred_outliers[y_pred_outliers == 1].size

Visualisez les résultats

Enfin, nous allons visualiser les résultats du modèle de SVM à une classe. Nous allons tracer la frontière de décision, les données d'entraînement, les observations nouvelles régulières et les observations nouvelles anormales.

## Visualisez les résultats
xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.title("Détection de nouveautés")
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), 0, 7), cmap=plt.cm.PuBu)
a = plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors="darkred")
plt.contourf(xx, yy, Z, levels=[0, Z.max()], colors="palevioletred")

s = 40
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c="white", s=s, edgecolors="k")
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c="blueviolet", s=s, edgecolors="k")
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c="gold", s=s, edgecolors="k")
plt.axis("tight")
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend(
    [a.collections[0], b1, b2, c],
    [
        "frontière apprise",
        "observations d'entraînement",
        "nouvelles observations régulières",
        "nouvelles observations anormales"
    ],
    loc="upper left",
    prop=matplotlib.font_manager.FontProperties(size=11)
)
plt.xlabel(
    "erreur entraînement : %d/200 ; erreurs nouvelles régulières : %d/40 ; erreurs nouvelles anormales : %d/40"
    % (n_error_train, n_error_test, n_error_outliers)
)
plt.show()

Sommaire

Dans ce laboratoire, nous avons appris à utiliser le SVM à une classe pour la détection de nouveautés. Nous avons généré des données, ajusté le modèle de SVM à une classe, calculé le nombre d'erreurs et visualisé les résultats. Le SVM à une classe est un algorithme utile pour détecter les anomalies dans les données et peut être appliqué à une large variété d'applications.