Scikit Learn - Détection d'anomalies

Ici, nous allons découvrir ce qu'est la détection d'anomalies dans Sklearn et comment elle est utilisée dans l'identification des points de données.

La détection d'anomalies est une technique utilisée pour identifier les points de données dans l'ensemble de données qui ne correspondent pas bien au reste des données. Il a de nombreuses applications dans les entreprises telles que la détection de fraude, la détection d'intrusion, la surveillance de l'état du système, la surveillance et la maintenance prédictive. Les anomalies, également appelées aberrantes, peuvent être divisées en trois catégories:

  • Point anomalies - Cela se produit lorsqu'une instance de données individuelle est considérée comme anormale par rapport au reste des données.

  • Contextual anomalies- Ce type d'anomalie est spécifique au contexte. Cela se produit si une instance de données est anormale dans un contexte spécifique.

  • Collective anomalies - Cela se produit lorsqu'une collection d'instances de données associées est anormale par rapport à l'ensemble de données plutôt qu'à des valeurs individuelles.

Méthodes

Deux méthodes à savoir outlier detection et novelty detectionpeut être utilisé pour la détection d'anomalies. Il est nécessaire de voir la distinction entre eux.

Détection des valeurs aberrantes

Les données d'entraînement contiennent des valeurs aberrantes qui sont loin du reste des données. Ces valeurs aberrantes sont définies comme des observations. C'est la raison pour laquelle les estimateurs de détection des valeurs aberrantes essaient toujours d'ajuster la région ayant les données d'entraînement les plus concentrées tout en ignorant les observations déviantes. Elle est également connue sous le nom de détection d'anomalies non supervisée.

Détection de nouveauté

Il s'agit de détecter un modèle non observé dans de nouvelles observations qui n'est pas inclus dans les données d'apprentissage. Ici, les données d'apprentissage ne sont pas polluées par les valeurs aberrantes. Elle est également connue sous le nom de détection d'anomalies semi-supervisée.

Il existe un ensemble d'outils ML, fournis par scikit-learn, qui peuvent être utilisés à la fois pour la détection des valeurs aberrantes et pour la détection de nouveauté. Ces outils implémentent d'abord l'apprentissage d'objets à partir des données dans une méthode non supervisée en utilisant la méthode fit () comme suit -

estimator.fit(X_train)

Maintenant, les nouvelles observations seraient triées comme inliers (labeled 1) ou outliers (labeled -1) en utilisant la méthode prédire () comme suit -

estimator.fit(X_test)

L'estimateur calculera d'abord la fonction de notation brute, puis la méthode de prédiction utilisera le seuil sur cette fonction de notation brute. Nous pouvons accéder à cette fonction de notation brute à l'aide descore_sample méthode et peut contrôler le seuil en contamination paramètre.

On peut aussi définir decision_function méthode qui définit les valeurs aberrantes comme une valeur négative et les inliers comme une valeur non négative.

estimator.decision_function(X_test)

Algorithmes Sklearn pour la détection des valeurs aberrantes

Commençons par comprendre ce qu'est une enveloppe elliptique.

Mise en place d'une enveloppe elliptique

Cet algorithme suppose que les données régulières proviennent d'une distribution connue telle que la distribution gaussienne. Pour la détection des valeurs aberrantes, Scikit-learn fournit un objet nommécovariance.EllipticEnvelop.

Cet objet ajuste une estimation de covariance robuste aux données, et donc, ajuste une ellipse aux points de données centraux. Il ignore les points en dehors du mode central.

Paramètres

Le tableau suivant contient les paramètres utilisés par sklearn. covariance.EllipticEnvelop méthode -

Sr. Non Paramètre et description
1

store_precision - Booléen, facultatif, par défaut = True

Nous pouvons le spécifier si la précision estimée est stockée.

2

assume_centered - Booléen, facultatif, par défaut = False

Si nous le définissons sur False, il calculera l'emplacement robuste et la covariance directement à l'aide de l'algorithme FastMCD. D'autre part, s'il est défini sur True, il calculera la prise en charge de l'emplacement robuste et du covarian.

