本文介紹分解類算法(ostl-esd、istl-esd和istl-nsigma)的參數(shù)調優(yōu)方法。

背景信息

分解類算法(ostl-esd、istl-esd和istl-nsigma)適用于周期性數(shù)據(jù),常見于QPS類數(shù)據(jù),如每天或每周在相對固定的時刻出現(xiàn)峰值或者谷值的數(shù)據(jù)。

在使用分解類算法計算原始數(shù)據(jù)時,數(shù)據(jù)點會被分解為趨勢項(trend),周期項(season)和殘余項(residual)三部分,即原始數(shù)據(jù)=trend+season+residual。分解完成后,再使用esd算法對殘余項進行異常檢測:算法會為每一個數(shù)據(jù)點分解得到的殘余項計算異常分數(shù)anomalyScore,而算法的輸入?yún)?shù)esd.alpha會決定檢測閾值threshold,若滿足anomalyScore>threshold,則該數(shù)據(jù)點異常,反之該數(shù)據(jù)點正常。

常見場景

檢測出的異常點太少或太多

優(yōu)化方法:上調esd.alpha參數(shù)使算法更敏感,檢測出更多的異常點;反之可以減少檢測出的異常點的數(shù)量。示例如下:

//ostl-esd算法調優(yōu)示例
SELECT xx, anomaly_detect(mean_duration, 'ostl-esd', 'periods[0]=24, esd.alpha=0.2') as res FROM xxx SAMPLE BY 0
//istl-esd算法調優(yōu)示例
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算法調優(yōu)示例
SELECT xx, anomaly_detect(mean_duration, 'istl-nsigma', 'periods[0]=24, nsigma.n=2') as res FROM xxx SAMPLE BY 0

參數(shù)說明

esd.alpha:異常檢測的敏感程度。取值范圍為(0,1)。

精確調整參數(shù)esd.alpha

通過精確地調整參數(shù)esd.alpha,可以獲得更精確的檢測效果。

優(yōu)化方法:在算法參數(shù)中添加verbose=true, esd.verbose=true條件,打開verbose模式。示例如下:

//ostl-esd算法參數(shù)調優(yōu)示例
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算法參數(shù)調優(yōu)示例
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算法參數(shù)調優(yōu)示例
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的兩條記錄, 在被檢測為異常數(shù)據(jù)點的同時, 也輸出了統(tǒng)計類算法(esd)的詳情列(anomalyScore和threshold)。

如果業(yè)務反饋mean_duration8651.6的記錄不屬于異常,可通過調整esd.alpha參數(shù)使該條記錄狀態(tài)變?yōu)檎!U{整方法,請參見步驟二

數(shù)據(jù)周期中的正常值觸發(fā)誤報

不同周期的數(shù)據(jù)可能會有部分不同,有時周期中稍有變化的正常值可能會觸發(fā)誤報。

優(yōu)化方法
  • 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. (可選)下調參數(shù)alphaStl。示例如下:
      說明 如果上調esd.alpha參數(shù)后已達理想結果,可省略該步驟。
      SELECT xx, anomaly_detect(mean_duration, 'ostl-esd', 'periods[0]=24, alphaStl=0.25') as res FROM xxx SAMPLE BY 0
      參數(shù)說明

      alphaStl:算法參考過往周期數(shù)據(jù)的程度。取值范圍為(0,1)。alphaStl的值越大,參考度越大。ostl-esd算法中alphaStl參數(shù)的默認值為0.35。

  • istl-esd:istl-esd可以自動調節(jié)對過往周期數(shù)據(jù)的依賴程度,只需下調esd.alpha,降低算法敏感度即可。操作方法可參考ostl-esd算法的步驟a

數(shù)據(jù)的周期長度劇烈改變后出現(xiàn)誤報

優(yōu)化方法

  • ostl-esd:重置算法模型,指定新周期的長度(如24),并從周期長度改變后的數(shù)據(jù)點開始檢測。示例如下:
    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個周期長度的數(shù)據(jù)來對算法進行預熱,在預熱階段,算法不會報出任何異常。
  • istl-esd:重置算法模型,并從周期長度改變后的數(shù)據(jù)點開始檢測。istl-esd算法可以自動感知數(shù)據(jù)的周期長度。您也可以手動指定周期長度,例如指定周期長度為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個周期長度的數(shù)據(jù)來對算法進行預熱,在預熱階段,算法不會報出任何異常。