Обзор простого в использовании API для масштабирования миллиардов временных рядов с обнаружением и прогнозированием аномалий с малой задержкой

Это первая из двух частей статьи об обнаружении аномалий в реальном времени с использованием Google Cloud Timeseries Insight API. В этой статье я расскажу, как создать набор данных для обнаружения аномалий и как запросить аномалию. Часть II будет посвящена тому, как добавлять новые события в потоковом режиме и получать аномалии для вновь добавленных данных, а также как удалять ненужные наборы данных временных рядов.

Прогнозирование временных рядов и обнаружение аномалий являются распространенными вариантами использования в ML и широко используются в различных отраслях, например, для прогнозирования трафика, планирования спроса, инвентаризации и т. д. Большинство из этих существующих систем выполняют прогнозирование и обнаружение аномалий в виде пакетных заданий. В этом руководстве я объясню и продемонстрирую пример использования для обнаружения аномалий почти в реальном времени (с задержкой менее секунды) с использованием Google Cloud Timeseries Insights API.

Так что же такое API Timeseries Insights, зачем и где его использовать?

Google Cloud Timeseries Insights API — это универсальная платформа для обнаружения аномалий, которая обеспечивает низкую стоимость, малую задержку и высокую масштабируемость.

На сегодняшний день существует несколько методов обнаружения аномалий. Они варьируются от простых, основанных на наблюдении порога с течением времени, до более сложных, которые динамически регулируют интервал разрешения. Ключевым ограничением этих систем является стоимость анализа временных рядов и выбора интересных. В дополнение к этому, прогнозирование и обнаружение аномалий в миллиардах временных рядов требует больших вычислительных ресурсов при пакетном выполнении. Это критическое ограничение для выполнения онлайн-анализа и анализа в реальном времени, например: отправка предупреждений пользователям на основе колебаний значений измерения события.

Основная цель прогнозирования временных рядов и его использования для обнаружения аномалий с помощью API анализа временных рядов:

  • Масштабирование до миллиардов временных рядов (временные ряды => серия подсчетов во времени для данного события)
  • Задержка в реальном времени (менее секунды) для прогнозирования и обнаружения аномалий
  • Обеспечение сравнительно более дешевого пакетного вывода для прогнозирования временных рядов

Давайте разберемся, как работает API Timeseries Insights, на примере и увидим его в действии. Существует 4 основных метода взаимодействия с API и запуска работы. Это:

  • Создать и загрузить набор данных
  • Запрос набора данных
  • Обновить набор данных (добавить потоковые/новые события в существующие наборы данных)
  • Удалить набор данных

В этой статье мы рассмотрим первые методы. Вы можете ознакомиться с официальной документацией по API, чтобы получить инструкции по настройке API и установить соответствующие разрешения. Теперь давайте перейдем к веселой части:

Мы используем вымышленный набор данных IoT. Данные поступают с одного датчика, и примерно каждые 25 секунд передается событие с показаниями таких атрибутов, как свет, температура, водород, влажность на складе. Набор данных содержит данные примерно за 3 месяца и содержит 202 000 строк. Мы будем использовать этот набор данных в этом упражнении. Вот несколько примеров строк из набора данных:

и вот как значения каждого атрибута выглядят в течение определенного периода времени:

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

Если внимательно присмотреться только к значениям температуры, то между 21.06.21 и 28.06.21 она очень быстро росла. В этом руководстве этот временной интервал будет использоваться для запроса проверки аномалий в значениях температуры.

1. Создание набора данных

Прежде чем мы запросим аномалию с помощью API Timeseries Insight, нам нужно будет создать набор данных в API, используя исторический набор данных. набор данных — это набор событий, и запросы выполняются с использованием этого набора данных. API ожидает, что эти данные будут в определенном формате json. Образец события в этом формате для данного набора данных выглядит следующим образом:

{“groupId”:”-8865179820473228792",
 ”eventTime”:”2021–06–14T00:02:24+00:00",
”dimensions”:
[{“name”:”measure”,”stringVal”:”LTTH”},{“name”:”Humidity”,”doubleVal”:36},
{“name”:”Light”,”doubleVal”:102},
{“name”:”h2_raw”,”doubleVal”:1040},{“name”:”temp”,”doubleVal”:36.95}]}

Здесь это одно событие представляет одну строку из табличного набора данных, показанного на изображении ранее. Давайте сначала разберемся с различными компонентами для создания набора данных в API Timeseries Insights. В разделе resource этой статьи есть ссылка на записную книжку, содержащую полный код для преобразования табличных данных в требуемый формат json.

groupId здесь представляет каждое уникальное событие в вашем наборе данных. Думайте об этом как об идентификаторе события, и поскольку каждая строка в нашем наборе данных представляет собой одно событие, у нас есть уникальный groupId для каждого события в преобразованном выше формате json. Я использовал хеш-функцию FARM_FINGERPRINT из BigQuery, чтобы сгенерировать это. Цель группы — вычислить корреляцию между событиями из одной группы. Обратите внимание: если у вас нет этого в вашем наборе данных, тогда groupId будет автоматически сгенерирован с использованием временной метки и другого содержимого из вашего набора данных, поэтому лучше создать его самостоятельно для полного контроля над схемой.

eventTime (с учетом регистра) — это не что иное, как отметка времени вашего события.

размеры – этосвойства данного события. Он может быть категориальным или числовым. Вы также можете думать об этом как о различных атрибутах ваших данных временных рядов. Обратите внимание, что каждое измерение будет иметь имя и его значения, используя stringVal, doubleVal или longVal.

Примечание. Обратите внимание, что событие json содержит измерение с парой ключ-значение с именами «measure» и «LTTH», но в нашем исходном наборе данных нет столбца с таким именем.

Это связано с концепцией под названием slice в API анализа временных рядов. Срез — это подмножество всех событий в наборе данных, которые имеют некоторые значения в некотором категориальном измерении, но поскольку в нашем наборе данных нет такого атрибута/столбца (все атрибуты числовые), нам нужно создать фиктивный тип категориального, и поскольку каждое событие в нашем наборе данных уникально и нет иерархии, мы можем использовать произвольное строковое значение для этого фиктивного измерения, которое будет иметь одинаковое значение для каждого события.

В будущем нарезка с использованием числового измерения будет поддерживаться API.

Это все, что вам нужно знать, чтобы создать набор данных в нужном формате. Преобразованный файл json теперь имеет 202 000 строк (так же, как исходный набор данных). Теперь, прежде чем этот набор данных можно будет создать, нам нужно переместить этот json-файл в корзину облачного хранилища. Вы можете использовать следующую команду для перемещения файла в корзину в облачном хранилище:

gsutil cp transformed.json gs://<my-data-bucket-name>

Следующим шагом является запуск команды создания набора данных в API анализа временных рядов для создания набора данных со всеми историческими записями.

В приведенном выше коде данные файла — это полезная нагрузка json, используемая для создания набора данных. Сначала укажите имя набора данных (здесь данные датчика), затем задается ttl, который представляет собой набор параметров, определяющий, как долго данные набора данных должны храниться до выбрасывания. Это указывает, что добавляемые события (для новых входящих данных) должны быть новее, чем текущее время минус значение ttl. Затем параметр dataNames представляет собой список всех измерений, присутствующих в вашем наборе данных. По сути, вы хотите включить сюда все измерения, которые вы хотите запросить для аномалии и прогнозирования. Наконец, dataSources — это местоположение преобразованного файла json, содержащего исторические данные, в gcs.

