Обнаружение аномалий в базе данных

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

У нас есть производственная база данных. Нагрузка на базу данных варьируется в разное время. Я хочу выявить аномалии; например, количество процессов базы данных, отвечающих на запросы пользователей в 9 утра, составляет 100 в определённый день. Если это число равно 200, то это аномалия, и как администратор базы данных, нам нужно немедленно проверить базу данных. Цель состоит в том, чтобы выявить закономерность и предупреждать о событиях вне этой закономерности.

День  время  количество процессов метка
Пн   09:00 100          Нормально
Пн   09:05 150          Нормально
Вт   09:00 200          Аномально

Я использую pandas для сбора данных, но не уверен, как выявлять закономерность и сообщать об аномалиях. Ближайшее, что я смог найти, это эта тема
Как мне подойти к обнаружению сгруппированных аномалий?

Существуют некоторые пакеты для обнаружения аномалий, такие как Luminol от Linkedin (https://github.com/linkedin/luminol) или TagAnomaly от Microsoft (https://github.com/microsoft/TagAnomaly).
Также вы можете использовать алгоритмы кластеризации для ваших признаков и обнаруживать выбросы. Или вы можете пометить свои предыдущие аномалии, чтобы обучить свои данные (хотя это обычно невозможно в большинстве случаев).

Таким образом, моё предложение — подготовить ваши данные с признаками, такими как 5_min_window_processcount_mean, 5_min_window_processcount_std, 5_min_lag_processcount_std и так далее (получить запаздывающие и оконные признаки, а затем вычислить их среднее, стандартное отклонение, медиану и т.д.).

После этого попробуйте кластеризацию и посмотрите, может ли она обнаруживать аномалии или нет. Если нет, попробуйте пометить свои данные этими признаками и использовать алгоритмы классификации. Тем временем вы можете использовать вышеупомянутые пакеты с вашими признаками. (Признаки, основанные на времени с запаздывающими/окнами, очень важны).

Обнаружение аномалий часто рассматривается как задача без учителя (метки не используются для обучения). Это может быть кластеризация, оценка плотности или одноклассовая классификация.

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

С моделированием времени как контекста вы можете использовать одну из стандартных моделей аномалий/выбросов в scikit-learn. Разделите время на его компоненты, например:

время_суток, день_недели, номер_недели

В зависимости от модели вы можете захотеть закодировать день недели с помощью one-hot, так как это может рассматриваться как порядковый признак. В качестве альтернативы вы можете разделить его просто на рабочий день/не рабочий день (и включить также праздники).

Выбор временного интервала для вычисления признаков может быть довольно важным для хорошей производительности. Если имеется значительная естественная вариация, то 5 минут может быть слишком часто. Я бы рассмотрел интервалы в 60, 30 или 15 минут. Затем вы можете вычислить некоторые сводные статистики точек измерений (5 минут или меньше) и использовать их в качестве признаков.

среднее_количество_запросов, стандартное_отклонение_количества_запросов, минимальное_количество_запросов, максимальное_количество_запросов 

Запустите одну из вышеуказанных моделей scikit-learn на этих признаках из исторических данных, чтобы получить оценки аномалий. Постройте оценки в виде гистограммы и установите порог для значения, чтобы получить вашу функцию решения для определения аномалий.

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

Постскриптум: Очень желательно иметь/составить набор помеченных аномалий для валидационного и тестового наборов. Это позволит провести оптимизацию гиперпараметров (таких как выбор порога) и оценку.

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

Обнаружение аномалий в базе данных: детальный анализ и рекомендации

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

Поиск закономерностей и установление аномалий

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

  1. Сбор данных: Используйте pandas для сбора и предварительной обработки данных.

    • Создайте временные метки для дней и времени.
    • Помните, что вам нужен агрегированный подход, учитывающий различные временные интервалы, такие как 5 минут, 15 минут, 30 минут или 1 час.
  2. Создание признаков: Разработайте различные признаки, которые будут включать:

    • Смещение (лаг) старых значений.
    • Среднее, стандартное отклонение, минимальное и максимальное значения запросов за выбранные временные интервалы.
    • Признаки на основе временных компонентов (время суток, день недели и т.д.).
    import pandas as pd
    
    # Пример создания признаков на основе временных данных
    df['time'] = pd.to_datetime(df['time'])
    df.set_index('time', inplace=True)
    df['5_min_mean'] = df['processcount'].rolling('5min').mean()
    df['5_min_std'] = df['processcount'].rolling('5min').std()
  3. Обработка временной составляющей: Поскольку данные имеют временной контекст, оцените временные компоненты, разделив их на более простые переменные, такие как:

    • time_of_day
    • weekday
    • is_workday (Рабочий день или выходной)

    Эти новые признаки помогут в построении более точной модели.

Алгоритмы обнаружения аномалий

Существует несколько методов, которые вы можете применить для выявления аномалий:

  • Кластеризация: Используйте методы кластеризации, такие как K-means или DBSCAN, чтобы выделить группы данных и обнаружить выбросы.
  • Обнаружение по одному классу: Если у вас есть наборы с помеченными аномалиями, вы можете использовать методы классификации, такие как SVM (машины опорных векторов).
  • Алгоритмы, встроенные в scikit-learn: Используйте готовые решения, такие как Isolation Forest, Local Outlier Factor или One-class SVM, чтобы быстро протестировать гипотезу об аномалиях.

    from sklearn.ensemble import IsolationForest
    
    model = IsolationForest()
    model.fit(features)  # 'features' - это ваши подготовленные признаки
    anomalies = model.predict(features)

Рекомендации по визуализации

Важно визуализировать аномалии. Постройте график распределения аномальных значений и пороговых значений, а также проверьте, чтобы известные аномалии прошлого были должным образом зафиксированы. Это поможет вам усовершенствовать ваш алгоритм.

  • График аномальных оценок: Создайте временной ряд с аномальными значениями, чтобы оценить, насколько хорошо ваша модель справляется с задачей.

Подход к поддержанию и улучшению модели

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

Заключение

Эффективное обнаружение аномалий в базе данных требует комплексного подхода и тщательной проработки модели. Используйте методы статистики, машинного обучения и анализа временных рядов, чтобы получить максимальный результат. Такой подход позволит вам не только повысить скорость реагирования на аномалии, но и улучшить общее качество обслуживания вашей базы данных.

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

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