王銳
(中國移動通信集團廣東有限公司,廣東 廣州 510623)
異常檢測[1-3]也稱為離群檢測,用于發現數據流中的異常類型并確定其發生的詳細信息。但是隨著移動通信的發展,整個通信業務急劇膨脹,為了適配多種終端、不同接入方式,運行場景日趨復雜,各類監控指標繁多且數據量巨大,海量多維序列數據給運維人員帶來更高的挑戰。
面對大數據場景,傳統的單指標檢測結果可能會出現片面性問題,且效率較低。文獻[4]綜述了多維時間序列異常檢測算法,并指出了要注意盡量降低算法的復雜度以及開展實時監測的研究;文獻[5-7]針對智能運維、安全駕駛和交易消費等領域,分別提出了基于VRNN、自動編碼器和模糊孤立森林等算法,研究了多維序列異常檢測算法及應用,并取得良好的效果。上述研究方法中部分算法復雜度較高,面對多樣化的海量數據,算法模型的泛化能力和計算開銷有一定局限。因此,本文提出了一種多維時間序列的異常檢測算法,采用優化的孤立森林(iForest,isolation Forest)算法,實現了較好的異常檢測效果。該算法易于理解,計算開銷小,并且泛化能力和實用性較好。
傳統的單指標異常檢測就是KPI異常檢測[8],也是運維領域中的一個重要環節。KPI指的是對系統、服務等運維對象的監控指標(如訪問量、利用率等),其數據是按發生的時間先后順序排列而成的數列,也就是時間序列。
為了發現異常數據,建立了一個單指標的時間序列異常檢測系統[9],基本遵循以下步驟:
(1)數據采集:數據流的持續采集;
(2)正常行為建模:識別異常的第一步是建立一個模型,設計一個統計測試來確定數據點,如果模型沒有解釋它們,則可能就是異常點;
(3)異常行為檢測:通過對比正常模型發現異常的數據,并描述異常的各種屬性。
時間序列異常檢測系統通過觀察度量行為的各個方面,假設數據變化滿足一種分布(如高斯分布或者正態分布)來計算動態閾值模型,對數據按照一定的規律波動來判斷異常是否有效,判別速度快。通過應用異常檢測算法將每個時間點標記為正常/異常或者預測某個點的信號,然后測試該點實際值是否與預測值相差足夠大以將其視為異常。
但是,一旦數據在某一段時間變化幅度加大,數據不夠平滑,對于多指標(多維序列)數據來說,復雜度更高、無效和干擾信息更加嚴重。針對多維度時間序列,如果需要將每個維度指標單獨進行檢測,會存在效率低下的問題;另一方面,大多數檢測只選取獨立的維度進行分析,很難發現相關聯的異常指標數據,不利于整體分析問題。
孤立森林(iForest)[10-11]屬于集成學習方法,廣泛應用于異常檢測領域。iForest對數據集的適應能力很強,同時在訓練樣本以及樣本屬性的選擇方面都是隨機的,在處理多維序列存在一定的優勢。其算法流程大致如下:
(1)從訓練數據中隨機選擇φ個點作為子樣本,放入一棵孤立樹的根節點;
(2)隨機指定一個維度,在當前節點數據范圍內隨機產生一個切割點p,切割點產生于當前節點數據中指定維度的最大值與最小值之間;
(3)此切割點的選取生成了一個超平面,將當前節點數據空間切分為2個子空間:把當前所選維度下小于p的點放在當前節點的左分支,把大于等于p的點放在當前節點的右分支;
(4)在節點的左分支和右分支節點遞歸步驟,不斷構造新的葉子節點,直到葉子節點上只有一個數據(無法再繼續切割)或樹已經生長到了所設定的高度,此時獲得了一個iTree。
獲得t個iTree之后,iForest訓練就結束,然后可以用生成的iForest來評估測試數據。對于一個訓練數據X,令其遍歷每一棵iTree,然后計算X最終落在每個樹第幾層(X在樹的高度),可以得出X在每棵樹的高度平均值。獲得每個測試數據的高度平均值后,可以設置一個閾值(邊界值),高度平均值低于此閾值的測試數據即為異常。
孤立森林檢測算法具有較大的隨機性,且對噪聲維度魯棒性不夠強,可靠性較低。在建立樹的同時,可能會有部分維度的信息沒有被完全利用,這些因素都影響了樹的構建,導致在實際異常檢測中一些檢測點會被誤判,使檢測結果的準確率低下。
鑒于上述這些問題,本文提出一種基于格拉布斯準則(Grubbs算法)的孤立森林算法改進,該算法邏輯簡潔且實用性強,通過引入格拉布斯準則,增加每個指標檢測的正常值閾值,同時利用孤立森林進行離群點檢測。實驗結果表明,該算法具有較好的檢測效果,與孤立森林相比,檢測結果更加穩定,可以過濾一些無關維度造成的影響。改進的算法流程說明如下:
第一步:
對同一系統中多個設備所對應的指標同時進行檢測,實時采集各個指標數據,每個指標即對應一個維度,各指標數據組成多維序列。對指標的采樣時間粒度可根據實際需要進行設定,如5分鐘。
預先獲取多維序列的歷史數據,選取的歷史時間范圍可以為一年或數月,通常是相對完整的時間周期。
進一步地,由于任一系統中各設備的運行狀態在不同的時間片段內存在規律性的變化,如對于一個IT系統其各設備的使用率在每天白天和晚上會存在較大的差別,或者在一周中工作日與節假日也會存在差別,因此在獲取各指標的正常閾值區間時,需要根據各時間片段內的規律進行劃分。時間片段的劃分規則可根據實際系統的運行規則進行設置,如一周的時間按照一天進行劃片,得到的時間片段為周一、周二、……;也可以將一天的時間按一個小時進行劃分,得到的時間片段為00:00~00:59、01:00~01:59、……、23:00~23:59;還可以將一天的時間按照白天和晚上進行劃分等。
多維序列歷史數據通過時間劃片,建立了各個時間片段對應的多維序列組。在每個維度序列組內,通過預設的閾值計算方法,獲得指標(即維度)在對應的時間片段內的正常閾值區間,從而得到各指標在不同的時間片段內的規律。本文采用閾值計算方法是Grubbs離群數據檢測方法。
Grubbs離群數據檢測方法[12]以任一維度i的采樣值組成數據集Xi={Xij},尋找其中最大的z-score,也就是計算每一個采樣值Xij對平均值偏離與標準差Si的比值,其中z-score的計算如下:

