時(shí)間序列是指一組在連續(xù)時(shí)間上測(cè)得的數(shù)據(jù),其在數(shù)學(xué)上的定義是一組向量x(t), t=0,1,2,3,...,其中t表示數(shù)據(jù)所在的時(shí)間點(diǎn),x(t)是一組按時(shí)間順序(測(cè)得)排列的隨機(jī)變量。包含單個(gè)變量的時(shí)間序列稱(chēng)為單變量時(shí)間序列,而包含多個(gè)變量的時(shí)間序列則稱(chēng)為多變量。
時(shí)間序列在很多方面多有涉及到,如天氣預(yù)報(bào),每天每個(gè)小時(shí)的氣溫,股票走勢(shì)等等,在商業(yè)方面有諸多應(yīng)用,如:
- 銷(xiāo)售預(yù)測(cè),零售產(chǎn)品銷(xiāo)量預(yù)測(cè);
- 需求預(yù)測(cè),用于定價(jià),庫(kù)存和勞動(dòng)力管理;
- 交通預(yù)測(cè),運(yùn)輸和路線優(yōu)化,道路設(shè)施設(shè)計(jì);
- 收入預(yù)測(cè),預(yù)算和目標(biāo)設(shè)定。
下面我們將通過(guò)一個(gè)航班數(shù)據(jù)來(lái)說(shuō)明如何使用已有的工具來(lái)進(jìn)行時(shí)間序列數(shù)據(jù)預(yù)測(cè)。常用來(lái)處理時(shí)間序列的包有三個(gè):
- 最常見(jiàn)的AR、ARMA、ARIMA建模的工具包
pmdarima,這個(gè)包能非常方便的對(duì)平穩(wěn)序列進(jìn)行建模,對(duì)于但是其無(wú)法處理包含 seasonal 成分的序列; -
statmodels中的tsa模塊,該模塊中同樣也實(shí)現(xiàn)了AR、ARMA、ARIMA方法,除此之外,該模塊還實(shí)現(xiàn)了SARIMA方法,該方法在ARIMA的基礎(chǔ)上又添加了對(duì)seasonal 部分建模的方法,因此適用度更高; -
fbprophet包,該包實(shí)現(xiàn)的算法與上面的不同,其對(duì)序列沒(méi)有平穩(wěn)性要求,對(duì)于任何序列都可以直接來(lái)建模,不過(guò)其對(duì)訓(xùn)練數(shù)據(jù)有一定的要求,一般需要幾個(gè)月的訓(xùn)練數(shù)據(jù)才能夠達(dá)到比較好的效果。
對(duì)于基于AR、MA的方法一般需要數(shù)據(jù)預(yù)處理,因此本文分為三部分:
- 1、數(shù)據(jù)探索分析,包括數(shù)據(jù)查看數(shù)據(jù)的一些基本統(tǒng)計(jì)量(均值方差等),異常檢測(cè)(包括缺失值、離群點(diǎn)等),數(shù)據(jù)分布(是否正態(tài)分布)和數(shù)據(jù)的發(fā)展趨勢(shì)(上升、下降還是基本持平)等;
- 2、數(shù)據(jù)預(yù)處理。這一步主要是將數(shù)據(jù)處理成更適合模型建模的數(shù)據(jù)分布,如將非正態(tài)分布轉(zhuǎn)換為正態(tài)分布,對(duì)于AR、MA相關(guān)建模方法,一般會(huì)先將非平穩(wěn)序列轉(zhuǎn)換為平穩(wěn)序列;
- 3、建模分析,使用時(shí)間序列建模算法對(duì)數(shù)據(jù)進(jìn)行建模分析。
1、數(shù)據(jù)探索性分析
1.1 數(shù)據(jù)基本統(tǒng)計(jì)量查看
import warnings
warnings.filterwarnings('ignore')
import itertools
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
import pandas as pd
pd.set_option('display.expand_frame_repr', False)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.ar_model import AR
from statsmodels.tsa.arima_model import ARMA, ARIMA
from pmdarima.arima import auto_arima
from statsmodels.tsa.statespace.sarimax import SARIMAX
from fbprophet import Prophet
from math import sqrt
import matplotlib
matplotlib.rcParams['axes.labelsize'] = 14
matplotlib.rcParams['xtick.labelsize'] = 12
matplotlib.rcParams['ytick.labelsize'] = 12
matplotlib.rcParams['text.color'] = 'k'
import seaborn as sns
from random import random
from sklearn.metrics import mean_squared_error, r2_score, \
mean_absolute_error, median_absolute_error, mean_squared_log_error


