Сравнение алгоритмов обнаружения аномалий

Beginner

This tutorial is from open-source community. Access the source code

Введение

Этот лаба сравнивает различные алгоритмы обнаружения аномалий на двухмерных наборах данных. Наборы данных содержат один или два режима (регионы высокой плотности), чтобы продемонстрировать способность алгоритмов справляться с мультимодальными данными. Для каждого набора данных 15% выборок генерируются в виде случайного равномерного шума. Границы решений между инлайерами и аутлайерами отображаются в черном цвете, за исключением Local Outlier Factor (LOF), так как у него нет метода predict, который можно было бы применить к новым данным, когда он используется для обнаружения аутлайеров.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

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

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортировать необходимые библиотеки

Импортируйте необходимые библиотеки для лабораторной работы.

import time

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

from sklearn import svm
from sklearn.datasets import make_moons, make_blobs
from sklearn.covariance import EllipticEnvelope
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
from sklearn.linear_model import SGDOneClassSVM
from sklearn.kernel_approximation import Nystroem
from sklearn.pipeline import make_pipeline

Установить параметры

Установите требуемые параметры для лабораторной работы.

n_samples = 300
outliers_fraction = 0.15
n_outliers = int(outliers_fraction * n_samples)
n_inliers = n_samples - n_outliers

Определить алгоритмы обнаружения аномалий

Определите алгоритмы обнаружения аномалий для сравнения.

anomaly_algorithms = [
    (
        "Robust covariance",
        EllipticEnvelope(contamination=outliers_fraction, random_state=42),
    ),
    ("One-Class SVM", svm.OneClassSVM(nu=outliers_fraction, kernel="rbf", gamma=0.1)),
    (
        "One-Class SVM (SGD)",
        make_pipeline(
            Nystroem(gamma=0.1, random_state=42, n_components=150),
            SGDOneClassSVM(
                nu=outliers_fraction,
                shuffle=True,
                fit_intercept=True,
                random_state=42,
                tol=1e-6,
            ),
        ),
    ),
    (
        "Isolation Forest",
        IsolationForest(contamination=outliers_fraction, random_state=42),
    ),
    (
        "Local Outlier Factor",
        LocalOutlierFactor(n_neighbors=35, contamination=outliers_fraction),
    ),
]

Определить наборы данных

Определите наборы данных для лабораторной работы.

blobs_params = dict(random_state=0, n_samples=n_inliers, n_features=2)
datasets = [
    make_blobs(centers=[[0, 0], [0, 0]], cluster_std=0.5, **blobs_params)[0],
    make_blobs(centers=[[2, 2], [-2, -2]], cluster_std=[0.5, 0.5], **blobs_params)[0],
    make_blobs(centers=[[2, 2], [-2, -2]], cluster_std=[1.5, 0.3], **blobs_params)[0],
    4.0
    * (
        make_moons(n_samples=n_samples, noise=0.05, random_state=0)[0]
        - np.array([0.5, 0.25])
    ),
    14.0 * (np.random.RandomState(42).rand(n_samples, 2) - 0.5),
]

Сравнить классификаторы

Сравните данные классификаторы в заданных настройках.

xx, yy = np.meshgrid(np.linspace(-7, 7, 150), np.linspace(-7, 7, 150))

plt.figure(figsize=(len(anomaly_algorithms) * 2 + 4, 12.5))
plt.subplots_adjust(
    left=0.02, right=0.98, bottom=0.001, top=0.96, wspace=0.05, hspace=0.01
)

plot_num = 1
rng = np.random.RandomState(42)

for i_dataset, X in enumerate(datasets):
    ## Add outliers
    X = np.concatenate([X, rng.uniform(low=-6, high=6, size=(n_outliers, 2))], axis=0)

    for name, algorithm in anomaly_algorithms:
        t0 = time.time()
        algorithm.fit(X)
        t1 = time.time()
        plt.subplot(len(datasets), len(anomaly_algorithms), plot_num)
        if i_dataset == 0:
            plt.title(name, size=18)

        ## fit the data and tag outliers
        if name == "Local Outlier Factor":
            y_pred = algorithm.fit_predict(X)
        else:
            y_pred = algorithm.fit(X).predict(X)

        ## plot the levels lines and the points
        if name!= "Local Outlier Factor":  ## LOF does not implement predict
            Z = algorithm.predict(np.c_[xx.ravel(), yy.ravel()])
            Z = Z.reshape(xx.shape)
            plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors="black")

        colors = np.array(["#377eb8", "#ff7f00"])
        plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[(y_pred + 1) // 2])

        plt.xlim(-7, 7)
        plt.ylim(-7, 7)
        plt.xticks(())
        plt.yticks(())
        plt.text(
            0.99,
            0.01,
            ("%.2fs" % (t1 - t0)).lstrip("0"),
            transform=plt.gca().transAxes,
            size=15,
            horizontalalignment="right",
        )
        plot_num += 1

plt.show()

Резюме

В этой лабораторной работе сравнивались разные алгоритмы обнаружения аномалий на двухмерных наборах данных. Набора данных содержали один или два режима (регионы высокой плотности), чтобы продемонстрировать способность алгоритмов справляться с мультимодальными данными. Границы решений между правильными и аномальными данными отображались черным цветом, за исключением Local Outlier Factor (LOF), так как у него нет метода predict для применения к новым данным при его использовании для обнаружения аномалий. Было обнаружено, что :class:~sklearn.svm.OneClassSVM чувствителен к аномалиям и, следовательно, не справляется очень хорошо с обнаружением аномалий. :class:sklearn.linear_model.SGDOneClassSVM была реализацией One-Class SVM на основе стохастического градиентного спуска (SGD). :class:sklearn.covariance.EllipticEnvelope предполагала, что данные являются гауссовскими, и обучала эллипс, а :class:~sklearn.ensemble.IsolationForest и :class:~sklearn.neighbors.LocalOutlierFactor показывали приемлемые результаты для мультимодальных наборов данных.