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