Anomalieerkennung mit Isolation Forest

Beginner

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

Einführung

In diesem Lab werden wir den Prozess des Einsatzes von Isolation Forest zur Anomalieerkennung durchgehen. Wir beginnen mit der Erzeugung eines Datensatzes mit zwei Clustern und einigen Ausreißern, trainieren dann ein Isolation Forest-Modell, um die Ausreißer zu identifizieren. Schließlich werden wir die Entscheidungsgrenze des Modells visualisieren, um zu sehen, wie es die Inneren und die Ausreißer trennt.

Tipps für die VM

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Datenerzeugung

Wir werden einen Datensatz mit zwei Clustern und einigen Ausreißern erzeugen. Die Cluster werden durch Zufallsstichproben aus der Standardnormalverteilung generiert. Einer von ihnen wird sphärisch sein, und der andere wird leicht deformiert sein. Die Ausreißer werden durch Zufallsstichproben aus einer Gleichverteilung generiert.

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])  ## allgemein
cluster_2 = 0.3 * rng.randn(n_samples, 2) + np.array([-2, -2])  ## sphärisch
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)

Visualisiere den Datensatz

Wir können die resultierenden Cluster visualisieren, um zu sehen, wie der Datensatz aussieht.

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=["Ausreißer", "Innerpunkte"], title="wahre Klasse")
plt.title("Gaußsche Innerpunkte mit \ngleichmäßig verteilten Ausreißern")
plt.show()

Trainiere das Modell

Wir werden ein Isolation Forest-Modell mit den Trainingsdaten trainieren.

from sklearn.ensemble import IsolationForest

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

Zeichne die diskrete Entscheidungsgrenze

Wir werden die Klasse DecisionBoundaryDisplay verwenden, um eine diskrete Entscheidungsgrenze zu visualisieren. Die Hintergrundfarbe gibt an, ob eine Probe in einem bestimmten Bereich als Ausreißer vorhergesagt wird oder nicht. Der Streudiagramm zeigt die wahren Labels an.

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("Binäre Entscheidungsgrenze \nvon IsolationForest")
plt.axis("square")
plt.legend(handles=handles, labels=["Ausreißer", "Innerpunkte"], title="wahre Klasse")
plt.show()

Zeichne die Entscheidungsgrenze basierend auf der Pfadlänge

Durch Festlegung von response_method="decision_function" repräsentiert der Hintergrund der DecisionBoundaryDisplay die Normalitätsmessung einer Beobachtung. Ein solcher Score wird durch die über einen Wald von zufälligen Bäumen gemittelte Pfadlänge gegeben, die selbst durch die Tiefe des Blattes (oder gleichwertig die Anzahl der Aufteilungen) angegeben wird, die erforderlich ist, um eine gegebene Probe zu isolieren.

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("Entscheidungsgrenze basierend auf der Pfadlänge \nvon IsolationForest")
plt.axis("square")
plt.legend(handles=handles, labels=["Ausreißer", "Innerpunkte"], title="wahre Klasse")
plt.colorbar(disp.ax_.collections[1])
plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man Isolation Forest für die Anomalieerkennung verwendet. Wir haben einen Datensatz mit zwei Clustern und einigen Ausreißern erzeugt, ein Isolation Forest-Modell trainiert, um die Ausreißer zu identifizieren, und die Entscheidungsgrenze des Modells visualisiert, um zu sehen, wie es die Innerpunkte und Ausreißer trennt.