3

support_fraction - float in (0., 1.), optionnel, par défaut = Aucun

Ce paramètre indique à la méthode la proportion de points à inclure dans le support des estimations brutes MCD.

4

contamination - float in (0., 1.), optionnel, par défaut = 0,1

Il fournit la proportion des valeurs aberrantes dans l'ensemble de données.

5

random_state - int, instance RandomState ou None, facultatif, par défaut = aucun

Ce paramètre représente la graine du nombre pseudo aléatoire généré qui est utilisé lors du brassage des données. Voici les options -

  • int - Dans ce cas, random_state est la graine utilisée par le générateur de nombres aléatoires.

  • RandomState instance- Dans ce cas, random_state est le générateur de nombres aléatoires.

  • None - Dans ce cas, le générateur de nombres aléatoires est l'instance RandonState utilisée par np.random.

Les attributs

Le tableau suivant comprend les attributs utilisés par sklearn. covariance.EllipticEnvelop méthode -

Sr. Non Attributs et description
1

support_ - en forme de tableau, forme (n_samples,)

Il représente le masque des observations utilisé pour calculer des estimations robustes de l'emplacement et de la forme.

2

location_ - forme de type tableau (n_features)

Il renvoie l'emplacement robuste estimé.

3

covariance_ - en forme de tableau, forme (n_features, n_features)

Elle renvoie la matrice de covariance robuste estimée.

4

precision_ - en forme de tableau, forme (n_features, n_features)

Il renvoie la pseudo matrice inverse estimée.

5

offset_ - flotter

Il permet de définir la fonction de décision à partir des scores bruts. decision_function = score_samples -offset_

Implementation Example

import numpy as np^M
from sklearn.covariance import EllipticEnvelope^M
true_cov = np.array([[.5, .6],[.6, .4]])
X = np.random.RandomState(0).multivariate_normal(mean = [0, 0], cov=true_cov,size=500)
cov = EllipticEnvelope(random_state = 0).fit(X)^M
# Now we can use predict method. It will return 1 for an inlier and -1 for an outlier.
cov.predict([[0, 0],[2, 2]])

Output

array([ 1, -1])

Forêt d'isolement

Dans le cas d'un jeu de données de grande dimension, un moyen efficace de détection des valeurs aberrantes consiste à utiliser des forêts aléatoires. Le scikit-learn fournitensemble.IsolationForestméthode qui isole les observations en sélectionnant au hasard une entité. Ensuite, il sélectionne au hasard une valeur entre les valeurs maximale et minimale des caractéristiques sélectionnées.

Ici, le nombre de fractionnements nécessaires pour isoler un échantillon équivaut à la longueur du chemin entre le nœud racine et le nœud de terminaison.

Paramètres

Le tableau suivant comprend les paramètres utilisés par sklearn. ensemble.IsolationForest méthode -

Sr. Non Paramètre et description
1

n_estimators - int, facultatif, par défaut = 100

Il représente le nombre d'estimateurs de base dans l'ensemble.

2

max_samples - int ou float, facultatif, par défaut = "auto"

Il représente le nombre d'échantillons à tirer de X pour entraîner chaque estimateur de base. Si nous choisissons int comme valeur, il tirera des échantillons max_samples. Si nous choisissons float comme valeur, il tirera max_samples ∗ .shape [0] échantillons. Et, si nous choisissons auto comme valeur, il dessinera max_samples = min (256, n_samples).

3

support_fraction - float in (0., 1.), optionnel, par défaut = Aucun

Ce paramètre indique à la méthode la proportion de points à inclure dans le support des estimations brutes MCD.

4

contamination - auto ou float, facultatif, par défaut = auto

Il fournit la proportion des valeurs aberrantes dans l'ensemble de données. Si nous le définissons par défaut, c'est-à-dire auto, il déterminera le seuil comme dans le papier d'origine. S'il est réglé sur float, la plage de contamination sera dans la plage de [0,0,5].

5

