Фон
Я работаю в Центре сетевых операций, мы отслеживаем компьютерные системы и их производительность. Одним из ключевых показателей для мониторинга является количество посетителей \ клиентов, которые в настоящее время подключены к нашим серверам. Чтобы сделать это видимым, мы (команда Ops) собираем такие метрики, как данные временных рядов и рисуем графики. Graphite позволяет нам делать это, имеет довольно богатый API, который я использую для создания системы оповещений, чтобы уведомлять нашу команду о внезапных падениях (в основном) и других изменениях. На данный момент я установил статический порог, основанный на значении avg, но он не очень хорошо работает (есть много ложных срабатываний) из-за разной нагрузки в течение дня и недели (фактор сезонности).
Это выглядит примерно так:
Фактические данные (пример для одной метрики, 15-минутный интервал времени; первое число - количество пользователей, второе - метка времени):
[{"target": "metric_name", "datapoints": [[175562.0, 1431803460], [176125.0, 1431803520], [176125.0, 1431803580], [175710.0, 1431803640], [175710.0, 1431803700], [175733.0, 1431803760], [175733.0, 1431803820], [175839.0, 1431803880], [175839.0, 1431803940], [175245.0, 1431804000], [175217.0, 1431804060], [175629.0, 1431804120], [175104.0, 1431804180], [175104.0, 1431804240], [175505.0, 1431804300]]}]
Чего я пытаюсь достичь
Я создал скрипт Python, который получает последние точки данных, сравнивает их с историческим средним и оповещает, если происходит внезапное изменение или падение. Из-за сезонности «статический» порог не работает, а скрипт генерирует ложные срабатывания. Я хочу улучшить алгоритм оповещения, чтобы быть более точным и заставить его работать без постоянной настройки порога оповещения.
Какие советы мне нужны и что я обнаружил
Погуглив, я понял, что ищу алгоритмы машинного обучения для обнаружения аномалий (неконтролируемые). Дальнейшее расследование показало, что их множество, и очень сложно понять, какой из них применим в моем случае. Из-за моего ограниченного знания математики я не могу читать сложные научные труды, и я ищу что-то простое для начинающего в этой области.
Мне нравится Python и я немного знаком с R, поэтому буду рад увидеть примеры для этих языков. Пожалуйста, порекомендуйте хорошую книгу или статью, которая поможет мне решить мою проблему. Спасибо за ваше время и простите за такое длинное описание
Полезные ссылки
Похожие вопросы:
- Временные ряды и обнаружение аномалий
- Обнаружение аномалий временных рядов с помощью Python
- Аномалии временных рядов
- Алгоритмы обнаружения аномалий временных рядов
- Применение вейвлетов к алгоритмам обнаружения аномалий на основе временных рядов
- Какой алгоритм я должен использовать?
Внешние ресурсы:
auto.arima
функцию из превосходного forecast
пакета R (см. Jstatsoft.org/v27/i03/paper ). Вы можете настроить уровни достоверности, отрегулировав level
параметр, например data.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99)
.