Який алгоритм слід використовувати для виявлення аномалій у часових рядах?


69

Фон

Я працюю в Центрі мережевих операцій, ми відстежуємо комп'ютерні системи та їх роботу. Однією з ключових показників для моніторингу є кількість відвідувачів / клієнтів, які зараз підключені до наших серверів. Щоб зробити його видимим, ми (команда Ops) збираємо такі показники, як дані часових рядів та малюємо графіки. Графіт дозволяє нам це робити, він має досить багатий API, який я використовую для побудови системи оповіщення для сповіщення нашої команди, якщо трапляються раптові падіння (в основному) та інші зміни. Наразі я встановив статичний поріг на основі середнього значення, але він працює не дуже добре (є багато хибнопозитивних) через різне навантаження вдень та тижні (коефіцієнт сезонності).

Це виглядає приблизно так: кількість користувачів у системі

Фактичні дані (приклад для однієї метрики, часовий діапазон 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, який отримує останні точкові дані, порівнює їх із середніми історичними показниками та попереджає, якщо є різка зміна чи падіння. Через сезонність "статичний" поріг не працює добре, і сценарій генерує помилкові сповіщення. Я хочу вдосконалити алгоритм оповіщення, щоб бути більш точним і змусити його працювати без постійної настройки порогу оповіщення.

Що мені потрібно порадити і речі, які я виявив

За допомогою googling я зрозумів, що шукаю алгоритми машинного навчання для виявлення аномалій (без нагляду). Подальше дослідження показало, що їх є багато, і дуже важко зрозуміти, який із них застосовний у моєму випадку. Через свої обмежені знання з математики я не можу читати складних наукових робіт і шукаю для початківців чогось простого.

Мені подобається Python і трохи знайомий з R, тому я буду радий побачити приклади цих мов. Будь ласка, рекомендуйте гарну книгу чи статтю, яка допоможе мені вирішити свою проблему. Дякую за ваш час і вибачте мене за такий довгий опис

Корисні посилання

Подібні запитання:

Зовнішні ресурси:


1
Ви подивилися на один із найпростіших алгоритмів, як CUSUM?
Владислав Довгалець

@xeon, ще не. Я новачок у цій темі і мені потрібен певний час, щоб усе переварити. Дякую за те, що ви
довели

1
Це чудове запитання, @ ma-ge. У мене схожий сценарій. Мій підхід полягав у налаштуванні сповіщень, будуючи постійні періодичні прогнози, використовуючи 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).
Алекс Вулфорд

3
Хлопці з Twitter написали дуже цікаву статтю на цю тему. Перевірте це: blog.twitter.com/2015/…
ognjenz

Гей @IlyaKhadykin Сподіваюся, у тебе все добре! ви коли-небудь отримували рішення для цієї проблеми. Я роблю щось саме таке, в якому щохвилини ми маємо певних користувачів, і ми також отримуємо багато хибних позитивів. На сьогоднішній день ми обчислюємо бал за кожні 5 хвилин інтервальних даних і співставляємо їх з історичною схемою. ЯКЩО ВИ ОПИТАТИСЯ ЯКЩО ПРАВИЛЬНИЙ АЛГОРИТМ РОБОТИ, МОЖЕТЕ ВИ ПОДІЛИТИСЯ, ЯК ВИ ЗДОРОВИЛИ Спасибі заздалегідь!
ak3191

Відповіді:


23

Я думаю, що ключ - це "несподіваний" класифікатор у вашому графіку. Для того, щоб виявити несподіване, вам потрібно мати уявлення про те, що очікується .

Я б почав із простої моделі часових рядів, таких як AR (p) або ARMA (p, q). Пристосовуйте його до даних, додайте сезонність, якщо це доречно. Наприклад, модель SAR (1) (24) може бути: , де - час у годинах. Отже, ви б прогнозували графік на наступну годину. Щоразу, коли помилка передбачення "занадто велика", ви накидаєте попередження.yt=c+ϕyt1+Φ24yt24+Φ25yt25+εttet=yty^t

Оцінивши модель, ви отримаєте дисперсію помилки . Залежно від ваших припущень щодо розподілу, таких як звичайні, ви можете встановити поріг, виходячи з ймовірності, наприклад, на 99,7% або односторонній .σεεt|et|<3σεet>3σε

Кількість відвідувачів, ймовірно, досить наполеглива, але суперсезонна. Можливо, краще спробувати сезонних манекенів замість мультиплікативної сезонності, тоді ви спробуєте ARMAX, де X означає екзогенні змінні, які можуть бути будь-якими на кшталт пустуючих манекенів, манекенів години, манекенів вихідних тощо.