random_state - int, instance RandomState ou None, facultatif, par défaut = aucun

Ce paramètre représente la graine du nombre pseudo aléatoire généré qui est utilisé lors du brassage des données. Voici les options -

  • int - Dans ce cas, random_state est la graine utilisée par le générateur de nombres aléatoires.

  • RandomState instance- Dans ce cas, random_state est le générateur de nombres aléatoires.

  • None - Dans ce cas, le générateur de nombres aléatoires est l'instance RandonState utilisée par np.random.

6

max_features - int ou float, facultatif (par défaut = 1.0)

Il représente le nombre d'entités à tirer de X pour entraîner chaque estimateur de base. Si nous choisissons int comme valeur, il dessinera des fonctionnalités max_features. Si nous choisissons float comme valeur, il tirera des échantillons max_features * X.shape [].

sept

bootstrap - Booléen, facultatif (par défaut = False)

Son option par défaut est False, ce qui signifie que l'échantillonnage serait effectué sans remplacement. Et d'autre part, s'il est défini sur True, signifie que les arbres individuels sont ajustés sur un sous-ensemble aléatoire des données d'apprentissage échantillonnées avec remplacement.

8

n_jobs - int ou None, facultatif (par défaut = None)

Il représente le nombre de travaux à exécuter en parallèle pendant fit() et predict() méthodes à la fois.

9

verbose - int, facultatif (par défaut = 0)

Ce paramètre contrôle la verbosité du processus de création de l'arborescence.

dix

warm_start - Bool, facultatif (par défaut = False)

Si warm_start = true, nous pouvons réutiliser la solution des appels précédents pour ajuster et ajouter plus d'estimateurs à l'ensemble. Mais si est défini sur false, nous devons adapter une toute nouvelle forêt.

Les attributs

Le tableau suivant comprend les attributs utilisés par sklearn. ensemble.IsolationForest méthode -

Sr. Non Attributs et description
1

estimators_ - liste de DecisionTreeClassifier

Fournir la collection de tous les sous-estimateurs ajustés.

2

max_samples_ - entier

Il fournit le nombre réel d'échantillons utilisés.

3

offset_ - flotter

Il permet de définir la fonction de décision à partir des scores bruts. decision_function = score_samples -offset_

Implementation Example

Le script Python ci-dessous utilisera sklearn. ensemble.IsolationForest méthode pour ajuster 10 arbres sur des données données

from sklearn.ensemble import IsolationForest
import numpy as np
X = np.array([[-1, -2], [-3, -3], [-3, -4], [0, 0], [-50, 60]])
OUTDClf = IsolationForest(n_estimators = 10)
OUTDclf.fit(X)

Output

IsolationForest(
   behaviour = 'old', bootstrap = False, contamination='legacy',
   max_features = 1.0, max_samples = 'auto', n_estimators = 10, n_jobs=None,
   random_state = None, verbose = 0
)

Facteur de valeur aberrante locale

L'algorithme LOF (Local Outlier Factor) est un autre algorithme efficace pour effectuer la détection des valeurs aberrantes sur des données de grande dimension. Le scikit-learn fournitneighbors.LocalOutlierFactorméthode qui calcule un score, appelé facteur aberrant local, reflétant le degré d'anomalie des observations. La logique principale de cet algorithme est de détecter les échantillons qui ont une densité nettement inférieure à celle de ses voisins. C'est pourquoi il mesure l'écart de densité locale de points de données donnés par rapport à leurs voisins.

Paramètres

Le tableau suivant comprend les paramètres utilisés par sklearn. neighbors.LocalOutlierFactor méthode

Sr. Non Paramètre et description
1

n_neighbors - int, facultatif, par défaut = 20

Il représente le nombre de voisins utilisés par défaut pour la requête Kneighbours. Tous les échantillons seraient utilisés si.

2

algorithm - facultatif

