Давайте применим Isolation Forest с помощью scikit-learn, используя набор данных Iris

Обнаружение аномалий - это идентификация редких наблюдений с экстремальными значениями, которые резко отличаются от остальных точек данных. Эти элементы называются выбросами, и их необходимо идентифицировать, чтобы отделить от обычных элементов. У этих аномальных наблюдений может быть много причин: изменчивость данных, ошибки, полученные во время сбора данных, или что-то новое и редкое. Последнее объяснение не является ошибкой, как вы обычно ожидаете.

Управление выбросами является сложной задачей, поскольку обычно невозможно понять, связана ли проблема с неправильным сбором данных или по другим причинам. В зависимости от мотива вам нужно решить удалить или оставить выброс. Если аномальные точки возникают в результате появления новых событий, удаление выбросов подразумевает потерю информации. В этом последнем случае выбросы содержат важную и новую информацию из-за ее редкости.

Обнаружение мошеннических финансовых транзакций, неисправных машин в производственном контексте или злонамеренных сетевых действий можно рассматривать как приложения для обнаружения аномалий. Итак, цель обнаружения аномалии - построить модель, объясняющую аномалию данных. Изучение этого аномального поведения может быть использовано для принятия соответствующих решений в компаниях, таких как банки и отрасли.

Я собираюсь сосредоточиться на алгоритме Isolation Forest для обнаружения аномалий. Его предложили Фэй Тони Лю, Кай Мин Тинг и Чжи-Хуа Чжоу в 2008 году [1]. Это неконтролируемый непараметрический алгоритм, основанный на деревьях. На самом деле, он состоит из множества деревьев изоляции для данного набора данных. Изоляция - ключевое слово этого алгоритма, поскольку он изолирует аномалии от остальных наблюдений. Эта процедура изоляции разделяет все точки данных путем случайного разделения области на более мелкие части. После того, как я объясню основы этого алгоритма, я покажу приложение Isolation Forest с scikit-learn с использованием набора данных Iris.

Table of Contents
1. How Isolation Forest works
2. Anomaly Score
3. Implementation with sklearn

1. Как работает Isolation Forest

Isolation Forest очень похож на случайные леса и построен на основе ансамбля деревьев решений для данного набора данных. Однако есть некоторые отличия. Isolation Forest идентифицирует аномалии как наблюдения с короткими средними длинами трасс на деревьях изоляции. Для каждого дерева изоляции применяется процедура:

  1. Случайным образом выберите две функции.
  2. Разделите точки данных, случайным образом выбрав значение между минимальным и максимальным из выбранных функций.

Разделение наблюдений повторяется рекурсивно до тех пор, пока все наблюдения не будут изолированы.

Выше я показываю примеры процедуры после четырех разделений, соответственно. В этом случае мне нужно было проверить только две функции x и y и четыре наблюдения. Первое условие отличает нормальное наблюдение от аномалии. Если x больше 120, то наблюдение является выбросом и окрашено в красный цвет. Затем можно различить нормальные и аномальные точки данных на основе средней длины пути: более короткие пути указывают на наличие аномалий, а более длинные пути указывают на наличие нормальных наблюдений.

2. Оценка аномалий

Изолирующему лесу нужен показатель аномалии, чтобы иметь представление о том, насколько аномальна точка данных. Его значения лежат в диапазоне от 0 до 1. Оценка аномалии определяется как:

где E(h(x)) - это среднее значение h(x), которое представляет собой длину пути от корневого узла до внешнего узла x, а c(n) - это среднее значение h(x) при заданном n и используется для нормализации h(x). Возможны три ситуации:

  • Когда оценка наблюдения близка к 1, длина пути очень мала, и тогда точка данных легко выделяется. У нас есть аномалия.
  • Когда оценка этого наблюдения меньше 0,5, длина пути большая, и тогда у нас есть нормальная точка данных.
  • Если для всех наблюдений показатель аномалии составляет около 0,5, то во всей выборке нет никаких аномалий.

Затем лес изоляции может изолировать аномалии за меньшее количество шагов, чем при обычных наблюдениях, путем вычисления оценки аномалий для каждого дерева и получения среднего значения по деревьям изоляции. Действительно, выбросы с более высокими баллами имеют меньшую длину пути.

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

3. Реализация с помощью sklearn

Начнем пример с импорта библиотек plotly.express и sklearn. В частности, нам понадобится библиотека для Isolation Forest от sklearn.ensemble. Вот как получить библиотеку:

import plotly.express as px
from sklearn.datasets import load_iris
from sklearn.ensemble import IsolationForest

После импорта библиотек мы прочитаем набор данных радужной оболочки глаза с помощью функции load_iris. Цель состоит в том, чтобы проверить аномалии в этом наборе данных.

data = load_iris(as_frame=True)
X,y = data.data,data.target
df = data.frame
df.head()

Из каждого образца собраны четыре характеристики: длина и ширина чашелистиков и лепестков. Эти особенности будут обнаружены алгоритмом Isolation Forest, чтобы проверить, являются ли наблюдения аномальными или нет.

