通過Python 代碼實現時間序列數據的統計學預測模型

2020-12-22 AI科技大本營

來源 | DeepHub IMBA

封圖 | CSDN 付費下載於視覺中國

在本篇中,我們將展示使用 Python 統計學模型進行時間序列數據分析。 目標是:根據兩年以上的每日廣告支出歷史數據,提前預測兩個月的廣告支出金額。

原始數據:2017-01-01 到 2019-09-23 期間的每日廣告支出。

數據準備:劃分訓練集和測試集。

df1 = data[['Date','Spend']].set_index('Date') train = df1.iloc[:933,:]test = df1.iloc[933:,:] test.shape,train.shape測試集大小:(63,1);訓練集大小:(933,1)。

統計模型與統計要素

時間序列分析常用統計模型

單變量時間序列統計學模型,如:平均方法、平滑方法、有/無季節性條件的 ARIMA 模型。多變量時間序列統計學模型,如:外生回歸變量、VAR。附加或組件模型,如:Facebook Prophet、ETS。結構化時間序列模型,如:貝葉斯結構化時間序列模型、分層時間序列模型。在本篇文章中,我們主要關注 SARIMA 和 Holt-winters 方法。

單變量時間序列統計學模型的關鍵要素

如果我們想要對時間序列數據進行上述統計學模型分析,需要進行一系列處理使得:

(1)數據均值(2)數據方差(3)數據自協方差

這三個指標不依賴於時間項。即時間序列數據具有平穩性。

如何明確時間序列數據是否具有平穩性?

可以從兩個特徵進行判斷。

(1) 趨勢,即均值隨時間變化;

(2) 季節性,即方差隨時間變化、自協方差隨時間變化。

若滿足以上兩個條件,則時間序列數據不符合平穩性要求。

可以通過以下方法消除上述問題:

變換,如:取對數、取平方等。平滑處理,如:移動平均等。差分。分解。多項式擬合,如:擬合回歸。

ARIMA:差分整合移動平均自回歸模型

Autoregressive Integrated Moving Average model (ARIMA),差分整合移動平均自回歸模型。ARIMA(p,d,q)主要包含三項:

p:AR項,即自回歸項(autoregression),將時間序列下一階段描述為前一階段數據的線性映射。

d項,即積分項(integration),時間序列的差分預處理步驟,使其滿足平穩性要求

q:MA項,即移動平均項(moving average),將時間序列下一階段描述為前一階段數據平均過程中的殘留誤差的線性映射。

該模型需要指定 p d q三項參數,並按照順序執行。ARIMA 模型也可以用於開發 AR, MA 和 ARMA 模型。

ACF 和 PACF 圖

自相關函數,autocorrelation function(ACF),描述了時間序列數據與其之後版本的相關性(如:Y(t) 與 Y(t-1) 之間的相關性)。

偏自相關函數,partial autocorrelation function(PACF),描述了各個序列的相關性。

通過 PACF 圖可以確定 p通過 ACF 圖可以確定 qSARIMA

季節性差分自回歸滑動平均模型,seasonal autoregressive integrated moving averaging(SARIMA),在 ARIMA 模型的基礎上進行了季節性調節。

其形式為:SARIMA(p,d,q)(P,D,Q)s,其中P,D,Q為季節參數,s為時間序列周期。

案例:通過 SARIMA 預測廣告支出

首先,我們建立test_stationarity來檢查時間序列數據的平穩性。

from statsmodels.tsa.stattools import adfuller df1=df.resample('D', how=np.mean)def test_stationarity(timeseries): rolmean = timeseries.rolling(window=30).mean rolstd = timeseries.rolling(window=30).std plt.figure(figsize=(14,5)) sns.despine(left=True) orig = plt.plot(timeseries, color='blue',label='Original') mean = plt.plot(rolmean, color='red', label='Rolling Mean') std = plt.plot(rolstd, color='black', label = 'Rolling Std') plt.legend(loc='best'); plt.title('Rolling Mean & Standard Deviation') plt.showprint ('<Results of Dickey-Fuller Test>') dftest = adfuller(timeseries, autolag='AIC') dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])for key,value in dftest[4].items: dfoutput['Critical Value (%s)'%key] = value print(dfoutput) test_stationarity(df1.Spend.dropna)通過 test_stationarity函數,可以繪製移動平均值以及標準差,並且通過 Augmented Dickey-Fuller test 輸出 P 值。

對比臨界值(critical value)可以看到,時間序列數據時非平穩的。

首先我們試試對數變換,能不能使數據達到平穩性要求。