5
Цей підхід передбачає специфічну модель ARIMA, яка матиме упереджені параметри на основі аномалій, які, по суті, вважаються неіснуючими. Більш загальним підходом було б ТАКОЖ спочатку визначити аномалії, а потім оптимальну модель ARIMA, що веде до вбудованих тестів значущості. Крім того, аномалії можуть бути змінами рівня, сезонними імпульсами та місцевими тенденціями часу, які потребують більш загального рішення, ніж тут пропонується. Дивіться unc.edu/~jbhill/tsay.pdf про комплексну процедуру. Ви також можете надати Google "автоматичне виявлення втручання" для отримання додаткової інформації.
IrishStat

@IrishStat Я запропонував ARIMAX з манекенами для подій. ОП може пояснювати відомі події, такі як збої на веб-сайті з манекенами. Це зменшить відхилення помилок, і буде більше сповіщень. Немає підстав будувати складну модель, оскільки просто неможливо врахувати все, що стосується трафіку веб-сайтів. Найпростіші моделі будуть працювати найкраще.
Аксакал

2
@ ma-ge, ще одне: ви можете використовувати інтервали, що перекриваються. Скажімо, ви збираєте дані щохвилини, але для моделювання ви можете вибрати крок за 10 хвилин. Це створює деякі проблеми для estimaton (за рахунок автокореляції), але отримана модель, швидше за все, буде більш надійною.
Аксакал

@Aksakal Моделі повинні бути настільки простими, наскільки це необхідно, АЛЕ не надто просто.
IrishStat

17

