[PYTHON] Détection des valeurs aberrantes à l'aide d'un SVM de classe

Ce que j'ai fait

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

Exemple de données

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

résultat

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.

image image image

Exemple de code

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

Détection des valeurs aberrantes à l'aide d'un SVM de classe
Détection de sourire non supervisée à l'aide du SVM One Class
Implémentation SVM à une classe
Détection d'anomalies Introduction 2 Détection des valeurs aberrantes
Détection d'expression à l'aide de Yolov5
Détection de caractéristiques à l'aide d'opencv (détection de coin)