Обнаружение аномалий временных рядов с помощью Python


10

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

Описание данных: это месячные данные временных рядов, которые только начали собираться за последние 2 года или около того (т.е. только 24-36 временных периодов). По сути, существует несколько показателей, которые отслеживаются ежемесячно для нескольких клиентов.

time_period    client    metric    score
01-2013        client1   metric1   100
02-2013        client1   metric1   119
01-2013        client2   metric1   50
02-2013        client2   metric2   500
...

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

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


Я не знаю пути Python, но этот вопрос полон идей относительно общих подходов: stats.stackexchange.com/questions/26688/…
rapaio

pypi.org/project/anomaly-detection Он встроен в библиотеку для обнаружения аномалий в python, которая аналогична обнаружению аномалий в Twitter. Так как код обнаружения аномалий в твиттере написан на языке R. Ваша проблема - контекстная аномалия. Модель Auto.arima тоже
saravanan saminathan

Ответы:


1

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


Я прочитаю это. Этот метод хорош для временных рядов с небольшими объемами данных (например, 24 месяца)?
Эрик Миллер

прочитал большую часть этого. Согласно этому методу, я должен рассчитать 3-е стандартное отклонение для временного ряда и построить график на этих границах. Если значение когда-либо превышает эти пределы, отметьте его. Это метод, который я рассмотрел.
Эрик Миллер

1

Существует множество вариантов обнаружения аномалий, от стандартного отклонения с использованием функции отклонения Pandas std, до байесовского метода и множества методов машинного обучения, таких как: кластеризация, SVM, гауссовский процесс, нейронные сети.

Взгляните на этот учебник: https://www.datascience.com/blog/python-anomaly-detection

С байесовской точки зрения я рекомендую Facebook Prophet. Это дает очень продвинутые результаты без необходимости быть экспертом временного ряда. У него есть опции для работы с месяцами, днями и т. Д., И «интервалы неопределенности» помогают при аномалиях.

Наконец, я рекомендую этот блог Uber об использовании нейронных сетей (LSTM) для обнаружения аномалий, он содержит очень полезную информацию: https://eng.uber.com/neural-networks/


0

Если вы хотите предположить, что ваш набор данных нормально распределен, то вы можете оценить квантили этого распределения и посмотреть, выходит ли он за пределы, например, 95%, 80% и т. Д. Квантиль. Я не слишком знаком с библиотеками Python, но уверен, что для этого уже есть встроенные функции.


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

2
Тогда нет в этом случае. Я полагаю, что метод ниже меня и вашего будет хорошо работать в этой ситуации. Раньше я делал нечто похожее на это: взять скользящее скользящее среднее за период X, вычесть текущее значение метрики из скользящего среднего. Найдите границы стандартного отклонения (или используйте субъективные входные данные, если вы случайно узнали об этом сценарии) этих остатков, и все, что выше или ниже этих границ, можно считать аномалией. Этот метод будет хорошо работать, если клиент внезапно увидит увеличение оценки.
Кевин Пей
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.