1.2 數(shù)據(jù)可視化分析
通過(guò)簡(jiǎn)單的初步處理以及可視化可以幫助我們有效快速的了解數(shù)據(jù)的分布(以及時(shí)間序列的趨勢(shì))。


觀察數(shù)據(jù)的頻率直方圖以及密度分布圖以洞察數(shù)據(jù)結(jié)構(gòu),從下圖可以看出:
- 該數(shù)據(jù)不是一個(gè)完美的正態(tài)分布;
-
該數(shù)據(jù)分布左移,因此在后續(xù)分析前進(jìn)行轉(zhuǎn)換可能會(huì)有用。
觀察數(shù)據(jù)的箱線圖:
-
- 每一年的中間值都呈上升趨勢(shì)證明了這個(gè)數(shù)據(jù)隨著時(shí)間的推移呈現(xiàn)穩(wěn)定的上升趨勢(shì);
- 隨著時(shí)間的推移中間數(shù)據(jù)量(25%-50%區(qū)間)穩(wěn)定上升;
- 不同月份的數(shù)值呈現(xiàn)一個(gè)先上升后下降的趨勢(shì),結(jié)合上面圖的每年數(shù)值總體上升的整體趨勢(shì),可以猜測(cè)一年之中不同月份的數(shù)據(jù)可能存在一個(gè)規(guī)律,因此考慮季節(jié)性(或者說(shuō)部分周期性)模型會(huì)比較好。
1.3 序列分解
使用statsmodels對(duì)該時(shí)間序列進(jìn)行分解,以了解該時(shí)間序列數(shù)據(jù)的各個(gè)部分,每個(gè)部分都代表著一種模式類(lèi)別。借用statsmodels序列分解我們可以看到數(shù)據(jù)的主要趨勢(shì)成分、季節(jié)成分和殘差成分,這與我們上面的推測(cè)相符合。

