[PYTHON] Ausreißererkennung mit One Class SVM

Was ich getan habe

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

Beispieldaten

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

Ergebnis

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.

image image image

Beispielcode

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()

Recommended Posts

Ausreißererkennung mit One Class SVM
Unüberwachte Lächelnerkennung mit One Class SVM
SVM-Implementierung einer Klasse
Einführung in die Anomalieerkennung 2 Ausreißererkennung
Expressionsnachweis mit Yolov5
Feature-Erkennung mit opencv (Eckenerkennung)