Второй шаг - определение модели. Существуют соответствующие гиперпараметры для создания экземпляра класса Isolation Forest [2]:

  • загрязнение - это доля аномалий в наборе данных. В данном случае мы фиксируем его равным 0,05.
  • max_samples - максимальное количество выборок, которые следует рассматривать на основе матрицы характеристик X. Мы будем использовать все образцы.
  • max_features - максимальное количество функций, которые можно учитывать во время обучения модели. Мы будем использовать все четыре функции.
  • n_estimators - количество рассматриваемых деревьев изоляции. Мы будем использовать 100 оценщиков.

Вот код:

iforest = IsolationForest(n_estimators=100, max_samples='auto', 
                          contamination=0.05, max_features=4, 
                          bootstrap=False, n_jobs=-1, random_state=1)

После того, как мы определили модель, мы можем подогнать модель к данным и вернуть метки для X. Эта задача выполняется с помощью функции fit_predict. Код ниже:

pred= iforest.fit_predict(X)
df['scores']=iforest.decision_function(X)
df['anomaly_label']=pred

Мы можем найти оценку аномалии с помощью функции decision_function, в то время как мы можем сохранить метки, полученные в прогнозах. Если метка равна -1, это означает, что у нас есть аномалии. Если метка равна 1, у нас есть вставки.

df[df.anomaly_label==-1]

Если мы отфильтруем набор данных по anomaly_label, равному -1, мы увидим, что все оценки отрицательны около нуля. В противном случае, с меткой аномалии, равной 1, мы нашли все положительные оценки.

df[df.anomaly_label==1]

Чтобы подчеркнуть эту взаимосвязь между оценками аномалий и метками, полученными с помощью прогноза, мы можем отобразить гистограмму. Перед созданием гистограммы я добавил столбец, указывающий на состояние аномалии. Вот код:

df['anomaly']=df['anomaly_label'].apply(lambda x: 'outlier' if x==-1  else 'inlier')
fig=px.histogram(df,x='scores',color='anomaly')
fig.show()

Гораздо более очевидно, что точки с отрицательными оценками являются выбросами, если посмотреть на этот интерактивный график. Вы так не думаете? Перемещая мышь, вы также можете увидеть количество наблюдений с определенной оценкой аномалии и то, как наблюдения классифицируются. Еще одно полезное представление выбросов - это трехмерная диаграмма рассеяния, позволяющая просматривать более двух объектов. Вот как создать диаграмму рассеяния:

fig = px.scatter_3d(df,x='petal width (cm)',
                       y='sepal length (cm)',
                       z='sepal width (cm)',
                       color='anomaly')
fig.show()

На этой диаграмме рассеяния мы можем наблюдать, что красные точки, рассматриваемые как выбросы, имеют экстремальные значения функций, рассматриваемых в наборе данных.

Чтобы глубже интерпретировать выходные данные модели, мы можем визуализировать 5-е дерево изоляции с помощью Graphviz, программного обеспечения для визуализации графов с открытым исходным кодом. Сначала мы создаем точечный файл, который представляет собой Graphviz-представление дерева изоляции. Позже мы конвертируем точечный файл в файл png для отображения изображения.

from sklearn.tree import export_graphviz
from subprocess import call
from IPython.display import Image
estimator = iforest.estimators_[5]
#print(estimator)
export_graphviz(estimator,out_file='tree.dot',max_depth=5,
                feature_names = data.feature_names,
                special_characters=True,rounded=True,precision=2)
call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])
Image(filename = 'tree.png')

В каждом внутреннем узле диаграммы дерева изоляции есть правило принятия решения, которое разделяет данные. Например, первое решающее правило принимает длину лепестка как характеристику, а точка разделения равна 2,8. Аномалии можно распознать как экземпляры, имеющие короткую среднюю длину пути на деревьях изоляции. Действительно, мы можем заметить, что некоторые узлы уже изолированы. Кажется, что очень маленькая ширина лепестка или очень большая ширина лепестка определяет, является ли предмет аномальным или нет. Давайте проверим фильтрацию во фрейме данных:

df[(df['petal width (cm)']<=0.13)|(df['petal width (cm)']>=2.46)]

Когда ширина лепестка очень мала, наблюдение не всегда является аномальным, это, вероятно, зависит от значений других характеристик, в то время как большая ширина лепестка всегда подразумевает выброс. Эти наблюдения были сделаны на основе статистики фрейма данных:

df.describe().T

Последние мысли

Поздравляю! Надеюсь, это руководство помогло вам получить обзор проблемы обнаружения аномалий и изолированного леса. Я хочу указать, что гиперпараметр загрязнения играет важную роль в этом алгоритме. Когда вы его изменяете, модель будет возвращать ту же пропорцию выбросов, и вам нужно тщательно выбирать ее. Типичные значения находятся в диапазоне от 0 до 0,5, но это также зависит от набора данных.

Я также предлагаю вам использовать библиотеку plotly.express для отображения графиков, как я сделал в этом уроке. Они намного более детализированы, чем полученные с помощью seaborn и matplotlib. Код Github находится здесь. Спасибо за прочтение. Хорошего дня.

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



Ссылки:

[1] Лю Ф. Т., Тинг К. М. и Чжоу З. Х. (2008 г., декабрь). Изоляция леса. В Data Mining, 2008. ICDM’08. Восьмая международная конференция IEEE по (стр. 413–422). IEEE.

[2] https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest

Вам понравилась статья? Станьте участником и получайте неограниченный доступ к новым сообщениям о данных каждый день!