Играем с Anomaly Detector в Cognitive Services от Microsoft

0
3242

В анализе данных есть несколько направлений для поиска аномалий: детектирование выбросов (Outlier Detection) и «новизны» (Novelty Detection).

Но перед тем, как рассматривать поиск аномалий, необходимо рассмотреть независимое исключение весов. Переход к групповому случаю не представляет существенных сложностей. Следуя стандартной схеме ARD, пусть априорное распределение на веса будет нормальным с центром в нуле p(w) =N(0,α^2), апостериорное — нормальным с произвольными параметрами qφ(w)=N(μ,σ^2), где μ ∈ Rm, α, σ∈Rm×mиα,σ — диагональные матрицы. Далее для упрощения выкладок считается, что σi=σii. KL-дивергенция для отдельного веса wi будет выглядеть так:

Можно исключить веса α, выразив их максимальные значения через μ и σ:

Тогда первую формулу можно упростить:

и итоговая формула примет вид … и тут вы такие «Чиго?! Слышь, Масян, воу, воу, палехче, мы тут пост пришли читать, чо началось-то?». ;)

Чуть меньше года назад когнитивные сервисы Microsoft пополнились новым сервисом — Anomaly Detector. Если простыми словами, то это обычный REST API сервис, который позволяет отслеживать и обнаруживать отклонения в данных временных рядов с помощью машинного обучения. Вы отправляете ему JSON обект, а он скажет, что из этих данных выбивается из общих значений. Данные можно отправлять, как в реалтайме (real-time) или в потоковой передаче, так и просто на проверку целой пачкой (batch).

Сразу, наше любимое, 20 000 запросов в месяц — бесплатно. Мы же любим, когда что-то бесплатно. ;)

Так, это всё классно, но какие данные мы можем туда отправить? Первое, что приходит в голову и каких данных точно в избытке, то это данные системы мониторинга. Почему бы и нет? У нас есть постоянно наполняемая база счетчиков производительности, есть метрики изменений CPU, RAM, объема диска и т.д. К сожалению, у меня нет никаких IoT-устройств, где бы можно было отследить температуру, влажность или другие показания. Как мне кажется, то это один из наглядных примеров для использования Anomaly Detector.

Anomaly Detector можно найти в Marketplace на портале Azure, там ничего сложного. Нашли, создали, развернули.

Данные будем брать из системы мониторинга SCOM (System Center Operations Manager) за последний день обычным SQL-запросом.

Ок, что-то есть, какие-то метрики мы видим, но т.к. нам необходимо немного подготовить данные для Anomaly Detector, надо их чуть-чуть преобразовать. Мне удобней это делать через python. Для этого подключимся к базе сразу через python и соберем все в словаре, который представим в виде JSON. pymssql даёт возможность выполнять sql запрос, а точнее метод fetchall() и получать на выходе словарь (dict).

Время и данные необходимо поместить в timestamp и value в значение ключа series. На выходе получаем файл testdata.json примерно с таким набором {«series»: [{«timestamp»: «2019-10-20T22:02Z», «value»: 6.00938940048218}, {«timestamp»: «2019-10-20T22:07Z», «value»: 5.63296794891357}, {«timestamp»: «2019-10-20T22:37Z», «value»: 5.63296794891357}, {«timestamp»: «2019-10-20T22:42Z», «value»: 11.3306369781494} ….

Теперь надо написать обращение к REST API Anomaly Detector.

subscription_key необходимо подставить из Keys на портале Azure в сервисе Anomaly Detector.

Можно сказать, что цель достигнута…. почти. ;) У меня было два типа данных: с явно выраженной аномалией или, говоря другими словами, скачком по загрузке CPU и «ровные» данные без каких-либо скачков.

С левой стороны аномалий нет, а вот с правой стороны Anomaly Detector посчитал, что индексы 106, 234 и 292 со значениями 20, 19 и 31 явно выбиваются из общих показателей. Чтобы данные сделать более наглядными, надо расчехлить pyplot из python и порисовать графики. ;)

Для этого у Microsoft есть Microsoft Azure Notebooks, где можно запусть Jupyter. Кстати, тоже бесплатный. Наша задача не только построить график полученных данных, но и выделить точки, которые Anomaly Detector считает аномальными.

И …. получаем такой график. Как видим, что вот наши 3 значения. Но я решил пойти дальше и посмотреть, что покажет Anomaly Detector, если мы немного нагрузим CPU … и получился уже вот такой график.

Прямоугольная секция — это данные с предыдущего графика, это наши предыдущие 3 точки, Anomaly Detector их уже не учитывал, а вот резкий скачок, как видим, отметил в 3-х значениях: начало подъёма, пик и среднее значение, которое всё еще выбивается из среднего набора данных.

Я думаю, что это хороший пример, когда для критического сервиса можно подключить такую аналитику. Почему я вспомнил про Anomaly Detector? На прошедшем Microsoft Azure AI Hackathon один из победителей сделал IoT устройство, которое собирало данные с термодатчика внутри жизненно важной среды, отправляло их в Azure IoT-Hub, раз в минуту запускался код в Azure Functions, который собирал данные в Anomaly Detector и если температура начинала расти, то отправлял уведомление через Twilio API в Whatsapp или по SMS. До ужаса простое решение, но работает как часы.

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

Документация по Anomaly Detector — https://docs.microsoft.com/en-us/azure/cognitive-services/anomaly-detector/overview

Ну и наш любимый раздел — «слышь, а чо по деньгам?!» ж)

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