Как я могу найти аномалии в каждой строке данных?

Вопрос или проблема

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

-----------------------------------------------------------------------------
| Объект    | Посетители в янв. 2017 | Посетители в фев. 2017 | Посетители в марте 2017 |
-----------------------------------------------------------------------------
| Объект 1  |         1234           |           1345         |  100345                 |
----------------------------------------------------------------------------
| Объект 2  |         56             |           567          | 34                      |
----------------------------------------------------------------------------

Как обучить эту pandas dataframe по строкам таким образом?

Планирую использовать одно-классовую SVM из sklearn. Хочу выявить аномалии в каждом объекте, например, в объекте 1 я бы отметил 100345 как аномалию. У меня есть данные за несколько лет. Пока мы здесь, я совсем новичок в ML и науке о данных, могу ли я получить ссылку на сжатый учебный курс по обучению без учителя, большинство из тех, что я встречаю, предназначены для обучения с учителем.

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

Для обнаружения выбросов в случае обучения без учителя просто ознакомьтесь с курсом машинного обучения Эндрю Нга на Coursera, там есть глава о выявлении аномалий на основе гауссового ядра. Вы также можете почитать документы sklearn о OneClassSVM, LocalOutlierFactor и т.д. Основная идея обучения без учителя в обнаружении аномалий заключается в том, чтобы установить метрику для описания сродства между образцами и затем использовать пороговое значение, определяемое пользователем, чтобы решить, является ли новый образец достаточно похожим на другие.

Предполагая отсутствие связей между объектами, самый простой способ сделать обнаружение выбросов в вашей dataframe — это рассматривать каждый объект как отдельный набор данных и анализировать каждый по отдельности. Таким образом, обучите одну модель для каждого объекта. Вкратце, в случае обучения без учителя вы хотите подогнать модель к набору данных, которая возвращает оценку или меру расстояния. Это позволит вам судить, какие точки являются выбросами.

Для одно-классовой SVM вы можете адаптировать код и примеры с страницы sklearn о новизне и обнаружении выбросов или примера с изоляционным лесом, но учитывайте, что вам нужно будет рассматривать только один объект за раз.

Если вы не против отказаться от обучения без учителя и готовы рассмотреть более простой подход, постройте распределение каждого объекта в виде гистограммы и временного ряда, чтобы выяснить, какие количества выбросов ожидать и в каком масштабе (если только количество объектов не делает это невозможным).

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

Ответ или решение

Определение аномалий в строках данных, таких как в вашем случае, может быть выполнено посредством различных методов анализа данных и машинного обучения. Особенностью представленного вами набора данных является то, что он включает ежемесячные отчеты по посещаемости для различных объектов (Facility). В таких данных аномалии могут быть связаны с резкими изменениями в количестве посетителей, что и было продемонстрировано на примере Facility 1, где мартовская посещаемость резко отличается от предыдущих месяцев.

Теория

Аномалия в данных — это наблюдение, которое существенно отклоняется от других наблюдений в наборе данных. Аномалии часто указывают на важные события или ошибки в данных, которые требуют внимания. В задачах временных рядов такие аномалии могут означать, например, выход из строя оборудования, изменения в поведении потребителей или проблемы с источниками данных.

Для решения задачи обнаружения аномалий в условиях отсутствия обучения с учителем может быть использован метод поддержки векторных машин (SVM) для одного класса из библиотеки Scikit-learn. Это метод обучающегося на данных без аномалий и задача которого — идентифицировать аномальные записи.

Пример

Рассмотрим пример применения One-Class SVM в Python с использованием библиотеки Scikit-learn. Условно предполагаем, что для обучения мы используем данные за предыдущие периоды, не включающие известных аномалий.

import pandas as pd
from sklearn.svm import OneClassSVM
import numpy as np

# Пример данных
data = {
    '2017 Jan Visitors': [1234, 56],
    '2017 Feb Visitors': [1345, 567],
    '2017 March Visitors': [100345, 34]
}

df = pd.DataFrame(data)

# Перенос данных в numpy массив
X = df.values

# Инициализация и обучение модели One-Class SVM
model = OneClassSVM(kernel='rbf', gamma=0.1, nu=0.1)
model.fit(X)

# Предсказание аномалий
pred = model.predict(X)

# Запись результата
df['Anomaly'] = pred
print(df)

В данном примере SVM инициализирован с ядром радиальной базисной функции (RBF). Это ядро часто используется, так как хорошо справляется с проблемами нелинейности. Параметры nu и gamma подбираются эмпирически в зависимости от данных.

Применение

Теперь, когда у нас есть общее представление о подходе, давайте рассмотрим его в контексте данной задачи:

  1. Подготовка данных: Преобразуйте ваши данные так, чтобы каждая строка представлялась в числовом формате. Для каждой строки данных (в данном случае для каждого объекта) вы получите временной ряд данных.

  2. Обучение модели: Используйте метод One-Class SVM для обучения модели на временных рядах данных каждого объекта в отдельности. Необходимо обучить отдельную модель для каждого объекта, так как данные, характеризующие число посетителей одного объекта, вероятно, не сопоставимы с данными других объектов.

  3. Определение аномалий: После того как модель обучена, вы сможете определить, какие из значений считаются аномальными, основываясь на предсказаниях модели. Аномалии будут те точки, которые модель определяет как «не принадлежащие классу» (обычно обозначаются как -1).

  4. Анализ результатов: Особенно важно анализировать результаты, чтобы понять причины аномалий. Например, значительные рост или спад в посещаемости могут быть связаны с внешними факторами, такими как сезонные изменения или события.

Дополнительно

Важной частью работы с аномалиями является их верификация. При детектировании аномалий необходимо учитывать контекст данных и факторы, которые могут влиять на результаты. Кроме того, моя рекомендация — ознакомиться с теорией временных рядов и аномалий, что поможет лучше интерпретировать результаты. Онлайн-курсы, такие как курс Эндрю Ы в Coursera, могут стать отличным началом. Помимо этого, документация Scikit-learn предоставляет множество примеров и советов по настройке параметров моделей.

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

Оцените материал
Добавить комментарий

Капча загружается...