Небольшая наука о данных для обнаружения аномалий
One class SVM: введение
Эксперт или новичок в машинном обучении, вы, вероятно, слышали о Support Vector Machine (SVM) - контролируемом алгоритме машинного обучения, который часто цитируется и используется в задачах классификации. SVM используют гиперплоскости в многомерном пространстве, чтобы отделить один класс наблюдений от другого. Естественно, SVM используется при решении задач мультиклассовой классификации.
Однако SVM также все чаще используется в задаче одного класса, где все данные принадлежат одному классу. В этом случае алгоритм обучается узнавать, что является нормальным, чтобы при отображении новых данных алгоритм мог определить, должны ли они принадлежать к группе или нет. В противном случае новые данные помечаются как необычные или аномальные. Чтобы узнать больше об одноклассной SVM, прочтите длинную статью Ремера Власвельда.
И последнее, о чем стоит упомянуть: если вы знакомы с sklearn
библиотекой, то заметите, что существует алгоритм, специально разработанный для так называемого обнаружения новизны. Он работает аналогично тому, что я только что описал при обнаружении аномалий с использованием одноклассной SVM. На мой взгляд, именно контекст определяет, следует ли называть это обнаружением новизны, обнаружением выбросов или чем-то в этом роде.
Сегодняшняя статья является продолжением моей серии об алгоритмах обнаружения аномалий, выбросов и мошенничества с практическими примерами кодов. Мои предыдущие 7 статей касались различных инструментов и методов, доступных в области обнаружения аномалий, если вам интересно узнать о них, следующие ссылки:
- DBSCAN, неконтролируемый алгоритм
- Эллиптический конверт
- Фактор местного выброса (LOF)
- Z-оценка
- Коробчатый сюжет
- Статистические методы
- Обнаружение аномалий временных рядов
Ниже представлена простая демонстрация одноклассной SVM на языке программирования Python. Обратите внимание, что я использую выброс и аномалию как синонимы.
Шаг 1. Импортируйте библиотеки
Для этой демонстрации нам понадобятся три основные библиотеки - для обработки данных python
и numpy
, для построения модели sklearn
и для визуализации matlotlib
.
# import libraries import pandas as pd from sklearn.svm import OneClassSVM import matplotlib.pyplot as plt from numpy import where
Шаг 2. Подготовьте данные
Я использую знаменитый набор данных Iris из онлайн-источника, поэтому вы можете практиковаться, не беспокоясь о том, где взять данные и как их очистить.
# import data data = pd.read_csv("https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv") # input data df = data[["sepal_length", "sepal_width"]]
Шаг 3: моделирование
Вместо настройки гиперпараметров, как в других алгоритмах классификации, SVM одного класса использует nu в качестве гиперпараметра, который используется для определения того, какая часть данных должна быть классифицирована как выбросы. nu = 0,03 означает, что алгоритм определит 3% данных как выбросы.
# model specification model = OneClassSVM(kernel = 'rbf', gamma = 0.001, nu = 0.03).fit(df)
Шаг 4: Прогноз
Прогнозируемый набор данных будет иметь либо 1, либо -1 значения, где -1 значения - выбросы, обнаруженные алгоритмом.
# prediction y_pred = model.predict(df) y_pred
Шаг 5: фильтрация аномалий
# filter outlier index outlier_index = where(y_pred == -1) # filter outlier values outlier_values = df.iloc[outlier_index] outlier_values
Шаг 6: Визуализация аномалий
# visualize outputs plt.scatter(data["sepal_length"], df["sepal_width"]) plt.scatter(outlier_values["sepal_length"], outlier_values["sepal_width"], c = "r")
Резюме
В этой статье я хотел сделать краткое введение в One-Class SVM - алгоритм машинного обучения, используемый для обнаружения мошенничества / выбросов / аномалий. Я показал несколько простых шагов, чтобы развить интуицию, но, конечно, для реальной реализации потребовалось бы гораздо больше экспериментов, чтобы выяснить, что работает, а что нет для конкретного контекста и отрасли.
Спасибо, что следили за мной, чтобы узнать больше о моей работе, вы можете подписаться на меня в Twitter или LinkedIn.