--Détection des dépassements à l'aide d'une classe SVM --Utilisez des échantillons de données (distribution normale, distribution normale mixte) générés à l'aide de nombres aléatoires
En outre, l'estimateur de covariance robuste (méthode de détection des valeurs aberrantes utilisant la distance de Maharanobis, en supposant que les données normales suivent une distribution normale) est également présenté sur la page du guide de l'utilisateur ci-dessus, mais cette fois, il est omis.
One-Class SVM Méthode de détection des valeurs aberrantes utilisant SVM. Mappés à l'espace d'entités à l'aide du noyau, les points isolés sur l'espace d'origine sont distribués près de l'origine dans l'espace d'entités. Le noyau est le rbf par défaut, et essayez de changer nu (plage de 0 à 1, def. = 0,5) qui détermine le rapport des données anormales. Page d'objet Scikit-learn One Class SVM
Préparez trois types d'ensembles de données dans lesquels les données normales sont représentées par une distribution normale mixte. La plus à gauche est une distribution normale unique, et les deux sur la droite sont une superposition de quatre distributions normales. Les données anormales ont été uniformément distribuées.
Contrairement à la distance de Maharanobis, il existe une frontière discriminante pour chaque masse de distribution qui est séparée dans l'espace d'origine. Plus le nu est petit, plus chaque élément de données est sensible et complexe, et la valeur par défaut de 0,5 est très simple.
Reportez-vous au guide de l'utilisateur.
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib.font_manager
from scipy import stats
from sklearn import svm
from sklearn.covariance import EllipticEnvelope
# Example settings
n_samples = 400 #Nombre d'échantillons
outliers_fraction = 0.05 #Pourcentage de données anormales dans le nombre total d'échantillons
clusters_separation = [0, 1, 2]
#Génération de données de grille pour le dessin 2D
xx, yy = np.meshgrid(np.linspace(-7, 7, 500), np.linspace(-7, 7, 500))
#Génération de données normales et de données anormales
n_inliers = int((1. - outliers_fraction) * n_samples) #Nombre d'échantillons de données normales
n_outliers = int(outliers_fraction * n_samples) #Nombre d'échantillons de données anormales
ground_truth = np.ones(n_samples, dtype=int) #Données d'étiquette
ground_truth[-n_outliers:] = 0
# Fit the problem with varying cluster separation
# [fonction énumérer](http://python.civic-apps.com/zip-enumerate/)Boucles avec l'index
for i, offset in enumerate(clusters_separation):
np.random.seed(42)
#Génération normale de données
X1 = 0.3 * np.random.randn(0.25 * n_inliers, 2) - offset #Distribution normale N(μ= -offset, σ=0.3)
X2 = 0.3 * np.random.randn(0.25 * n_inliers, 2) + offset #Distribution normale N(μ= +offset, σ=0.3)
X3 = np.c_[
0.3 * np.random.randn(0.25 * n_inliers, 1) - 3*offset, #Distribution normale N(μ= -3*offset, σ=0.3)
0.3 * np.random.randn(0.25 * n_inliers, 1) + 3*offset #Distribution normale N(μ= +3*offset, σ=0.3)
]
X4 = np.c_[
0.3 * np.random.randn(0.25 * n_inliers, 1) + 3*offset, #Distribution normale N(μ= +3*offset, σ=0.3)
0.3 * np.random.randn(0.25 * n_inliers, 1) - 3*offset #Distribution normale N(μ= -3*offset, σ=0.3)
]
X = np.r_[X1, X2, X3, X4] #Rejoindre en ligne
#Génération de données aberrantes
X = np.r_[X, np.random.uniform(low=-6, high=6, size=(n_outliers, 2))] #Distribution uniforme-6 <= X <= +6
# Fit the model with the One-Class SVM
plt.figure(figsize=(10, 12))
#Outil de détection des valeurs aberrantes, SVM 1 classe et estimateur de covariance robuste
# classifiers = {
# "One-Class SVM": svm.OneClassSVM(nu=0.95 * outliers_fraction + 0.05,
# kernel="rbf", gamma=0.1),
# "robust covariance estimator": EllipticEnvelope(contamination=.1)} #Estimation de la covariance
nu_l = [0.05, 0.1, 0.5]
for j, nu in enumerate(nu_l):
# clf = svm.OneClassSVM(nu=0.95 * outliers_fraction + 0.05, kernel="rbf", gamma=0.1)
clf = svm.OneClassSVM(nu=nu, kernel="rbf", gamma='auto')
clf.fit(X)
y_pred = clf.decision_function(X).ravel() #Distance au superplan de chaque donnée, ravel()Convertissez le tableau en 1D avec
threshold = stats.scoreatpercentile(y_pred, 100 * outliers_fraction) #Définition du seuil de jugement anormal dans le centile
y_pred = y_pred > threshold
n_errors = (y_pred != ground_truth).sum() #Nombre de faux positifs
# plot the levels lines and the points
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) #Sortie de la distance par rapport au super plan dans un motif de grille
Z = Z.reshape(xx.shape)
subplot = plt.subplot(3, 3,i*3+j+1)
subplot.set_title("Outlier detection nu=%s" % nu)
#Résultat de la prédiction
subplot.contourf(xx, yy, Z, levels=np.linspace(Z.min(), threshold, 7), cmap=plt.cm.Blues_r)
#Super avion
a = subplot.contour(xx, yy, Z, levels=[threshold], linewidths=2, colors='red')
#Plage normale
subplot.contourf(xx, yy, Z, levels=[threshold, Z.max()], colors='orange')
#Données normales
b = subplot.scatter(X[:-n_outliers, 0], X[:-n_outliers, 1], c='white')
#Données anormales
c = subplot.scatter(X[-n_outliers:, 0], X[-n_outliers:, 1], c='black')
subplot.axis('tight')
subplot.legend(
[a.collections[0], b, c],
['learned decision function', 'true inliers', 'true outliers'],
prop=matplotlib.font_manager.FontProperties(size=11))
# subplot.set_xlabel("%d. %s (errors: %d)" % (i + 1, clf_name, n_errors))
subplot.set_xlabel("%d. One class SVM (errors: %d)" % (i+1, n_errors))
subplot.set_xlim((-7, 7))
subplot.set_ylim((-7, 7))
plt.subplots_adjust(0.04, 0.1, 1.2, 0.84, 0.1, 0.26)
plt.show()
Recommended Posts