天天看點

運維場景下的機器學習嘗試

機器學習最近大紅大紫,既有這個契機為何不乘機好好學習一番。本文不是科普文,本人作為初學者也沒有能力教别人,僅僅用此篇文章記錄自己學習及嘗試結合業務場景進行的一些實驗過程。

我們平時程式設計解決問題,主要是基于規則,而通過機器學習來解決問題是通過建立模型。

基于規則

運維場景下的機器學習嘗試

我們通過經驗或者智慧,主動發掘可以解決問題的規則(也許就是一條條 if 語句),然後将許多規則結合在一起形成解決問題的方案。就比如圖中判斷垃圾郵件的過程,标題是否包含某種詞……等就是明确的規則。這種方法修改起來非常友善,隻要根據場景的演變,不斷修正規則集。

基于模型

運維場景下的機器學習嘗試

機器學習就是通過模型來解決問題,首先需要一堆資料(假設為 X),然後通過某一種算法進行學習(這裡的某種算法多種多樣,需要了解但不需要精通,畢竟不是專業人士),資料+學習算法 就會産生一個模型(模型這裡我們認為是一個複雜的函數 f)。有了這個函數,當有新的資料來需要預測的時候,就代入函數得到函數的結果(函數結果也即為問題結果)。

這裡有兩個問題:

1.這個模型是由算法+資料 訓練産生的,而不是人工幹預形成的,是以當你覺得模型不滿意的時候,你沒法直接調整模型,因為模型對于你來說是一個黑盒。你隻能通過調整資料或者調整算法來間接調整模型,已達到優化解決方案的目的。是以有一個尴尬是,當你遇到一個新的問題場景,你想說像基于規則的程式那樣,我們快點給模型加一個規則來修正模型以解決新問題吧,抱歉,臣妾做不到……必須重新訓練模型。

2.通過模型計算出的結果往往不太好解釋,不像規則産生的結果可追溯形成的過程,進而完成修正

對問題進行分類,能夠幫助我們更好的找到适合機器學習發揮的場景,一般有四大類型:

分類(classification):在訓練資料上模組化,對于新樣本,判斷它的類别。如垃圾郵件識别中判斷是否垃圾郵件(二分類)、tensoflow 的入門教程-手寫數字識别(多分類) 等

回歸(regression):在訓練資料上模組化,對于新樣本,判斷它的标注值。标注值與分類問題不同,分類問題的标注是離散值,而回歸問題中的标注是實數(連續的)。如股價預測、房價預測、監控曲線預測等

聚類(clustering):給出了一些相似度衡量标準,用來判斷兩個不同資料的相似程度,然後根據這些标準将資料進行劃分。如在一堆未給出名字的照片中,自動的将同一個人的照片聚集到一塊。

規則抽取(rule extraction):發現資料中屬性之間的統計關系,而不隻是預測一些事情。如啤酒和尿布的關系。商品推薦就是最典型的應用場景

然後,針對這些問題能夠用來建立模型的算法更多,算法分類可以參考 機器學習算法概覽

運維的工作中,經常需要對重要的名額曲線進行觀察,來判斷系統是否正常 or 異常。這個場景廣泛發生在包括監控告警、營運變更、容災演練等情況下,但是通過一些固定閥值+特定檢測算法的方法并不能滿足不斷變化的情況。是以第一個嘗試的場景就是:

根據某一名額曲線的曆史資料判斷目前/未來資料點是否異常

在實踐上述問題的過程中,發現因為機器學習畢竟是基于曆史預測未來,如果曆史本就沒有值得學習的價值,那判斷是否異常就會導緻不可了解的結果(就是某些名額圖形效果不好),繼而産生另一場景:

把名額曲線進行分類,把不同圖形特征的名額曲線分成若幹類,分而治之

資料有哪些?針對某一條名額曲線,假設是每一分鐘為一個 slot,那麼一天就是 1440 slot。又因為我們秒級監控的資料是儲存兩周,那麼 14×1440 個 slot

資料需要提取特征嗎?正常的機器學習都需要通過專門設計、特征工程等方法來提取特征。(直接怼原始資料這種适用于深度學習的方法,應該是基于海量資料,略過…)

名額曲線異常檢測是什麼類型的問題?二分類問題,判斷 slot 是否異常

應該使用什麼算法?因為資料本身并不具備标記,且通過設計方法來标記資料的成本也很高(slot 太多,每個都要标記),是以隻能采用無監督算法來建立模型