可以看到,利用對數變換df1[『log_Spend』]=np.log(df1[『Spend』]),時間序列在閾值為5%時滿足平穩性要求。接下來,我們試試差分操作:test_stationarity(df1[『Spend』].diff(1).dropna)。

顯然,通過差分操作後,效果更好,時間序列在閾值為1%時滿足平穩性要求。

然後,我們就可以建立 SARIMA 模型,並且預測 2019-07-23 到 2019-09-23 這兩個月間每天的廣告指出。

import statsmodels.api as sm fit1 = sm.tsa.statespace.SARIMAX(train.Spend, order=(7, 1, 2), seasonal_order=(0, 1, 2, 7)).fit(use_boxcox=True) test['SARIMA'] = fit1.predict(start="2019-07-23", end="2019-09-23", dynamic=True) plt.figure(figsize=(16, 8)) plt.plot(train['Spend'], label='Train') plt.plot(test['Spend'], label='Test') plt.plot(test['SARIMA'], label='SARIMA') plt.legend(loc='best') plt.show現在,讓我們通過從 sklearn.metrics包導入mean_squared_error,mean_absolute_error函數計算 mse 和 mae 來檢查這個模型的性能。結果如下:

進行數據可視化:

從 mse、mae 以及預測曲線可以看出,SARIMA 模型成功預測了時間序列變化趨勢和季節性特徵。但是在峰值處的表現仍舊有待提高。

ETS:指數平滑法

ETS,Exponential Smoothing

由於時間序列數據隨時間變化但具有一定的隨機性,我們通常希望對數據進行平滑處理。為此,我們將使用 ETS 技術,通過指數方法為過去的數據分配較少的權重。同時將時間序列數據分解為趨勢(T)、季節(S)和誤差(E)分量。

三種常用 ETS 方法如下:

Linear:雙指數平滑;Additive:三指數平滑;Multiplicative:三指數平滑。

Holt-Winter 季節性預測算法

Holt-winter 季節性預測算法是一種三指數平滑方法。它包含三個主要部分:水平、趨勢、季節性分量。

案例:通過 Holt-Winter 季節性預測算法預測廣告支出

通過 Holt-winter 季節性預測算法預測 2019-07-23 到 2019-09-23 期間的每日廣告支出,代碼如下:

from statsmodels.tsa.api import ExponentialSmoothing fit1 = ExponentialSmoothing(np.asarray(train['Spend']) ,seasonal_periods=7 ,trend='add', seasonal='add').fit(use_boxcox=True)test['Holt_Winter'] = fit1.forecast(len(test)) plt.figure(figsize=(16,8)) plt.plot( train['Spend'], label='Train') plt.plot(test['Spend'], label='Test') plt.plot(test['Holt_Winter'], label='Holt_Winter') plt.legend(loc='best') plt.show

同樣,我們通過 mean_squared_error,mean_absolute_error函數查看 mse 和 mae。

可以看到,H-W 模型同樣能夠預測時間序列變化趨勢和季節性特徵。

算法對比

通過將兩種算法的預測結果進行對比,可以評價哪種方法預測能力更好。

從圖中可以看出,在MSE和MAE均較低的情況下,SARIMA模型的性能略優於Holt-Winter模型。儘管這兩種模式都無法完美地抓住峰谷特徵,但它們仍然對企業有用。根據數據,平均每月廣告支出為2百萬美元以上。而這兩種算法的MAE大約在6000左右。換言之,對於一家平均每月廣告支出為2百萬美元的企業,兩個月的廣告支出預測誤差只在6000美元左右,這是相當可觀的。

結束語

在本文中,單變量預測方法在廣告支出數據上表現良好。但這些方法難以組合/合併新的信號(如事件、天氣)。同時這些方法對丟失數據也非常敏感,通常不能很好地預測很長一段時間。

你還想了解深度學習技術的哪些問題,戳文末評論告訴我們,就有機會獲得「AI 開發者萬人大會」的在線直播門票哦!

前百度主任架構師創業,兩年融資千萬美元,他說AI新藥研發將迎來黃金十年北京四環堵車引發的智能交通大構想400 多行代碼!超詳細中文聊天機器人開發指南 | 原力計劃三大運營商將上線 5G 消息;蘋果谷歌聯手,追蹤 30 億用戶;jQuery 3.5.0 發布 | 極客頭條比特幣當贖金,WannaRen 勒索病毒二度來襲!你公司的虛擬機還閒著?基於 Jenkins 和 Kubernetes 的持續集成測試實踐了解一下!從 Web 1.0到Web 3.0:詳析這些年網際網路的發展及未來方向