2、數(shù)據(jù)預(yù)處理
2.1 時(shí)間序列平穩(wěn)性檢驗(yàn)
如果一個(gè)時(shí)間序列的均值和方差隨著時(shí)間變化保持穩(wěn)定,則可以說(shuō)這個(gè)時(shí)間序列是穩(wěn)定的。
大多數(shù)時(shí)間序列模型都是在平穩(wěn)序列的前提下進(jìn)行建模的。造成這種情況的主要原因是序列可以有許多種(復(fù)雜的)非平穩(wěn)的方式,而平穩(wěn)性只有一種,更加的易于分析,易于建模。
在直覺(jué)上,如果一段時(shí)間序列在某一段時(shí)間序列內(nèi)具有特定的行為,那么將來(lái)很可能具有相同的行為。譬如已連續(xù)觀察一個(gè)星期都是六點(diǎn)出太陽(yáng),那么可以推測(cè)明天也是六點(diǎn)出太陽(yáng),誤差非常小。
而且,與非平穩(wěn)序列相比,平穩(wěn)序列相關(guān)的理論更加成熟且易于實(shí)現(xiàn)。
一般可以通過(guò)以下幾種方式來(lái)檢驗(yàn)序列的平穩(wěn)性:
- ACF與PACF曲線。如果時(shí)間序列是穩(wěn)定的,則ACF/PACF曲線中某一觀測(cè)數(shù)據(jù)與其滯后數(shù)據(jù)點(diǎn)呈現(xiàn)很小的相關(guān)性并且這個(gè)相關(guān)性會(huì)迅速下降消失;
- 滑動(dòng)均值和方差的變化趨勢(shì)。通過(guò)繪制滑動(dòng)均值和方差的的曲線我們可以看出時(shí)間序列的均值和方差是否隨著時(shí)間序列變化;
- adf檢驗(yàn) (Augmented Dickey-Fuller Test)。這是用于檢驗(yàn)數(shù)據(jù)平穩(wěn)性的統(tǒng)計(jì)檢驗(yàn)方法之一。在adf檢驗(yàn)中,零假設(shè)為時(shí)間序列是非平穩(wěn)的。測(cè)試結(jié)果包括一些統(tǒng)計(jì)量、置信度和臨界值。如果檢驗(yàn)統(tǒng)計(jì)量小于關(guān)鍵值,則我們可以拒絕原假設(shè)并認(rèn)為該序列是平穩(wěn)的。
對(duì)于ACF和PCF的一些解釋?zhuān)?br> ACF(Autocorrelation Function):
我們可以假設(shè)每個(gè)變量的分布都符合高斯分布(鐘形曲線)。如果是這種情況,我們可以使用Pearson的相關(guān)系數(shù)來(lái)總結(jié)變量之間的相關(guān)性。皮爾遜相關(guān)系數(shù)是介于-1和1之間的數(shù)字,分別描述了負(fù)相關(guān)或正相關(guān),零值表示沒(méi)有相關(guān)性。我們可以計(jì)算時(shí)間序列觀測(cè)值與先前時(shí)間步長(zhǎng)的觀測(cè)值的相關(guān)性,稱(chēng)為滯后。因?yàn)闀r(shí)間序列觀測(cè)值的相關(guān)性是使用同一序列某一時(shí)刻值域先前時(shí)間的值計(jì)算的,所以這稱(chēng)為序列相關(guān)性或自相關(guān)。時(shí)間序列按時(shí)滯的自相關(guān)圖稱(chēng)為自相關(guān)函數(shù),或簡(jiǎn)稱(chēng)ACF。該圖有時(shí)稱(chēng)為相關(guān)圖或自相關(guān)圖。
PACF(Partial Autocorrelation Function):
PACF相當(dāng)于在計(jì)算X(t)和X(t-h)的相關(guān)性的時(shí)候,挖空在(t-h,t)上所有數(shù)據(jù)點(diǎn)對(duì)X(t)的影響,去反映X(t-h)和X(t)之間真正的相關(guān)性(直接相關(guān)性)。某一觀測(cè)值與先前時(shí)間觀測(cè)值之間的相關(guān)性包括直接相關(guān)和間接相關(guān)。這些間接性是觀測(cè)值相關(guān)性的線性函數(shù)。偏自相關(guān)函數(shù)試圖消除的就是這些間接相關(guān)。
個(gè)人理解,這里的直接相關(guān)可以看作是真實(shí)數(shù)據(jù)值,而間接相關(guān)則可以看作是隨機(jī)誤差值。因此從這點(diǎn)來(lái)說(shuō)AR模型看PACF(直接相關(guān)性,直接對(duì)數(shù)據(jù)進(jìn)行建模),而MA模型看ACF(對(duì)誤差進(jìn)行建模)。
參考:
A Gentle Introduction to Autocorrelation and Partial Autocorrelation
計(jì)量經(jīng)濟(jì)學(xué)中,ACF和PACF函數(shù)有什么區(qū)別?
2.1.1 通過(guò)ACF和PACF曲線來(lái)查看時(shí)間序列的平穩(wěn)性
如果時(shí)間序列是平穩(wěn)性的,那么在ACF/PACF中觀測(cè)點(diǎn)數(shù)據(jù)與之前數(shù)據(jù)點(diǎn)的相關(guān)性會(huì)急劇下降。
下圖中的圓錐形陰影是置信區(qū)間,區(qū)間外的數(shù)據(jù)點(diǎn)說(shuō)明其與觀測(cè)數(shù)據(jù)本身具有強(qiáng)烈的相關(guān)性,這種相關(guān)性并非來(lái)自于統(tǒng)計(jì)波動(dòng)。
PACF在計(jì)算X(t)和X(t-h)的相關(guān)性的時(shí)候,挖空在(t-h,t)上所有數(shù)據(jù)點(diǎn)對(duì)X(t)的影響,反應(yīng)的是X(t)和X(t-h)之間真實(shí)的相關(guān)性(直接相關(guān)性)。
從下圖可以看出,數(shù)據(jù)點(diǎn)的相關(guān)性并沒(méi)有急劇下降,因此該序列是非平穩(wěn)的。

