Détection d'anomalies avec l'Isolation Forest

Machine LearningMachine LearningBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous allons passer par le processus d'utilisation de l'Isolation Forest pour la détection d'anomalies. Nous commencerons par générer un ensemble de données avec deux grappes et quelques anomalies, puis entraîner un modèle Isolation Forest pour identifier les anomalies. Enfin, nous visualiserons la frontière de décision du modèle pour voir comment il sépare les données normales des anomalies.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter Notebook pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-49171{{"Détection d'anomalies avec l'Isolation Forest"}} sklearn/model_selection -.-> lab-49171{{"Détection d'anomalies avec l'Isolation Forest"}} sklearn/inspection -.-> lab-49171{{"Détection d'anomalies avec l'Isolation Forest"}} ml/sklearn -.-> lab-49171{{"Détection d'anomalies avec l'Isolation Forest"}} end

Génération des données

Nous allons générer un ensemble de données avec deux grappes et quelques anomalies. Les grappes seront générées en échantillonnant aléatoirement à partir de la distribution normale standard. L'une d'entre elles sera sphérique, et l'autre sera légèrement déformée. Les anomalies seront générées en échantillonnant aléatoirement à partir d'une distribution uniforme.

import numpy as np
from sklearn.model_selection import train_test_split

n_samples, n_outliers = 120, 40
rng = np.random.RandomState(0)
covariance = np.array([[0.5, -0.1], [0.7, 0.4]])
cluster_1 = 0.4 * rng.randn(n_samples, 2) @ covariance + np.array([2, 2])  ## général
cluster_2 = 0.3 * rng.randn(n_samples, 2) + np.array([-2, -2])  ## sphérique
outliers = rng.uniform(low=-4, high=4, size=(n_outliers, 2))

X = np.concatenate([cluster_1, cluster_2, outliers])
y = np.concatenate(
    [np.ones((2 * n_samples), dtype=int), -np.ones((n_outliers), dtype=int)]
)

X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)

Visualiser l'ensemble de données

Nous pouvons visualiser les grappes résultantes pour voir à quoi ressemble l'ensemble de données.

import matplotlib.pyplot as plt

scatter = plt.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor="k")
handles, labels = scatter.legend_elements()
plt.axis("square")
plt.legend(handles=handles, labels=["anomalies", "données normales"], title="classe réelle")
plt.title("Données normales gaussiennes avec \nanomalies distribuées uniformément")
plt.show()

Entraîner le modèle

Nous allons entraîner un modèle Isolation Forest avec les données d'entraînement.

from sklearn.ensemble import IsolationForest

clf = IsolationForest(max_samples=100, random_state=0)
clf.fit(X_train)

Tracer la frontière de décision discrète

Nous utiliserons la classe DecisionBoundaryDisplay pour visualiser une frontière de décision discrète. La couleur d'arrière-plan représente si un échantillon dans cette zone donnée est prédit comme étant une anomalie ou non. Le nuage de points affiche les vraies étiquettes.

import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay

disp = DecisionBoundaryDisplay.from_estimator(
    clf,
    X,
    response_method="predict",
    alpha=0.5,
)
disp.ax_.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor="k")
disp.ax_.set_title("Frontière de décision binaire \nde l'IsolationForest")
plt.axis("square")
plt.legend(handles=handles, labels=["anomalies", "données normales"], title="classe réelle")
plt.show()

Tracer la frontière de décision de la longueur du chemin

En définissant response_method="decision_function", l'arrière-plan de DecisionBoundaryDisplay représente la mesure de normalité d'une observation. Un tel score est donné par la longueur du chemin moyenne sur une forêt d'arbres aléatoires, qui elle-même est donnée par la profondeur de la feuille (ou de manière équivalente le nombre de splits) nécessaire pour isoler un échantillon donné.

disp = DecisionBoundaryDisplay.from_estimator(
    clf,
    X,
    response_method="decision_function",
    alpha=0.5,
)
disp.ax_.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor="k")
disp.ax_.set_title("Frontière de décision de la longueur du chemin \nde l'IsolationForest")
plt.axis("square")
plt.legend(handles=handles, labels=["anomalies", "données normales"], title="classe réelle")
plt.colorbar(disp.ax_.collections[1])
plt.show()

Sommaire

Dans ce laboratoire, nous avons appris à utiliser l'Isolation Forest pour la détection d'anomalies. Nous avons généré un ensemble de données avec deux grappes et quelques anomalies, entraîné un modèle Isolation Forest pour identifier les anomalies et visualisé la frontière de décision du modèle pour voir comment il sépare les données normales et les anomalies.