簡介:
先前,使用 Elasticsearch 時與機器學習有關的主要問題之一是解決異常檢測的問題。基本上,異常檢測是一個統計問題,可以通過從輸入資料分布的常見統計屬性中标記不規則性,以簡單的方式解決。 但是,我們可以使用基于機器學習的方法來解決該問題,例如基于聚類的異常檢測和基于支援向量機的異常檢測。 Elastic Stack 提供的機器學習功能可以涉及 Kibana 的資料可視化工具,作業管理,計劃程式以及來自Elasticsearch的統計任務的名額(metrics)聚合。 我們甚至可以使用Beats收集資料。 例如,使用Metricbeat 收集系統級資源使用情況統計資訊。
文本作者:劉曉國,Elastic 公司社群布道師。新加坡國立大學碩士,西北工業大學碩士,曾就職于新加坡科技,康柏電腦,通用汽車,愛立信,諾基亞,Linaro,Ubuntu,Vantiq 等企業。
如果你想一站式快速體驗 Elasticsearch 所有功能(免費提供機器學習、 X-pack 能力),開通
阿裡雲 Elasticsearch 1核2G,即可首月免費試用。
什麼叫做異常
我們首先觀察一下如下的一個時間系列的圖:

我們首先看到綠色的那個統計圖,明顯地在2016年2月9号4點左右一個叫做 AAL 的航空公司的訂票資料明顯高于其它天的情況。那麼這顯然是一個異常的情況。但是如果這個規律是每周或每個月在某個固定的時間段都是這麼反複出現,那麼這種情況也應該算是正常的情況。另外一個例子就是,我們生活在一個大城市裡,比如北京,每到周五晚上高峰期,出城的車輛非常多,明顯高于每周的其它工作日,這顯然是一個異常的情況,如果我們隻拿一周的統計資料來說。然而如果是每周五都是這樣的,那麼這樣的高峰期也就顯得非常正常了。這個是需要機器來根據以往的資料來分析而的出來結論的。
另外一種情況是:
标如果某事物與總體中的其他事物截然不同,則該實體是異常的。
總體來說,如果我們說某個事情不正常,它是一下的一種或兩種:
• 當實體的行為突然發生重大變化時
• 當實體與總體中的其他實體完全不同時
在機器學習中,他會根據實際資料自動幫我們選擇适當的資料模型:
機器學習會自動分析資料選擇适當的模型,并在地機率事件發生時檢測出異常。大多數情況是第一種資料模型。
機器學習
機器學習是使用 Elasticsearch 叢集中存在的資料,通過無監督的方法來建構資料模型。通過将(新的或替代的)資料與模型進行比較并識别資料中的異常模式或行為,它可以自動分析時間序列資料。在 Elasticsearch 的機器學習中,機器學習實習如下的功能:
• 異常檢測
• 異常打分 (分數介于0到100之間,分數越高,代表越不正常)
在我們覺得是否使用機器學習之前,需要驗證将使用的資料的适用性。在使用 Elasticsearch 機器學習之前,你必須考慮如下的三件事:
• 你的資料是否是一個時間系列的資料
• 資料需要包含對用例至關重要的關鍵性能名額(KPI)
• 資料的位置
事實上,你也可以通過機器學習的 API 接口來分析你的資料。這個工作并不一定小在 Kibana 中來完成。為了發現資料的異常,定義自己的資料的 KPI 是非常重要的一個環節。這些 KPI 名額,可以是:
• 在規定的一段時間裡,日志的數量
• 在規定的一段時間裡,所收到的 404 響應值
• 在規定的一段時間裡,磁盤的使用量
IT組織選擇用于跟蹤和标記的 KPI 可以跨越各種名額,包括以下各項:
• 客戶:影響名額,例如應用程式響應時間或錯誤計數
• 可用性:面向名額,例如正常運作時間或平均維修時間(MTTR)
• 業務:面向名額,例如每分鐘訂單數,收入或活躍使用者數
定義了 KPI 後,将對此 KPI 進行分析(平均值,最大值,計數等)。 分析功能和KPI的組合将稱為檢測器。我們可以為資料定義 single metric 或 multi metric 的偵測器以檢查資料中的異常情況。
機器學習另外一個很重要的功能就是預測所分析時序資料的未來發展趨勢。一但我們建立了機器學習的作業之後,我們就可以進行預測。除了使用 Kibana 的界面進行預測之外,Elasticsearch 也提供 API 接口來實作。在使用這個功能時,你需要提供相應的時間段來進行預測。
機器學習分類:
機器學習是如何工作的
當将ML作業配置為運作時,ML會将所有這些片段排序在一起。 下圖顯示了此過程的簡化版本:
通常,每個 bucket span 都執行一次上述過程,但是要進行其他優化以最小化 I/O。 這些細節超出了本文章的範圍。 但是,關鍵要點在于,這種編排使 ML 可以聯機(即不脫機/批處理),并不斷學習新攝取的資料。 ML 也會自動處理此過程,是以使用者不必擔心實作這一切所需的複雜過程。
啟用白金功能
在繼續使用 Elasticsearch 中 的機器學習功能之前,請確定已安裝Platinum許可證。 如果下載下傳了 Elasticsearch 軟體或使用了開源版本,它将是基本版本。我們必須激活30天試用許可證才能使用 Platinum 功能。
我們可以按照如下的步驟來啟動白金功能:
我們按照上面的三個步驟,選擇試用版,進而獲得白金版功能。
機器學習的作業
Kibana 7.0 支援四種類型的機器學習作業,如下所述:
- Single-metric jobs:資料分析僅在一個索引字段上執行
- Multi-metric jobs:可以對多個索引字段執行資料分析; 但是,每個字段都分别進行分析
- Advanced jobs:可以對多個索引字段執行資料分析。提供檢測器和影響者的完整配置設定
- Population jobs:對不常見資料(例如檢測總體中的異常值)的分布行為的資料分析
在今天的練習中,我們來展示一個使用single-metric job的例子。
Sample 資料
在今天的機器學中,我們使用如下的方法下載下傳我們的時序資料:
git clone https://github.com/liu-xiao-guo/machine_learning_data
等我們下載下傳完資料後,我們運作一下的指令:
$./cf_rfem_hist_price_bulk_index.sh
它将會把我們所需要的資料讀入到Elasticsearch中。我們可以在Kibana中查找這個資料。
GET cf_rfem_hist_price/_count
顯示:
{
"count" : 90,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
}
}
它顯示有90個資料。其中包括61個交易日和29個非交易日的資料。每一條資料的結構是:
"_source" : {
"date" : "2018-12-26",
"open" : 55.0803,
"high" : 56.0999,
"low" : 54.59,
"close" : 55.89,
"volume" : 27038,
"change" : 0.971,
"changePercent" : 1.768,
"label" : "Dec 26, 18",
"changeOverTime" : 0,
"symbol" : "RFEM"
}
這是一個股票代碼為RFEM的交易資訊。這裡它含有每天的開盤價,最高價,最低價,閉市價,交易量等資訊。
運作一個 single-metric 作業
基本上,single-metric 作業僅使用索引文檔中的一個字段作為分析檢測器。 下面介紹了針對 volume 字段運作 single-metric 作業的分步說明。
建立Index pattern
為了建立一個Index pattern,我們按照如下的步驟:
按照上面的1,2,3步驟:
輸入 cf_rfem_hist_price *,然後選擇 Next Step。
然後在 Time Filter field name 選擇 date,然後再選擇 Create index pattern。
這樣 cf_rfem_hist_price* index pattern 已建立,可以在機器學習作業中使用。
建立一個新的機器學習工作
要建立單名額機器學習作業,我們需要執行以下操作:
1、單擊左側工具欄上的機器學習按鈕,在以下螢幕截圖中顯示,右側窗格将顯示機器學習面闆
2、從頂部菜單中,選擇 “Anomaly Detection”。 點選 Create job 按鈕,如以下螢幕截圖所示:
3、該面闆将讓我們選擇源資料,這些源資料來自于新的搜尋,標明的索引或儲存的搜尋。 單擊cf_rfem_hist_price索引,如以下螢幕截圖所示:
4、有幾種作業類型可用于定義機器學習作業。 讓我們選擇一個 single metric 作業,如以下螢幕截圖所示:
5、選擇 Use full cf_rfem_hist_price* data
6、然後選擇 Next 按鈕
7、 single-metric 作業必須使用聚合。 由于我們的資料是每日記錄,而存儲段跨度(間隔)是一天,是以無論我們選擇 “Sum”,“Mean” 還是 “Median” 聚合,聚合都是相同的。我們選擇 volume 字段的 Sum 聚合用來檢查個異常。請注意這個也是我們之前談到的 KPI 名額。我們的目的是通過檢查 voume 的總和是否有異常的情況出現。
在上面,我們注意的一點是我們的 Bucket span 設定為15m,盡管我們的時序資料是每天一個資料。在實際的使用中可以根據自己的用例來進行調整。
8、點選 Next 按鈕,這樣我們可以看到如下的畫面:
9、接下來選擇 Next:
10、填好 Job ID,然後選擇 Next 按鈕
11、上面顯示 Validation 資訊。在這一步,如果有錯誤的話,它将會用紅色的字顯示錯誤資訊。上面顯示一切都好。然後,我們選擇 Next 按鈕:
12、我們再選擇 Create job 按鈕:
13、我們選擇 View results:
在上面,在起始的部分,我們可以看見機器學習在學習,我們看不出有什麼特别的地方。經過一段時間的學習,它偵測出一個異常的情況。
14、恭喜你。你已經建立了一個 single-metric 的機器學習的作業!我們可以點選下面的 Anomalies:
異常在上面的圖表中,以不同的顔色來表示的:
• Warning (blue): 分數低于25
• Minor (yellow): 分數介于25和50之間
• Major (orange): 分數介于50和75之間
• Critical (red): 分數介于75和100之間
我們可以在上面點選 Severity threshold 選擇不同的級别來進行顯示。如下圖,它顯示的是隻有 Critical (分數高于75的)的異常:
顯然顯示有很多異常的情況。點選最上面的那個January 10th 2019,我們可以看到詳細的資訊:
上面顯示的實際值是304198,但是根據機器學習所預測的值應該在22499。顯然這是一個異常。對于銷售人員來說,他們可以根據這個情況來了解一下,為什麼會出現這麼一個異常的情況,是什麼原因造成交易量的突然增加。是有人背後操作嗎?
在上面的圖中,由于我們的時間長度并不長,是以在一個畫面中都顯示完成。我們時間上可以通過調整左右的按鈕來進行時間的選擇:
這樣我們可以專注檢視我們所關心時間段的資料。
我們也可以針對我們的資料進行标注:
點選上面的 Create 按鈕,我們就可以為這個事件進行标注:
我們也可以點選右上角的那個 Forecast (預測)按鈕:
我們填入7天的預測。點選 Run 按鈕:
這是最終預測後的結果。
關于機器學習的時間選擇
在上面的練習中,我們選擇了預設的15分鐘作為 bucket_span 來對我們的資料進行分析。将 bucket span 視為分析前的聚合間隔,即為了進行分析而聚合一部分資料的時間視窗。 bucket_span 的持續時間越短,分析就越精細,但是資料中産生噪聲僞像的可能性也就越高。下圖顯示了在三個不同時間間隔内聚合的同一資料集:
請注意,如果由于尖峰持續時間短(小于2分鐘)而在60分鐘間隔内聚集資料幾乎消失了,則在5分鐘間隔内聚集的版本中看到的突出異常。 實際上,在這60分鐘的間隔内,峰值似乎不再顯得異常。
聲明:
本文版權歸作者所有,未經許可不得擅自轉載或引用。
【
阿裡雲Elastic Stack】100%相容開源ES,獨有9大能力,提供免費 X-pack服務(單節點價值$6000)
相關活動
更多折扣活動,請
通路阿裡雲 Elasticsearch 官網 阿裡雲 Elasticsearch 商業通用版,1核2G ,SSD 20G首月免費 阿裡雲 Logstash 2核4G首月免費 下載下傳白皮書:Elasticsearch 八大經典場景應用