本文介绍分解类算法(ostl-esd、istl-esd和istl-nsigma)的参数调优方法。

背景信息

分解类算法(ostl-esd、istl-esd和istl-nsigma)适用于周期性数据,常见于QPS类数据,如每天或每周在相对固定的时刻出现峰值或者谷值的数据。

在使用分解类算法计算原始数据时,数据点会被分解为趋势项(trend),周期项(season)和残余项(residual)三部分,即原始数据=trend+season+residual。分解完成后,再使用esd算法对残余项进行异常检测:算法会为每一个数据点分解得到的残余项计算异常分数anomalyScore,而算法的输入参数esd.alpha会决定检测阈值threshold,若满足anomalyScore>threshold,则该数据点异常,反之该数据点正常。

常见场景

检测出的异常点太少或太多

优化方法:上调esd.alpha参数使算法更敏感,检测出更多的异常点;反之可以减少检测出的异常点的数量。示例如下:

//ostl-esd算法调优示例
SELECT xx, anomaly_detect(mean_duration, 'ostl-esd', 'periods[0]=24, esd.alpha=0.2') as res FROM xxx SAMPLE BY 0
//istl-esd算法调优示例
SELECT xx, anomaly_detect(mean_duration, 'istl-esd', 'frequency=1h, periods[0]=24h, esd.alpha=0.2') as res FROM xxx SAMPLE BY 0
//istl-nsigma算法调优示例
SELECT xx, anomaly_detect(mean_duration, 'istl-nsigma', 'periods[0]=24, nsigma.n=2') as res FROM xxx SAMPLE BY 0

参数说明

esd.alpha:异常检测的敏感程度。取值范围为(0,1)。

精确调整参数esd.alpha

通过精确地调整参数esd.alpha,可以获得更精确的检测效果。

优化方法:在算法参数中添加verbose=true, esd.verbose=true条件,打开verbose模式。示例如下:

//ostl-esd算法参数调优示例
SELECT xx, anomaly_detect(mean_duration, 'ostl-esd', 'periods[0]=24, verbose=true, esd.verbose=true') as res FROM xxx SAMPLE BY 0
//istl-esd算法参数调优示例
SELECT xx, anomaly_detect(mean_duration, 'istl-esd', 'frequency=1h, periods[0]=24h, verbose=true, esd.verbose=true') as res FROM xxx SAMPLE BY 0
//istl-nsigma算法参数调优示例
SELECT xx, anomaly_detect(mean_duration, 'istl-nsigma', 'periods[0]=24, verbose=true, nsigma.verbose=true') as res FROM xxx SAMPLE BY 0
返回结果结构示例如下:
+----------------------------+---------------+-------------+---------------------+---------------------+-----------------------+
|           time             | mean_duration |    ...      |  res$anomalyScore   |   res$threshold     | res$detectedDirection |
+----------------------------+---------------+-------------+---------------------+---------------------+-----------------------+
| 2022-04-11T13:00:00+08:00  | 0             | ...         | 0                   | 1.6447834844273468  | NONE                  |
| 2022-04-11T14:00:00+08:00  | 0             | ...         | 0                   | 1.6447834844273468  | NONE                  |
| 2022-04-11T15:00:00+08:00  | 0             | ...         | 0                   | 1.6447834844273468  | NONE                  |
| 2022-04-11T16:00:00+08:00  | 0             | ...         | 0                   | 1.6447834844273468  | NONE                  |
| 2022-04-11T17:00:00+08:00  | 3136.3        | ...         | 0.6917962785972575  | 1.6447834844273468  | NONE                  |
|* 2022-04-11T18:00:00+08:00 | 13622.6       | ...         | 3.0136653345953954  | 1.6447834844273468  | UP                    |
|* 2022-04-11T19:00:00+08:00 | 8651.6        | ...         | 1.7122438285577357  | 1.6447834844273468  | UP                    |
| 2022-04-11T20:00:00+08:00  | 6735.46       | ...         | 1.252994967798293   | 1.6447834844273468  | NONE                  |
| 2022-04-11T21:00:00+08:00  | 1496.683      | ...         | 0                   | 1.6447834844273468  | NONE                  |
| 2022-04-11T22:00:00+08:00  | 1691.3175     | ...         | 0                   | 1.6447834844273468  | NONE                  |
+----------------------------+---------------+-------------+---------------------+---------------------+-----------------------+

可以观察到,mean_duration13622.68651.6的两条记录, 在被检测为异常数据点的同时, 也输出了统计类算法(esd)的详情列(anomalyScore和threshold)。

如果业务反馈mean_duration8651.6的记录不属于异常,可通过调整esd.alpha参数使该条记录状态变为正常。调整方法,请参见步骤二

数据周期中的正常值触发误报

不同周期的数据可能会有部分不同,有时周期中稍有变化的正常值可能会触发误报。

优化方法
  • ostl-esd:
    1. 上调esd.alpha使算法更敏感。示例如下:
      SELECT xx, anomaly_detect(mean_duration, 'ostl-esd', 'periods[0]=24, esd.alpha=0.2') as res FROM xxx SAMPLE BY 0
    2. (可选)下调参数alphaStl。示例如下:
      说明 如果上调esd.alpha参数后已达理想结果,可省略该步骤。
      SELECT xx, anomaly_detect(mean_duration, 'ostl-esd', 'periods[0]=24, alphaStl=0.25') as res FROM xxx SAMPLE BY 0
      参数说明

      alphaStl:算法参考过往周期数据的程度。取值范围为(0,1)。alphaStl的值越大,参考度越大。ostl-esd算法中alphaStl参数的默认值为0.35。

  • istl-esd:istl-esd可以自动调节对过往周期数据的依赖程度,只需下调esd.alpha,降低算法敏感度即可。操作方法可参考ostl-esd算法的步骤a

数据的周期长度剧烈改变后出现误报

优化方法

  • ostl-esd:重置算法模型,指定新周期的长度(如24),并从周期长度改变后的数据点开始检测。示例如下:
    SELECT xx, anomaly_detect(mean_duration, 'ostl-esd', 'periods[0]=24, reset_state=true') as res FROM xxx WHERE time >= xxxx SAMPLE BY 0
    重要 重置模型后需要4个周期长度的数据来对算法进行预热,在预热阶段,算法不会报出任何异常。
  • istl-esd:重置算法模型,并从周期长度改变后的数据点开始检测。istl-esd算法可以自动感知数据的周期长度。您也可以手动指定周期长度,例如指定周期长度为12小时,示例如下:
    SELECT xx, anomaly_detect(mean_duration, 'istl-esd', 'frequency=1h, periods[0]=12h, reset_state=true') as res FROM xxx WHERE time >= xxxx SAMPLE BY 1h
    重要 重置模型后需要4个周期长度的数据来对算法进行预热,在预热阶段,算法不会报出任何异常。