Quel algorithme utiliser pour calculer les voisins les plus proches.

  • Si vous choisissez ball_tree, il utilisera l'algorithme BallTree.

  • Si vous choisissez kd_tree, il utilisera l'algorithme KDTree.

  • Si vous choisissez brute, il utilisera un algorithme de recherche par force brute.

  • Si vous choisissez auto, il décidera de l'algorithme le plus approprié sur la base de la valeur que nous avons passée à la méthode fit ().

3

leaf_size - int, facultatif, par défaut = 30

La valeur de ce paramètre peut affecter la vitesse de la construction et de la requête. Cela affecte également la mémoire requise pour stocker l'arborescence. Ce paramètre est passé aux algorithmes BallTree ou KdTree.

4

contamination - auto ou float, facultatif, par défaut = auto

Il fournit la proportion des valeurs aberrantes dans l'ensemble de données. Si nous le définissons par défaut, c'est-à-dire auto, il déterminera le seuil comme dans le papier d'origine. S'il est réglé sur float, la plage de contamination sera dans la plage de [0,0,5].

5

metric - chaîne ou appelable, par défaut

Il représente la métrique utilisée pour le calcul de la distance.

6

P - int, facultatif (par défaut = 2)

C'est le paramètre de la métrique de Minkowski. P = 1 équivaut à utiliser manhattan_distance ie L1, alors que P = 2 équivaut à utiliser euclidean_distance ie L2.

sept

novelty - Booléen, (par défaut = False)

Par défaut, l'algorithme LOF est utilisé pour la détection des valeurs aberrantes, mais il peut être utilisé pour la détection de nouveauté si nous définissons novelty = true.

8

n_jobs - int ou None, facultatif (par défaut = None)

Il représente le nombre de travaux à exécuter en parallèle pour les deux méthodes fit () et predict ().

Les attributs

Le tableau suivant comprend les attributs utilisés par sklearn.neighbors.LocalOutlierFactor méthode -

Sr. Non Attributs et description
1

negative_outlier_factor_ - tableau numpy, forme (n_samples,)

Fournir un LOF opposé des échantillons d'apprentissage.

2

n_neighbors_ - entier

Il fournit le nombre réel de voisins utilisés pour les requêtes de voisins.

3

offset_ - flotter

Il permet de définir les étiquettes binaires à partir des scores bruts.

Implementation Example

Le script Python ci-dessous utilisera sklearn.neighbors.LocalOutlierFactor méthode pour construire la classe NeighboursClassifier à partir de n'importe quel tableau correspondant à notre ensemble de données

from sklearn.neighbors import NearestNeighbors
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
LOFneigh = NearestNeighbors(n_neighbors = 1, algorithm = "ball_tree",p=1)
LOFneigh.fit(samples)

Output

NearestNeighbors(
   algorithm = 'ball_tree', leaf_size = 30, metric='minkowski',
   metric_params = None, n_jobs = None, n_neighbors = 1, p = 1, radius = 1.0
)

Example

Maintenant, nous pouvons demander à ce classificateur construit est le point de fermeture vers [0.5, 1., 1.5] en utilisant le script python suivant -

print(neigh.kneighbors([[.5, 1., 1.5]])

Output

(array([[1.7]]), array([[1]], dtype = int64))

SVM à une classe

Le SVM à une classe, introduit par Schölkopf et al., Est la détection des valeurs aberrantes non supervisées. Il est également très efficace dans les données de grande dimension et estime le support d'une distribution de grande dimension. Il est mis en œuvre dans leSupport Vector Machines module dans le Sklearn.svm.OneClassSVMobjet. Pour définir une frontière, il nécessite un noyau (le plus utilisé est RBF) et un paramètre scalaire.

Pour une meilleure compréhension, adaptons nos données avec svm.OneClassSVM objet -

Exemple

from sklearn.svm import OneClassSVM
X = [[0], [0.89], [0.90], [0.91], [1]]
OSVMclf = OneClassSVM(gamma = 'scale').fit(X)

Maintenant, nous pouvons obtenir le score_samples pour les données d'entrée comme suit -

OSVMclf.score_samples(X)

Production

array([1.12218594, 1.58645126, 1.58673086, 1.58645127, 1.55713767])