Фон
Я работаю в Центре сетевых операций, мы отслеживаем компьютерные системы и их производительность. Одним из ключевых показателей для мониторинга является количество посетителей \ клиентов, которые в настоящее время подключены к нашим серверам. Чтобы сделать это видимым, мы (команда 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)
.Ответы:
Я думаю, что ключ является «неожиданным» классификатором в вашем графике. Чтобы обнаружить неожиданное, вам нужно иметь представление о том, что ожидается .
Я бы начал с простой модели временных рядов, такой как AR (p) или ARMA (p, q). Подгоните его под данные, добавьте сезонность по мере необходимости. Например, ваша модель SAR (1) (24) может быть: , где - время в часах. Итак, вы будете предсказывать график на следующий час. Всякий раз, когда ошибка прогнозирования "слишком велика", вы предупреждение. т е т = у т - у тyt=c+ϕyt−1+Φ24yt−24+Φ25yt−25+εt t et=yt−y^t
Оценив модель, вы получите дисперсию ошибки . В зависимости от ваших предположений о распределении, например нормальных, вы можете установить порог на основе вероятности, например для 99,7% или односторонний .ε t | е т | < 3 σ ε e t > 3 σ εσε εt |et|<3σε et>3σε
Количество посетителей, вероятно, довольно постоянное, но супер сезонное. Может быть лучше попробовать сезонные манекены вместо мультипликативной сезонности, тогда вы попробуете ARMAX, где X обозначает экзогенные переменные, которые могут быть чем-то вроде праздничных манекенов, часовых манекенов, манекенов выходных и т. Д.
источник
В техническом блоге Netflix есть статья об их инструменте Robust Anomaly Detection (RAD). http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html
Он имеет дело с сезонностью и очень большими объемами данных, поэтому он может соответствовать вашим требованиям. Код с открытым исходным кодом Java и Apache Pig https://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig
Базовый алгоритм основан на надежном PCA - см. Оригинальную статью здесь: http://statweb.stanford.edu/~candes/papers/RobustPCA.pdf
источник
Большинство алгоритмов обнаружения выбросов в пакете с открытым исходным кодом предназначены для данных бизнес-временных рядов с низкой частотой, ежедневной / еженедельной / ежемесячной частотой данных. Эти данные, по-видимому, относятся к специализированной области, которая регистрируется в течение нескольких минут, поэтому я не уверен, будет ли полезным определение выбросов с открытым исходным кодом. Вы можете попытаться адаптировать этот подход к вашим данным.
Ниже я обрисовываю некоторые доступные подходы пакетов в open source
R
:Существуют коммерческие пакеты, в которых есть специальные подходы для обнаружения аномалий. Другим классическим подходом является алгоритм определения выбросов Цая по временным рядам, аналогичный подходу Чена и Лю, он обнаруживает различные типы выбросов. Недавно я также наткнулся на это коммерческое программное решение под названием metafor, которое может быть более подходящим для ваших данных.
Надеюсь, это полезно
источник
Кажется, что другие ответы не упоминали, что ваша проблема звучит как обнаружение точки изменения . Идея обнаружения changeapoint заключается в том, что вы ищете сегменты в ваших данных, которые значительно различаются по свойствам терминов (например, среднее значение, дисперсия). Это может быть достигнуто с использованием оценки максимального правдоподобия, где для точек изменения функция правдоподобияm
где - ваши данные, - граничные точки, обозначающие изменения, а распределения вероятности параметризованы для каждого сегмента. Это может быть легко обобщено на различные ситуации. Существует ряд алгоритмов для нахождения параметров, включая поиск неизвестного . Существует также программное обеспечение, которое доступно для оценки таких моделей, например, пакет для R. Если вы хотите узнать больше, вы можете проверить следующие публикации и ссылки, которые они предоставляют: 1 < τ 1 < ⋯ < τ m < n p θ i i my1,…,yn 1<τ1<⋯<τm<n p θi i m
changepoint
источник
Вы пробовали использовать правила статистического контроля процессов (например, Western Electric http://en.wikipedia.org/wiki/Western_Electric_rules )?
Я использую их для данных временных рядов - часто с легкой интуицией в отношении данных - чтобы оценить, куда идут данные, и я не хочу, чтобы они шли. Как и в вашем примере, эти правила говорят, что если дельта / изменение согласовано в нескольких точках данных, это указывает на возможную проблему.
Также Статистический контроль процесса (SPC) может быть полезен для тренировки, если вы становитесь лучше или хуже, чем раньше.
Одна проблема с SPC заключается в том, что большая часть его зависит от нормального распределения, которое, вероятно, не подходит вашим данным, которые не могут быть ниже нуля. Другие лучше, чем я с SPC могут предложить варианты здесь. Мне нравится использовать его, чтобы пометить проблему, но, как и все модели, лучше всего использовать с зерном знаний о самих данных (и источника).
источник
Учитывая, что периодичность временного ряда должна быть хорошо понята, можно разработать простой, но эффективный алгоритм, основанный на дифференцировании.
Простое одношаговое различие обнаружит внезапное падение от предыдущего значения
но если ряд имеет сильный периодический компонент, вы ожидаете, что это падение будет значительным на регулярной основе. В этом случае было бы лучше сравнить любое значение с его аналогом в той же точке в предыдущем цикле, то есть один период назад.
В случае заданного вопроса было бы естественно ожидать двух значимых периодических компонентов: один - продолжительность дня, а другой - неделю. Но это не большая сложность, так как длина более длинного периода может быть аккуратно разделена на длину более короткого периода.
Если выборка проводится каждый час, в приведенном выше уравнении должно быть равно24 ∗ 7 = 168n 24∗7=168
Если капли имеют более пропорциональный характер, простая разница легко не сможет обнаружить внезапное падение при низкой активности. В таких обстоятельствах алгоритм может быть изменен для расчета коэффициентов вместо этого.
Я провел несколько тестов в R, используя смоделированный набор данных. В нем данные отбираются 6 раз в день, и существуют сильные ежедневные и еженедельные периоды, наряду с другими шумами и колебаниями. Капли добавляли в случайных местах и продолжительностью от 1 до 3.
Для выделения капель сначала рассчитывали отношения на расстоянии 42, а затем пороговое значение, установленное на 0,6, поскольку представляет интерес только отрицательное изменение определенного размера. Затем была рассчитана разница в один шаг, и пороговое значение было установлено равным -0,5. В конце концов один ложный положительный результат, похоже, проскользнул (тот, что в конце недели 16). Графики слева и справа показывают одни и те же данные, только по-разному.
источник
Было бы более полезно думать об изменениях во временных рядах как о начале новой тенденции, а не как об аномалии? Изучение разницы между соседними точками поможет определить, когда меняется наклон (производная), и может сигнализировать о начале нового тренда в дате. Также может быть полезно взять различия значений разности (вторая производная). Выполнение поиска в Google по «началу временного ряда» может дать хорошие подсказки для методов. В финансовых данных последнее внимание уделяется новым тенденциям (вы покупаете или продаете?), Поэтому есть статьи на эту тему.
Хорошее вступление к вейвлету - «Мир по вейвлетам» Хаббарда. Я считаю, что это автор.
источник
Мне удалось получить хорошие результаты для временных рядов с несколькими сезонностями (ежедневно, еженедельно), используя два разных алгоритма:
STL выполняет декомпозицию временной области вашего временного ряда на компонент тренда, один сезонный компонент и остаток. Сезонный компонент - это ваша высокочастотная сезонность (например, ежедневно), тогда как тренд включает в себя как низкочастотную сезонность (например, еженедельно), так и сам тренд. Вы можете разделить их, просто запустив STL снова на тренде. В любом случае, как только вы изолируете оставшуюся серию от других компонентов, вы можете выполнить обнаружение аномалий по этой серии.
Я сделал более подробную запись здесь:
https://techblog.expedia.com/2016/07/28/applying-data-science-to-monitoring/
источник
Вдохновленный Дэвидом, вы пытались использовать БПФ? Это может быть в состоянии обнаружить внезапные падения, потому что они указывают на ваши аномалии. Аномалии могут появляться в узком спектре. Таким образом, вы можете легко захватить их.
источник