2.1.2 通過(guò)滑動(dòng)均值/方差來(lái)檢驗(yàn)序列的平穩(wěn)性
如果序列是平穩(wěn)的,那么其滑動(dòng)均值/方差會(huì)隨著時(shí)間的變化保持穩(wěn)定。
但是從下圖我們可以看到,隨著時(shí)間的推移,均值呈現(xiàn)明顯的上升趨勢(shì),而方差也呈現(xiàn)出波動(dòng)式上升的趨勢(shì),因此該序列是非平穩(wěn)的。

2.1.3 adf檢驗(yàn)序列的穩(wěn)定性
一般來(lái)講p值小于0.05我們便認(rèn)為其是顯著性的,可以拒絕零假設(shè)。但是這里的p值為0.99明顯是非顯著性的,因此接受零假設(shè),該序列是非平穩(wěn)的。


2.2 數(shù)據(jù)轉(zhuǎn)換——使非平穩(wěn)序列轉(zhuǎn)換為平穩(wěn)序列
從上面的平穩(wěn)性檢驗(yàn)我們可以知道該時(shí)間序列為非平穩(wěn)序列。此外,通過(guò)上面1.3部分的序列分解我們也可以看到,該序列可分解為3部分:
- 長(zhǎng)期趨勢(shì)(Trend)因素。一般來(lái)說(shuō)該部分的均值會(huì)隨著時(shí)間變化;
- 季節(jié)性(seasonal)因素。一般來(lái)說(shuō)該部分變化是有規(guī)律的,呈周期性的變化。如大家每年都會(huì)在冬天買(mǎi)棉襖夏天買(mǎi)短袖T恤而不會(huì)反過(guò)來(lái)。
我們可以使用數(shù)據(jù)轉(zhuǎn)換來(lái)對(duì)那些較大的數(shù)據(jù)施加更大的懲罰,如取對(duì)數(shù)、開(kāi)平方根、立方根、差分等,以達(dá)到序列平穩(wěn)的目的。
2.2.1 對(duì)數(shù)轉(zhuǎn)換(log變換)

2.2.2 滑動(dòng)平均
我們對(duì)上面取log后的數(shù)據(jù)進(jìn)行滑動(dòng)平均。

滑動(dòng)平均后數(shù)據(jù)失去了其原來(lái)的特點(diǎn)(波動(dòng)式上升),這樣損失的信息過(guò)多,肯定是無(wú)法作為后續(xù)模型的輸入的。
2.2.3 差分
差分是常用的將非平穩(wěn)序列轉(zhuǎn)換平穩(wěn)序列的方法。ARIMA中的 'I' 便是指的差分,因此ARIMA是可以對(duì)非平穩(wěn)序列進(jìn)行處理的,其相當(dāng)于先將非平穩(wěn)序列通過(guò)差分轉(zhuǎn)換為平穩(wěn)序列再來(lái)使用ARMA進(jìn)行建模。
一般差分是用某時(shí)刻數(shù)值減去上一時(shí)刻數(shù)值來(lái)得到新序列。但這里有一點(diǎn)區(qū)別,我們是使用當(dāng)前時(shí)刻數(shù)值來(lái)減去其對(duì)應(yīng)時(shí)刻的滑動(dòng)均值。

我們來(lái)看看剛剛差分的結(jié)果怎么樣。

讓我們?cè)谶@里稍微停一下,我們剛剛干了什么?p值變?yōu)?.02,這意味著我們的時(shí)間序列竟然轉(zhuǎn)換成平穩(wěn)序列了(盡管其滑動(dòng)均值看起來(lái)略有波動(dòng))。
讓我們稍微總結(jié)下我們剛剛的步驟:
- 對(duì)原始數(shù)據(jù)取對(duì)數(shù);
- 求取各個(gè)位置的滑動(dòng)平均值;
- 各個(gè)位置取對(duì)數(shù)后的值減去該位置上對(duì)應(yīng)的滑動(dòng)均值,得到轉(zhuǎn)換后的平穩(wěn)序列。
通過(guò)上面的3步我們成功的將一個(gè)非平穩(wěn)序列轉(zhuǎn)換成了一個(gè)平穩(wěn)序列。上面使用的是最簡(jiǎn)單的滑動(dòng)均值,下面我們?cè)囋囍笖?shù)滑動(dòng)平均怎么樣。
2.2.4 指數(shù)滑動(dòng)平均