相關焦點

  • 時間序列模型matlab代碼 - CSDN
    你是否想要做時間序列分析,但卻不知道代碼怎麼寫?你是否不清楚時間序列分析各種模型該在什麼情況下使用?本文將針對以上兩個問題,帶你入門時間序列分析~等等!不止』入門『讀完這篇,你立即就能在R中寫出不同模型的相應代碼~先介紹以下我自己吧~我目前是Warner Bros.做Data Scientist,記得剛入職時,老闆就跟我說未來我的主要任務是用各種類型的時間序列模型做預測:預測好萊塢遊覽車未來三年每天的乘客數量、預測<Aquaman>, <Joker>,<Wonder
  • 乾貨|時間序列預測類問題下的建模方案探索實踐
    而時間序列就是該種現象某一個統計指標在不同時間上的數值,按時間先後順序排列而形成的序列。時間序列分析主要針對時間序列類問題的兩個領域,一個是對歷史區間數據的分析,通過對過往數據特徵的提煉總結來進行異常檢測和分類;另一類就是對未來數據的分析,根據過去時間點的數據對未來一個時間點或者幾個時間點的狀態或實際值進行預測。
  • Meal Kit 的時間序列數據預測實踐
    本文的目的是基於歷史數據,通過機器學習的方法實現對於每周需求的預測。主要目標在於開發一個模型用於減少配送損失。數據詞典首先,我們有三個烹飪食材配送服務相關的數據集。在時間序列中,缺失的數據可能會隱藏起來,因為數據可能在時間步長(1周)內不一致,這將在構建模型時可能會導致問題。對每個供應中心標識的數據進行分組。其中一些食材並非每周訂購/提供的,那麼將這幾周的需求量取為0,但是價格設置為組內食材的平均值。我們假設這些食材在缺失的幾周內是有提供的,但是沒有人買。在研究了餐盒市場後,人們意識到大部分成本來自易腐商品。
  • 使用LSTM深度學習模型進行溫度的時間序列單步和多步預測
    本文的目的是提供代碼示例,並解釋使用python和TensorFlow建模時間序列數據的思路。本文展示了如何進行多步預測並在模型中使用多個特徵。本文的簡單版本是,使用過去48小時的數據和對未來1小時的預測(一步),我獲得了溫度誤差的平均絕對誤差0.48(中值0.34)度。
  • Sktime:用於時間序列機器學習的Python庫
    例如,時間序列回歸模型(使用序列來預測輸出值)可用於時間序列預測任務(預測的輸出值是終值)。適合時間序列的數據模型Sktime針對pandas數據幀中的時間序列使用了嵌套數據結構。典型數據框架中的每一行都包含獨立同分布觀測值,列代表不同的變量。對於Sktime方法,Pandas數據幀中的每個單元格包含整個時間序列。
  • 數據統計方法:確定性時間序列的分析法
    時間序列分析是一種動態數據處理的統計方法。該方法基於隨機過程理論和數理統計學方法,研究隨機數據序列所遵從的統計變化規律,以用於解決實際問題。時間序列平穩性判別方法平穩時間序列有三要求:存在固定的期望,換句話說,前100個數字串和前1000個數字串他們的期望是一樣的,或者說,統計學上可以容忍為一樣的。存在固定的方差。
  • python數據挖掘常用工具有哪幾種?
    python數據挖掘常用工具有哪幾種? python有強大的第三方庫,廣泛用於數據分析,數據挖掘、機器學習等領域,下面小編整理了python數據挖掘的一些常用庫,希望對各位小夥伴學習python數據挖掘有所幫助。
  • 使用單行代碼評估回歸模型的Python包
    對此的一個內聯嘗試是python包「 regressormetricgraphplot」的開發,該軟體包旨在幫助用戶使用單行代碼繪製評估指標圖,以針對不同的廣泛使用的回歸模型指標進行一目了然的比較。使用該實用程序包,還可以通過將其應用於日常的預測回歸問題,顯著降低從業人員以業餘方式評估不同機器學習算法的障礙。
  • PyTorch-Transformers:最先進的自然語言處理庫(附帶python代碼)
    大多數最先進的模型需要大量的訓練數據和花費數天時間在昂貴的GPU硬體上進行訓練,而這些只有大型技術公司和研究實驗室才能負擔得起。但隨著PyTorch-Transformers的推出,現在任何人都可以利用這些最先進的模型!在你的機器上安裝PyTorch-Transformers在Python中 Pytorch-Transformers非常簡單。
  • 摺疊革命,深度學習通過胺基酸序列預測蛋白質結構
    近些年,蛋白質通過自身的胺基酸序列可以實現被預測,在計算方法上有了巨大進步。如果都能使用這些計算方法,那生物醫學研究都可以被轉換成計算公式。然而,現在一些應用則受到了蛋白質規模和範圍的局限而無法決策。近期,來自哈佛醫學院的科學家應用了深度學習的方法,基於胺基酸序列來有效預測蛋白質的3D結構。
  • python 預測股票專題及常見問題 - CSDN
    ,通常用來預測相關時間序列系統和研究隨機擾動項對變量系統的動態影響。VAR模型類似聯立方程,將多個變量包含在一個統一的模型中,共同利用多個變量信息,比起僅使用單一時間序列的ARIMA等模型,其涵蓋的信息更加豐富,能更好地模擬現實經濟體,因而用於預測時能夠提供更加貼近現實的預測值。此處擬基於貴州茅臺股票數據,建立VAR的預測模型。使用後30天的數據作為驗證集,剩餘的數據用於建立預測模型。
  • Python中的時間序列數據可視化的完整指南
    時間序列數據在許多不同的行業中都非常重要。它在研究、金融行業、製藥、社交媒體、網絡服務等領域尤為重要。對時間序列數據的分析也變得越來越重要。在分析中有什麼比一些好的可視化效果更好呢?沒有一些視覺效果,任何類型的數據分析都是不完整的。因為一個好的情節比20頁的報告更能讓你理解。因此,本文是關於時間序列數據可視化的。
  • 教你學Python32-預測數值型數據:數據回歸
    假定輸入數據存放在矩陣X中,結果存放在向量y中:而回歸係數存放在向量w中:那麼對於給定的數據x1,即矩陣X的第一列數據,預測結果u1將會通過如下公式給出:現在的問題是,手裡有數據矩陣X和對應的標籤向量y,怎麼才能找到w呢?一個常用的方法就是找出使誤差最小的w。
  • NeuralProphet:基於神經網絡的時間序列建模庫
    NeuralProphet是一個python庫,用於基於神經網絡對時間序列數據進行建模。它建立在PyTorch之上,並受到Facebook Prophet和AR-Net庫的極大啟發。
  • 手把手:用Python搭建機器學習模型預測黃金價格
    大數據文摘作品編譯:小明同學君、吳雙、Yawei xia新年總是跟黃金密不可分。新年第一天,讓我們嘗試用python搭建一個機器學習線性回歸模型,預測金價!自古以來,黃金一直作為貨幣而存在,就是在今天,黃金也具有非常高的儲藏價值,那麼有沒有可能預測出黃金價格的變化趨勢呢?
  • 通過Keras 構建基於 LSTM 模型的故事生成器
    所以神經網絡要準確進行預測,就必須記憶單詞的所以序列。 而這正是 LSTM 可以做到的。編程實現 LSTM本文將通過 LSTM 網絡開發一個故事生成器模型。主要使用自然語言處理(NLP)進行數據預處理,使用雙向LSTM進行模型構建。
  • Python實現固定效應回歸模型實現因果關係推斷
    然後,我將介紹可以提供有效解決方案的固定效應(FE)模型。 之後,我將使用兩套數據分析示例向您展示如何在python中進行操作。 我希望本文能夠通過良好的設計和令人信服的結果增強您對因果關係的理解。相關可以表示因果關係 — 僅在滿足某些條件時讓我們給出因果關係的正式定義。 因果關係是x導致y。
  • 數模中預測類方法偏AI的走向
    在之前的數模競賽中,即便是美賽O獎的作品中,我們都能看到諸如灰色預測這樣的用MATLAB實現的方法,實際上我們有時間序列,回歸等一系列比較常用的預測方法。
  • python定時獲取天氣數據並自動發送到郵箱
    自動發送郵件,python幾行代碼來搞定!我們說到如何用python來實現自動發送郵件。另一種是通過python爬取相關天氣預報網頁的內容,從裡面提取相關的信息。由於之前沒有給大家介紹過相關爬蟲的知識,所以這裡採用第一種方法。以後再陸續介紹爬蟲怎麼去獲取天氣預報信息。
  • 幾行代碼搞定ML模型,低代碼機器學習Python庫正式開源
    想提高機器學習實驗的效率,把更多精力放在解決業務問題而不是寫代碼上?低代碼平臺或許是個不錯的選擇。最近,機器之心發現了一個開源低代碼機器學習 Python 庫 PyCaret,它支持在「低代碼」環境中訓練和部署有監督以及無監督的機器學習模型。