<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【機(jī)器學(xué)習(xí)基礎(chǔ)】不會(huì)時(shí)間序列預(yù)測?不要緊,大神來教你

          共 10458字,需瀏覽 21分鐘

           ·

          2020-09-07 13:45

          作者:Leandro Rabelo
          譯者:李潔
          整理:Lemonbit
          譯文出品:Python數(shù)據(jù)之道


          「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è)例子中,我們可以通過把幾乎所有的東西都放到相同的基上來減少差異值。
          下面還是同一個(gè)例子:
          1. price1 = np.log(52.5) - np.log(50)

          2. price2 = np.log(105) - np.log(100)

          3. printf('The percentage variation of the first example is {round(price1*100,1)} and the second is {round(price2*100,1)}')


          原始序列與 NL 序列變換的對比圖:


          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è)滯后的影響。
          部分自相關(guān)圖如下:


          可以看到,幾乎沒有滯后對當(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ù)值大還是小,示例如下:
          1. a = np.array([1,2,3,4,5])

          2. b = np.array([5,4,3,2,1])


          3. error = a - b


          4. MFE = error.mean()

          5. MAE = np.abs(error).mean()


          6. print(f'The error of each model value looks like this: {error}')

          7. 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ù)的誤差:
          1. #Libraries to create the function:

          2. from math import sqrt

          3. from sklearn.metrics import mean_squared_error,mean_absolute_error, mean_absolute_error


          4. def check_error(orig, pred, name_col='', index_name=''):

          5. bias = np.mean(orig - pred)

          6. mse = mean_squared_error(orig, pred)

          7. rmse = sqrt(mean_squared_error(orig, pred))

          8. mae = mean_absolute_error(orig, pred)

          9. mape = np.mean(np.abs((orig - pred) / orig)) * 100

          10. error_group = [bias, mse, rmse, mae, mape]

          11. serie = pd.DataFrame(error_group, index=['BIAS','MSE','RMSE','MAE', 'MAPE'], columns=[name_col])

          12. serie.index.name = index_name

          13. return serie

          殘差與預(yù)測值(散點(diǎn)圖):
          分析這個(gè)圖是非常重要的,因?yàn)樵谶@個(gè)圖中我們可以檢查模式,它可以告訴我們是否需要對模型進(jìn)行一些修改,理想的情況是誤差沿著預(yù)測序列線性分布。
          殘差的QQ圖(散點(diǎn)圖):
          https://en.wikipedia.org/wiki/Q–Q_plot
          總的來說這是一個(gè)顯示了殘差在理論上應(yīng)該如何分布的圖形,遵循高斯分布,而不是實(shí)際情況。
          殘差自相關(guān)(序列圖):
          如果沒有置信區(qū)間的值,或者說模型不包含信息。
          我們需要?jiǎng)?chuàng)建另一個(gè)函數(shù)來繪制這些圖:
          1. def plot_error(data, figsize=(18,8)):


          2. # Creating the column error

          3. data['Error'] = data.iloc[:,0] -data.iloc[:,1]


          4. plt.figure(figsize=figsize)

          5. ax1 = plt.subplot2grid((2,2), (0,0))

          6. ax2 = plt.subplot2grid((2,2), (0,1))

          7. ax3 = plt.subplot2grid((2,2), (1,0))

          8. ax4 = plt.subplot2grid((2,2), (1,1))


          9. #Plotting actual and predicted values

          10. ax1.plot(data.iloc[:,0:2])

          11. ax1.legend(['Real','Pred'])

          12. ax1.set_title('Real Value vs Prediction')


          13. # Error vs Predicted value

          14. ax2.scatter(data.iloc[:,1], data.iloc[:,2])

          15. ax2.set_xlabel('Predicted Values')

          16. ax2.set_ylabel('Residual')

          17. ax2.set_title('Residual vs Predicted Values')


          18. ## Residual QQ Plot

          19. sm.graphics.qqplot(data.iloc[:,2], line='r', ax=ax3)


          20. # Autocorrelation Plot of residual

          21. plot_acf(data.iloc[:,2], lags=60, zero=False, ax=ax4)

          22. plt.tight_layout()

          23. 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í)際周期的值。
          下面是幾個(gè) α 值的圖表:


          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)備讀博士請說明):

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  伊人网站在线免费观看 | 国产成人精品一区二区毛片 | 少妇视频导航 | 久久久久91精品成人片 | www.豆花视频无码 |