上面是最常用的指數(shù)滑動(dòng)平均的定義,但是pandas實(shí)現(xiàn)的指數(shù)滑動(dòng)平均好像與這個(gè)有一點(diǎn)區(qū)別,詳細(xì)區(qū)別還得去查pandas文檔。

指數(shù)滑動(dòng)均值的效果看起來(lái)也很差。我們使用差分+指數(shù)滑動(dòng)平均再來(lái)試試吧。

2.3 分解處理后的序列
在上面我們通過(guò)取log+(指數(shù))滑動(dòng)平均+差分已經(jīng)成功將非平穩(wěn)序列轉(zhuǎn)換為了平穩(wěn)序列。
下面我們看看,轉(zhuǎn)換后的平穩(wěn)序列的各個(gè)成分是什么樣的。不過(guò)這里我們使用的是最簡(jiǎn)單的差分,當(dāng)前時(shí)刻的值等于原始序列當(dāng)前時(shí)刻的值減去原始序列中上一時(shí)刻的值,即: x'(t) = x(t) - x(t-1)。

看起來(lái)挺不錯(cuò),是個(gè)平穩(wěn)序列的樣子。不過(guò),還是檢驗(yàn)一下吧。

經(jīng)過(guò)上面的轉(zhuǎn)換后序列已經(jīng)基本可以認(rèn)為是平穩(wěn)序列了。然我們來(lái)看看其各個(gè)組分現(xiàn)在是什么樣子。

可以看到,趨勢(shì)(Trend)部分已基本被去除,但是季節(jié)性(seasonal)部分還是很明顯,而ARIMA是無(wú)法對(duì)含有seasonal的序列進(jìn)行建模分析的。
3、時(shí)間序列建模預(yù)測(cè)
在一開(kāi)始我們提到了3個(gè)包均可以對(duì)時(shí)間序列進(jìn)行建模。
為了簡(jiǎn)便,這里pmdarima和statsmodels.tsa直接使用最好的建模方法即SARIMA,該方法在ARIMA的基礎(chǔ)上添加了額外功能,可以擬合seasonal部分以及額外添加的數(shù)據(jù)。
3.1 使用statsmodels.tsa中的方法來(lái)進(jìn)行建模
在使用ARIMA(Autoregressive Integrated Moving Average)模型前,我們先簡(jiǎn)單了解下這個(gè)模型。這個(gè)模型其實(shí)可以包括三部分,分別對(duì)應(yīng)著三個(gè)參數(shù)(p, d, q):
-
AR(Autoregressive,p),自回歸模型就是利用滯后的時(shí)間來(lái)預(yù)測(cè)當(dāng)前時(shí)間點(diǎn)的數(shù)據(jù),如使用x(t-1), x(t-2)和x(t-3)來(lái)擬合預(yù)測(cè)x(t)。這里使用的滯后變量的數(shù)量就是p;AR模型
-
MA(Moving Averages,q),滑動(dòng)平均模型使用滯后序列的白噪聲來(lái)擬合當(dāng)前數(shù)據(jù),同樣的滯后數(shù)據(jù)數(shù)量即是q;MA模型
-
Difference(即差分,d),上面講了通過(guò)差分可以將非平穩(wěn)序列轉(zhuǎn)變?yōu)槠椒€(wěn)的,這個(gè)差分的作用與其相同,因?yàn)锳R和MA無(wú)法對(duì)非平穩(wěn)序列進(jìn)行擬合。差分
因此ARIMA模型就是將AR和MA模型結(jié)合起來(lái)然后加上差分,克服了不能處理非平穩(wěn)序列的問(wèn)題。但是,需要注意的是,其仍然無(wú)法對(duì)seasonal進(jìn)行擬合。

