Обнаружение аномалий с использованием Isolation Forest

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии мы рассмотрим процесс использования Isolation Forest для обнаружения аномалий. Сначала мы сгенерируем датасет с двумя кластерами и некоторыми выбросами, а затем обучим модель Isolation Forest для идентификации выбросов. Наконец, мы визуализируем границу решения модели, чтобы увидеть, как она разделяет объекты, принадлежащие нормальному распределению, и выбросы.

Советы по использованию ВМ

После запуска виртуальной машины щелкните в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) 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{{"Обнаружение аномалий с использованием Isolation Forest"}} sklearn/model_selection -.-> lab-49171{{"Обнаружение аномалий с использованием Isolation Forest"}} sklearn/inspection -.-> lab-49171{{"Обнаружение аномалий с использованием Isolation Forest"}} ml/sklearn -.-> lab-49171{{"Обнаружение аномалий с использованием Isolation Forest"}} end

Генерация данных

Мы сгенерируем датасет с двумя кластерами и некоторыми выбросами. Кластеры будут сгенерированы путём случайного выборки из стандартного нормального распределения. Один из них будет сферическим, а другой будет немного деформированным. Выбросы будут сгенерированы путём случайного выборки из равномерного распределения.

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

Визуализация датасета

Мы можем визуализировать полученные кластеры, чтобы увидеть, как выглядит датасет.

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=["outliers", "inliers"], title="true class")
plt.title("Gaussian inliers with \nuniformly distributed outliers")
plt.show()

Обучение модели

Мы обучим модель Isolation Forest на тренировочных данных.

from sklearn.ensemble import IsolationForest

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

Построение дискретной границы решения

Мы будем использовать класс DecisionBoundaryDisplay для визуализации дискретной границы решения. Цвет фона показывает, предсказывается ли образец в данной области как выброс или нет. Диаграмма рассеяния отображает истинные метки.

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("Binary decision boundary \nof IsolationForest")
plt.axis("square")
plt.legend(handles=handles, labels=["outliers", "inliers"], title="true class")
plt.show()

Построение границы решения по длине пути

Задавая response_method="decision_function", фон DecisionBoundaryDisplay представляет собой меру нормальности наблюдения. Такая оценка определяется средней длиной пути в лесу случайных деревьев, которая в свою очередь определяется глубиной листа (или эквивалентно количеством разбиений), необходимым для изоляции данного образца.

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("Path length decision boundary \nof IsolationForest")
plt.axis("square")
plt.legend(handles=handles, labels=["outliers", "inliers"], title="true class")
plt.colorbar(disp.ax_.collections[1])
plt.show()

Резюме

В этом практическом занятии мы узнали, как использовать Isolation Forest для обнаружения аномалий. Мы сгенерировали датасет с двумя кластерами и некоторыми выбросами, обучили модель Isolation Forest для идентификации выбросов и визуализировали границу решения модели, чтобы увидеть, как она разделяет инлайеры и выбросы.