Введение
В этом практическом занятии мы рассмотрим процесс использования Isolation Forest для обнаружения аномалий. Сначала мы сгенерируем датасет с двумя кластерами и некоторыми выбросами, а затем обучим модель Isolation Forest для идентификации выбросов. Наконец, мы визуализируем границу решения модели, чтобы увидеть, как она разделяет объекты, принадлежащие нормальному распределению, и выбросы.
Советы по использованию ВМ
После запуска виртуальной машины щелкните в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Генерация данных
Мы сгенерируем датасет с двумя кластерами и некоторыми выбросами. Кластеры будут сгенерированы путём случайного выборки из стандартного нормального распределения. Один из них будет сферическим, а другой будет немного деформированным. Выбросы будут сгенерированы путём случайного выборки из равномерного распределения.
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()
Обучение модели
Мы обучим модель Isolation Forest на тренировочных данных.
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 представляет собой меру нормальности наблюдения. Такая оценка определяется средней длиной пути в лесу случайных деревьев, которая в свою очередь определяется глубиной листа (или эквивалентно количеством разбиений), необходимым для изоляции данного образца.
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()
Резюме
В этом практическом занятии мы узнали, как использовать Isolation Forest для обнаружения аномалий. Мы сгенерировали датасет с двумя кластерами и некоторыми выбросами, обучили модель Isolation Forest для идентификации выбросов и визуализировали границу решения модели, чтобы увидеть, как она разделяет инлайеры и выбросы.