每一個名額曲線都建立一個唯一模型?理論上,針對異常分類,每個名額曲線單獨一個模型肯定是最優的,因為可以避免其他名額曲線的幹擾。但是因為實時性、資源等實際情況,需要針對應用場景自己決定,此處單獨模組化。

時序資料如何提取有關于異常檢測的特征。采取的方法是:每個 slot 單獨提取特征向量(可能變化 slot 時間視窗為 5min)。每個 slot 提取特征的過程,是使用很多比較“流行”的異常檢測器來完成。slot 經過每個檢測器的提取之後,會得到一些被檢查器量化過的,可以衡量資料異常程度的數值,稱為 serverity,然後采各種不同的 serverity 組合形成 slot 對應的特征向量。舉例 servertiy 的方法:

比如常見的正态分布的方法,假設某一時間點(縱向上看,不同天但同時同分) 的資料符合正太分布,即 14 個 slot 符合正太分布,計算 14 個點的μ和σ,然後對于某個點 x 的 serverity=|x-μ| / σ。另外其他能夠預測名額曲線值的方法可以使用 serverity = |預測值 - 實際值| / (max -min) 的方法來度量異常程度。

如下圖所示的思想,把每一個 slot 分别轉換為不同的檢測器産生的 serverity。這樣做的思考是,通過聚集不同檢測器的能力,檢測出不同情況下的異常,再通過機器學習來區分哪些是真正的異常點。經過轉化之後有效的去除了時間、數值等帶來的影響。

運維場景下的機器學習嘗試

我們最終實作了的檢測器包括:sma(移動平均法)、wma(權重移動平均)、tsd(時間序列分解法)、diff(差分)、rate(同環比)、gasi(高斯分布)、ema(一次指數平滑)、hw(三次指數平滑)、arima(自回歸積分華東平均) 等

訓練模型,采用是 sklearn 的 python 庫來實作。經過對比和實驗,選取的機器學習算法是無監督的分類異常檢測算法 isolationForest(孤異森林)。該算法的特點是:無監督、速度快、效果好(ps:已經有 wxg 同學在登入異常檢測中嘗試過)。放一張某天 tdp 系統異常時某核心名額曲線的檢測效果:

運維場景下的機器學習嘗試

上圖為當日異常曲線與昨日正常曲線對比圖,下圖為經過模型判斷之後的圖,紅色表示判斷為異常點。該模型已經嘗試在一體化流程系統的上線驗證子產品使用。

曲線分類,同樣是機器學習中典型的分類問題,而且針對這個問題已經有同學進行過嘗試,可參考智能告警算法-曲線識别模型。接下來簡單描述下不同的地方:

特征的設計:采用了開源工程提取特征和人工設計特征相結合的方法,開源時序特征工程為 cesium 和 tsfresh。因為開源特征較多,可以使用一個特征選擇的方法,進行篩選之後使用,第一版本的模型,使用了 19 個特征。

标記的訓練資料:并沒有采用 kmeans 的方法來形成标記資料,反而使用了人工标記的方法(标記了 200 個不同的曲線,花了一天時間)。之前也參考其他同學的方法先用 kmeans 聚類打标,但是效果一直不太好,且聚類完成之後也要人工挑選确認樣本,是以一不做二不休直接人工了,23333333

監督分類算法:監督分類算法很多,比如 svm、LR、神經網絡等。因為我們訓練資料不多,最後采用的是随機森林

人工劃分了 4 個類别:周期較光滑曲線、周期較粗糙曲線、類心跳曲線(整體起伏不大,在某一個範圍内反複上線跳動)、類錯誤率曲線(絕大部分情況為恒定值,比如 0,偶爾有異常突起或下陷)。該模型在腳本大師上建立了一個體驗任務,可是輸入秒級監控的曲線體驗分類。

1 .特征很重要:”資料和特征決定了機器學習的上限,而模型和算法隻是逼近這個上限而已。“由此可見,特征工程尤其是特征選擇在機器學習中占有相當重要的地位。在實踐中,大部分時間也都花在了特征選擇與提取上。怪不得深度學習如此火,跳過這步還是很偉大的,23333

2 .資料難獲得:實踐中,資料的擷取,特别是有标記的資料擷取,感覺是十分困難的。看似有很多資料,但是不知道怎麼把看似大量資料變成問題所需要且能夠使用的資料,還真是個世界難題

3 .應用場景難選取:想在運維實踐中運用機器學習獲得良好的效果,需要豐富的運維經驗,又要深厚的機器學習功底。21 世紀什麼最重要?人才、人才、人才。好好學習把,童鞋們