更詳細(xì)的介紹可以參考 數(shù)據(jù)分析技術(shù):時(shí)間序列分析的AR/MA/ARMA/ARIMA模型體系。
下面開(kāi)始使用ARIMA來(lái)擬合數(shù)據(jù)。
(1) 先分訓(xùn)練集和驗(yàn)證集。需要注意的是這里使用的原始數(shù)據(jù)來(lái)進(jìn)行建模而非轉(zhuǎn)換后的數(shù)據(jù)。

(2)ARIMA一階差分建模并預(yù)測(cè)

查看一下預(yù)測(cè)的未還原差分的結(jié)果:

(3)對(duì)差分結(jié)果進(jìn)行還原

可視化一下看看結(jié)果怎么樣。

(4)使用模型評(píng)估指標(biāo)對(duì)模型進(jìn)行評(píng)估試試

(5)使用SARIMA來(lái)建模試試。上面我們使用ARIMA雖然使用了差分能將非平穩(wěn)序列轉(zhuǎn)換為平穩(wěn)序列,但是ARIMA是無(wú)法處理seasonal部分的,而SARIMA則可以,下面我們使用SARIMA試試。
Seasonal Autoregressive Integrated Moving-Average (SARIMA)
SARIMA是ARIMA的擴(kuò)展,他明確支持具有季節(jié)性成分的單變量時(shí)間序列數(shù)據(jù)。該實(shí)現(xiàn)稱(chēng)為SARIMAX而不是SARIMA是因?yàn)樵搶?shí)現(xiàn)還支持可選的外部變量,通過(guò)exog參數(shù)指定,外部變量的實(shí)例:人口,假期,航空公司數(shù)量,重大事件。
他添加了3個(gè)新的超參數(shù),以指定序列的季節(jié)性分量的自回歸(AR),差分(I)和移動(dòng)平均值(MA),以及季節(jié)性周期的附加參數(shù)m。
Trend因素有三個(gè)參數(shù)控制,這幾個(gè)參數(shù)與ARIMA中是一樣的:
- p,trend AR階數(shù)(order);
- d,trend差分階數(shù);
- q,trend MA階數(shù)。
Seasonal因素有四個(gè)參數(shù)控制:
- P,季節(jié)性AR階數(shù);
- D,季節(jié)性差分階數(shù);
- Q,季節(jié)性MA階數(shù);
- m,單個(gè)季節(jié)周期的時(shí)間步數(shù)。例如,月度數(shù)據(jù)的S為12表示每年的季節(jié)周期。
SARIMA表示法:SARIMA(p,d,q)(P,D,Q,m)。
先手動(dòng)選擇幾組參數(shù),然后參數(shù)搜索找到最佳值。需要注意的是,為了避免過(guò)擬合,這里的階數(shù)一般不太建議取太大。


可視化看看結(jié)果怎么樣吧。

效果相當(dāng)不錯(cuò)呢。再來(lái)看看評(píng)估指標(biāo)怎么樣。

各個(gè)指標(biāo)都還不錯(cuò)呢,至少比上面的ARIMA是進(jìn)不了不少,可喜可賀??磥?lái)模型對(duì)seasonal部分的擬合還是非常重要的啊。
(6)最后,我們還能對(duì)擬合好的模型進(jìn)行診斷看看結(jié)果怎么樣。
我們主要關(guān)心的是確保模型的殘差(residual)部分互不相關(guān),并且呈零均值正態(tài)分布。若季節(jié)性ARIMA(SARIMA)不滿足這些屬性,則表明它可以進(jìn)一步改善。模型診斷根據(jù)下面的幾個(gè)方面來(lái)判斷殘差是否符合正態(tài)分布:
- 下圖的右上角圖中,紅色的KDE曲線與N(0, 1)曲線形狀大致相同,說(shuō)明殘差是基本符合正態(tài)分布的;
- 左下角的QQ圖表明,藍(lán)色(殘差)序列的分布遵循正態(tài)分布樣本的線性趨勢(shì)。這也說(shuō)明殘差符合正態(tài)分布;
- 左上圖隨著時(shí)間的推移,沒(méi)有顯示出任何的季節(jié)性變化,說(shuō)明其是白噪聲;
-
右下角的自相關(guān)圖表明觀測(cè)序列與其之前的相關(guān)性非常小。
3.2 使用 pmdarima 中的包來(lái)進(jìn)行建模
同樣的,為了方便,我們這里使用pmdarima 中一個(gè)可以自動(dòng)搜索最佳參數(shù)的方法auto_arima來(lái)進(jìn)行建模。

