Рубрики

Машинное обучение для обнаружения аномалий

Обнаружение аномалий — это метод выявления редких событий или наблюдений, которые могут вызвать подозрения, так как статистически отличаются от остальных наблюдений. Такое «аномальное» поведение обычно приводит к некоторой проблеме, такой как мошенничество с кредитными картами, сбой компьютера на сервере, кибератака и т. Д.

Аномалия может быть широко разделена на три категории —

  1. Точечная аномалия: Кортеж в наборе данных называется точечной аномалией, если он далек от остальных данных.
  2. Контекстуальная аномалия: наблюдение является контекстуальной аномалией, если это аномалия из-за контекста наблюдения.
  3. Коллективная аномалия: набор данных помогает найти аномалию.

Обнаружение аномалий может быть сделано с использованием концепций машинного обучения . Это можно сделать следующими способами —

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

Теперь мы продемонстрируем процесс обнаружения аномалий на синтетическом наборе данных с использованием алгоритма K-Nearest Neighbours, который включен в модуль pyod .

Шаг 1: Импорт необходимых библиотек

import numpy as np

from scipy import stats

import matplotlib.pyplot as plt

import matplotlib.font_manager

from pyod.models.knn import KNN 

from pyod.utils.data import generate_data, get_outliers_inliers

Шаг 2: Создание синтетических данных

# генерация случайного набора данных с двумя функциями

X_train, y_train = generate_data(n_train = 300, train_only = True,

                                                   n_features = 2)

  
# Установка процента выбросов

outlier_fraction = 0.1

  
# Хранение выбросов и вкладчиков в разных массивах

X_outliers, X_inliers = get_outliers_inliers(X_train, y_train)

n_inliers = len(X_inliers)

n_outliers = len(X_outliers)

  
# Разделение двух функций

f1 = X_train[:, [0]].reshape(-1, 1)

f2 = X_train[:, [1]].reshape(-1, 1)

Шаг 3: Визуализация данных

# Визуализация набора данных
# создать сетку

xx, yy = np.meshgrid(np.linspace(-10, 10, 200),

                     np.linspace(-10, 10, 200))

  
# точечный график
plt.scatter(f1, f2)

plt.xlabel('Feature 1')

plt.ylabel('Feature 2')

Шаг 4: Обучение и оценка модели

# Тренировка классификатора

clf = KNN(contamination = outlier_fraction)

clf.fit(X_train, y_train)

  
# Вы можете распечатать это, чтобы увидеть все оценки предсказания

scores_pred = clf.decision_function(X_train)*-1

  

y_pred = clf.predict(X_train)

n_errors = (y_pred != y_train).sum()

# Подсчет количества ошибок

  

print('The number of prediciton errors are ' + str(n_errors))

Шаг 5: Визуализация предсказаний

# пороговое значение для рассмотрения
# datapoint inlier или outlier

threshold = stats.scoreatpercentile(scores_pred, 100 * outlier_fraction)

  
# решающая функция вычисляет необработанные
# оценка аномалий для каждой точки

Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) * -1

Z = Z.reshape(xx.shape)

  
# заполнить синюю карту цветов от минимальной аномалии
# оценка до порогового значения

subplot = plt.subplot(1, 2, 1)

subplot.contourf(xx, yy, Z, levels = np.linspace(Z.min(), 

                  threshold, 10), cmap = plt.cm.Blues_r)

  
# нарисовать красную контурную линию, где аномалия
# оценка равна порогу

a = subplot.contour(xx, yy, Z, levels =[threshold],

                     linewidths = 2, colors ='red')

  
# заполнить оранжевые контурные линии где диапазон аномалии
# оценка от порога до максимальной оценки аномалии

subplot.contourf(xx, yy, Z, levels =[threshold, Z.max()], colors ='orange')

  
# разброс графиков прорезей с белыми точками

b = subplot.scatter(X_train[:-n_outliers, 0], X_train[:-n_outliers, 1],

                                    c ='white', s = 20, edgecolor ='k'

  
# точечный график выбросов с черными точками

c = subplot.scatter(X_train[-n_outliers:, 0], X_train[-n_outliers:, 1], 

                                    c ='black', s = 20, edgecolor ='k')

subplot.axis('tight')

  
subplot.legend(

    [a.collections[0], b, c],

    ['learned decision function', 'true inliers', 'true outliers'],

    prop = matplotlib.font_manager.FontProperties(size = 10),

    loc ='lower right')

  

subplot.set_title('K-Nearest Neighbours')

subplot.set_xlim((-10, 10))

subplot.set_ylim((-10, 10))

plt.show() 

Ссылка: https://www.analyticsvidhya.com/blog/2019/02/outlier-detection-python-pyod/

Рекомендуемые посты:

Машинное обучение для обнаружения аномалий

0.00 (0%) 0 votes