趨勢預測算法大PK!

https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/106368395

趨勢預測在很多應用場景中都會起到至關重要的作用,比如淘寶商家會考慮庫存量應該保持在多少才能夠滿足客戶需求,商場希望得知假期會迎來多大的客流量以安排系列活動,機場想要預測五一黃金週會有多大的客運量來做相應的應急部署等。在智能運維領域,趨勢預測同樣具有一定的理論意義和實際應用價值。

趨勢預測在運維場景中的應用背景

在實時監控系統中會採集到大量的數據,有些數據具有週期性等時間特徵,也稱之爲時間序列。如果能挖掘出時間序列中所蘊含的信息,實現輔助人工決策,甚至是自動決策,都會爲運維工作帶來事半功倍的效果。

比如KPI異常檢測可以衡量服務的健康程度,分析出CPU、交易量、響應時間等指標的歷史規律後,設置動態閾值,得到更加準確的異常報警,減少漏報誤報情況的發生,提高應急響應效率;通過對歷史事件單的分析,預測出下次系統告警可能發生的時間或者指定時間內可能發生告警的系統等,就可以根據分析結果做出相應的響應措施,爲後續運維工作帶來極大的指導意義。類似這樣的應用場景還有很多,如何充分挖掘出時間序列中所蘊含的信息,成爲智能運維領域研究中的一大熱點。

那麼時間序列一般會有哪些比較明顯的特徵呢?

一般來講具有趨勢性、季節性、週期性隨機性四種特徵。但是對於時間序列預測,想要找到一個適用所有場景的通用模型幾乎是不可能的,因爲現實中每個預測問題的背景不同,影響預測值的因素與程度也往往不同,針對不同的問題就要採用不同的方法和模型進行統計分析,這都會給建模人員和數據分析師帶來極大的難度,也使得時間序列預測問題變得複雜。

不同的模型會有各自的優勢和劣勢,本文將對傳統時間序列預測模型ARIMA、經典神經網絡模型LSTM以及Prophet模型展開具體介紹,並在事件單數據集上做了初步的探索。

常用的趨勢預測算法

2.1、ARIMA模型

ARIMA模型,全稱爲自迴歸積分滑動平均模型(Autoregressive Integrated Moving Average Model),是由博克思(Box)和詹金斯(Jenkins)於20世紀70年代初提出的一種時間序列預測方法。ARIMA模型並不是一個特定的模型,而是一類模型的總稱。通常用p,d,q值來確定,記做ARIMA(p,d,q)。其中p代表自迴歸模型階數,d代表差分階數,q代表移動平均階數。

ARIMA模型的建模步驟如下:

首先對時間序列數據進行平穩性檢測,若不通過,則採取對數、差分等相應的變換將其變爲平穩序列。通過平穩性檢測之後,進行白噪聲檢測,當序列不是白噪聲序列時,即可選擇合適的ARIMA模型進行擬合。如果誤差值通過白噪聲檢測,就可以採用擬合出的模型對時序數據進行預測了。

雖然ARIMA模型已經在很多個場景中得以應用,但是它存在的缺陷是不可忽視的:要求時序數據具有穩定性,或者通過差分化後是穩定的;對於數據中存在缺失值的情況,需要先進行缺失值填補,這很大程度上損害了數據的可靠性。

2.2 神經網絡模型

2.2.1 網絡模型初探

在人工智能領域,DNN(Deep Neural Networks,深度神經網絡)的應用極其廣泛,在圖像分類、目標檢測等領域已經取得了優異的成績。但是在DNN中,當前網絡層只和上一層神經網絡有連接,沒有考慮樣本出現的時間順序,只能進行逐層進行訓練。

爲了將時間因素包含在內,出現了RNN(循環神經網絡模型),可以將神經元的輸出在下一個時間戳直接作用到自身。具體來講,就是在t時刻接收到輸入之後,隱藏層的值是,輸出值是。關鍵點在於,的值不僅僅取決於,還取決於也就是說當前層的輸出值不僅與當前時間點的輸入有關,還要結合上一個時間點的輸出值共同參與模型的訓練。這樣RNN就成爲了一個在時間上傳遞的神經網絡了。

但RNN也存在一定的弊端,RNN只能夠接受上一個節點的輸出,隨着網絡層次的加深,可能會發生梯度消失或者梯度爆炸,通俗來講,就是當前節點無法對距離自己較遠節點的信息進行“記憶”。爲了解決該問題,研究人員提出了很多解決辦法,其中最爲經典的一個網絡模型是長短時間記憶模型(Long Short-Term Memory,LSTM)。

LSTM與RNN主要的區別在於,它在模型中加入了一個判斷信息是否有用的“處理器”,這個處理器被稱爲“記憶單元”(Memory Cell)。在一個Cell中放置了三扇門,分別是輸入門、遺忘門和輸出門。也就是說,當一個信息進入到LSTM中後,可以根據規則來判斷其是否有用,只有符合要求的信息纔會被留下,不符合的信息會被直接“遺忘”。這樣序列數據在訓練過程中的“記憶”問題就迎刃而解了。

採用神經網絡的方法雖然能夠達到較好的效果,但是模型不夠靈活,很難讓使用者引入問題的背景知識,或者一些有用的假設;訓練模型還需要大量的數據,數量不夠多很可能會產生過擬合,影響訓練效果;除此之外,LSTM是單步預測,只能預測出下一個時間點的值,對於未來任意時間段的預測很不友好。