Этот запрос на создание возвращает успех, если сервер API его принимает. вы можете отправить другой запрос, чтобы просмотреть или перечислить набор данных. Первоначально задание будет иметь статус «ЗАГРУЖАЕТСЯ» до тех пор, пока не завершится индексирование для всех измерений, затем состояние изменится на «ЗАГРУЖЕНО», и это означает, что набор данных может начать принимать запросы и обновления для выявления аномалий и прогнозирования.

Проверка состояния и список всех наборов данных на сервере API, выполнив следующий код

Ниже приведен ответ, который вы увидите. Вы можете увидеть имя набора данных, все проиндексированные измерения, uri набора данных вашего файла json в облачном хранилище и число или строки в наборе данных. Обратите внимание, что вы можете запрашивать набор данных только в том случае, если он находится в состоянии ЗАГРУЖЕНО, и в зависимости от размера ваших данных может пройти некоторое время, прежде чем он будет проиндексирован и готов к запросу.

{'datasets': [{'name': 'projects/your-project-name/locations/us-central1/datasets/sensor-data',
   'dataNames': ['measure', 'Humidity', 'Light', 'h2_raw', 'temp'],
   'dataSources': [{'uri': 'gs://<your-bucket-name>/transformed.json'}],
   'state': 'LOADED',
   'status': {'message': 'name: "num-items-examined"\nvalue: 202267\n,name: "num-items-ingested"\nvalue: 202267\n,name: "processed-session"\nvalue: 202267\n'}}]}

2. Запрос на аномалию

Как только набор данных будет успешно создан и получит статус Загружен, API будет готов принимать запросы на аномалии или прогнозирование. Подобно созданию набора данных, существует полезная нагрузка json данных запроса, которая будет использоваться для выполнения HTTP-запроса к API. Ниже приведен пример полезной нагрузки для запроса аномалии в значении температуры.

На высоком уровне запрос обнаружения аномалий API Timeseries Insights проверяет, есть ли в наборе данных какие-либо срезы, которые имеют ожидаемое значение в данный конкретный момент времени, и это называется временем обнаружения. Есть четыре параметра верхнего уровня, о которых вам нужно знать:

  • detectionTime: время обнаружения указывает момент времени, когда мы хотим проанализировать и выявить аномалию, если ожидаемое значение отличается от фактического значения выбранного вами показателя.
  • slicingParams. Разделение показывает, как события группируются в слайды и контролируются во время запроса. Параметр dimensionNames принимает список измерений, которые можно использовать для разделения данных. В приведенном выше запросе мы используем фиктивную меру измерения. Помните, что в настоящее время для разделения данных можно использовать только размерность строкового типа. В будущем будет поддерживаться срез данных с использованием числового измерения.
  • timeseriesParams. Этот параметр определяет объем данных, используемых при обнаружении аномалий и процессе объединения событий во временные ряды для каждого среза. forecastHistoryпараметр представляет собой количество времени в секундах и указывает, сколько точек мы включаем во временной ряд во время запроса аномалии. Параметр granularity представляет собой фиксированное расстояние между последовательными точками временного ряда. Это можно настроить на более низкие значения, чтобы фиксировать повторяющиеся шаблоны. Он также неявно представляет ширину агрегированного периода окна в секундах. метрика — этопараметр числового типа, и его значение используется для агрегирования. По сути, это измерение, для которого пользователь запрашивает аномалию.
  • forecastParams: эти параметры управляют такими настройками, как чувствительность, сезонность, окно горизонта и т. д. Чувствительность определяет, насколько чувствителен процесс обнаружения аномалий. Это значение должно быть в интервале (0,0, 0,1]. Меньшее значение указывает на меньшую чувствительность и приводит к меньшим аномалиям, а увеличение его значения приводит к высоким значениям аномалий, поскольку процесс становится очень чувствительным. Порог шума представляет собой минимальную разницу между ожидаемыми и фактическими значениями во время обнаружения. для данного среза.

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