可以看到,這里是對(duì)seasonal部分進(jìn)行建模了的。看看結(jié)果怎么樣吧。

結(jié)果很不錯(cuò)啊,雖然比上面的最好的要差些,但是比起ARIMA還是要好上很多的。
3.3 使用Prophet進(jìn)行建模
一般來(lái)說(shuō),在實(shí)際生活和生產(chǎn)環(huán)節(jié)中,除了季節(jié)項(xiàng),趨勢(shì)項(xiàng),剩余項(xiàng)之外,通常還有節(jié)假日的效應(yīng)。所以,在prophet算法里面,作者同時(shí)考慮了以上四項(xiàng),即:

上式中,
- g(t) 表示趨勢(shì)項(xiàng),它表示時(shí)間序列在非周期上面的變化趨勢(shì);
- s(t) 表示周期項(xiàng),或者稱(chēng)為季節(jié)項(xiàng),一般來(lái)說(shuō)是以周或者年為單位;
- h(t) 表示節(jié)假日項(xiàng),表示在當(dāng)天是否存在節(jié)假日;
- ξt 表示誤差項(xiàng)或者稱(chēng)為剩余項(xiàng)。
更多詳細(xì)Prophet算法內(nèi)容可以參考 Facebook 時(shí)間序列預(yù)測(cè)算法 Prophet 的研究。
Prophet算法就是通過(guò)擬合這幾項(xiàng),然后把它們累加起來(lái)得到時(shí)間序列的預(yù)測(cè)值。
Prophet提供了直觀且易于調(diào)整的參數(shù):
- 趨勢(shì)參數(shù)(Trend Params):
- growth:指定線性或邏輯趨勢(shì);
- changepoints:包括潛在變更點(diǎn)的日期列表(如未指定,則為自動(dòng));
- n_chagepoints:如果未提供更改點(diǎn)(changepoint),可以提供自動(dòng)尋找changgepoint的數(shù)量;
- chagepoint_prior_scale:用于控制自動(dòng)選擇changepoint的靈活性;
- 季節(jié)性和假期參數(shù)(Seasonality and Holiday Params):
- yearly_seasonality: 用來(lái)擬合年度季節(jié)性;
- weekly_seasonality: 用來(lái)擬合每周的季節(jié)性;
- daily_seasonality: 用來(lái)擬合每日的季節(jié)性;
- holidays: 形式為dataframe,包含假日名和日期;
- seasonality_prior_scale: 用來(lái)調(diào)整模型季節(jié)性強(qiáng)度的參數(shù);
- holiday_prior_scale: 用于調(diào)整模型假期強(qiáng)度的參數(shù)。
Prophet對(duì)輸入數(shù)據(jù)有要求:
- y, target, numeric;
- ds, datetime
關(guān)于 Prophet 的使用例子可以參考 Prophet example notebooks
下面使用 Prophet 來(lái)進(jìn)行處理數(shù)據(jù)。


查看各個(gè)部分的變化情況。由于我們上面僅選擇了
yearly_seasonality=True,因此下面的seasonal中只有year。
最后評(píng)估一下模型的預(yù)測(cè)結(jié)果怎么樣。

這結(jié)果可以說(shuō)是相當(dāng)好了,而且是沒(méi)有附加節(jié)假日信息,沒(méi)有調(diào)參的結(jié)果。
參考:
Facebook 時(shí)間序列預(yù)測(cè)算法 Prophet 的研究
Prophet example notebooks
auto_arima documentation for selecting best model
數(shù)據(jù)分析技術(shù):時(shí)間序列分析的AR/MA/ARMA/ARIMA模型體系
https://github.com/advaitsave/Introduction-to-Time-Series-forecasting-Python
時(shí)間序列分析
My First Time Series Comp (Added Prophet)
Prophet官方文檔:https://facebookincubator.github.io




