Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через 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()
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.
Параметры
max_samples max_samples: "auto", int или float, по умолчанию="auto"

Количество образцов, выбираемых из X для обучения каждого базового оценщика.

- Если задано целое число, выбирается `max_samples` образцов.
- Если задано число с плавающей точкой, выбирается `max_samples * X.shape[0]` образцов.
- Если задано "auto", используется `max_samples=min(256, n_samples)`.

Если max_samples превышает количество предоставленных образцов,
для всех деревьев будут использоваться все образцы (без выборки).
100
random_state random_state: целое число, экземпляр RandomState или None, по умолчанию=None

Управляет псевдослучайным выбором признаков
и значений разбиения на каждом шаге ветвления и в каждом дереве леса.

Передайте целое число, чтобы получать воспроизводимые результаты при нескольких вызовах функции.
Подробнее см. :term:`Глоссарий <random_state>`.
0
n_estimators n_estimators: целое число, по умолчанию=100

Количество базовых оценщиков в ансамбле.
100
contamination contamination: 'auto' или число с плавающей точкой, по умолчанию='auto'

Доля выбросов в наборе данных. Используется при обучении для определения порогового значения
оценок образцов.

- Если задано 'auto', пороговое значение определяется так же, как в
оригинальной статье.
- Если задано число с плавающей точкой, значение contamination должно находиться в диапазоне (0, 0.5].

.. versionchanged:: 0.22
Значение параметра ``contamination`` по умолчанию изменено с 0.1
на ``'auto'``.
'auto'
max_features max_features: целое число или число с плавающей точкой, по умолчанию=1.0

Количество признаков, выбираемых из X для обучения каждого базового оценщика.

- Если задано целое число, выбирается `max_features` признаков.
- Если задано число с плавающей точкой, выбирается `max(1, int(max_features * n_features_in_))` признаков.

Примечание: если задать число с плавающей точкой меньше 1.0 или целое число меньше количества
признаков, будет выполняться подвыборка признаков, что увеличит время работы.
1.0
bootstrap bootstrap: логическое значение, по умолчанию=False

Если True, отдельные деревья обучаются на случайных подмножествах обучающих
данных, выбранных с возвращением. Если False, выборка выполняется без возвращения.
False
n_jobs n_jobs: целое число, по умолчанию=None

Количество заданий, выполняемых параллельно для :meth:`fit`. Значение ``None`` означает 1,
если только не используется контекст :obj:`joblib.parallel_backend`. Значение ``-1`` означает использование
всех процессоров. Подробнее см. :term:`Глоссарий <n_jobs>`.
None
verbose verbose: целое число, по умолчанию=0

Управляет подробностью вывода в процессе построения деревьев.
0
warm_start warm_start: логическое значение, по умолчанию=False

Если задано ``True``, повторно используется результат предыдущего вызова fit,
а в ансамбль добавляются новые оценщики. В противном случае обучается совершенно новый лес.
См. :term:`глоссарий <warm_start>`.

.. versionadded:: 0.21
False
Обученные атрибуты
Имя Тип Значение
estimator_ estimator_: экземпляр :class:`~sklearn.tree.ExtraTreeRegressor`

Шаблон дочернего оценщика, используемый для создания коллекции
обученных подоценщиков.

.. versionadded:: 1.2
`base_estimator_` переименован в `estimator_`.
ExtraTreeRegressor ExtraTreeRegr...andom_state=0)
estimators_ estimators_: список экземпляров ExtraTreeRegressor

Коллекция обученных подоценщиков.
list [ExtraTreeRegr...te=2087557356), ExtraTreeRegr...ate=132990059), ExtraTreeRegr...te=1109697837), ExtraTreeRegr...ate=123230084), ...]
estimators_features_ estimators_features_: список ndarray

Подмножество выбранных признаков для каждого базового оценщика.
list [array([0, 1]), array([0, 1]), array([0, 1]), array([0, 1]), ...]
estimators_samples_ estimators_samples_: список ndarray

Подмножество выбранных образцов (то есть образцы, попавшие в выборку) для каждого базового
оценщика.
list [array([131, ...57, 12, 61]), array([ 3, 1...36, 124, 16]), array([146, ...16, 124, 78]), array([183, 1...99, 61, 78]), ...]
max_samples_ max_samples_: целое число

Фактическое количество образцов.
int 100
n_features_in_ n_features_in_: целое число

Количество признаков, обнаруженных во время :term:`fit`.

.. versionadded:: 0.24
int 2
offset_ offset_: число с плавающей точкой

Смещение, используемое для вычисления функции принятия решений на основе исходных оценок. Выполняется
соотношение: ``decision_function = score_samples - offset_``.
Параметр ``offset_`` определяется следующим образом. Если параметр contamination
равен "auto", смещение равно -0.5, поскольку оценки нормальных наблюдений близки к 0,
а оценки выбросов — к -1. Если задан параметр contamination, отличный от "auto", смещение
определяется так, чтобы получить ожидаемое количество выбросов
(образцов со значением функции принятия решений < 0) в обучающих данных.

.. versionadded:: 0.20
float -0.5


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

Для визуализации дискретной границы принятия решений мы используем класс 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.542 секунды)

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 для двух классов

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

Регрессия Theil-Sen

© 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

Spec-Zone.ru

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