通過(guò)Elasticsearch機(jī)器學(xué)習(xí)實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)的智能檢測(cè)和預(yù)測(cè)
Elasticsearch機(jī)器學(xué)習(xí)是一種利用機(jī)器學(xué)習(xí)技術(shù)對(duì)Elasticsearch數(shù)據(jù)進(jìn)行智能檢測(cè)和預(yù)測(cè)的工具,可以自動(dòng)識(shí)別數(shù)據(jù)模式和數(shù)據(jù)異常,生成新的特征和聚合結(jié)果,為數(shù)據(jù)分析和應(yīng)用提供支持。Elasticsearch機(jī)器學(xué)習(xí)可以提高數(shù)據(jù)的可用性和價(jià)值,還可以為用戶提供更加智能和高效的數(shù)據(jù)分析和應(yīng)用解決方案。本文通過(guò)兩個(gè)示例介紹無(wú)監(jiān)督機(jī)器學(xué)習(xí)和監(jiān)督機(jī)器學(xué)習(xí)的實(shí)踐。
背景信息
Elasticsearch機(jī)器學(xué)習(xí)分為無(wú)監(jiān)督機(jī)器學(xué)習(xí)Unsupervised和監(jiān)督機(jī)器學(xué)習(xí)Supervised兩類:
無(wú)監(jiān)督機(jī)器學(xué)習(xí)包括Single metric和Populartion等場(chǎng)景,對(duì)數(shù)據(jù)進(jìn)行異常檢測(cè)。該模式不需要訓(xùn)練機(jī)器學(xué)習(xí)什么是異常,機(jī)器學(xué)習(xí)算法將自動(dòng)檢測(cè)數(shù)據(jù)中的異常或異常模式。
監(jiān)督機(jī)器學(xué)習(xí)包括Regression和Classification等場(chǎng)景,使用分類和回歸算法解決非常復(fù)雜的問(wèn)題。該模式需要一定的數(shù)據(jù)訓(xùn)練預(yù)測(cè)任務(wù),然后使用訓(xùn)練出來(lái)的任務(wù)來(lái)對(duì)未來(lái)的數(shù)據(jù)進(jìn)行分類、預(yù)測(cè)。
場(chǎng)景大類 | 場(chǎng)景 | 類別 | 說(shuō)明 |
異常檢測(cè)Anomaly Detection | 單一指標(biāo)檢測(cè)Single metric | unsupervised | 檢測(cè)單個(gè)時(shí)序中的異常,數(shù)據(jù)分析僅在一個(gè)索引字段上執(zhí)行。 |
多指標(biāo)檢測(cè)Mutil metric | unsupervised | 使用一個(gè)或多個(gè)指標(biāo)檢測(cè)異常,并根據(jù)需要拆分分析,數(shù)據(jù)分析在多個(gè)索引字段上執(zhí)行。 | |
填充Populartion | unsupervised | 通過(guò)與Population中的行為進(jìn)行比較,檢測(cè)不尋常的行為。 Population是指某一研究領(lǐng)域內(nèi)所有可能被研究的個(gè)體、事物或現(xiàn)象的總體。 | |
高級(jí)用法和功能 Advanced | unsupervised | 提供了更多的選項(xiàng)和設(shè)置,以便用戶可以更好地定制和優(yōu)化機(jī)器學(xué)習(xí)任務(wù),以適應(yīng)不同的應(yīng)用場(chǎng)景和數(shù)據(jù)類型,用于更高級(jí)用例的機(jī)器學(xué)習(xí)。 | |
歸類Categorization | unsupervised | 識(shí)別和分析日志消息中的特征和模式,將日志消息分為不同的組別,并檢測(cè)其中的異常情況。 | |
數(shù)據(jù)分析Data Frame Analytics | 離群值檢測(cè)Outlier detection | unsupervised | 用聚類分析和異常檢測(cè)算法訓(xùn)練任務(wù),用于快速檢測(cè)數(shù)據(jù)中的異常點(diǎn)或異常行為。 |
回歸Regression | supervised | 回歸預(yù)測(cè)數(shù)據(jù)集中的數(shù)值。 | |
分類Classification | supervised | 分類預(yù)測(cè)數(shù)據(jù)集中數(shù)據(jù)點(diǎn)的類別。 |
準(zhǔn)備工作
創(chuàng)建阿里云Elasticsearch實(shí)例,本文使用8.5版本Elasticsearch實(shí)例。具體操作,請(qǐng)參見(jiàn)創(chuàng)建阿里云Elasticsearch實(shí)例。
說(shuō)明不同版本Elasticsearch機(jī)器學(xué)習(xí)的使用可能存在差異性。更多信息,請(qǐng)參見(jiàn)Machine learning官方文檔。
登錄Kibana控制臺(tái)。具體操作,請(qǐng)參見(jiàn)登錄Kibana控制臺(tái)。
添加樣例數(shù)據(jù)。
在Kibana主頁(yè),通過(guò)添加集成開始使用區(qū)域單擊試用樣例數(shù)據(jù)。
在樣例數(shù)據(jù)頁(yè)簽,單擊其他樣例數(shù)據(jù)集。
分別單擊Sample flight data和Sample web logs數(shù)據(jù)集下的添加數(shù)據(jù)。
待添加數(shù)據(jù)變?yōu)?b data-tag="uicontrol" id="d48fab40fabcc" class="uicontrol">查看數(shù)據(jù)時(shí),表示該數(shù)據(jù)集已添加完成。添加樣例數(shù)據(jù)后,Kibana會(huì)自動(dòng)創(chuàng)建kibana_sample_data_flights索引和kibana_sample_data_logs索引。
創(chuàng)建機(jī)器學(xué)習(xí)任務(wù)
本文通過(guò)以下兩個(gè)示例介紹無(wú)監(jiān)督機(jī)器學(xué)習(xí)和監(jiān)督機(jī)器學(xué)習(xí)的實(shí)踐。
創(chuàng)建單指標(biāo)機(jī)器學(xué)習(xí)任務(wù)
本操作通過(guò)單指標(biāo)檢測(cè)構(gòu)建一個(gè)無(wú)監(jiān)督機(jī)器學(xué)習(xí)任務(wù),使用Kibana自帶的樣例數(shù)據(jù)Sample web logs,該數(shù)據(jù)集為訪問(wèn)Web服務(wù)器的模擬數(shù)據(jù),通過(guò)分析樣例數(shù)據(jù)了解用戶的訪問(wèn)行為、優(yōu)化網(wǎng)站性能和檢測(cè)異常訪問(wèn)等。
下面是數(shù)據(jù)集Sample web logs中的一條數(shù)據(jù)信息。
{
"_index": "kibana_sample_data_logs",
"_type": "_doc",
"_id": "n6GHI4gBmNQSVxOwNnPn",
"_version": 1,
"_score": null,
"_source": {
"agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24",
"bytes": 847,
"clientip": "122.62.233.59",
"extension": "",
"geo": {
"srcdest": "CN:CO",
"src": "CN",
"dest": "CO",
"coordinates": {
"lat": 31.24905556,
"lon": -82.39530556
}
},
"host": "www.elastic.co",
"index": "kibana_sample_data_logs",
"ip": "122.62.233.59",
"machine": {
"ram": 4294967296,
"os": "win xp"
},
"memory": null,
"message": "122.62.233.59 - - [2018-08-21T02:34:54.901Z] \"GET /logging HTTP/1.1\" 200 847 \"-\" \"Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24\"",
"phpmemory": null,
"referer": "http://twitter.com/success/paul-w-richards",
"request": "/logging",
"response": 200,
"tags": [
"success",
"info"
],
"timestamp": "2023-06-06T02:34:54.901Z",
"url": "https://www.elastic.co/solutions/logging",
"utc_time": "2023-06-06T02:34:54.901Z",
"event": {
"dataset": "sample_web_logs"
}
},
"fields": {
"@timestamp": [
"2023-06-06T02:34:54.901Z"
],
"utc_time": [
"2023-06-06T02:34:54.901Z"
],
"hour_of_day": [
2
],
"timestamp": [
"2023-06-06T02:34:54.901Z"
]
},
"sort": [
1686018894901
]
}
您還可以通過(guò)Transforms對(duì)導(dǎo)入的數(shù)據(jù)進(jìn)行聚合,將原始數(shù)據(jù)聚合為更高級(jí)別的指標(biāo)或統(tǒng)計(jì)數(shù)據(jù),并將聚合結(jié)果存儲(chǔ)到新的索引中,提高查詢性能和響應(yīng)時(shí)間,并為后續(xù)的分析和機(jī)器學(xué)習(xí)提供基礎(chǔ)數(shù)據(jù)。
單擊Kibana頁(yè)面左上角的圖標(biāo),選擇Kibana > Machine Learning。
在左側(cè)菜單欄,單擊
。在異常檢測(cè)作業(yè)頁(yè)面,單擊創(chuàng)建作業(yè)。
選擇kibana_sample_data_logs索引。
在從 數(shù)據(jù)視圖 Kibana Sample Data Logs 創(chuàng)建作業(yè)頁(yè)面的使用向?qū)?/b>區(qū)域,單擊單一指標(biāo),創(chuàng)建單指標(biāo)任務(wù)。
配置單指標(biāo)任務(wù)。
時(shí)間范圍選擇使用完整的數(shù)據(jù),單擊下一步。
說(shuō)明樣例數(shù)據(jù)集里數(shù)據(jù)較少,所以選擇使用完整的kibana_sample_data_logs數(shù)據(jù)。
選取字段Count(Event rate),配置存儲(chǔ)桶跨度和稀疏數(shù)據(jù)后,單擊下一步。
說(shuō)明Count(Event rate) 作為單指標(biāo)視圖的指標(biāo)可以很好地反映出服務(wù)器在每秒內(nèi)響應(yīng)請(qǐng)求的次數(shù),可以作為異常檢測(cè)的目標(biāo)。
存儲(chǔ)桶跨度:用于將時(shí)間序列數(shù)據(jù)分成不同的塊,以便進(jìn)行分析和預(yù)測(cè)。該參數(shù)定義了每個(gè)時(shí)間段的持續(xù)時(shí)間,您可以根據(jù)業(yè)務(wù)需求進(jìn)行調(diào)整。
稀疏數(shù)據(jù):選擇是否將字段中的空值視為異常。在機(jī)器學(xué)習(xí)中,數(shù)據(jù)的稀疏性是指數(shù)據(jù)中存在大量的空值(缺失值)。
輸入作業(yè)ID和作業(yè)描述,單擊下一步。
時(shí)間范圍和任務(wù)內(nèi)存限制的驗(yàn)證沒(méi)問(wèn)題后,單擊下一步。
在頁(yè)面底部,單擊創(chuàng)建作業(yè)。
Elasticsearch按照時(shí)序播放這些數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行分析學(xué)習(xí)建立任務(wù),同時(shí)對(duì)后面的數(shù)據(jù)進(jìn)行評(píng)估。
說(shuō)明創(chuàng)建作業(yè)需要時(shí)間進(jìn)行驗(yàn)證,花費(fèi)的時(shí)間受索引數(shù)據(jù)的大小影響。
作業(yè)創(chuàng)建完成后,在頁(yè)面左下角單擊查看結(jié)果。
單擊count 的單時(shí)間序列分析右側(cè)的圖標(biāo),查看單時(shí)間序列分析說(shuō)明。
用鼠標(biāo)左鍵拖動(dòng)時(shí)間控制條的左右邊緣或移動(dòng)時(shí)間控制條,選擇需要進(jìn)行異常檢測(cè)的時(shí)間段。
在頁(yè)面右側(cè)單擊預(yù)測(cè),對(duì)未來(lái)進(jìn)行預(yù)測(cè)。
創(chuàng)建推理機(jī)器學(xué)習(xí)任務(wù)
訓(xùn)練航班延誤預(yù)測(cè)任務(wù)
本操作通過(guò)回歸算法訓(xùn)練一個(gè)監(jiān)督機(jī)器學(xué)習(xí)任務(wù),使用Kibana自帶的樣例數(shù)據(jù)Sample flight data,該數(shù)據(jù)集為虛構(gòu)的航班數(shù)據(jù),通過(guò)回歸算法根據(jù)歷史數(shù)據(jù)訓(xùn)練航班延誤時(shí)間的任務(wù)。預(yù)測(cè)任務(wù)可以為航空公司和旅客提供重要的參考信息,幫助旅客更好地規(guī)劃行程和航班安排。
下面是Sample flight data數(shù)據(jù)集中的一條數(shù)據(jù)信息。
{
"_index": "kibana_sample_data_flights",
"_type": "_doc",
"_id": "7b0aeogBmNQSVxOwslB_",
"_version": 1,
"_score": null,
"_source": {
"FlightNum": "QYX9S3I",
"DestCountry": "CH",
"OriginWeather": "Cloudy",
"OriginCityName": "Chicago",
"AvgTicketPrice": 824.8516378170061,
"DistanceMiles": 4442.909325899777,
"FlightDelay": false,
"DestWeather": "Thunder & Lightning",
"Dest": "Zurich Airport",
"FlightDelayType": "No Delay",
"OriginCountry": "US",
"dayOfWeek": 4,
"DistanceKilometers": 7150.1694661808515,
"timestamp": "2023-06-02T07:28:15",
"DestLocation": {
"lat": "47.464699",
"lon": "8.54917"
},
"DestAirportID": "ZRH",
"Carrier": "Logstash Airways",
"Cancelled": false,
"FlightTimeMin": 420.59820389299125,
"Origin": "Chicago O'Hare International Airport",
"OriginLocation": {
"lat": "41.97859955",
"lon": "-87.90480042"
},
"DestRegion": "CH-ZH",
"OriginAirportID": "ORD",
"OriginRegion": "US-IL",
"DestCityName": "Zurich",
"FlightTimeHour": 7.009970064883188,
"FlightDelayMin": 0
}
}
單擊Kibana頁(yè)面左上角的圖標(biāo),選擇Kibana>Machine Learning。
在左側(cè)菜單欄,單擊
。在數(shù)據(jù)幀分析作業(yè)頁(yè)面,單擊創(chuàng)建作業(yè)。
選擇kibana_sample_data_flights索引。
在創(chuàng)建作業(yè)的配置區(qū)域,配置作業(yè)基本參數(shù)。
選中回歸任務(wù)。
因變量選擇FlightDelayMin,因變量即要預(yù)測(cè)的目標(biāo)變量。
在已包括字段中,取消選中Cancelled、FlightDelay和FlightDelayType字段。
Cancelled、FlightDelay和FlightDelayType字段對(duì)預(yù)測(cè)航班延誤時(shí)間沒(méi)有影響,排除多余字段可避免任務(wù)受到不必要的影響,提升預(yù)測(cè)準(zhǔn)確性。
拖動(dòng)圓點(diǎn),調(diào)整訓(xùn)練百分比。
您可以根據(jù)業(yè)務(wù)實(shí)際情況,調(diào)整參加訓(xùn)練的數(shù)據(jù)量百分比,本文設(shè)置訓(xùn)練百分比為90%。
說(shuō)明如果數(shù)據(jù)量比較大,還需要考慮訓(xùn)練的時(shí)間問(wèn)題,訓(xùn)練時(shí)間會(huì)隨著數(shù)據(jù)量的增加而增加。數(shù)據(jù)量比較大時(shí)建議選擇較小的比例進(jìn)行訓(xùn)練,例如50%或者更低的比例,然后不斷地進(jìn)行矯正,直到得到合適的正確率。
單擊繼續(xù),配置其他選項(xiàng)。
設(shè)置功能重要性值為5。計(jì)算5個(gè)對(duì)于預(yù)測(cè)結(jié)果重要的特征,以便我們了解哪些特征對(duì)于預(yù)測(cè)結(jié)果的貢獻(xiàn)最大,有助于進(jìn)行特征選擇和任務(wù)優(yōu)化。
設(shè)置預(yù)測(cè)字段名稱為FlightDelayMin_prediction。指定要預(yù)測(cè)的目標(biāo)變量的名稱。
取消選中使用估計(jì)的模型內(nèi)存限制,設(shè)置模型內(nèi)存限制為500MB。指定機(jī)器學(xué)習(xí)任務(wù)可以使用的內(nèi)存上限。如果數(shù)據(jù)集比較大,任務(wù)較為復(fù)雜,可能會(huì)消耗大量?jī)?nèi)存,如果超出了限制,可能會(huì)導(dǎo)致任務(wù)訓(xùn)練失敗或者性能下降,因此需要根據(jù)數(shù)據(jù)集的大小和任務(wù)的復(fù)雜度來(lái)設(shè)置適當(dāng)?shù)膬?nèi)存上限。
設(shè)置最大線程數(shù)為1。用于指定訓(xùn)練任務(wù)的最大線程數(shù),如果設(shè)置的線程數(shù)過(guò)多,可能會(huì)導(dǎo)致內(nèi)存不足或者系統(tǒng)崩潰。
單擊繼續(xù),設(shè)置作業(yè)ID為flightdelaymin_job。
單擊繼續(xù),自動(dòng)對(duì)任務(wù)進(jìn)行驗(yàn)證。
驗(yàn)證通過(guò)后,單擊繼續(xù)。
在創(chuàng)建區(qū)域,單擊創(chuàng)建,創(chuàng)建任務(wù)。
生成任務(wù)需要時(shí)間,具體耗時(shí)由訓(xùn)練的數(shù)據(jù)量大小決定。
任務(wù)創(chuàng)建完畢后,單擊查看結(jié)果,查看分析作業(yè)的結(jié)果。
在模型評(píng)估區(qū)域,查看任務(wù)的可靠性。
泛化誤差:衡量任務(wù)在新數(shù)據(jù)上表現(xiàn)的能力,反映了任務(wù)的泛化能力。泛化誤差越小,表示任務(wù)具有更好的泛化能力,能夠更準(zhǔn)確地對(duì)未知數(shù)據(jù)進(jìn)行預(yù)測(cè)。
訓(xùn)練誤差:指任務(wù)在訓(xùn)練數(shù)據(jù)集上的表現(xiàn)能力,反映了任務(wù)在學(xué)習(xí)過(guò)程中所做的誤差。訓(xùn)練誤差越小,表示任務(wù)在訓(xùn)練數(shù)據(jù)集上的表現(xiàn)越好。
評(píng)估指標(biāo)說(shuō)明:
均方誤差:評(píng)估回歸任務(wù)性能的重要指標(biāo),數(shù)值越小表示任務(wù)的預(yù)測(cè)結(jié)果越精確。通過(guò)計(jì)算真實(shí)值與回歸任務(wù)預(yù)測(cè)值之間的差值的平均平方和獲得。
R平方:評(píng)估回歸任務(wù)性能的重要指標(biāo),數(shù)值越接近1表示任務(wù)的擬合程度越好。一般認(rèn)為超過(guò)0.8的任務(wù)擬合優(yōu)度比較高。
均方根對(duì)數(shù)誤差:數(shù)值越小,表示任務(wù)的預(yù)測(cè)效果越好。通過(guò)對(duì)預(yù)測(cè)值和真實(shí)值取對(duì)數(shù)后計(jì)算誤差平方和的平均值獲得。
說(shuō)明比較多個(gè)回歸任務(wù)時(shí),需要同時(shí)考慮均方誤差和R平方,以找到最佳平衡任務(wù)或適合特定數(shù)據(jù)集的任務(wù)。
均方誤差為0或R平方值為1通常是不可能的,因?yàn)槿蝿?wù)的預(yù)測(cè)結(jié)果受到多種因素的影響,而這些因素?zé)o法全部考慮到并完全消除誤差。
均方根對(duì)數(shù)誤差為NaN表示任務(wù)預(yù)測(cè)的結(jié)果或真實(shí)結(jié)果存在非正數(shù)或零的情況。
更多詳細(xì)信息請(qǐng)參見(jiàn)回歸評(píng)估。
使用航班延誤預(yù)測(cè)任務(wù)
通過(guò)Kibana中的推理處理器使用上面訓(xùn)練的航班延誤預(yù)測(cè)任務(wù)。
單擊Kibana頁(yè)面左上角的圖標(biāo),選擇Management > 開發(fā)工具。
在Kibana控制臺(tái)中,執(zhí)行以下命令查看并記錄model_id值。
GET _ml/inference/flightdelaymin_job*?human=true
此命令表示查詢名為flightdelaymin_job的所有推理分析結(jié)果,并將結(jié)果以人類可讀的格式進(jìn)行輸出。命令中flightdelaymin_job為創(chuàng)建回歸推理任務(wù)中定義的作業(yè)ID。
基于上面創(chuàng)建的回歸推理任務(wù),創(chuàng)建一個(gè)基于推理處理器的pipeline管道。
說(shuō)明將代碼中的model_id值替換為您獲取到的model_id值。
PUT _ingest/pipeline/flight_flightDelayMin_predict { "description": "Predict the number of minutes of delay for each flight", "processors": [ { "inference": { "model_id": "flightDelayMin_job-168609891****", "inference_config": { "regression": {} }, "field_map": {}, "tag": "flightDelayMin_prediction" } } ] }
使用kibana_sample_data_flights索引中的數(shù)據(jù),以航班延誤時(shí)間FlightDelayMin為目標(biāo)變量,進(jìn)行數(shù)據(jù)分析和預(yù)測(cè)。
POST _ingest/pipeline/flight_flightDelayMin_predict/_simulate { "docs": [ { "_source": { "FlightNum": "EDGSV3T", "DestCountry": "CN", "OriginWeather": "Damaging Wind", "OriginCityName": "Durban", "AvgTicketPrice": 1065.7037805199147, "DistanceMiles": 7273.460817641552, "FlightDelay": true, "DestWeather": "Rain", "Dest": "Shanghai Pudong International Airport", "FlightDelayType": "Carrier Delay", "OriginCountry": "ZA", "dayOfWeek": 5, "DistanceKilometers": 11705.500526106527, "timestamp": "2023-06-03T09:34:00", "DestLocation": { "lat": "31.14340019", "lon": "121.8050003" }, "DestAirportID": "PVG", "Carrier": "Kibana Airlines", "Cancelled": false, "FlightTimeMin": 881.1071804361806, "Origin": "King Shaka International Airport", "OriginLocation": { "lat": "-29.61444444", "lon": "31.11972222" }, "DestRegion": "SE-BD", "OriginAirportID": "DUR", "OriginRegion": "SE-BD", "DestCityName": "Shanghai", "FlightTimeHour": 14.685119673936343, "FlightDelayMin": 45 } } ] }
得到的結(jié)果,如圖所示。
實(shí)際的航班延誤時(shí)間FlightDelayMin為45min,預(yù)測(cè)得到的航班延誤時(shí)間FlightDelayMin_prediction為50.28min,與實(shí)際相差不大。
feature_importance里顯示了對(duì)估算航班延誤時(shí)間貢獻(xiàn)最大的5個(gè)影響因素:FlightTimeMin,DistanceKilometers,DistanceMiles,OriginAirportID和FlightTimeHour。您可以通過(guò)調(diào)整5個(gè)影響因素的值來(lái)調(diào)整任務(wù)預(yù)測(cè)結(jié)果,從而更為精確地估計(jì)未來(lái)每個(gè)航班的延誤時(shí)間。