Примечание
Перейти к концу для скачивания полного примера кода. или запустить этот пример в вашем браузере через JupyterLite или Binder
Пример IsolationForest
Пример использования IsolationForest для выявления аномалий.
Изоляционное лес — это ансамбль «деревьев изоляции», которые «изолируют» наблюдения с помощью рекурсивного случайного разбиения, которое может быть представлено структурой дерева. Количество разделений, необходимых для изоляции образца, меньше для выбросов и больше для инлайеров.
В данном примере мы демонстрируем два способа визуализации границ принятия решений изоляционного леса, обученного на наборе данных игрушечного типа.
# 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,466 секунды)
Похожие примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/ensemble/plot_isolation_forest.html