Ниже показано, как необработанные временные ряды событий преобразуются в новую форму временных рядов, в которой значения атрибутов были агрегированы по периоду времени 360 секунд. В целях иллюстрации он показывает все атрибуты, но на самом деле временные ряды будут содержать только измерение, используемое в поле metric в полезной нагрузке запроса.

Вот как выглядит результат запроса для аномалии, и здесь вы можете увидеть созданный внутренний временной ряд. Вы также можете отключить эту историю и просто вывести результат аномалии в полезной нагрузке. Эти значения в метках времени являются агрегированным значением для temperature с окном значения granularity, установленным в полезной нагрузке запроса. Это может быть настроено и изменено пользователями для каждого запроса аномалии в соответствии с сезонностью и бизнес-требованиями.

{'name': 'projects/pnishit-mlai/datasets/sensor_data_test',
 'slices': [{'dimensions': [{'name': 'measure', 'stringVal': 'LTTH'}],
   'history': {'point': [{'time': '2021-06-24T15:00:00Z', 'value': 2995.96},
     {'time': '2021-06-24T15:30:00Z', 'value': 3180.5099999999998},
     {'time': '2021-06-24T16:00:00Z', 'value': 3330.51},
     {'time': '2021-06-24T16:30:00Z', 'value': 3468.07},
     {'time': '2021-06-24T17:00:00Z', 'value': 3583.22},
     {'time': '2021-06-24T17:30:00Z', 'value': 3672.84},
     {'time': '2021-06-24T18:00:00Z', 'value': 3744.3500000000004},
     {'time': '2021-06-24T18:30:00Z', 'value': 3813.61},
     {'time': '2021-06-24T19:00:00Z', 'value': 3624.17},
     {'time': '2021-06-24T19:30:00Z', 'value': 3935.7699999999995},
     {'time': '2021-06-24T20:00:00Z', 'value': 3978.78},
     {'time': '2021-06-24T20:30:00Z', 'value': 4022.67},
     {'time': '2021-06-24T21:00:00Z', 'value': 4064},
     {'time': '2021-06-24T21:30:00Z', 'value': 4103.86},
     {'time': '2021-06-24T22:00:00Z', 'value': 4141.099999999999},
     {'time': '2021-06-24T22:30:00Z', 'value': 4171.9800000000005},
     {'time': '2021-06-24T23:00:00Z', 'value': 4206.53},
     {'time': '2021-06-24T23:30:00Z', 'value': 4226.34},
     {'time': '2021-06-25T00:00:00Z', 'value': 4172.81},
     {'time': '2021-06-25T00:30:00Z', 'value': 4085.0400000000004},
     {'time': '2021-06-25T01:00:00Z', 'value': 4013.5500000000006},
     {'time': '2021-06-25T01:30:00Z', 'value': 3981.5299999999997},
     {'time': '2021-06-25T02:00:00Z', 'value': 3955.63},
     {'time': '2021-06-25T02:30:00Z', 'value': 3906.63},
     {'time': '2021-06-25T03:00:00Z', 'value': 3846.0699999999997},
     {'time': '2021-06-25T03:30:00Z', 'value': 3796.7999999999997},
     {'time': '2021-06-25T04:00:00Z', 'value': 3758.2000000000003},
     {'time': '2021-06-25T04:30:00Z', 'value': 3725.0299999999997},
     {'time': '2021-06-25T05:00:00Z', 'value': 3692.67},
     {'time': '2021-06-25T05:30:00Z', 'value': 3660.129999999999},
     {'time': '2021-06-25T06:00:00Z', 'value': 3633.4300000000003},
     {'time': '2021-06-25T06:30:00Z', 'value': 3610.93},
     {'time': '2021-06-25T07:00:00Z', 'value': 3592.7699999999995},
     {'time': '2021-06-25T07:30:00Z', 'value': 3568.870000000001},
     {'time': '2021-06-25T08:00:00Z', 'value': 3548.359999999999},
     {'time': '2021-06-25T08:30:00Z', 'value': 3508.33},
     {'time': '2021-06-25T09:00:00Z', 'value': 3470.5899999999997},
     {'time': '2021-06-25T09:30:00Z', 'value': 3436.9699999999993},
     {'time': '2021-06-25T10:00:00Z', 'value': 3408.55},
     {'time': '2021-06-25T10:30:00Z', 'value': 3391.9299999999994},
     {'time': '2021-06-25T11:00:00Z', 'value': 3410.7200000000003},
     {'time': '2021-06-25T11:30:00Z', 'value': 3450.05},
     {'time': '2021-06-25T12:00:00Z', 'value': 3515.57},
     {'time': '2021-06-25T12:30:00Z', 'value': 3603.83},
     {'time': '2021-06-25T13:00:00Z', 'value': 3692.41},
     {'time': '2021-06-25T13:30:00Z', 'value': 3773.9999999999995},
     {'time': '2021-06-25T14:00:00Z', 'value': 3853.7},
     {'time': '2021-06-25T14:30:00Z', 'value': 3923.61},
     {'time': '2021-06-25T15:00:00Z', 'value': 3977.2799999999997},
     {'time': '2021-06-25T15:30:00Z', 'value': 4009.2700000000004},
     {'time': '2021-06-25T16:00:00Z', 'value': 4024.3199999999997},
     {'time': '2021-06-25T16:30:00Z', 'value': 4041.01},
     {'time': '2021-06-25T17:00:00Z', 'value': 4076.29},
     {'time': '2021-06-25T17:30:00Z', 'value': 4104.429999999999},
     {'time': '2021-06-25T18:00:00Z', 'value': 4120.57},
     {'time': '2021-06-25T18:30:00Z', 'value': 4146.42},
     {'time': '2021-06-25T19:00:00Z', 'value': 4178.8099999999995},
     {'time': '2021-06-25T19:30:00Z', 'value': 4210.83},
     {'time': '2021-06-25T20:00:00Z', 'value': 4245.74},
     {'time': '2021-06-25T20:30:00Z', 'value': 4275.35},
     {'time': '2021-06-25T21:00:00Z', 'value': 4296.56},
     {'time': '2021-06-25T21:30:00Z', 'value': 4301.129999999999},
     {'time': '2021-06-25T22:00:00Z', 'value': 4299.98},
     {'time': '2021-06-25T22:30:00Z', 'value': 4319.23},
     {'time': '2021-06-25T23:00:00Z', 'value': 4345.3},
     {'time': '2021-06-25T23:30:00Z', 'value': 4326.54},
     {'time': '2021-06-26T00:00:00Z', 'value': 4273.6},
     {'time': '2021-06-26T00:30:00Z', 'value': 4212.950000000001},
     {'time': '2021-06-26T01:00:00Z', 'value': 4156.549999999999},
     {'time': '2021-06-26T01:30:00Z', 'value': 4116.820000000001},
     {'time': '2021-06-26T02:00:00Z', 'value': 4081.8199999999997},
     {'time': '2021-06-26T02:30:00Z', 'value': 4049.9899999999993},
     {'time': '2021-06-26T03:00:00Z', 'value': 4022},
     {'time': '2021-06-26T03:30:00Z', 'value': 4048.0999999999995},
     {'time': '2021-06-26T04:00:00Z', 'value': 3968.9299999999994},
     {'time': '2021-06-26T04:30:00Z', 'value': 3948.3800000000006},
     {'time': '2021-06-26T05:00:00Z', 'value': 3927.44},
     {'time': '2021-06-26T05:30:00Z', 'value': 3909.3899999999994},
     {'time': '2021-06-26T06:00:00Z', 'value': 3895.73},
     {'time': '2021-06-26T06:30:00Z', 'value': 3883.1},
     {'time': '2021-06-26T07:00:00Z', 'value': 3882.58},
     {'time': '2021-06-26T07:30:00Z', 'value': 3893.34},
     {'time': '2021-06-26T08:00:00Z', 'value': 3891.4699999999993},
     {'time': '2021-06-26T08:30:00Z', 'value': 3894.45},
     {'time': '2021-06-26T09:00:00Z', 'value': 3896.4600000000005},
     {'time': '2021-06-26T09:30:00Z', 'value': 3953.680000000001},
     {'time': '2021-06-26T10:00:00Z', 'value': 3901.069999999999},
     {'time': '2021-06-26T10:30:00Z', 'value': 3907.5699999999997},
     {'time': '2021-06-26T11:00:00Z', 'value': 3929.04},
     {'time': '2021-06-26T11:30:00Z', 'value': 3968.5},
     {'time': '2021-06-26T12:00:00Z', 'value': 4018.16},
     {'time': '2021-06-26T12:30:00Z', 'value': 4077.7299999999996},
     {'time': '2021-06-26T13:00:00Z', 'value': 4134.67},
     {'time': '2021-06-26T13:30:00Z', 'value': 4171.8099999999995},
     {'time': '2021-06-26T14:00:00Z', 'value': 4189.67},
     {'time': '2021-06-26T14:30:00Z', 'value': 4216.96},
     {'time': '2021-06-26T15:00:00Z', 'value': 4262.1900000000005},
     {'time': '2021-06-26T15:30:00Z', 'value': 4305.4},
     {'time': '2021-06-26T16:00:00Z', 'value': 4338.31},
     {'time': '2021-06-26T16:30:00Z', 'value': 4369.320000000001},
     {'time': '2021-06-26T17:00:00Z', 'value': 4403.7},
     {'time': '2021-06-26T17:30:00Z', 'value': 4435.98},
     {'time': '2021-06-26T18:00:00Z', 'value': 4521.87},
     {'time': '2021-06-26T18:30:00Z', 'value': 4478.610000000001},
     {'time': '2021-06-26T19:00:00Z', 'value': 4474.28},
     {'time': '2021-06-26T19:30:00Z', 'value': 4470.839999999999},
     {'time': '2021-06-26T20:00:00Z', 'value': 4482.829999999999},
     {'time': '2021-06-26T20:30:00Z', 'value': 4490.8099999999995},
     {'time': '2021-06-26T21:00:00Z', 'value': 4490.0199999999995},
     {'time': '2021-06-26T21:30:00Z', 'value': 4480.2},
     {'time': '2021-06-26T22:00:00Z', 'value': 4460.11},
     {'time': '2021-06-26T22:30:00Z', 'value': 4445.86},
     {'time': '2021-06-26T23:00:00Z', 'value': 4429.5},
     {'time': '2021-06-26T23:30:00Z', 'value': 4411.9},
     {'time': '2021-06-27T00:00:00Z', 'value': 4398.25},
     {'time': '2021-06-27T00:30:00Z', 'value': 4372.870000000001},
     {'time': '2021-06-27T01:00:00Z', 'value': 4341.87},
     {'time': '2021-06-27T01:30:00Z', 'value': 4368.8},
     {'time': '2021-06-27T02:00:00Z', 'value': 4283.039999999999},
     {'time': '2021-06-27T02:30:00Z', 'value': 4259.9800000000005},
     {'time': '2021-06-27T03:00:00Z', 'value': 4239.389999999999},
     {'time': '2021-06-27T03:30:00Z', 'value': 4229.23},
     {'time': '2021-06-27T04:00:00Z', 'value': 4223.23},
     {'time': '2021-06-27T04:30:00Z', 'value': 4216.63},
     {'time': '2021-06-27T05:00:00Z', 'value': 4203.12},
     {'time': '2021-06-27T05:30:00Z', 'value': 4180.82},
     {'time': '2021-06-27T06:00:00Z', 'value': 4169.47},
     {'time': '2021-06-27T06:30:00Z', 'value': 4152.599999999999},
     {'time': '2021-06-27T07:00:00Z', 'value': 4136.5},
     {'time': '2021-06-27T07:30:00Z', 'value': 4128.530000000001},
     {'time': '2021-06-27T08:00:00Z', 'value': 4119.19},
     {'time': '2021-06-27T08:30:00Z', 'value': 4100.19},
     {'time': '2021-06-27T09:00:00Z', 'value': 4085.1599999999994},
     {'time': '2021-06-27T09:30:00Z', 'value': 4141.089999999999},
     {'time': '2021-06-27T10:00:00Z', 'value': 4097.710000000001},
     {'time': '2021-06-27T10:30:00Z', 'value': 4102.32},
     {'time': '2021-06-27T11:00:00Z', 'value': 4105.12},
     {'time': '2021-06-27T11:30:00Z', 'value': 4118.86},
     {'time': '2021-06-27T12:00:00Z', 'value': 4134.59},
     {'time': '2021-06-27T12:30:00Z', 'value': 4156.07},
     {'time': '2021-06-27T13:00:00Z', 'value': 4184.75},
     {'time': '2021-06-27T13:30:00Z', 'value': 4224.679999999999},
     {'time': '2021-06-27T14:00:00Z', 'value': 4276.73},
     {'time': '2021-06-27T14:30:00Z', 'value': 4324.28},
     {'time': '2021-06-27T15:00:00Z', 'value': 4365.74}]},
   'forecast': {'point': [{'time': '2021-06-27T15:00:00Z',
      'value': 4910.465311007107}]},
   'detectionPointActual': 4365.74,
   'detectionPointForecast': 4910.465311007107,
   'expectedDeviation': 310.28363664899683,
   'anomalyScore': 1.511934641477489,
   'status': {}}]}​