其中,zij即為z-score;為數據的均值;Si為數據的標準差。
如果z-score大于給定顯著性水平a下的離群檢測的臨界值gc,則認定該數為離群值,并把這個值進行剔除。其中,tc是一個選定的值,它服從具有n-2個自由度的t分布。

通過上述Grubbs離群數據檢測算法對數據集進行清洗后,所述數據集合中將不存在z-score大于所述臨界值gc的采集值,從而得到該維度i對應的正常閾值區間Oseti。
第二步:
獲取歷史數據作為訓練集,歷史時間可為近期范圍,如最近一個月內。從所述訓練集中進行采樣,通過孤立森林算法,構建異常檢測模型。
上述異常檢測模型是通過歷史數據訓練得到的,建議定期重新訓練更新。
第三步:
將所有同一采樣時間采集到的各指標數據組成待測的多維序列,輸入到第二步訓練得到異常檢測模型,輸出得到異常時間點集合,再結合各維度對應的正常閾值區間進行排除比對處理,最后得到改進算法的最終異常點集合。
綜合以上三步,整體基于Grubbs和孤立森林的多維序列異常檢測算法說明如下:
(1)對多維序列的歷史數據中,按時間劃片規則進行分組,分別針對每個時間片段中多維序列數據集使用Grubbs算法求得Oset,得到各個維度數據在每個時間片段內的正常閾值區間;
(2)將近期多維序列歷史數據通過孤立森林算法,獲得異常檢測模型ForestModel;
(3)對待測的當前多維序列采用異常檢測模型ForestModel進行檢測,得到異常序列集合Anomaly;
(4)結合待測的多維序列的采樣時間對應的時間片的Oset,對異常序列集合Anomaly進行排除比對,同一時間片段內異常序列集合Anomaly中存在Xij不在所對應維度的正常閾值區間,則標注為最終異常序列,Xij為異常數據值,最后遍歷得到最終的異常序列集合Anomaly*。
實驗中采用的數據為某IT系統運行環境采集的CPU使用率、內存使用率、數據庫等待事件等多個指標的一個數據集,時間跨度為2020年9月至11月共計8 000余條的數據集,時間粒度為15分鐘。篩選了部分有價值的檢測指標后,對數據進行預處理,將要進行訓練的數據如表1所示:

表1 多維序列數據示例
多維時間序列數據展示圖如圖1所示。可以看出,時間序列的數據中有一些突增突降的點,這些點可能是異常值,而各個指標之間發生突增突降的時間是相近的,證明各個指標之間的異常情況是有關聯的。

圖1 多維時間序列數據展示圖
對數據進行了孤立森林算法訓練,并得出相應的模型,然后用2020年11月23日至25日系統采集15分鐘粒度總計288條的數據進行擬合,初步得出了異常結果。如表2所示,選取25日下午3點至6點的時間段進行展示,其中字段異常情況為0的時刻表示正常、-1的時刻表示異常。

表2 孤立森林算法檢測結果
在實際情況中,這兩天的時間段共有19處故障異常點。孤立森林算法找出的異常點共有43條,在展示的時間段中,部分模型找出的時間點與實際情況相吻合,但是與實際的結果相對比,有許多不關聯的時間點也被認為是異常點,產生了誤判的情況。為了檢驗模型的實際情況,畫出了模型的ROC曲線進行模型評估。孤立森林ROC曲線圖如圖2所示。

圖2 孤立森林ROC曲線圖
ROC曲線被用于醫學、無線電、生物學等領域中,在機器學習領域也有很好的發展。ROC曲線越靠近上方,曲線下面積AUC越大,則檢測的準確率越高,否則檢測準確率越低[13]。從圖2可以看到,傳統的孤立森林模型的預測模型結果為72.7%,檢測效果一般。
接下來使用改進后的孤立森林算法,首先利用Grubbs算法進行建模,得到異常檢測模型以及各個指標的正常閾值區間(為了便于計算比較,這里統一對應為一個時間分片,即白天)。各個維度的正常值區間范圍如表3所示:

表3 各個維度的正常值區間范圍
利用Grubbs算法得出各個指標的區間范圍,與孤立森林算法的模型所求得的異常時間點進行比對排除,重新求得異常時間點。改進的孤立森林算法檢測結果如表4所示。

表4 改進的孤立森林算法檢測結果
經過改進算法后,異常時間點在原來的基礎上縮減到了32個,每個指標中超出正常值的點也被標注了出來。同樣,畫出ROC曲線進行模型評估。改進的孤立森林ROC曲線圖如圖3所示。
從圖3可以看出,AUC值提升至86.4%,整體效果比原來好了很多。如表5的兩個時間段,系統中出現異常的指標為“Oracle連接數”與“數據庫等待事件數”,這兩個指標可能是引起異常的主要原因。在實際情況中,該時間點確實如此,可見算法的檢測結果是準確的。

表5 實際情況說明

圖3 改進的孤立森林ROC曲線圖
本文提出的改進算法使用了基于孤立森林算法與Grubbs算法對多維序列數據進行異常檢測,實驗結果表明,該算法能夠有效檢測出多維時間序列中存在的異常數據,且在處理海量數據過程中效率較高。目前該檢測方法已經逐步代替了原來的固定閾值方法,應用于業務開通領域IT系統運維場景中各類指標的監控,經過對比分析,面對海量數據計算效率更高,預警更加準確,減少了無效告警,可以得到較好的檢測效果。同時,該方法也能廣泛應用于移動通信的各個業務領域。