Поделиться через


series_decompose_anomalies()

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Обнаружение аномалий основано на декомпозиции ряда. Дополнительные сведения см. в разделе series_decompose().

Функция принимает выражение, содержащее ряд (динамический числовый массив) в качестве входных данных, и извлекает аномальные точки с оценками.

Синтаксис

series_decompose_anomalies (Серия [ пороговая ,,тенденция сезонности, Test_points, AD_method Seasonality_threshold ], ,)

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Type Обязательно Описание
Серия dynamic ✔️ Массив числовых значений, как правило, результирующий результат операторов make-series или make_list .
Threshold real Порог аномалии. Значение по умолчанию — 1,5, k для обнаружения мягких или сильных аномалий.
Сезонность int Управляет сезонным анализом. Возможны следующие значения:

- -1: автоматическое определение сезонности с помощью series_periods_detect. Это значение по умолчанию.
— целый период времени: положительное целое число, указывающее ожидаемый период в количестве ячеек. Например, если ряд находится в 1h ячейках, еженедельный период составляет 168 ячеек.
- 0: нет сезонности, поэтому пропустите извлечение этого компонента.
Тенденция string Управляет анализом тренда. Возможны следующие значения:

- avg: определите компонент тренда как average(x). Это значение по умолчанию.
- linefit: извлечение компонента тренда с помощью линейной регрессии.
- none: нет тенденции, поэтому пропустите извлечение этого компонента.
Test_points int Положительное целое число, указывающее количество точек в конце ряда, которые следует исключить из обучения или регрессии, процесса. Этот параметр должен быть задан для целей прогнозирования. Значение по умолчанию равно 0.
AD_method string Управляет методом обнаружения аномалий в остаточных временных рядах, содержащим одно из следующих значений:

- ctukey: тест забора Tukey с настраиваемым диапазоном 10-90-го процентиля. Это значение по умолчанию.
- tukey: Тест забора Tukey с стандартным 25-м-75-м процентилем диапазона.

Дополнительные сведения о остатках временных рядов см. в series_outliers.
Seasonality_threshold real Пороговое значение для оценки сезонности, если для параметра "Сезонность " задано значение autodetect. Порог оценки по умолчанию — 0,6.

Дополнительные сведения см. в series_periods_detect.

Возвраты

Функция возвращает следующую соответствующую серию:

  • ad_flag: тернарный ряд, содержащий (+1, -1, 0) маркировку вверх/вниз/без аномалий соответственно
  • ad_score: Оценка аномалий
  • baseline: прогнозируемое значение ряда в соответствии с декомпозицией

Алгоритм

Эта функция выполняет следующие действия.

  1. Вызывает series_decompose() с соответствующими параметрами, чтобы создать базовый и остаточный ряд.
  2. Вычисляет ad_score ряд, применяя series_outliers() с выбранным методом обнаружения аномалий в ряде остаточных элементов.
  3. Вычисляет ряд ad_flag, применяя пороговое значение для ad_score, чтобы пометить вверх/вниз/без аномалий соответственно.

Примеры

Обнаружение аномалий в еженедельной сезонности

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

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 10.0, 15.0) - (((t%24)/10)*((t%24)/10)) // generate a series with weekly seasonality
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y)
| render timechart  

Еженедельная сезонность, показывающая базовые показатели и выбросы.

Обнаружение аномалий в еженедельной сезонности с помощью тренда

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

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y)
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart

Еженедельные сезонные выбросы с тенденцией.

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

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y, 1.5, -1, 'linefit')
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart  

Еженедельные сезонные аномалии с тенденцией linefit.

Настройка порога обнаружения аномалий

Несколько шумных точек были обнаружены как аномалии в предыдущем примере. Теперь увеличьте порог обнаружения аномалий с 1,5 по умолчанию до 2,5. Используйте этот диапазон взаимодействия, чтобы обнаруживаться только более сильные аномалии. Теперь будут обнаружены только те излия, которые вы вставляете в данные.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and onlgoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y, 2.5, -1, 'linefit')
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart  

Еженедельные аномалии серии с более высоким пороговым значением аномалий.