Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через JupyterLite или Binder.
Пример IsolationForest
Пример использования IsolationForest для обнаружения аномалий.
Isolation Forest — это ансамбль «деревьев изоляции», которые «изолируют» наблюдения посредством рекурсивного случайного разбиения, представленного в виде структуры дерева. Для изоляции выброса требуется меньше разбиений, чем для изоляции нормального наблюдения.
В этом примере мы покажем два способа визуализации границы принятия решений Isolation Forest, обученного на простом искусственном наборе данных.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Генерация данных
Мы генерируем два кластера (каждый содержит n_samples), случайным образом выбирая значения из стандартного нормального распределения, возвращаемого функцией numpy.random.randn. Один из кластеров имеет сферическую форму, а другой — слегка деформированную.
Для согласованности с обозначениями IsolationForest нормальным наблюдениям (то есть гауссовым кластерам) присваивается истинная метка 1, а выбросам (созданным с помощью numpy.random.uniform) — метка -1.
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()

Обучение модели
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 отображает меру нормальности наблюдения. Эта оценка определяется как средняя длина пути по лесу случайных деревьев. Длина пути задаётся глубиной листа (или, что эквивалентно, количеством разбиений), необходимых для изоляции данного образца.
Если лес случайных деревьев в совокупности строит короткие пути для изоляции некоторых образцов, то такие образцы, скорее всего, являются аномалиями, а мера нормальности близка к 0. Аналогично, длинные пути соответствуют значениям, близким к 1, и, скорее всего, указывают на нормальные наблюдения.
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()

Общее время выполнения скрипта: (0 минут 0.542 секунды)
Связанные примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/ensemble/plot_isolation_forest.html