Вывод результата содержит много информации. Во-первых, мы видим временные ряды, созданные API на основе полезной нагрузки вашего запроса. Мы также видим прогнозируемое значение и фактическое значение метрики во время обнаружения. Две основные части информации — это expectedDeviation и anomalyScore, которые описаны ниже. Вы можете использовать их, чтобы окончательно рассчитать аномалию для заданного времени обнаружения для ваших данных. Поскольку показатель аномалии больше 1,0 и разница между ожидаемыми и фактическими значениями температуры достаточно значительна, мы будем рассматривать это как аномалию для данного времени обнаружения.

Для каждого запроса в результате есть несколько вещей.

  • detectionPointActual это значение атрибута временного ряда, который вы запросили (метрика = температура в данном случае). Это фактическое значение (агрегированное) в detectionTime.
  • detectionPointForecast – это прогнозируемое значение атрибута `detectionTime` для временных рядов.
  • expectedDeviation указывает уровень достоверности прогнозируемых значений. Он указывает абсолютное отклонение от прогнозируемого API значения.
  • anomalyScore, вы можете думать об этом как о фактическом отклонении между прогнозируемым значением и фактическим значением в detetionTime. Если это значение выше, то мы считаем срез аномалией. Другими словами, эта оценка показывает, насколько далеко фактическое отклонение от ожидаемого отклонения.

Как правило, оценки ниже 1,0 отражают вариации, характерные для истории среза, в то время как оценки выше 1,0 требуют внимания, а более высокие оценки представляют более серьезные аномалии. Этот результат можно использовать в нижестоящих приложениях для бизнес-целей.

Опять же, интерпретация оценки аномалии и ожидаемого отклонения является относительной и может зависеть от варианта использования, поэтому конкретное их значение, которое приводит к аномалии для одного варианта использования, может не быть аномалией для другого варианта использования.

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

В этом руководстве мы рассмотрели, как создать набор данных из набора исторических данных и как запросить прогнозирование аномалий и временных рядов. В следующей части этого блога я расскажу, как добавлять данные в существующий набор данных в режиме потоковой передачи в реальном времени и выполнять обнаружение на них. Оставайтесь с нами для части - II

Ресурсы