Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для скачивания полного примера кода. или запустить этот пример в вашем браузере через 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()
Gaussian inliers with  uniformly distributed outliers

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

from sklearn.ensemble import IsolationForest

clf = IsolationForest(max_samples=100, random_state=0)
clf.fit(X_train)
IsolationForest(max_samples=100, random_state=0)
В среде Jupyter, пожалуйста, перезапустите этот ячейку, чтобы показать HTML-представление, или доверьтесь блокноту.
На GitHub, HTML-представление не может отобразить, пожалуйста, попробуйте загрузить эту страницу с nbviewer.org.
IsolationForest(max_samples=100, random_state=0)


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

Мы используем класс 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()
Binary decision boundary  of IsolationForest

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

Установив 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()
Path length decision boundary  of IsolationForest

Общее время выполнения скрипта: (0 минут 0,466 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_isolation_forest.ipynb

Download Python source code: plot_isolation_forest.py

Download zipped: plot_isolation_forest.zip

Похожие примеры

Сравнение алгоритмов обнаружения аномалий для выявления выбросов на наборах данных игрушечного типа

Двухклассовая AdaBoost

Классификация ближайших соседей

Регрессия Теил-Сена

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API