2.3 Prophet模型

facebook發佈了prophet(“先知”)項目,它以更簡單、靈活的預測方式獲得與經驗豐富的分析師相媲美的預測結果。Prophet是Facebook發佈的基於可分解(趨勢+季節+節假日)模型的開源庫。它讓我們可以用更加簡單、直觀的參數進行高精度的時間序列預測,並且支持自定義季節和節假日因素的影響。

prophet的整體框架分爲四部分:Modeling、Forecast Evaluation、Surface Problems以及Visually Inspect Forecasts。從整體上看,這是一個循環結構,而這個結構又可以根據虛線分爲分析師操縱部分與自動化部分。因此,整個過程就是分析師與自動化過程相結合的循環體系,也是一種將問題背景知識與統計分析融合起來的過程,這種結合大大的增加了模型的適用範圍,提高了模型的準確性。

首先Modeling:建立時間序列模型;然後進行Forecast Evaluation,也就時模型評估,對參數進行多種嘗試,根據仿真效果評估出更加合適的模型;接着是Surface Problems:呈現問題,將誤差較大的潛在原因呈現給分析師進行人工干預;最後一部分是Visually Inspect Forecasts:以可視化的方式反饋整個預測結果,將問題反饋給分析師後,由分析師考慮是否進一步調整和構建模型。

針對不同的應用場景,Prophet也有相應的模型:

  1. 增長趨勢的模型:有幾個月(最好是一年)的每小時、每天或每週觀察的歷史數據;

  2. 季節趨勢的模型(seasonality模型):有較強的季節性趨勢;

  3. 有事先知道的以不定期的間隔發生的重要節假日(holiday模型),比如國慶節等。

整體來講,Prophet模型可以根據前一段時間的序列數據,結合專家的經驗,預測出期望時間段的輸出值,以較小的模型訓練成本獲得較好的訓練結果。

趨勢預測算法小試牛刀

3.1 數據採集

本文采集了一些系統工單數據,通過LSTM和prophet模型分別對系統產生的工單數量的趨勢進行預測。

首先對對提取到的數據進行預處理,提取出時間(ds)和事件單數(y)兩列數據,部分數據可視化結果如下圖所示:


 
  1. import numpy as np

  2. import pandas as pd

  3. #讀入數據

  4. sales_df = pd.read_csv('false.csv')

  5. sales_df.head()

3.2 數據實驗

1)LSTM模型構建與實驗

本文采用keras框架,構建有一個LSTM和一個全連接層的網絡,採用MSE損失函數,用adam來優化損失函數,並將數據以7:3的比例劃分爲訓練集和測試集。具體代碼如下:


 
  1. # create and fit the LSTM network

  2. model = Sequential()

  3. model.add(LSTM(4, input_shape=(1, look_back)))

  4. model.add(Dense(1))

  5. model.compile(loss='mean_squared_error', optimizer='adam')

  6. model.fit(trainX, trainY, epochs=240, batch_size=1, verbose=2)

在數據集上的實驗結果如下圖所示,左圖展現了LSTM模型在數據集上的擬合情況,橫軸爲時間,縱軸爲事件單數,黃色線爲真實值,綠色實現代表訓練集上的預測結果,綠色虛線表示測試集上的結果。可以看到模型基本可以擬合出變化趨勢,但是在具體的數量預測還有改進的空間。右圖展現了在驗證集和測試集上的loss趨勢圖。

2)Prophet模型構建與實驗


 
  1. from fbprophet import Prophet

  2.  
  3. ## 擬合模型

  4. m = Prophet()

  5. m.fit(sales_df)

  6. # # 構建待預測日期數據框,periods = 10 代表除歷史數據的日期外再往後推 10 天

  7. future = m.make_future_dataframe(periods=10)

  8. # 預測數據集

  9. forecast = m.predict(future)

  10. forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

  11.  

通過fit()方法擬合Prophet()模型,make_future_dataframe()可以對未來日期的數據趨勢進行預測,periods = 10 代表預測10天的結果,並計算出預測值(yhat),預測最小值(yhat_lower),預測最大值(yhat_upper)。具體趨勢預測圖如曲線圖所示,黑點代表真實值,淺藍色部分代表預測區間,可以看到模型基本可以擬合出較好的時間預測效果。

還能夠通過plot_components(forecast)方法預測出數據的整體趨勢和周效應:

趨勢--整體趨勢:

趨勢--周效應:

除了預測每天產生的工單數量,本文還對某些系統每天發生的工單數進行了分析和預測,希望能夠在預測的基礎上,我們可以根據工單的預測數輔助運維工作的安排和開展。如某系統產生的工單數如下圖:

小結

趨勢預測算法在衆多場景中都有重要的應用價值。本文對比較主流的ARIMA模型、LSTM神經網絡模型和facebook發佈的Prophet模型進行介紹,並在系統工單數據集上進行了初步探索。

雖然由於數據量的原因以及模型調參上還沒有達到最佳的訓練結果,但是模型對於趨勢預測的有效性已經初步展現。之後,還會對趨勢預測算法作進一步的探索和更深層次的研究,相信趨勢預測算法在智能運維領域的應用也會更加廣泛和可靠。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章