ELK在Machine learning上異常偵測必知的教學設定(上)

ELK在Machine learning上異常偵測必知的教學設定(上)

在這篇文章中,主要會針對在Elastic-search Kibana上操作Machine learning做異常偵測時的一些操作教學以及參數設定介紹。

主要目的是希望能夠讓讀者在操作時,能夠對於自己的資料有較佳的參數設定,使得異常偵測整體效果更佳。

在文章前段主要會針對操作流程進行描述、教學,中後段的部分則會針對數值的特徵來做參數調整與設定,最後再將此異常偵測模型加上提醒(alert)。

建立異常偵測Job

1. 上傳資料集

在本文中不會針對Logstash匯入資料來寫,主要以Kibana上操作能完成為主。在這階段我們在Machine Learning 頁面中找到Data Visualizer來匯入資料,在此篇文章中會以NAB 中的 realAWScloudwatch (AGPL-3.0) 的資料作為範例,可以下載任意一個資料集(.csv)作為training data,在這裡我們下載的是 ec2_cpu_utilization_24ae8d.csv

2.選擇Import data

上傳剛剛下載的 ec2_cpu_utilization_24ae8d.csv 至此頁面。


上傳檔案後會有資料統整頁面可以確認,由於我們是要做時間序列的異常偵測,確保系統偵測到的時間欄位是對的欄位名稱(Time field)

 

3.輸入文件index

在 elasticsearch 中,每個資料都有屬於他的index,在這裡建議使用符合elasticesearch naming rule的命名規則(e.g. ec2_cpu_utilization_2014)

4.建立異常偵測Job

點選 create job 後,選擇剛才建立資料的index 。(亦或是有多筆index要選時可以至左側選單 Stack management > index patterns 中建立新的index pattern來使用,例如:建立一個ec2_cpu_utilization_*來表示選取所有符合此index pattern的所有index)

選擇完畢後,會出現下面的畫面:

在Elasticsearch將異常偵測分為以上幾種不同的作法,其種主要又可分為時間型(Temporal)以及種群型(Population)這兩種:

  • 時間型(Temporal):
    • Single metric : 單一維度的異常偵測,意指在單一時間下輸入資料(因子)僅僅會有一筆。
      • 情境:本次使用的範例為輸入CPU使用率,偵測是否有使用率異常的情形
    • Multi metric: 多維度輸入資料的異常偵測,在單一時間下,可允許有多個不同的資料輸入,由多筆資料(因子)來判斷該時間是否為異常。
      • 情境:一台server有多個因子可以來分析此台server是否有異常,例如:CPU使用率、RAM使用率、DISK I/O rate …等,藉由同一時間點的多個因子分析server是否異常。
    • Advance: 此種模式為以上兩種的綜合型,根據設定的不同,可以設定成Multi-metric 或是 Single-metric
  • 種群型(Population):
    • Population:對種群內成員進行的對等分析,或者更準確地說,是個別實體與一段時間內由所有對等實體組成的聚合模型之間的對比
      • 情境:假設小明和他大部分同事每天對系統中的一號API的request是10-20次,今天如果小華對一號API發了5000次request,這就會被被視為異常。在此情境中,因為不能以單一一個人的操作,作為典型代表,於是我們必須聚合多個單一使用者的行為來產生一個對此API的典型模型,在此模型下就可偵測出單一使用者的異常使用此API的情境。
    • Categorization: 針對文字來做分群,從無排序的Log資料中,先將各個不同的Log做分群,再針對分群的結果在單一時間區間內的分佈來偵測該Log是否為異常Log
      • 情境:有一個檔案寫滿了Log,但是系統並無停止,也沒看到先前有設定過的Error log,但是單一檔案內log種類太多,分不出何者才是與系統有異常時所出現的Log,在這裡就會將所有的Log進行分類,並且找出最有可能的Log是哪些。

5.Demo資料適用模型為Single-metric

在本文中的Demo資料適用模型為Single-metric,選擇後會看到以下畫面,若希望使用全資料作為訓練依據則點選use full <index名稱>即可套用全資料作為訓練資料

6.Pick fields階段

Pick fields階段,主要是要決定要判讀哪一個數值在特定時間區間(bucket_span)內是否為異常,在此資料中,我們可以看到只有value這個欄位,在這裡我們以Max(value)來Demo:

在這裡可以注意,所選的fields運算方式,是根據bucket span來計算(e.g. bucket span設定60分鐘,根據以上所選是指要判斷近60分鐘最大值是否異常),此處所選擇的計算方式會大大的影響異常偵測的靈敏度、準確度,可以針對自己的資料特性來選擇。

然而bucket span所設定的數值可以根據資料的週期性來做為參考依據(若是無想法也可使用Elasticsearch內建的預估功能),例如這份資料,每天於凌晨3-4點都會有一個週期性的高峰,透過資料觀察可以發現峰值都出現在03:00 – 04:00 之間,故可將bucket span設為60m,使得模型在偵測週期性能更加順利(因為異常發生可能會在03:00也可能在04:00,如果要模型能夠知道03:00-04:00都有可能發生異常,就應該要儘量讓模型在03:00以及04:00之間任意時間內的fields計算方式都可以包含到異常值,所以bucket span在這情境下選60m會是較佳的設定,但也可透過實驗來嘗試找到較佳的設定)。

7.Job meta設定&進階設定

在這裡設定Job ID 以及一些Job的描述讓自己能夠識別、紀錄為主。

Calendar欄位提供特別節日輸入,像是聖誕節、發薪日、春節、購物節…等特殊日期或是對此筆資料可能有影響的日期,就像是在購物節時,伺服器的單位時間請求數一定會暴增,但這情況不一定是異常狀況,所以可以透過輸入特殊日期讓模型去學習特殊狀況(e.g. 每個月5號是發薪日,銀行伺服器的請求數目每個月都會是平常的五倍以上,可是在平常出現五倍以上可能就是異常狀況,反之若是在5號沒有出現5倍的請求數而是維持普通請求數,這樣反而會是異常)。

8.建立Job

最後一步,按下Create Job,即可看到歷史資料預測的結果:

點擊View Job 可以看到以下畫面,我們可以看到圖中有個紅點被判別為異常,且其分數為91分,在這裡Anomaly score是將這個點的數值在這個模型出現的機率,然後透過常態分佈將所有機率轉為0-100的數值。

看到下面表格就能夠詳細看到此點的資訊:

我們可以看到在這個數值(actual value = 2.34 )時,對於此模型而言這數值出現的機率為2.288881576879961e-128,是非常小的機率會出現,所以在常態分佈表他會在分佈的最兩側(0.1%以下),所以被判定為91分的高分

如此一來,建立一個獨立事件的異常偵測就這樣完成了,下一步我們要來測試此Job的異常狀態提醒!

 

訂閱偉康科技洞察室部落格,掌握最新科技趨勢!

了解更多

智能優先 AI First


偉康科技提供以雲端服務、智能數據、資安技術為核心的數位轉型解決方案,協助攻克企業資料治理遇到的難題,如有需求歡迎 聯絡我們

立即訂閱電子報

掌握最新科技趨勢!