本文介绍分解类算法(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_duration为13622.6和8651.6的两条记录, 在被检测为异常数据点的同时, 也输出了统计类算法(esd)的详情列(anomalyScore和threshold)。
如果业务反馈mean_duration为8651.6的记录不属于异常,可通过调整esd.alpha参数使该条记录状态变为正常。调整方法,请参见步骤二。
数据周期中的正常值触发误报
不同周期的数据可能会有部分不同,有时周期中稍有变化的正常值可能会触发误报。
- ostl-esd:
- 上调esd.alpha使算法更敏感。示例如下:
SELECT xx, anomaly_detect(mean_duration, 'ostl-esd', 'periods[0]=24, esd.alpha=0.2') as res FROM xxx SAMPLE BY 0
- (可选)下调参数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。
- 上调esd.alpha使算法更敏感。示例如下:
- 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个周期长度的数据来对算法进行预热,在预热阶段,算法不会报出任何异常。