「Python數(shù)據(jù)之道」導(dǎo)語本文內(nèi)容較長,較為詳細(xì)的闡述了進(jìn)行時(shí)間序列預(yù)測的步驟,有些內(nèi)容可能暫時(shí)用不到或者看不懂,但不要緊,知道有這么一個(gè)概念,后續(xù)碰到的時(shí)候,繼續(xù)深入學(xué)習(xí)以及使用就可以。
一文弄懂時(shí)間序列預(yù)測的基本原理
Photo by Adrian Schwarz on Unsplash
我們被隨處可見的模式所包圍,人們可以注意到四季與天氣的關(guān)系模式,以交通量計(jì)算的交通高峰期的模式,你的心跳或者是股票市場和某些產(chǎn)品的銷售周期。分析時(shí)間序列數(shù)據(jù)對于發(fā)現(xiàn)這些模式和預(yù)測未來非常有用。有幾種方法可以創(chuàng)建這類預(yù)測,在本文中,我將介紹最基本且最傳統(tǒng)的方法概念。所有代碼都是用 Python 編寫的,并且在 GitHub 上可以看到所有的信息。https://nbviewer.jupyter.org/github/leandrovrabelo/tsmodels/blob/master/notebooks/english/Basic Principles for Time Series Forecasting.ipynb那么讓我們開始談?wù)劮治?strong style="color: rgb(46, 46, 46);">時(shí)間序列的初始條件:
1
平穩(wěn)序列
平穩(wěn)時(shí)間序列是指統(tǒng)計(jì)特性,如均值、方差和自相關(guān)系數(shù),隨時(shí)間相對恒定的序列。因此,非平穩(wěn)序列是統(tǒng)計(jì)特性隨時(shí)間變化的序列。在開始任何預(yù)測建模之前,都有必要驗(yàn)證這些統(tǒng)計(jì)屬性是否是常量,我將一一解釋下面的每個(gè)點(diǎn):常數(shù)均值
常數(shù)方差
自相關(guān)
常數(shù)均值
一個(gè)平穩(wěn)序列在時(shí)間上具有一個(gè)相對穩(wěn)定的均值,這個(gè)值沒有減少或者增加的趨勢。圍繞常數(shù)均值的小的變化,使我們更容易推測未來。在某些情況下,相對于平均值的變量比較小,使用它可以很好地預(yù)測未來。下圖顯示了變量與該常數(shù)平均值相對于時(shí)間變化的關(guān)系:
在這種情況下,如果序列不是平穩(wěn)的,對未來的預(yù)測將是無效的,因?yàn)槠骄抵車淖兞繒?huì)顯著偏離,如下圖所示:
在上圖中,我們可以明顯看到上升的趨勢,均值正在逐漸上升。在這種情況下,如果使用均值進(jìn)行未來值的預(yù)測,誤差將非常大,因?yàn)轭A(yù)測價(jià)格會(huì)總是低于實(shí)際價(jià)格。常數(shù)方差
當(dāng)序列的方差為常數(shù)時(shí),我們知道均值和標(biāo)準(zhǔn)差之間存在一種關(guān)系。當(dāng)方差不為常數(shù)時(shí)(如下圖所示),預(yù)測在某些時(shí)期可能會(huì)有較大的誤差,而這些時(shí)期是不可預(yù)測的。可以預(yù)測到,隨著時(shí)間的推移直到未來,方差會(huì)保持不穩(wěn)定。
為了減小方差效應(yīng),可以采用對數(shù)變換。在本例中,也可以使用指數(shù)變換,如 Box-Cox 方法,或者使用膨脹率調(diào)整。自相關(guān)序列
當(dāng)兩個(gè)變量在時(shí)間上的標(biāo)準(zhǔn)差有相似的變化時(shí),你可以說這些變量是相關(guān)的。例如,體重會(huì)隨著心臟疾病而增加,體重越大,心臟問題的發(fā)生率就越大。在這種情況下,相關(guān)性是正的,圖形應(yīng)該是這樣的:
負(fù)相關(guān)的情況類似于這樣:對工作安全措施的投入越多,工作相關(guān)的事故數(shù)量就越少。下面是幾個(gè)相關(guān)級(jí)別的散點(diǎn)圖的例子:
當(dāng)談到自相關(guān)時(shí),意思是某些先前時(shí)期與當(dāng)前時(shí)期存在相關(guān)性,這種相關(guān)性是滯后的。例如,在以小時(shí)為單位的測量值序列中,今天 12:00 的溫度與 24 小時(shí)前的 12:00 的溫度非常相似。如果你比較 24 小時(shí)內(nèi)的溫度變化,就會(huì)存在自相關(guān),在本例中,我們將與第 24 小時(shí)前的時(shí)間存在自相關(guān)關(guān)系。自相關(guān)是使用單個(gè)變量創(chuàng)建預(yù)測的一種情況,因?yàn)槿绻麤]有相關(guān)性,就不能使用過去的值來預(yù)測未來;當(dāng)有多個(gè)變量時(shí),則可以驗(yàn)證因變量和獨(dú)立變量的滯后之間是否存在相關(guān)性。如果一個(gè)序列不存在自相關(guān)關(guān)系,那么它就是隨機(jī)且不可預(yù)測的,做預(yù)測的最佳方法通常是使用前一天的值。我將在下面使用更詳細(xì)的圖表來解釋。從這里開始我將分析 Esalq 上的每周含水乙醇價(jià)格(這是巴西談判含水乙醇的價(jià)格參考),數(shù)據(jù)可以在這里(https://www.cepea.esalq.usp.br/br/indicador/etanol.aspx)下載。價(jià)格單位是巴西雷亞爾每立方米(BRL/m3)。在開始任何分析之前,要將數(shù)據(jù)劃分為訓(xùn)練集和測試集。劃分訓(xùn)練集和測試集數(shù)據(jù)
當(dāng)我們要?jiǎng)?chuàng)建時(shí)序預(yù)測模型時(shí),將數(shù)據(jù)劃分為兩部分至關(guān)重要:訓(xùn)練集:這些數(shù)據(jù)將是定義模型系數(shù)/參數(shù)的主要依據(jù);測試集:這些數(shù)據(jù)將被分離且對模型不可見,用于測試模型是否有效(通常將這些值與模型結(jié)果進(jìn)行比較,最后測量平均誤差)。測試集的大小通常約為總樣本的20%,盡管這個(gè)百分比取決于你擁有的樣本大小以及你希望提前多少時(shí)間進(jìn)行預(yù)測。理想情況下,測試集應(yīng)至少與所需預(yù)測的最大范圍相同。與其他如分類和回歸等不受時(shí)間影響的預(yù)測方法不同,在時(shí)間序列中,不可以將訓(xùn)練和測試數(shù)據(jù)從數(shù)據(jù)中隨機(jī)抽樣取出,我們必須遵循序列的時(shí)間標(biāo)準(zhǔn),訓(xùn)練數(shù)據(jù)應(yīng)該始終是在測試數(shù)據(jù)之前。在本例中,我們有Esalq 含水乙醇的 856 周的價(jià)格數(shù)據(jù),使用前 700 周的數(shù)據(jù)作為訓(xùn)練集,后 156 周(3年,18%)的數(shù)據(jù)用作測試集:
從現(xiàn)在開始,我們只使用訓(xùn)練集來做研究,測試集僅用于驗(yàn)證我們的預(yù)測。每一個(gè)時(shí)間序列可以分為三個(gè)部分:趨勢、季節(jié)性和殘差,殘差是將前兩部分從序列中去除后剩下的部分,使用這種分割方法之后:
顯然,該序列具有上升趨勢,在每一年的年底到年初之間達(dá)到峰值,在4月和9月之間達(dá)到最低值(此時(shí)在巴西中南部開始甘蔗的壓榨)。我們?nèi)匀唤ㄗh使用統(tǒng)計(jì)測試來確認(rèn)序列是否是平穩(wěn)的,這里將使用兩個(gè)測試:Dickey-Fuller 測試和 KPSS 測試。首先,我們將使用 Dickey-Fuller 檢驗(yàn),我將使用 5% 的基礎(chǔ) P 值,也就是說,如果 P 值低于 5% 這意味著這個(gè)序列在統(tǒng)計(jì)上是平穩(wěn)的。此外,還有模型的統(tǒng)計(jì)檢驗(yàn),可以將檢驗(yàn)值與 1%、5%、10% 的臨界值進(jìn)行比較,如果統(tǒng)計(jì)檢驗(yàn)低于選定的某個(gè)臨界值,就認(rèn)為序列是平穩(wěn)的:
在本例中,Dickey-Fuller 檢驗(yàn)結(jié)果表明序列不是平穩(wěn)的( P 值 36%,臨界值 5% 小于統(tǒng)計(jì)檢驗(yàn))。現(xiàn)在我們要用 KPSS 檢驗(yàn)分析序列,與 Dickey-Fuller 檢驗(yàn)不同,KPSS 檢驗(yàn)已經(jīng)假設(shè)序列是平穩(wěn)的,只有當(dāng) P 值小于 5% 或統(tǒng)計(jì)檢驗(yàn)小于某個(gè)臨界值時(shí),序列才不是平穩(wěn)的:
KPSS 檢驗(yàn)證實(shí)了 Dickey-Fuller 檢驗(yàn)的正確性,同時(shí)也表明該序列不是平穩(wěn)的,因?yàn)?P 值為 1%,統(tǒng)計(jì)檢驗(yàn)高于任何臨界值。接下來,我將演示如何將序列轉(zhuǎn)換為平穩(wěn)狀態(tài)。2
將序列轉(zhuǎn)換為平穩(wěn)狀態(tài)
差分
差分法用來移除趨勢信號(hào),也可以用來減少方差,它只是 T 周期的值與前一個(gè) T-1 周期值的差值。為了更容易理解,下面我們只用一小部分的乙醇價(jià)格,以便更好地可視化,可以看到從 2005 年 5 月開始價(jià)格上漲,直到 2006 年 5 月中旬,價(jià)格每周都在上漲,這就累積了一個(gè)上升的趨勢,這種情況下,屬于非平穩(wěn)序列。
當(dāng)進(jìn)行一階微分時(shí)(如下圖),我們?nèi)コ诵蛄械睦鄯e效應(yīng),并且僅顯示了整個(gè)系列中時(shí)段 T 相對于時(shí)段 T-1 的變化,因此如果 3 天前的價(jià)格為 800 BRL 且已漲到 850.00 BRL,差價(jià)將是 50.00 BRL,如果今天的價(jià)格是 860.00 BRL,那么差價(jià)將是 - 10.00 BRL。
通常只需要一階微分就足夠?qū)⑿蛄修D(zhuǎn)換為平穩(wěn)狀態(tài),但如果需要,可以應(yīng)用二階微分,在這種情況下,將對一階微分的值進(jìn)行求導(dǎo)(幾乎沒有二階以上微分的情況)。同樣的例子,要進(jìn)行二次微分,我們必須取 T 時(shí)刻減去 T-1 時(shí)刻的微分:2.9 BRL -5.5 BRL = - 2.6 BRL 等等。
我們來做一下 Dickey-Fuller 測試,看看這個(gè)序列是否會(huì)在一階微分后是平穩(wěn)的:
在這種情況下,我們確定該序列是平穩(wěn)的,P 值為零,并且當(dāng)我們比較統(tǒng)計(jì)檢驗(yàn)的值時(shí),它遠(yuǎn)遠(yuǎn)低于臨界值。在下一個(gè)例子中,我們將嘗試調(diào)整通貨膨脹率將一個(gè)序列轉(zhuǎn)換到平穩(wěn)狀態(tài)。膨脹率調(diào)整
價(jià)格是相對于交易時(shí)間的,2002 年乙醇的價(jià)格是 680.00 BRL,如果現(xiàn)在產(chǎn)品的價(jià)格是這個(gè)價(jià)格,很多工廠肯定會(huì)倒閉,因?yàn)檫@個(gè)價(jià)格非常低。為了讓序列平穩(wěn),我將基于當(dāng)前值使用巴西 IPCA 索引(巴西的 CPI 指數(shù))調(diào)整整個(gè)序列,從訓(xùn)練區(qū)間的結(jié)尾(2016年4月)到研究的開始,數(shù)據(jù)的來源是 IBGE 網(wǎng)站。
現(xiàn)在我們來看序列如何能變平穩(wěn)以及是否變平穩(wěn)。
如圖所示,上升趨勢已經(jīng)消失,只剩下季節(jié)性振蕩, Dickey-Fuller 測試也證實(shí)了這個(gè)序列現(xiàn)在是穩(wěn)定的。如果好奇,可以參閱下面的圖表,其中調(diào)整后的價(jià)格與原始系列的通貨膨脹率相對應(yīng)。
減小方差
對數(shù)變換
對數(shù)變換通常用于將指數(shù)增長的序列轉(zhuǎn)換為具有更趨于線性增長的序列,在本例中,我們將使用自然對數(shù)(Natural Logarithm,NL),其底數(shù)為 2.718 ,這種對數(shù)類型在經(jīng)濟(jì)模型中被廣泛使用。轉(zhuǎn)換成 NL 值的差值近似等于原始序列值的百分比變化,作為降低不同價(jià)格序列的方差的基礎(chǔ)是很有效的,如下例:如果我們有一個(gè)產(chǎn)品在 2000 年價(jià)格上漲,從 50.00 BRL 到 52.50 BRL,幾年后(2019年),價(jià)格已經(jīng)是 100.00 BRL,已經(jīng)上漲到 105.00 BRL,價(jià)格之間的絕對差分別是 2.50 BRL 和 5.00 BRL,但兩者的百分比差為 5% 。
當(dāng)我們對這些價(jià)格中使用 NL 時(shí),我們得到:NL (52.50) - NL(50.00) = 3.96 - 3.912 = 0.048 或 4.8%,同樣地,在第二個(gè)價(jià)格序列中使用 LN 時(shí),我們得到:NL (105) - NL(100) = 4.654-4.605 = 0.049 或 4.9% 。在這個(gè)例子中,我們可以通過把幾乎所有的東西都放到相同的基上來減少差異值。price1 = np.log(52.5) - np.log(50)
price2 = np.log(105) - np.log(100)
printf('The percentage variation of the first example is {round(price1*100,1)} and the second is {round(price2*100,1)}')
Box-Cox 變換(指數(shù)變換)
Box-Cox 轉(zhuǎn)換也是一種轉(zhuǎn)換序列的方法,lambda(λ)的值是用于轉(zhuǎn)換序列的參數(shù)。簡而言之,這個(gè)函數(shù)是幾個(gè)指數(shù)變換函數(shù)的結(jié)合,我們需要找到轉(zhuǎn)換序列的 lambda 的最佳值,使其分布更接近正態(tài)高斯分布。使用此轉(zhuǎn)換的一個(gè)條件是序列只有正值,公式為:
接下來我將繪制原始序列及其分布圖,然后用 lambda 最佳值繪制新的轉(zhuǎn)換序列及其分布圖,為了找到 lambda 的值,我們將使用庫 Scipy 的?boxcox?函數(shù)生成轉(zhuǎn)換的序列和理想 lambda 值:
下面是一個(gè)交互式圖表,在圖中可以更改 lambda 值和檢查更改:
此工具通常用于提高模型的性能,因?yàn)樗鼓P透呌谡龖B(tài)分布,記住在完成模型的預(yù)測后,必須根據(jù)以下公式反轉(zhuǎn)轉(zhuǎn)換到原始的基數(shù):
尋找相關(guān)時(shí)滯
為了便于預(yù)測,具有單一變量的序列必須具有自相關(guān)性,即,當(dāng)前時(shí)段必須是能夠基于較早的時(shí)段(滯后)而解釋的。由于這個(gè)序列每周為一周期,1 年大約 52 周,我將使用 60 的滯后期的自相關(guān)函數(shù)來驗(yàn)證當(dāng)前周期與這些滯后的相關(guān)性。
通過對上述自相關(guān)圖的分析,似乎所有的滯后都可以用來為未來事件創(chuàng)建預(yù)測,因?yàn)樗鼈兊恼嚓P(guān)接近 1 ,而且都在置信區(qū)間之外,但這一特征屬于非平穩(wěn)序列。另一個(gè)非常重要的函數(shù)是部分自相關(guān)函數(shù),其中消除了先前的滯后對當(dāng)前區(qū)間的影響,只保留了當(dāng)前區(qū)間滯后的影響來分析,例如:第四個(gè)滯后的偏自相關(guān)將消除第一、第二和第三個(gè)滯后的影響。
可以看到,幾乎沒有滯后對當(dāng)前周期有影響,但是正如前面所演示的,沒有微分的序列不是平穩(wěn)的,我們現(xiàn)在用一階微分的序列繪制這兩個(gè)函數(shù)來展示原理:
自相關(guān)曲線變化顯著,表明該序列僅在第一個(gè)滯后期具有顯著相關(guān),在第 26 個(gè)滯后(半年)左右具有負(fù)相關(guān)的季節(jié)效應(yīng)。為了做出預(yù)測,我們必須注意一個(gè)找到相關(guān)的滯后現(xiàn)象的非常重要的細(xì)節(jié),重要的是這種關(guān)聯(lián)背后的原因,因?yàn)槿绻麤]有邏輯上的原因,就有可能是偶然的,當(dāng)包含更多的數(shù)據(jù)時(shí),這種關(guān)聯(lián)就會(huì)消失。另一個(gè)重點(diǎn)是自相關(guān)和部分自相關(guān)圖對異常值非常敏感,因此分析時(shí)間序列本身并與兩個(gè)自相關(guān)圖進(jìn)行對比非常重要。在這個(gè)例子中,第一個(gè)滯后與當(dāng)前周期具有高度相關(guān)性,因?yàn)榍耙恢艿膬r(jià)格歷史上沒有顯著變化,在相同的情況下,第 26 個(gè)滯后呈現(xiàn)負(fù)相關(guān),表明與當(dāng)前時(shí)期相反的趨勢,可能原因是一年內(nèi)不同時(shí)期供需不同。隨著膨脹率調(diào)整后的序列已經(jīng)趨于平穩(wěn),我們將使用它來創(chuàng)建我們的預(yù)測,下圖是調(diào)整后序列的自相關(guān)和部分自相關(guān)圖:
我們將只使用前兩個(gè)滯后作為自回歸序列的預(yù)測因子。想要了解更多信息的話,杜克大學(xué)教授 Robert Nau 的網(wǎng)站是與此主題相關(guān)的最佳網(wǎng)站之一。(http://people.duke.edu/~rnau/411home.htm)
3?
模型評(píng)價(jià)指標(biāo)
為了分析預(yù)測值是否接近當(dāng)前值,必須對誤差進(jìn)行測量,此種情況下的誤差(或殘差)基本上是 Yreal-YpredYreal-Ypred (這個(gè)暫時(shí)不知道怎么翻譯, real 真實(shí)值, pred 預(yù)測值)。對訓(xùn)練數(shù)據(jù)中的錯(cuò)誤進(jìn)行評(píng)估以驗(yàn)證模型是否具有良好的確定性,然后通過檢查測試數(shù)據(jù)中的誤差(模型未“看到”的數(shù)據(jù))來驗(yàn)證模型。當(dāng)將訓(xùn)練數(shù)據(jù)與測試數(shù)據(jù)進(jìn)行對比時(shí),檢查誤差對于驗(yàn)證你的模型是否過擬合或欠擬合非常重要。以下是一些用于評(píng)估時(shí)間序列模型的關(guān)鍵指標(biāo):平均預(yù)測誤差——偏差(bias)
它只是被評(píng)估序列的平均誤差,值可以是正的也可以是負(fù)的。該指標(biāo)表明,模型傾向于預(yù)測實(shí)際值以上(負(fù)誤差)還是實(shí)際值以下(正誤差),因此也可以說平均預(yù)測誤差是模型的偏差。MAE——平均絕對誤差
這個(gè)指標(biāo)與上面提到的預(yù)測的平均誤差非常相似,唯一的區(qū)別是將誤差的負(fù)值轉(zhuǎn)化為正值,然后計(jì)算平均值。這個(gè)指標(biāo)在時(shí)間序列中被廣泛使用,因?yàn)樵谝恍┣闆r下,負(fù)誤差可以抵消正誤差,使人誤以為模型是準(zhǔn)確的,而在用 MAE 的情況下不會(huì)發(fā)生,因?yàn)檫@個(gè)指標(biāo)顯示預(yù)測距離實(shí)際值有多遠(yuǎn),不管數(shù)值大還是小,示例如下:a = np.array([1,2,3,4,5])
b = np.array([5,4,3,2,1])
error = a - b
MFE = error.mean()
MAE = np.abs(error).mean()
print(f'The error of each model value looks like this: {error}')
print(f'The MFE error was {MFE}, the MAE error was {MAE}')
與 MAE 和 MFE 不同,MSE 值是平方單位,而不是模型單位。RMSE——均方根誤差
這個(gè)指標(biāo)只是 MSE 的平方根,使誤差返回到模型的度量單位(BRL/m3),因?yàn)樗鼘r(shí)間序列在平方過程中產(chǎn)生的較大誤差更為敏感而非常有用。MAPE——平均絕對百分誤差
這是另一個(gè)可用的有趣的指標(biāo),它通常在管理報(bào)告中使用,因?yàn)檎`差是以百分比度量的,所以產(chǎn)品 X 的錯(cuò)誤可以與產(chǎn)品 Y 的誤差進(jìn)行比較。該指標(biāo)的計(jì)算取誤差的絕對值除以當(dāng)前價(jià)格,然后計(jì)算平均值:
我們來創(chuàng)建一個(gè)函數(shù),用幾個(gè)評(píng)估指標(biāo)來評(píng)估訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)的誤差:#Libraries to create the function:
from math import sqrt
from sklearn.metrics import mean_squared_error,mean_absolute_error, mean_absolute_error
def check_error(orig, pred, name_col='', index_name=''):
bias = np.mean(orig - pred)
mse = mean_squared_error(orig, pred)
rmse = sqrt(mean_squared_error(orig, pred))
mae = mean_absolute_error(orig, pred)
mape = np.mean(np.abs((orig - pred) / orig)) * 100
error_group = [bias, mse, rmse, mae, mape]
serie = pd.DataFrame(error_group, index=['BIAS','MSE','RMSE','MAE', 'MAPE'], columns=[name_col])
serie.index.name = index_name
return serie
分析這個(gè)圖是非常重要的,因?yàn)樵谶@個(gè)圖中我們可以檢查模式,它可以告訴我們是否需要對模型進(jìn)行一些修改,理想的情況是誤差沿著預(yù)測序列線性分布。https://en.wikipedia.org/wiki/Q–Q_plot總的來說這是一個(gè)顯示了殘差在理論上應(yīng)該如何分布的圖形,遵循高斯分布,而不是實(shí)際情況。如果沒有置信區(qū)間的值,或者說模型不包含信息。我們需要?jiǎng)?chuàng)建另一個(gè)函數(shù)來繪制這些圖:def plot_error(data, figsize=(18,8)):
# Creating the column error
data['Error'] = data.iloc[:,0] -data.iloc[:,1]
plt.figure(figsize=figsize)
ax1 = plt.subplot2grid((2,2), (0,0))
ax2 = plt.subplot2grid((2,2), (0,1))
ax3 = plt.subplot2grid((2,2), (1,0))
ax4 = plt.subplot2grid((2,2), (1,1))
#Plotting actual and predicted values
ax1.plot(data.iloc[:,0:2])
ax1.legend(['Real','Pred'])
ax1.set_title('Real Value vs Prediction')
# Error vs Predicted value
ax2.scatter(data.iloc[:,1], data.iloc[:,2])
ax2.set_xlabel('Predicted Values')
ax2.set_ylabel('Residual')
ax2.set_title('Residual vs Predicted Values')
## Residual QQ Plot
sm.graphics.qqplot(data.iloc[:,2], line='r', ax=ax3)
# Autocorrelation Plot of residual
plot_acf(data.iloc[:,2], lags=60, zero=False, ax=ax4)
plt.tight_layout()
plt.show()
與實(shí)際值相比,誤差往往會(huì)增加。許多人還使用這種方法作為?基線(baseline),試圖用更復(fù)雜的模型來改進(jìn)。下面我們將使用訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)來進(jìn)行模擬:
QQ 圖顯示了有一些比理論上要大些(包括正負(fù)值)的殘差,這些是所謂的異常值,但在第一,第六和第七個(gè)滯后中仍然存在明顯的自相關(guān),這可以用于改進(jìn)模型。同樣地,我們現(xiàn)在將在測試數(shù)據(jù)中進(jìn)行預(yù)測。預(yù)測序列的第一個(gè)值將是訓(xùn)練數(shù)據(jù)的最后一個(gè)值,然后這些值將按照測試的當(dāng)前值逐步更新,依此類推:
RMSE 和 MAE 的誤差與訓(xùn)練數(shù)據(jù)相似,QQ 圖與殘差更符合理論值,可能是由于與訓(xùn)練數(shù)據(jù)相比樣本值較少。在對比殘差與預(yù)測值的圖表中,我們注意到當(dāng)價(jià)格上漲時(shí),誤差絕對值有增加的趨勢,可能用對數(shù)調(diào)整會(huì)減少誤差的擴(kuò)大并完成殘差相關(guān)圖,表明由于第一個(gè)滯后有很強(qiáng)的相關(guān)性,因此仍有改進(jìn)的空間,可能添加基于第一個(gè)滯后的回歸來改進(jìn)預(yù)測。下一個(gè)模型是簡單平均值:簡單平均
另一種預(yù)測方法是使用序列平均值,通常當(dāng)數(shù)值在平均值附近振蕩時(shí),具有常數(shù)的方差,沒有上升或下降趨勢時(shí),這種預(yù)測形式是好的,但是也能使用更好的方法,其中可以使用季節(jié)模式進(jìn)行預(yù)測。此模型使用數(shù)據(jù)首端直到分析的前一個(gè)時(shí)期的平均值,并且按天擴(kuò)展到數(shù)據(jù)結(jié)束,最后,趨勢是一條直線,我們現(xiàn)在將此模型與第一個(gè)模型的誤差進(jìn)行比較:
在測試數(shù)據(jù)中,我將繼續(xù)使用訓(xùn)練數(shù)據(jù)一開始的均值,并展開添加到測試數(shù)據(jù)上:
簡單均值模型無法捕獲序列的相關(guān)信息,如真實(shí)值和預(yù)測值圖中所示,也可以在相關(guān)性和殘差和預(yù)測圖中看到。簡單滑動(dòng)平均:
滑動(dòng)平均是針對給定周期(例如 5 天)計(jì)算的平均值,它是滑動(dòng)的并始終使用此特定時(shí)段進(jìn)行計(jì)算,在這種情況下,我們將始終使用過去 5 天的平均值來預(yù)測下一天的值。
誤差低于簡單平均,但仍高于簡單模型,以下是測試模型:
與訓(xùn)練數(shù)據(jù)相似,滑動(dòng)平均模型優(yōu)于簡單平均模型,但尚未比簡單模型基礎(chǔ)有所增益。預(yù)測具有 2 個(gè)時(shí)滯的自相關(guān)性,并且相對于預(yù)測值有很大的方差誤差。指數(shù)滑動(dòng)平均:
上述簡單滑動(dòng)平均模型具有同等地處理最后 X 個(gè)觀測值并完全忽略所有先前觀測值的特性。直觀地說,過去的數(shù)據(jù)應(yīng)該逐漸打折,例如,理論上最近的觀測結(jié)果應(yīng)該比第二近的更重要,而第二近的觀測應(yīng)該比第三近的數(shù)據(jù)更重要,等等, 指數(shù)滑動(dòng)平均(Exponential Moving Average,EMM)模型就是這樣做的。由于?α(alpha)是一個(gè)常數(shù),其值介于 0 和 1 之間,因此我們將使用以下公式計(jì)算預(yù)測值:
如果預(yù)測的第一個(gè)值是相應(yīng)的當(dāng)前值,其他值將更新為實(shí)際值與前一個(gè)時(shí)段的預(yù)測之差的 α 倍。當(dāng)α為零時(shí),我們根據(jù)第一個(gè)預(yù)測值得到一個(gè)常數(shù),當(dāng) α 為 1 時(shí),我們有一個(gè)簡單方法的模型,因?yàn)榻Y(jié)果是前一個(gè)實(shí)際周期的值。
EMM 預(yù)測中的平均數(shù)據(jù)周期為 1 /α。例如,當(dāng) α= 0.5 時(shí),滯后相當(dāng)于 2 個(gè)周期; 當(dāng) α= 0.2 時(shí),滯后是 5 個(gè)周期; 當(dāng) α= 0.1 時(shí),滯后是 10 個(gè)周期,依此類推。在這個(gè)模型中,我們將任意選用 α 值為 0.5 ,而你可以通過網(wǎng)格搜索算法查找在訓(xùn)練集和驗(yàn)證集中都中減少了錯(cuò)誤的 α,數(shù)據(jù)大概應(yīng)是這樣:
這個(gè)模型的誤差與滑動(dòng)平均的誤差相似,但是我們需要在測試集對模型進(jìn)行驗(yàn)證:
在驗(yàn)證數(shù)據(jù)中,目前為止的誤差在我們已經(jīng)訓(xùn)練過的模型中排名第二,而殘差圖的特征與 5 天滑動(dòng)平均模型的特征非常相似。自回歸
自回歸模型基本上是一個(gè)具有顯著相關(guān)滯后的線性回歸,首先要繪制自相關(guān)圖和部分自相關(guān)圖來驗(yàn)證是否存在相關(guān)關(guān)系。下面是訓(xùn)練序列的自相關(guān)圖和部分自相關(guān)圖,顯示了自回歸模型的特征為具有 2 個(gè)時(shí)滯的顯著相關(guān)性:
接下來我們將根據(jù)訓(xùn)練數(shù)據(jù)創(chuàng)建模型,得到模型的系數(shù)后,將其乘以測試數(shù)據(jù)將要執(zhí)行的值:
這個(gè)模型與我們所訓(xùn)練的其他模型相比,誤差最小,現(xiàn)在我們用它的系數(shù)對訓(xùn)練數(shù)據(jù)進(jìn)行逐步預(yù)測:
注意,在測試數(shù)據(jù)中,誤差不會(huì)保持穩(wěn)定,甚至?xí)群唵文P透?,可以看到圖中的預(yù)測值幾乎總是低于當(dāng)前值,偏差測量顯示實(shí)際值比預(yù)測值高 50.19 BRL, 也許在訓(xùn)練模型中調(diào)整一些參數(shù),這種差異會(huì)減小。要改進(jìn)這些模型,你可以應(yīng)用多個(gè)轉(zhuǎn)換,例如本文中介紹的轉(zhuǎn)換,也可以添加外部變量作為預(yù)測源,但是,這已然超出本文內(nèi)容了。
4?
結(jié)束語
每個(gè)時(shí)間序列模型都有自己的特點(diǎn),應(yīng)該分別單獨(dú)分析,這樣我們就可以提取盡可能多的信息來做出好的預(yù)測,減少未來的不確定性。檢驗(yàn)平穩(wěn)度、轉(zhuǎn)換數(shù)據(jù)、在訓(xùn)練數(shù)據(jù)中建立模型、驗(yàn)證測試數(shù)據(jù)、檢驗(yàn)殘差是建立良好時(shí)間序列預(yù)測的關(guān)鍵步驟。也可以看看本文原作者的有關(guān)ARIMA模型的文章。https://www.kaggle.com/leandrovrabelo/climate-change-forecast-sarima-model
原文來源:https://towardsdatascience.com/basic-principles-to-create-a-time-series-forecast-6ae002d177a4
本文來自公眾號(hào)讀者翻譯,歡迎各位童鞋向公號(hào)投稿,點(diǎn)擊下面圖片了解詳情!
李潔,北京師范大學(xué)香港浸會(huì)大學(xué)聯(lián)合學(xué)院 數(shù)據(jù)科學(xué)系助教,香港科技大學(xué)電信學(xué)碩士。
-------------------End-------------------
獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:
https://t.zsxq.com/662nyZF
本站qq群1003271085。
加入微信群請掃碼進(jìn)群(如果是博士或者準(zhǔn)備讀博士請說明):