У технологічному блозі Netflix є стаття про їхній надійний інструмент виявлення аномалій (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


12

Більшість алгоритмів виявлення зовнішніх джерел у пакеті з відкритим кодом - це дані про бізнес-часові ряди із низькою частотою, щоденними / щоденними / щомісячними даними. Ці дані, схоже, є для спеціалізованої області, яка захоплюється за лічені хвилини, тому я не впевнений, чи не буде корисним викриття з відкритим кодом. Ви можете спробувати адаптувати цей підхід до своїх даних.

Нижче я окреслюю декілька доступних пакетів підходів у відкритому коді R:

  1. tsoutliers : реалізовує алгоритм виявлення Чен та Лю в межах арима. дивіться моє попереднє запитання на цьому сайті. Фантастичний підхід, але дуже повільно, не впевнений, чи зможе він обробляти високочастотні дані, як ваш. Це має перевагу в виявленні всіх типів людей, що втратили життя, як зазначено в моєму попередньому запитанні.
  2. Виявлення аномалії Twitter : Використовує алгоритм Роснера для виявлення аномалій на основі часових рядів. Алгоритм розкладає часові серії, а потім виявляє аномалії. На мою особисту думку, це виявляється неефективно та точно у виявленні невдач у часових рядах.
  3. tsoutlier в пакеті прогнозів: Аналогічний алгоритму щебетання з точки зору декомпозиції часових рядів, а потім виявлення залишків. Виявлятимуть лише добавки, що відпадають або імпульси.

Існують комерційні пакети, які мають спеціалізовані підходи до спроб виявлення аномалій. Ще одним класичним підходом є алгоритм виявлення зовнішніх часових рядів Цей , подібний до підходу Чена та Лю, який виявляє різні типи людей, що вижили. Нещодавно я також натрапив на це комерційне програмне рішення під назвою metafor, яке, можливо, більше підходить для ваших даних.

Сподіваюся, це корисно


Дякую, це дає мені погляд на подібні проблеми та підходи; особлива подяка за посилання!
Ілля Хадикін

Якщо хтось шукає Metafor, ми придбали Splunk. Наші алгоритми TSAD включені в останні версії Splunk IT Service Intelligence ("ITSI").
Алекс Круз

4

Ви спробували використовувати правила статистичного контролю процесів (наприклад, Western Electric http://en.wikipedia.org/wiki/Western_Electric_rules )?

Я використовую їх для даних часових рядів - часто з інтуїцією щодо даних - для оцінки того, чи збираються ці дані кудись, я не хочу, щоб вони йшли. Як і у вашому прикладі, ці правила говорять, якщо дельта / зміна є послідовною для декількох точок даних, вони позначають, що може виникнути проблема.

Також статистичний контроль процесів (SPC) може бути корисним для відпрацювання, якщо ви стаєте кращими чи гіршими, ніж раніше.

Одне з проблем SPC полягає в тому, що значна частина його покладається на звичайний розподіл, який, ймовірно, не відповідає вашим даним, який не може опуститися нижче нуля. Інші кращі, ніж я з SPC, можуть запропонувати тут варіанти. Мені подобається використовувати його для позначення проблеми, але, як і всі моделі, найкраще використовувати із знанням про самі дані (та джерело).


4

Інші відповіді, схоже, не згадують - це те, що ваша проблема звучить як виявлення зміни точки . Ідея виявлення шангапойду полягає в тому, що ви шукаєте сегменти ваших даних, які суттєво відрізняються за властивостями термінів (наприклад, середня, дисперсія). Цього можна досягти, використовуючи максимальну оцінку ймовірності, де для змінних точок є ймовірність функціїm

L(m,τ1:m,θ1:(m+1))=i=1m+1p(y(τi1+1):τiθi)

де - ваші дані, - граничні точки, що позначають зміни, а розподіли ймовірностей параметризуються для кожного -го відрізка. Це можна легко узагальнити для перегляду різноманітних ситуацій. Існує ряд алгоритмів для пошуку параметрів, включаючи пошук невідомого . Існує також програмне забезпечення, яке доступне для оцінки таких моделей, наприклад пакет для R. Якщо ви хочете дізнатися більше, ви можете перевірити наступні публікації та посилання, які вони надають:y1,,yn1<τ1<<τm<npθiimchangepoint

Ребекка Кіллік та Ідріс А. Еклі. (2013) пункт зміни : пакет R для аналізу точок змін. (онлайн-папір)

Eckley, IA, Fearnhead, P. and Killick, R. (2011) Аналіз моделей змінних точок . [в:] Байєсові моделі часових рядів , ред. Д. Барбер, А. Т. Чемгіл та С. Чіаппа, Кембриджський університетський прес.


4

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

Просте розрізнення в один крок виявить раптове падіння від попереднього значення

yt=ytyt1

але якщо серія має сильний періодичний компонент, ви очікуєте, що цей спад буде регулярним. У цьому випадку було б краще порівняти будь-яке значення зі своїм аналогом у тому ж самому пункті попереднього циклу, тобто за один період тому.

yt=ytytnwhere n=length of period

У випадку розміщеного питання було б природно очікувати двох важливих періодичних компонентів, один - тривалість дня, інший - тривалість тижня. Але це не є особливим ускладненням, оскільки тривалість більш тривалого періоду може бути акуратно розділена на довжину коротшого.

Якщо вибірка проводиться щогодини, у наведеному рівнянні має бути встановлено наn247=168

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

yt=ytytn

Я робив кілька тестів в R, використовуючи модельований набір даних. У ній дані відбираються 6 разів на день і є сильний щоденний та тижневий періоди, разом з іншими шумами та коливаннями. Краплі додавали у випадкових місцях і тривалістю від 1 до 3.
Для виділення крапель спочатку розраховували співвідношення на відстані 42, потім поріг, встановлений у 0,6, оскільки представляє інтерес лише негативна зміна певного розміру. Потім розраховувались ступінчасту різницю і встановлювали поріг у -0,5. Зрештою, схоже, один хибний позитив проскочив (той, що відбувся наприкінці 16 тижня). Графіки зліва та справа показують однакові дані, лише різними способами.

введіть тут опис зображення


3

Чи було б корисніше думати про зміни часового ряду як початок нового тренду, а не про аномалію? Визначення різниці між суміжними точками допоможе визначити, коли нахил (похідна) змінюється і може сигналізувати про початок нового тренду в даті. Також може бути корисним прийняття відмінностей значень різниці (друга похідна). Пошук у Google за "початком тренду часових рядів" може дати хороші пропозиції щодо методів. У фінансових даних пізно приділяється уваги новим тенденціям (ви купуєте чи продаєте?), Тому на цю тему є статті.

Хорошим вступом до вейвлет є "Світ згідно вейвлетам" Хаббарда, який я вважаю автором.


2

Мені вдалося отримати хороші результати для багатосезонних часових рядів (щоденних, тижневих) за допомогою двох різних алгоритмів:

  • Розклад сезонного тренду, використовуючи льос (або STL) для встановлення середини середньої точки.
  • Нелінійна регресія для встановлення порогів навколо цієї середини, виходячи з співвідношення між дисперсією та рівнем.

STL декомпозиція часової області вашого часового ряду на компонент тренду, окремий сезонний компонент та залишок. Сезонний компонент - це ваша високочастотна сезонність (наприклад, щоденна), тоді як тенденція включає як низькочастотну сезонність (наприклад, тижневу), так і належну тенденцію. Ви можете розділити ці два, просто запустивши STL знову в тренді. У будь-якому випадку, коли ви ізолюєте решту рядів від інших компонентів, ви можете виконати своє виявлення аномалії проти цієї серії.

Тут я зробив більш детальну реєстрацію:

https://techblog.expedia.com/2016/07/28/applying-data-science-to-monitoring/


1

Надихнувшись Девідом, ви намагалися використовувати FFT? Можливо, ви зможете помітити раптові краплі, оскільки вони вказують на ваші аномалії. Аномалії можуть проявлятися у вузькому спектрі. Таким чином, ви можете легко їх захопити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.