本文詳細(xì)說明了進(jìn)行時(shí)間序列預(yù)測(cè)的步驟嗤军。
我們被隨處可見的模式所包圍,人們可以注意到四季與天氣的關(guān)系模式晃危,以交通量計(jì)算的交通高峰期的模式,你的心跳或者是股票市場(chǎng)和某些產(chǎn)品的銷售周期老客。
分析時(shí)間序列數(shù)據(jù)對(duì)于發(fā)現(xiàn)這些模式和預(yù)測(cè)未來非常有用僚饭。有幾種方法可以創(chuàng)建這類預(yù)測(cè),在本文中胧砰,我將介紹最基本且最傳統(tǒng)的方法概念鳍鸵。
所有代碼都是用Python編寫的,并且尉间,在我的 GitHub 上可以看到所有的附加信息偿乖。
那么讓我們開始談?wù)劮治?strong>時(shí)間序列的初始條件:
平穩(wěn)序列
平穩(wěn)時(shí)間序列是指統(tǒng)計(jì)特性,如均值哲嘲、方差和自相關(guān)系數(shù)贪薪,隨時(shí)間相對(duì)恒定的序列。因此眠副,非平穩(wěn)序列是統(tǒng)計(jì)特性隨時(shí)間變化的序列画切。
在開始任何預(yù)測(cè)建模之前,都有必要驗(yàn)證這些統(tǒng)計(jì)屬性是否是常量囱怕,我將一一解釋下面的每個(gè)點(diǎn):
· 常數(shù)均值
· 常數(shù)方差
· 自相關(guān)
常數(shù)均值
平穩(wěn)序列在時(shí)間上具有一個(gè)相對(duì)穩(wěn)定的均值霍弹,這個(gè)值沒有減少或者增加的趨勢(shì)毫别。圍繞常數(shù)均值的小的變化,使我們更容易推測(cè)未來典格。 在某些情況下岛宦,相對(duì)于平均值的變量比較小,使用它可以很好地預(yù)測(cè)未來耍缴。下圖顯示了變量與該常數(shù)平均值相對(duì)于時(shí)間變化的關(guān)系:
在這種情況下砾肺,如果序列不是平穩(wěn)的,對(duì)未來的預(yù)測(cè)將是無效的私恬,因?yàn)槠骄抵車淖兞繒?huì)顯著偏離债沮,如下圖所示:
在上圖中,我們可以明顯看到上升的趨勢(shì)本鸣,均值正在逐漸上升疫衩。在這種情況下,如果使用均值進(jìn)行未來值的預(yù)測(cè)荣德,誤差將非常大闷煤,因?yàn)轭A(yù)測(cè)價(jià)格會(huì)總是低于實(shí)際價(jià)格。
常數(shù)方差
當(dāng)序列的方差為常數(shù)時(shí)涮瞻,我們知道均值和標(biāo)準(zhǔn)差之間存在一種關(guān)系鲤拿。當(dāng)方差不為常數(shù)時(shí)(如下圖所示),預(yù)測(cè)在某些時(shí)期可能會(huì)有較大的誤差署咽,而這些時(shí)期是不可預(yù)測(cè)的近顷。可以預(yù)測(cè)到宁否,隨著時(shí)間的推移直到未來窒升,方差會(huì)保持不穩(wěn)定。
為了減小方差效應(yīng)慕匠,可以采用對(duì)數(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)的情況類似于這樣:對(duì)工作安全措施的投入越多屉凯,工作相關(guān)的事故數(shù)量就越少。
下面是幾個(gè)相關(guān)級(jí)別的散點(diǎn)圖的例子:
當(dāng)談到自相關(guān)時(shí)眼溶,意思是某些先前時(shí)期與當(dāng)前時(shí)期存在相關(guān)性悠砚,這種相關(guān)性是滯后的。例如堂飞,在以小時(shí)為單位的測(cè)量值序列中灌旧,今天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ù)測(cè)的一種情況衡蚂,因?yàn)槿绻麤]有相關(guān)性,就不能使用過去的值來預(yù)測(cè)未來骏庸;當(dāng)有多個(gè)變量時(shí)毛甲,則可以驗(yàn)證因變量和獨(dú)立變量的滯后之間是否存在相關(guān)性。
如果一個(gè)序列不存在自相關(guān)關(guān)系具被,那么它就是隨機(jī)且不可預(yù)測(cè)的玻募,做預(yù)測(cè)的最佳方法通常是使用前一天的值。我將在下面使用更詳細(xì)的圖表來解釋一姿。
從這里開始我將分析Esalq上的每周含水乙醇價(jià)格(這是巴西談判含水乙醇的價(jià)格參考)七咧,數(shù)據(jù)可以在這里(https://www.cepea.esalq.usp.br/br/indicador/etanol.aspx)下載。
價(jià)格單位是巴西雷亞爾每立方米(BRL/m3)叮叹。
在開始任何分析之前坑雅,要將數(shù)據(jù)劃分為訓(xùn)練集和測(cè)試集。
劃分訓(xùn)練集和測(cè)試集數(shù)據(jù)
當(dāng)我們要?jiǎng)?chuàng)建時(shí)序預(yù)測(cè)模型時(shí)衬横,將數(shù)據(jù)劃分為兩部分至關(guān)重要:
訓(xùn)練集:這些數(shù)據(jù)將是定義模型系數(shù)/參數(shù)的主要依據(jù);
測(cè)試集:這些數(shù)據(jù)將被分離且對(duì)模型不可見终蒂,用于測(cè)試模型是否有效(通常將這些值與模型結(jié)果進(jìn)行比較蜂林,最后測(cè)量平均誤差)。
測(cè)試集的大小通常約為總樣本的20%拇泣,盡管這個(gè)百分比取決于你擁有的樣本大小以及你希望提前多少時(shí)間進(jìn)行預(yù)測(cè)噪叙。理想情況下,測(cè)試集應(yīng)至少與所需預(yù)測(cè)的最大范圍相同霉翔。
與其他如分類和回歸等不受時(shí)間影響的預(yù)測(cè)方法不同睁蕾,在時(shí)間序列中,不可以將訓(xùn)練和測(cè)試數(shù)據(jù)從數(shù)據(jù)中隨機(jī)抽樣取出,我們必須遵循序列的時(shí)間標(biāo)準(zhǔn)子眶,訓(xùn)練數(shù)據(jù)應(yīng)該始終是在測(cè)試數(shù)據(jù)之前瀑凝。
在本例中,我們有Esalq 含水乙醇的856周的價(jià)格數(shù)據(jù)臭杰,使用前700周的數(shù)據(jù)作為訓(xùn)練集粤咪,后156周(3年,18%)的數(shù)據(jù)用作測(cè)試集:
從現(xiàn)在開始渴杆,我們只使用訓(xùn)練集來做研究寥枝,測(cè)試集僅用于驗(yàn)證我們的預(yù)測(cè)。
每一個(gè)時(shí)間序列可以分為三個(gè)部分:趨勢(shì)磁奖、季節(jié)性和殘差囊拜,殘差是將前兩部分從序列中去除后剩下的部分,使用這種分割方法之后:
顯然比搭,該序列具有上升趨勢(shì)冠跷,在每一年的年底到年初之間達(dá)到峰值,在4月和9月之間達(dá)到最低值(此時(shí)在巴西中南部開始甘蔗的壓榨)敢辩。
仍然建議使用統(tǒng)計(jì)測(cè)試來確認(rèn)序列是否平穩(wěn)蔽莱,這里將使用兩個(gè)測(cè)試:Dickey-Fuller測(cè)試和KPSS測(cè)試。
首先戚长,我們將使用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)镻值為1%喉磁,統(tǒng)計(jì)檢驗(yàn)高于任何臨界值。
接下來官脓,我將演示如何將序列轉(zhuǎn)換為平穩(wěn)狀態(tài)协怒。
將序列轉(zhuǎn)換為平穩(wěn)狀態(tài)
差分
差分法用來移除趨勢(shì)信號(hào),也可以用來減少方差确买,它只是T周期的值與前一個(gè)T-1周期值的差值斤讥。
為了更容易理解,下面我們只用一小部分的乙醇價(jià)格湾趾,以便更好地可視化芭商,可以看到從2005年5月開始價(jià)格上漲,直到2006年5月中旬搀缠,價(jià)格每周都在上漲铛楣,這就累積了一個(gè)上升的趨勢(shì),這種情況下艺普,屬于非平穩(wěn)序列簸州。
當(dāng)進(jìn)行一階微分時(shí)(如下圖),我們?nèi)コ诵蛄械睦鄯e效應(yīng)歧譬,并且僅顯示了整個(gè)系列中時(shí)段T相對(duì)于時(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)用二階微分,在這種情況下袁滥,將對(duì)一階微分的值進(jìn)行求導(dǎo)(幾乎沒有二階以上微分的情況)盖桥。
同樣的例子,要進(jìn)行二次微分题翻,我們必須取T時(shí)刻減去T-1時(shí)刻的微分:2.9 BRL -5.5 BRL = - 2.6 BRL等等揩徊。
做一下Dickey-Fuller測(cè)試,看看這個(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à)格是相對(duì)于交易時(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)沿盅。
如圖所示,上升趨勢(shì)已經(jīng)消失纫溃,只剩下季節(jié)性振蕩腰涧,Dickey-Fuller測(cè)試也證實(shí)了這個(gè)序列現(xiàn)在是穩(wěn)定的。
如果好奇紊浩,可以參閱下面的圖表窖铡,其中調(diào)整后的價(jià)格與原始系列的通貨膨脹率相對(duì)應(yīng)。
減小方差
對(duì)數(shù)變換
對(duì)數(shù)變換通常用于將指數(shù)增長(zhǎng)的序列轉(zhuǎn)換為具有更趨于線性增長(zhǎng)的序列坊谁,在本例中费彼,我們將使用自然對(duì)數(shù)(Natural Logarithm,NL)口芍,其底數(shù)為2.718箍铲,這種對(duì)數(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à)格之間的絕對(duì)差分別是2.50 BRL和5.00 BRL春畔,但兩者的百分比差為5%。
當(dāng)我們對(duì)這些價(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è)例子中,我們可以通過把幾乎所有的東西都放到相同的基上來減少差異值烫堤。
下面還是同一個(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)}')
原始序列與NL序列變換的對(duì)比圖:
Box-Cox變換(指數(shù)變換)
Box-Cox轉(zhuǎn)換也是一種轉(zhuǎn)換序列的方法潜必,lambda(λ)的值是用于轉(zhuǎn)換序列的參數(shù)。
簡(jiǎn)而言之凿滤,這個(gè)函數(shù)是幾個(gè)指數(shù)變換函數(shù)的結(jié)合,我們需要找到轉(zhuǎn)換序列的lambda的最佳值利诺,使其分布更接近正態(tài)高斯分布。使用此轉(zhuǎn)換的一個(gè)條件是序列只有正值剩燥,公式為:
接下來我將繪制原始序列及其分布圖慢逾,然后用lambda最佳值繪制新的轉(zhuǎn)換序列及其分布圖,為了找到lambda的值灭红,我們將使用庫(kù)Scipy的boxcox函數(shù)生成轉(zhuǎn)換的序列和理想lambda值:
下面是一個(gè)交互式圖表侣滩,在圖中可以更改lambda值和檢查更改:
此工具通常用于提高模型的性能,因?yàn)樗鼓P透呌谡龖B(tài)分布比伏,記住在完成模型的預(yù)測(cè)后胜卤,必須根據(jù)以下公式反轉(zhuǎn)轉(zhuǎn)換到原始的基數(shù):
尋找相關(guān)時(shí)滯
為了便于預(yù)測(cè),具有單一變量的序列必須具有自相關(guān)性赁项,即葛躏,當(dāng)前時(shí)段必須是能夠基于較早的時(shí)段(滯后)而解釋的。
由于這個(gè)序列每周為一周期悠菜,1年大約52周舰攒,我將使用60的滯后期的自相關(guān)函數(shù)來驗(yàn)證當(dāng)前周期與這些滯后的相關(guān)性。
通過對(duì)上述自相關(guān)圖的分析悔醋,似乎所有的滯后都可以用來為未來事件創(chuàng)建預(yù)測(cè)摩窃,因?yàn)樗鼈兊恼嚓P(guān)接近1,而且都在置信區(qū)間之外芬骄,但這一特征屬于非平穩(wěn)序列猾愿。
另一個(gè)非常重要的函數(shù)是部分自相關(guān)函數(shù),其中消除了先前的滯后對(duì)當(dāng)前區(qū)間的影響账阻,只保留了當(dāng)前區(qū)間滯后的影響來分析蒂秘,例如:第四個(gè)滯后的偏自相關(guān)將消除第一、第二和第三個(gè)滯后的影響淘太。
部分自相關(guān)圖如下:
可以看到姻僧,幾乎沒有滯后對(duì)當(dāng)前周期有影響,但是正如前面所演示的蒲牧,沒有微分的序列不是平穩(wěn)的撇贺,我們現(xiàn)在用一階微分的序列繪制這兩個(gè)函數(shù)來展示原理:
自相關(guān)曲線變化顯著,表明該序列僅在第一個(gè)滯后期具有顯著相關(guān)冰抢,在第26個(gè)滯后(半年)左右具有負(fù)相關(guān)的季節(jié)效應(yīng)松嘶。
為了做出預(yù)測(cè),我們必須注意一個(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)圖對(duì)異常值非常敏感骇吭,因此分析時(shí)間序列本身并與兩個(gè)自相關(guān)圖進(jìn)行對(duì)比非常重要橙弱。
在這個(gè)例子中,第一個(gè)滯后與當(dāng)前周期具有高度相關(guān)性燥狰,因?yàn)榍耙恢艿膬r(jià)格歷史上沒有顯著變化棘脐,在相同的情況下,第26個(gè)滯后呈現(xiàn)負(fù)相關(guān)龙致,表明與當(dāng)前時(shí)期相反的趨勢(shì)蛀缝,可能原因是一年內(nèi)不同時(shí)期供需不同。
隨著膨脹率調(diào)整后的序列已經(jīng)趨于平穩(wěn)目代,我們將使用它來創(chuàng)建我們的預(yù)測(cè)屈梁,下圖是調(diào)整后序列的自相關(guān)和部分自相關(guān)圖:
我們將只使用前兩個(gè)滯后作為自回歸序列的預(yù)測(cè)因子。
想要了解更多信息的話榛了,杜克大學(xué)教授Robert Nau的網(wǎng)站是與此主題相關(guān)的最佳網(wǎng)站之一在讶。(http://people.duke.edu/~rnau/411home.htm)
模型評(píng)價(jià)指標(biāo)
為了分析預(yù)測(cè)值是否接近當(dāng)前值,必須對(duì)誤差進(jìn)行測(cè)量霜大,此種情況下的誤差(或殘差)基本上是 Yreal-YpredYreal-Ypred构哺。
對(duì)訓(xùn)練數(shù)據(jù)中的錯(cuò)誤進(jìn)行評(píng)估以驗(yàn)證模型是否具有良好的確定性,然后通過檢查測(cè)試數(shù)據(jù)中的誤差(模型未“看到”的數(shù)據(jù))來驗(yàn)證模型战坤。
當(dāng)將訓(xùn)練數(shù)據(jù)與測(cè)試數(shù)據(jù)進(jìn)行對(duì)比時(shí)曙强,檢查誤差對(duì)于驗(yàn)證你的模型是否過擬合或欠擬合非常重要。
以下是一些用于評(píng)估時(shí)間序列模型的關(guān)鍵指標(biāo):
平均預(yù)測(cè)誤差——偏差(bias)
它只是被評(píng)估序列的平均誤差途茫,值可以是正的也可以是負(fù)的碟嘴。該指標(biāo)表明,模型傾向于預(yù)測(cè)實(shí)際值以上(負(fù)誤差)還是實(shí)際值以下(正誤差)慈省,因此也可以說平均預(yù)測(cè)誤差是模型的偏差臀防。
MAE——平均絕對(duì)誤差
這個(gè)指標(biāo)與上面提到的預(yù)測(cè)的平均誤差非常相似,唯一的區(qū)別是將誤差的負(fù)值轉(zhuǎn)化為正值边败,然后計(jì)算平均值袱衷。
這個(gè)指標(biāo)在時(shí)間序列中被廣泛使用,因?yàn)樵谝恍┣闆r下笑窜,負(fù)誤差可以抵消正誤差致燥,使人誤以為模型是準(zhǔn)確的,而在用MAE的情況下不會(huì)發(fā)生排截,因?yàn)檫@個(gè)指標(biāo)顯示預(yù)測(cè)距離實(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}')</pre>
與MAE和MFE不同,MSE值是平方單位脱吱,而不是模型單位智政。
RMSE——均方根誤差
這個(gè)指標(biāo)只是MSE的平方根,使誤差返回到模型的度量單位(BRL/m3)箱蝠,因?yàn)樗鼘?duì)時(shí)間序列在平方過程中產(chǎn)生的較大誤差更為敏感而非常有用续捂。
MAPE——平均絕對(duì)百分誤差
這是另一個(gè)可用的有趣的指標(biāo),它通常在管理報(bào)告中使用宦搬,因?yàn)檎`差是以百分比度量的牙瓢,所以產(chǎn)品X的錯(cuò)誤可以與產(chǎn)品Y的誤差進(jìn)行比較。
該指標(biāo)的計(jì)算取誤差的絕對(duì)值除以當(dāng)前價(jià)格间校,然后計(jì)算平均值:
我們來創(chuàng)建一個(gè)函數(shù)矾克,用幾個(gè)評(píng)估指標(biāo)來評(píng)估訓(xùn)練數(shù)據(jù)和測(cè)試數(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</pre>
殘差與預(yù)測(cè)值(散點(diǎn)圖):
分析這個(gè)圖是非常重要的,因?yàn)樵谶@個(gè)圖中我們可以檢查模式憔足,它可以告訴我們是否需要對(duì)模型進(jìn)行一些修改胁附,理想的情況是誤差沿著預(yù)測(cè)序列線性分布。
殘差的QQ圖(散點(diǎn)圖):(https://en.wikipedia.org/wiki/Q
總的來說這是一個(gè)顯示了殘差在理論上應(yīng)該如何分布的圖形四瘫,遵循高斯分布汉嗽,而不是實(shí)際情況。
殘差自相關(guān)(序列圖):
如果沒有置信區(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ù)和測(cè)試數(shù)據(jù)來進(jìn)行模擬:
QQ圖顯示了有一些比理論上要大些(包括正負(fù)值)的殘差诚纸,這些是所謂的異常值撰筷,但在第一,第六和第七個(gè)滯后中仍然存在明顯的自相關(guān)畦徘,這可以用于改進(jìn)模型毕籽。
同樣地,我們現(xiàn)在將在測(cè)試數(shù)據(jù)中進(jìn)行預(yù)測(cè)井辆。 預(yù)測(cè)序列的第一個(gè)值將是訓(xùn)練數(shù)據(jù)的最后一個(gè)值关筒,然后這些值將按照測(cè)試的當(dāng)前值逐步更新,依此類推:
RMSE和MAE的誤差與訓(xùn)練數(shù)據(jù)相似杯缺,QQ圖與殘差更符合理論值蒸播,可能是由于與訓(xùn)練數(shù)據(jù)相比樣本值較少。
在對(duì)比殘差與預(yù)測(cè)值的圖表中,我們注意到當(dāng)價(jià)格上漲時(shí)袍榆,誤差絕對(duì)值有增加的趨勢(shì)胀屿,可能用對(duì)數(shù)調(diào)整會(huì)減少誤差的擴(kuò)大并完成殘差相關(guān)圖,表明由于第一個(gè)滯后有很強(qiáng)的相關(guān)性包雀,因此仍有改進(jìn)的空間宿崭,可能添加基于第一個(gè)滯后的回歸來改進(jìn)預(yù)測(cè)。下一個(gè)模型是簡(jiǎn)單平均值:
簡(jiǎn)單平均
另一種預(yù)測(cè)方法是使用序列平均值才写,通常當(dāng)數(shù)值在平均值附近振蕩時(shí)劳曹,具有常數(shù)的方差,沒有上升或下降趨勢(shì)時(shí)琅摩,這種預(yù)測(cè)形式是好的,但是也能使用更好的方法锭硼,其中可以使用季節(jié)模式進(jìn)行預(yù)測(cè)房资。
此模型使用數(shù)據(jù)首端直到分析的前一個(gè)時(shí)期的平均值,并且按天擴(kuò)展到數(shù)據(jù)結(jié)束檀头,最后轰异,趨勢(shì)是一條直線,我們現(xiàn)在將此模型與第一個(gè)模型的誤差進(jìn)行比較:
在測(cè)試數(shù)據(jù)中暑始,我將繼續(xù)使用訓(xùn)練數(shù)據(jù)一開始的均值搭独,并展開添加到測(cè)試數(shù)據(jù)上:
簡(jiǎn)單均值模型無法捕獲序列的相關(guān)信息,如真實(shí)值和預(yù)測(cè)值圖中所示廊镜,也可以在相關(guān)性和殘差和預(yù)測(cè)圖中看到牙肝。
簡(jiǎn)單滑動(dòng)平均:
滑動(dòng)平均是針對(duì)給定周期(例如5天)計(jì)算的平均值,它是滑動(dòng)的并始終使用此特定時(shí)段進(jìn)行計(jì)算嗤朴,在這種情況下配椭,我們將始終使用過去5天的平均值來預(yù)測(cè)下一天的值。
誤差低于簡(jiǎn)單平均雹姊,但仍高于簡(jiǎn)單模型股缸,以下是測(cè)試模型:
與訓(xùn)練數(shù)據(jù)相似,滑動(dòng)平均模型優(yōu)于簡(jiǎn)單平均模型吱雏,但尚未比簡(jiǎn)單模型基礎(chǔ)有所增益敦姻。
預(yù)測(cè)具有2個(gè)時(shí)滯的自相關(guān)性,并且相對(duì)于預(yù)測(cè)值有很大的方差誤差歧杏。
指數(shù)滑動(dòng)平均:
上述簡(jiǎn)單滑動(dòng)平均模型具有同等地處理最后X個(gè)觀測(cè)值并完全忽略所有先前觀測(cè)值的特性镰惦。 直觀地說,過去的數(shù)據(jù)應(yīng)該逐漸打折得滤,例如陨献,理論上最近的觀測(cè)結(jié)果應(yīng)該比第二近的更重要,而第二近的觀測(cè)應(yīng)該比第三近的數(shù)據(jù)更重要懂更,等等眨业, 指數(shù)滑動(dòng)平均(Exponential Moving Average急膀,EMM)模型就是這樣做的。
由于α(alpha)是一個(gè)常數(shù)龄捡,其值介于0和1之間卓嫂,因此我們將使用以下公式計(jì)算預(yù)測(cè)值:
如果預(yù)測(cè)的第一個(gè)值是相應(yīng)的當(dāng)前值,其他值將更新為實(shí)際值與前一個(gè)時(shí)段的預(yù)測(cè)之差的α倍聘殖。 當(dāng)α為零時(shí)晨雳,我們根據(jù)第一個(gè)預(yù)測(cè)值得到一個(gè)常數(shù),當(dāng)α為1時(shí)奸腺,我們有一個(gè)簡(jiǎn)單方法的模型餐禁,因?yàn)榻Y(jié)果是前一個(gè)實(shí)際周期的值。
下面是幾個(gè)α值的圖表:
EMM預(yù)測(cè)中的平均數(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)平均的誤差相似游盲,但是我們需要在測(cè)試集對(duì)模型進(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ù)后又沾,將其乘以測(cè)試數(shù)據(jù)將要執(zhí)行的值:
這個(gè)模型與我們所訓(xùn)練的其他模型相比弊仪,誤差最小,現(xiàn)在我們用它的系數(shù)對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行逐步預(yù)測(cè):
注意杖刷,在測(cè)試數(shù)據(jù)中励饵,誤差不會(huì)保持穩(wěn)定,甚至?xí)群?jiǎn)單模型更差滑燃,可以看到圖中的預(yù)測(cè)值幾乎總是低于當(dāng)前值役听,偏差測(cè)量顯示實(shí)際值比預(yù)測(cè)值高 50.19 BRL, 也許在訓(xùn)練模型中調(diào)整一些參數(shù),這種差異會(huì)減小典予。
要改進(jìn)這些模型甜滨,你可以應(yīng)用多個(gè)轉(zhuǎn)換,例如本文中介紹的轉(zhuǎn)換瘤袖,也可以添加外部變量作為預(yù)測(cè)源衣摩,但是,這已然超出本文內(nèi)容了捂敌。
結(jié)束語
每個(gè)時(shí)間序列模型都有自己的特點(diǎn)艾扮,應(yīng)該分別單獨(dú)分析,這樣我們就可以提取盡可能多的信息來做出好的預(yù)測(cè)占婉,減少未來的不確定性泡嘴。
檢驗(yàn)平穩(wěn)度、轉(zhuǎn)換數(shù)據(jù)逆济、在訓(xùn)練數(shù)據(jù)中建立模型磕诊、驗(yàn)證測(cè)試數(shù)據(jù)、檢驗(yàn)殘差是建立良好時(shí)間序列預(yù)測(cè)的關(guān)鍵步驟纹腌。
也可以看看我有關(guān)ARIMA模型的文章。(https://www.kaggle.com/leandrovrabelo/climate-change-forecast-sarima-model)
原文來源: https://medium.com/predict/the-beginners-self-starter-guide-to-ml-6ed40f4df4de
譯文首發(fā)于wx公眾號(hào) @python數(shù)據(jù)之道