SLS機器學習介紹(05):時間序列預測
00系列文章目錄
0.1 演算法原理目錄
- SLS機器學習介紹(01):時序統計建模
- SLS機器學習介紹(02):時序聚類建模
- SLS機器學習介紹(03):時序異常檢測建模
- SLS機器學習介紹(04):規則模式挖掘
- SLS機器學習介紹(05):時間序列預測
0.2 演算法最佳實踐
一、問題背景
場景一:計量預測
- 我們在使用阿里雲的產品,能不能提供一下我們服務未來一週或者未來一天的相關計量指標的預測,方便計算服務外來的花費等問題?
場景二:服務容量預測
- 能否根據歷史資料,預測一下,網站請求量的情況?儲存容量的預測?OSS使用情況的預測?
- 能否根據在ECS中的機器的使用情況,能否更好的輔助運維同學做各種資源的排程,讓使用者的服務更加彈性,提高服務的可用性?
- 能否預測穩定業務的機櫃和機架的電量消耗,幫助資料中心降低資源消耗,節約成本?
場景三:業務預測告警
- 根據服務的歷史訪問情況,進行未來一天的訪問請求預測,當實際值與預測值偏差較大時,立馬告知相關的運營同學,分析使用者留存等問題,幫助產品持續迭代?
二、我們提供了什麼?
2.1 統計學模型
1. 使用預設的arma(p=3, q=1)模型進行預測 ts_predicate_simple(unixtime, val, nPred, samplePeriod, sampleMethod) 2. 使用ar(p)模型進行預測 ts_predicate_ar(unixtime, val, p, nPred, samplePeriod, sampleMethod) 3. 使用arma(p, q)模型進行預測 ts_predicate_arma(unixtime, val, p, q, nPred, samplePeriod, sampleMethod) 4. 使用arima(p, d, q)模型進行預測 ts_predicate_arima(unixtime, val, p, d, q, nPred, samplePeriod, sampleMethod)
2.2 機器學習模型
1. 不對資料做任何處理,直接使用GBRT模型進行預測 ts_regression_predict(unixtime, val, nPred, 'origin', samplePeriod, sampleMethod) 2. 對資料做時序分解,對分解出來的序列分別做預測,在進行整合 ts_regression_predict(unixtime, val, nPred, 'forest', samplePeriod, sampleMethod) 3. 不對資料做任何處理,使用線性模型進行預測 ts_regression_predict(unixtime, val, nPred, 'linear', samplePeriod, sampleMethod) 4. 使用auto引數,演算法儘可能根據時序自身的特徵,進行學習預測 ts_regression_predict(unixtime, val, nPred, 'auto', samplePeriod, sampleMethod)
傳送門在這裡:機器學習簡介
三、內部的演算法邏輯
3.0 資料的基本預處理
- 資料先進行歸一化,去均值操作,這個很重要,需要將訊號中的直流分量去除讓演算法分析時效果更加穩定。
- 按照一定的策略將資料進行補齊,具體的操作詳見文件:Signal extension modes。這裡展示出補點結果的示意圖,其中紅色的曲線點是原始的時序序列,其中黑色的點是按照不通方式補充的點示意圖。本平臺內建的演算法使用的補點策略是Periodic模式。
3.1 小波分解演算法
3.1.1 形象的認識下小波
針對小波變換,聊深了就會涉及到大量的問題定義、性質分析、定理證明等。僅僅想明白下為什麼用小波而不選擇大家熟悉的傅立葉變換,就要寫上幾篇文章,且需要在不通的問題中去對比分析。作者非數學系出身,非訊號出身,對於冗長的證明就是看看就好,重在瞭解小波的特點而解決相應的問題。
- 小波是啥?
傅立葉變換主要給大家提供了一種在不通空間進行訊號表達的橋樑,但是該橋樑是一個獨木橋(僅僅有一個維度:時間或者頻率)。針對平穩時間訊號而言,頻率相對穩定(隨時間變化較小),這種訊號可以使用傅立葉變換去解決,很好的分析相應的頻域特徵;
現實中訊號大都是非平穩訊號,在計算機系統中的各個指標都會不同,當想去提取有用的資訊時,最初往往是通過加視窗的傅立葉變換的方法在不通視窗將頻域的相關資訊進行展開。其中涉及到視窗的選擇和相應的變換基(就是作用函式,這裡我們就先這麼稱呼哈),複雜度較高。因此,各路大神,將尺度資訊和位置資訊整合在一起(是按照一定的函式關係互相聯動),在很多約束下(能量守恆、正交性等)設計出不通性質的小波函式(也叫小波基),可以更直觀的分析在高維空間中的特性,從而更好的解決問題。
-
視覺化一些小波基函式
- Haar小波:Haar小波函式,是小波分析中最早使用的一個具有緊支撐的正交小波函式,也是最簡單的一個小波函式。Haar小波在時域上是不連續的,所以作為基本小波效能並不是很好。
- Daubechies小波:多貝西小波,一般簡寫成DB-N,其中N是小波的階數。DB-N小波具有很好的正則性,即該小波作為稀疏基所引入的光滑誤差不容易被察覺,使得訊號重構過程比較光滑。DB-N小波的特點是隨著階數的增加,消失矩的階數也會越大,其中消失矩越高,重構的訊號的光滑性越好,頻域的區域性化能力就越強,頻帶的劃分效果越好,但是會使得支撐域減弱,同時計算量加大。
- Symlet小波:Symlet小波函式是對DB-N系列小波函式的一種改進。Symlet小波系通常表示為Sym-N。SymN小波的支撐範圍為2N-1,消失矩為N,同時也具備較好的正則行。與DB-N小波相比,在連續性、支撐集長度、濾波器長度等方面與DB-N小波一致,但sym-N小波具有更好的對稱性,即一定程度上能夠減少對訊號進行分析和重構時的相位失真。
- Meyer小波:Meyer小波的小波函式和尺度函式都是在頻率域中進行定義的,它不是緊支撐的,但是它的收斂速度很快。
3.1.2 Mallat小波分解
- 序列的小波分解的具體的邏輯關係如下
- 分解邏輯解釋
將時間序列進行小波分解,每一層分解的結果是上次分解得到的低頻訊號再分解成高頻和低頻兩個部分,如此進行N層分解後,源訊號X被分解成:
$$ X = D_1 + D_2 + ... + D_N + A_N $$
其中,$D_1, D_2, D_3, ..., D_N$分別為第一層、第二層到第N層分解得到的高頻訊號,$A_N$為第N層分解得到的低頻訊號。對$D_1, D_2, D_3, ..., D_N$分別進行預測,然後進行小波重構實現對源訊號的預測:
- 對源序列進行小波分解,得到各層小波係數
- 對各層小波係數分別建立時序模型,對各層小波係數進行預測
- 用得到的預測小波係數對原始序列進行重構
其中步驟2中的時序模型,可以為ARMA模型,Forest模型,神經網路模型,SVR模型等。
-
PS:拿到各個分解出來的序列訊號,還能做些什麼?
- 針對低頻部分的可以分別去檢測序列的週期性
舉個例子,看看Mallat分解演算法對於訊號的處理能力
- 以某叢集的CPU負載情況為例,來看下分析的能力
圖中各個區域的含義:
- 藍色表示15分鐘一個粒度的某叢集CPU負載曲線的實際圖
- A1、A2、A3表示不同層級的低頻訊號重構出來的時域訊號資訊
- D1、D2、D3表示相應層級的高頻訊號重構出來的時域訊號資訊
- 某網站的近10天PV情況為例子,來看下分析能力
圖中各個區域的含義:
- 藍色表示10分鐘一個粒度的某WebSite的PV曲線的實際圖
- A1、A2、A3表示不同層級的低頻訊號重構出來的時域訊號資訊
- D1、D2、D3表示相應層級的高頻訊號重構出來的時域訊號資訊
3.1.3 小波收縮(WaveletShrinkage)演算法
WaveShrink方法來對未知訊號進行降噪,此方法的原理是將小波係數趨向零收縮,從而達到降噪目的。一般而言,訊號經小波變換後,得到一系列的小波係數。一般情況下,較大系數代表訊號,較小系數代表噪聲,將小系數剔除後,在進行小波逆變換,重構訊號中的噪聲含量便降低了。
-
WaveShrink降噪分為以下三步:
- 將訊號進行小波變換,求小波係數;
- 根據經驗公式計算閾值,並對小波係數進行閾值處理;
- 將處理後的小波係數逆變換。閾值處理方法採用軟閾值方式,軟閾值方式是講小波係數通閾值相比較,絕對值小於閾值的係數被設定成零,絕對值大於閾值的係數將閾值從其絕對值中減掉;
- 經過軟閾值降噪的訊號比較平滑,但是訊號會產生一定的偏差;
-
基於Stein's Unbiased Risk Estimate原理(SURE)產生閾值
- 對於一個給定的閾值$\lambda$最小化,就得到了所選擇的閾值,給定閾值$\lambda$定義為:
$$ \lambda = \sigma * 2 * \sqrt(log(n) / n), \sigma = MAD / 0.6745 $$
MAD為最佳尺度上小波係數軌跡的絕對均值,因子0.6745是高斯分佈矯正選擇的。
- 以某叢集中某機櫃的電量使用情況,可以在具體的使用的效果
圖中,藍色的曲線是原始的機櫃電量的示意圖,橙色曲線是經過小波收縮後的結果示意圖,可以很好的濾掉序列中的高頻噪聲,而對低頻訊號的保留相對較好,相比於在時序進行各種簡單平滑操作得到的效果好處顯而易見。
3.2 機器學習演算法
經過上述各種時域和頻域的變換操作後,我們拿到一些資料預處理之後的結果,針對該結果,進行更好的時序預測。這時要們要使用機器學習中的相關演算法進行建模,得到最合理的時序預測結果。
3.2.0 模型構建和驗證流程
現在模型學習和模型驗證思路大多是:
- 直接比較不同模型在相同的訓練集中的效果如何?或是相同模型的不同引數在同一個資料集合中的效果如何?
- 在另一份資料中去驗證模型在不同指標的好壞,最終通過相關的結果評估公式選擇一個目前最好的模型作為最終的模型
- 當前討論問題是對時序進行預測,因此,模型衡量的標準就是在驗證集合中時序的預測效果,衡量效果的指標就是MAE/MSE/R-Square/Adj-R-Square。
3.2.1 線性模型(Linear Regression)
迴歸就是使用若干已知的樣本對公式引數的估計。$Y=F(X_1,X_2,X_3)$,這裡的迴歸函式$F(...)$可以是任意函式,其中線性迴歸的模型如下所示:
$$ Y = F(X_1,X_2,X_3) = a*X_1 + b*X_2 + c*X_3 + d $$
其中,$X_1,X_2,X_3$是訓練樣本集合中樣本的各個維度,$a,b,c,d$是模型中的未知引數。
通過對線性模型的訓練,可以較好的得到模型中各個變數之間的關係。
-
常用的線性模型
- 線性迴歸
- 多元線性迴歸
- 嶺迴歸
- Lasso迴歸
按照最小均方誤差函式進行操作,得到的優化目標函式如下:
$$ f(x_i) = \sum_{m=1}^{p} w_m * x_{im} + w_0 = w^{T} * x_i $$
使用各種優化方法,求解$w$向量,得到線性模型中的相關引數,在使用逐點預測的方式,得到相應的預測結果。
3.2.3 非線性模型(Non-Linear Regression)
在之前的文章中介紹過時序統計學模型(AR、ARMA、ARIMA)模型,建模的思路源於針對當前觀測點的最近P個點和最近Q個點的誤差值進行建模,結構如下:$Y_t = \sum_{j=1}^{P}\phi_j * Y_{t-j} - \sum_{k=i}^{Q} \theta_k * \epsilon_{t-k} + \epsilon_t$。在利用相應的數學工具進行求解,具體的原理文章,請見SLS機器學習介紹(01):時序統計建模
這裡,我們介紹下機器學習演算法中,如何進行時序預測~~~
現實背景中,很多資料並不是嚴格按照線性關係刻畫的,演算法工程師為了兼顧模型的可解釋性,將非線性的資料進行各種變換(冪函式變換、倒數變換、指數變換、對數變換、Box-Cax等)將一個非線性問題轉換成一個呈現線性關係的問題,再利用相應的模型進行解決。
-
機器學習演算法可以進行迴歸預測的模型如下
- Logistic Regression
- GBRT(MART)/XGBOOST
- 神經網路模型
- 支援向量機(SVR)
- 不同學習方法在不同特性方面的體現
特性 | 神經網路 | SVM | 樹 | MARS | K-NN核 |
---|---|---|---|---|---|
混合型別資料的自然處理 | 差 | 差 | 好 | 好 | 中等 |
遺漏值的處理 | 差 | 差 | 好 | 好 | 好 |
對輸入空間中孤立點的健壯性 | 差 | 差 | 好 | 差 | 好 |
對輸入的單調轉換的不敏感性 | 差 | 差 | 好 | 差 | 差 |
計算的可伸縮性 | 差 | 差 | 好 | 好 | 差 |
處理不相關輸入的能力 | 差 | 差 | 好 | 好 | 差 |
提取特徵的線性組合的能力 | 好 | 好 | 差 | 差 | 中等 |
可解釋性 | 差 | 差 | 中等 | 好 | 差 |
預測能力 | 好 | 好 | 差 | 中等 | 好 |
在資料探勘應用中,包含在分析中的大量預測例子變數僅有一小部分與預測是實際相關聯的。同時,與模式識別等諸多應用不同,這裡很少有可靠的領域知識幫助建立特別相關的特徵或者過濾掉不相關的特徵,其結果是嚴重降低了許多方法的效能。
對速度、可解釋性的要求和資料凌亂的特性嚴重限制了大量學習過程,使之無法作為資料探勘的“現貨方法”。“現貨”方法是一種可以直接應用於資料,而不需要花費太多時間進行資料預處理或對學習過程小心進行調整的方法。
PS:上述表格出自《統計機器學習基礎:資料探勘、推理與預測》第10章。
本平臺使用GBRT演算法進行時間序列的預測,下面具體介紹下GBRT演算法的基本流程和本平臺的建模流程!
3.2.3.1 迴歸樹演算法簡介
資料組織如下,P個輸入和一個響應,以及N個觀測:即$(x_i, y_i)$,其中$i=1,2,3,...,N$,$x_i = (x_{i1}, x_{i2}, ..., x_{ip})$。演算法需要自動確定分裂變數和分裂點,以及樹應該有什麼樣的拓撲結構。
假設已經將空間劃分成M個區域$R_1, R_2, ..., R_M$,並且在每個區域內用常量$c_m$對響應建模。
$$ f(x) = \sum_{m=1}^{M}c_m * I(x \in R_m) $$
優化的目標函式採用誤差平方和$\sum (y_i - f(x_i))^2$極小華作為我們的準則,則推導得到最佳的$\hat{c}_m$恰好是$y_i$在區域$R_m$的平均值
$$ \hat{c}_m = avg(y_i | x_i \in R_m) $$
從所有的資料開始,考慮一個分裂變數j和分裂點s,並定義一對半平面:
$$ R_1(j, s) = \{X|X_j \leq s\} , R_2(j, s) = \{X | X_j > s\} $$
然後搜尋分裂變數j和分裂點s,它求解:
$$ min_{j,s} = [min_{c_1} \sum_{x_i \in R_1(j, s)}(y_i - c_1)^2 + min_{c_2} \sum_{x_i \in R_2(j, s)}(y_i - c_2)^2] $$
對於任意的j和s,內部極小化可以用下式求解:
$$ \hat{c}_1 = avg(y_i|x_i \in R_1(j, s)), \hat{c}_2 = avg(y_i|x_i \in R_2(j, s)) $$
找到最好的分裂,我們把資料劃分成兩個結果區域,並對每個區域重複分裂過程。然後對素偶偶的結果區域重複這一過程。
PS:這僅僅是迴歸演算法的簡單描述,並沒有詳細說明其中越到的各種坑。
3.2.3.2 時序特徵的構造
拿到一條時間序列,我們能從中構造哪些特徵???
給定一個視窗,從中挖掘相應的特徵,同時也方便後續進行滾動預測。
平臺實驗
具體如何使用相關演算法的說明和例項在SLS機器學習最佳實戰:時序預測這篇文章中有詳細的描述,大家如果在使用過程中遇到什麼BadCase可以告知我們。
硬廣時間
日誌進階
阿里雲日誌服務針對日誌提供了完整的解決方案,以下相關功能是日誌進階的必備良藥:
- 機器學習語法與函式: https://help.aliyun.com/document_detail/93024.html
- 日誌上下文查詢:https://help.aliyun.com/document_detail/48148.html
- 快速查詢:https://help.aliyun.com/document_detail/88985.html
- 實時分析:https://help.aliyun.com/document_detail/53608.html
- 快速分析:https://help.aliyun.com/document_detail/66275.html
- 基於日誌設定告警:https://help.aliyun.com/document_detail/48162.html
- 配置大盤:https://help.aliyun.com/document_detail/69313.html
更多日誌進階內容可以參考:日誌服務學習路徑。
聯絡我們
糾錯或者幫助文件以及最佳實踐貢獻,請聯絡:悟冥
問題諮詢請加釘釘群: