--Outlier-Erkennung mit One Class SVM --Verwenden Sie Beispieldaten (Normalverteilung, gemischte Normalverteilung), die mit Zufallszahlen erstellt wurden
Darüber hinaus wird auf der obigen Benutzerhandbuchseite auch der Robust Covariance Estimator (Ausreißererkennungsmethode unter Verwendung der Maharanobis-Entfernung unter der Annahme, dass normale Daten einer Normalverteilung folgen) vorgestellt, diesmal jedoch weggelassen.
One-Class SVM Ausreißererkennungsmethode mit SVM. Mit dem Kernel dem Feature-Space zugeordnet, werden die auf dem ursprünglichen Space isolierten Punkte in der Nähe des Ursprungs im Feature-Space verteilt. Kernel ist die Standardeinstellung für rbf. Versuchen Sie, nu zu ändern (Bereich von 0 bis 1, def. = 0,5), um das Verhältnis abnormaler Daten zu bestimmen. Scikit-learn One Class SVM-Objektseite
Bereiten Sie drei Arten von Datensätzen vor, in denen Normaldaten durch eine gemischte Normalverteilung dargestellt werden. Ganz links ist eine einzelne Normalverteilung, und die beiden rechts sind eine Überlagerung von vier Normalverteilungen. Die anomalen Daten waren gleichmäßig verteilt.
Im Gegensatz zur Maharanobis-Entfernung gibt es für jede im ursprünglichen Raum getrennte Verteilungsmasse eine Unterscheidungsgrenze. Je kleiner die Nu, desto empfindlicher und komplexer ist jedes Datenelement, und der Standardwert von 0,5 ist sehr einfach.
Siehe die Bedienungsanleitung.
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 #Anzahl von Beispielen
outliers_fraction = 0.05 #Prozentsatz abnormaler Daten in der Gesamtzahl der Proben
clusters_separation = [0, 1, 2]
#Generierung von Rasterdaten für 2D-Zeichnungen
xx, yy = np.meshgrid(np.linspace(-7, 7, 500), np.linspace(-7, 7, 500))
#Erzeugung normaler und abnormaler Daten
n_inliers = int((1. - outliers_fraction) * n_samples) #Anzahl der Stichproben normaler Daten
n_outliers = int(outliers_fraction * n_samples) #Anzahl der Proben anomaler Daten
ground_truth = np.ones(n_samples, dtype=int) #Daten beschriften
ground_truth[-n_outliers:] = 0
# Fit the problem with varying cluster separation
# [Funktion aufzählen](http://python.civic-apps.com/zip-enumerate/)Schleifen mit dem Index
for i, offset in enumerate(clusters_separation):
np.random.seed(42)
#Normale Datengenerierung
X1 = 0.3 * np.random.randn(0.25 * n_inliers, 2) - offset #Normalverteilung N.(μ= -offset, σ=0.3)
X2 = 0.3 * np.random.randn(0.25 * n_inliers, 2) + offset #Normalverteilung N.(μ= +offset, σ=0.3)
X3 = np.c_[
0.3 * np.random.randn(0.25 * n_inliers, 1) - 3*offset, #Normalverteilung N.(μ= -3*offset, σ=0.3)
0.3 * np.random.randn(0.25 * n_inliers, 1) + 3*offset #Normalverteilung N.(μ= +3*offset, σ=0.3)
]
X4 = np.c_[
0.3 * np.random.randn(0.25 * n_inliers, 1) + 3*offset, #Normalverteilung N.(μ= +3*offset, σ=0.3)
0.3 * np.random.randn(0.25 * n_inliers, 1) - 3*offset #Normalverteilung N.(μ= -3*offset, σ=0.3)
]
X = np.r_[X1, X2, X3, X4] #Mit der Linie verbinden
#Generierung von Ausreißerdaten
X = np.r_[X, np.random.uniform(low=-6, high=6, size=(n_outliers, 2))] #Gleichmäßige Verteilung-6 <= X <= +6
# Fit the model with the One-Class SVM
plt.figure(figsize=(10, 12))
#Ausreißererkennungstool, 1-Klassen-SVM und Robust Covariance Estimator
# classifiers = {
# "One-Class SVM": svm.OneClassSVM(nu=0.95 * outliers_fraction + 0.05,
# kernel="rbf", gamma=0.1),
# "robust covariance estimator": EllipticEnvelope(contamination=.1)} #Kovarianzschätzung
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() #Entfernung zur Superplane jeder Daten, Ravel()Konvertieren Sie das Array in 1D mit
threshold = stats.scoreatpercentile(y_pred, 100 * outliers_fraction) #Festlegen des Schwellenwerts für eine abnormale Beurteilung im Perzentil
y_pred = y_pred > threshold
n_errors = (y_pred != ground_truth).sum() #Anzahl der falsch positiven Ergebnisse
# plot the levels lines and the points
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) #Geben Sie den Abstand zur Superebene in einem Gittermuster aus
Z = Z.reshape(xx.shape)
subplot = plt.subplot(3, 3,i*3+j+1)
subplot.set_title("Outlier detection nu=%s" % nu)
#Vorhersageergebnis
subplot.contourf(xx, yy, Z, levels=np.linspace(Z.min(), threshold, 7), cmap=plt.cm.Blues_r)
#Super Flugzeug
a = subplot.contour(xx, yy, Z, levels=[threshold], linewidths=2, colors='red')
#Normalbereich
subplot.contourf(xx, yy, Z, levels=[threshold, Z.max()], colors='orange')
#Normale Daten
b = subplot.scatter(X[:-n_outliers, 0], X[:-n_outliers, 1], c='white')
#Abnormale Daten
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()