日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

时间序列(一):时间序列数据与时间序列预测模型

發(fā)布時(shí)間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 时间序列(一):时间序列数据与时间序列预测模型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

時(shí)間序列系列文章:

時(shí)間序列(一):時(shí)間序列數(shù)據(jù)與時(shí)間序列預(yù)測(cè)模型
時(shí)間序列(二):時(shí)間序列平穩(wěn)性檢測(cè)
時(shí)間序列(三):ARIMA模型實(shí)戰(zhàn)

時(shí)間序列及其預(yù)測(cè)是日常工作中建模,分析,預(yù)測(cè)的重要組成部分。本系列我們將從0開(kāi)始介紹時(shí)間序列的含義,模型及其分析。本篇為第一部分,我們主要介紹時(shí)間序列,與其常用的預(yù)測(cè)模型。

時(shí)間序列定義:

時(shí)間序列是按照一定的時(shí)間間隔排列的一組數(shù)據(jù),其時(shí)間間隔可以是任意的時(shí)間單位,如小時(shí)、日、周月等。比如,每天某產(chǎn)品的用戶數(shù)量,每個(gè)月的銷售額,這些數(shù)據(jù)形成了以一定時(shí)間間隔的數(shù)據(jù)。

通過(guò)對(duì)這些時(shí)間序列的分析,從中發(fā)現(xiàn)和揭示現(xiàn)象發(fā)展變化的規(guī)律,并將這些知識(shí)和信息用于預(yù)測(cè)。比如銷售量是上升還是下降,銷售量是否與季節(jié)有關(guān),是否可以通過(guò)現(xiàn)有的數(shù)據(jù)預(yù)測(cè)未來(lái)一年的銷售額是多少等。

對(duì)于時(shí)間序列的預(yù)測(cè),由于很難確定它與其他變量之間的關(guān)系,這時(shí)我們就不能用回歸去預(yù)測(cè),而應(yīng)使用時(shí)間序列方法進(jìn)行預(yù)測(cè)。

采用時(shí)間序列分析進(jìn)行預(yù)測(cè)時(shí)需要一系列的模型,這種模型稱為時(shí)間序列模型。

時(shí)間序列預(yù)測(cè)模型與方法

注:本部分只關(guān)注相關(guān)模型與分析的方法,模型的選擇,調(diào)參與優(yōu)化會(huì)放在后續(xù)文章中詳細(xì)講解

原始數(shù)據(jù)

本文所使用原始數(shù)據(jù)與代碼,可以在公眾號(hào):Smilecoc的雜貨鋪 中回復(fù)“時(shí)間序列”獲取??芍苯訏呙栉哪┒S碼關(guān)注!

樸素法

樸素法就是預(yù)測(cè)值等于實(shí)際觀察到的最后一個(gè)值。它假設(shè)數(shù)據(jù)是平穩(wěn)且沒(méi)有趨勢(shì)性與季節(jié)性的。通俗來(lái)說(shuō)就是以后的預(yù)測(cè)值都等于最后的值。

這種方法很明顯適用情況極少,所以我們重點(diǎn)通過(guò)這個(gè)方法來(lái)熟悉一下數(shù)據(jù)可視化與模型的評(píng)價(jià)及其相關(guān)代碼。

#樸素法 dd = np.asarray(train['Count'])#訓(xùn)練組數(shù)據(jù) y_hat = test.copy()#測(cè)試組數(shù)據(jù) y_hat['naive'] = dd[len(dd) - 1]#預(yù)測(cè)組數(shù)據(jù)#數(shù)據(jù)可視化 plt.figure(figsize=(12, 8)) plt.plot(train.index, train['Count'], label='Train') plt.plot(test.index, test['Count'], label='Test') plt.plot(y_hat.index, y_hat['naive'], label='Naive Forecast') plt.legend(loc='best') plt.title("Naive Forecast") plt.show()

得到結(jié)果:

我們通過(guò)計(jì)算均方根誤差,檢查模型在測(cè)試數(shù)據(jù)集上的準(zhǔn)確率。
其中均方根誤差(RMSE)是各數(shù)據(jù)偏離真實(shí)值的距離平方和的平均數(shù)的開(kāi)方

#計(jì)算均方根誤差RMSE from sklearn.metrics import mean_squared_error from math import sqrt# mean_squared_error求均方誤差 rmse = sqrt(mean_squared_error(test['Count'], y_hat['naive'])) print(rmse)

得到均方根誤差為1053

簡(jiǎn)單平均法

簡(jiǎn)單平均法就是預(yù)測(cè)的值為之前過(guò)去所有值的平均.當(dāng)然這不會(huì)很準(zhǔn)確,但這種預(yù)測(cè)方法在某些情況下效果是最好的。

#簡(jiǎn)單平均法 y_hat_avg = test.copy() y_hat_avg['avg_forecast'] = train['Count'].mean()

其后續(xù)可視化與模型效果評(píng)估方法與上述一致,這里不再贅述,需要詳細(xì)代碼可以查看相關(guān)源碼。得到RMSE值為2637

移動(dòng)平均法

我們經(jīng)常會(huì)遇到這種數(shù)據(jù)集,比如價(jià)格或銷售額某段時(shí)間大幅上升或下降。如果我們這時(shí)用之前的簡(jiǎn)單平均法,就得使用所有先前數(shù)據(jù)的平均值,但在這里使用之前的所有數(shù)據(jù)是說(shuō)不通的,因?yàn)橛瞄_(kāi)始階段的價(jià)格值會(huì)大幅影響接下來(lái)日期的預(yù)測(cè)值。因此,我們只取最近幾個(gè)時(shí)期的價(jià)格平均值。很明顯這里的邏輯是只有最近的值最要緊。這種用某些窗口期計(jì)算平均值的預(yù)測(cè)方法就叫移動(dòng)平均法。

#移動(dòng)平均法 y_hat_avg = test.copy() #利用時(shí)間窗函數(shù)rolling求平均值u y_hat_avg['moving_avg_forecast'] = train['Count'].rolling(60).mean().iloc[-1]

其后續(xù)可視化與模型效果評(píng)估方法與上述一致,這里不再贅述,需要詳細(xì)代碼可以查看相關(guān)源碼。得到RMSE值為1121

指數(shù)平滑法

在做時(shí)序預(yù)測(cè)時(shí),一個(gè)顯然的思路是:認(rèn)為離著預(yù)測(cè)點(diǎn)越近的點(diǎn),作用越大。比如我這個(gè)月體重100斤,去年某個(gè)月120斤,顯然對(duì)于預(yù)測(cè)下個(gè)月體重而言,這個(gè)月的數(shù)據(jù)影響力更大些。假設(shè)隨著時(shí)間變化權(quán)重以指數(shù)方式下降——最近為0.8,然后0.8**2,0.8**3…,最終年代久遠(yuǎn)的數(shù)據(jù)權(quán)重將接近于0。將權(quán)重按照指數(shù)級(jí)進(jìn)行衰減,這就是指數(shù)平滑法的基本思想。

指數(shù)平滑法有幾種不同形式:一次指數(shù)平滑法針對(duì)沒(méi)有趨勢(shì)和季節(jié)性的序列,二次指數(shù)平滑法針對(duì)有趨勢(shì)但沒(méi)有季節(jié)性的序列,三次指數(shù)平滑法針對(duì)有趨勢(shì)也有季節(jié)性的序列。“

所有的指數(shù)平滑法都要更新上一時(shí)間步長(zhǎng)的計(jì)算結(jié)果,并使用當(dāng)前時(shí)間步長(zhǎng)的數(shù)據(jù)中包含的新信息。它們通過(guò)”混合“新信息和舊信息來(lái)實(shí)現(xiàn),而相關(guān)的新舊信息的權(quán)重由一個(gè)可調(diào)整的參數(shù)來(lái)控制。

一次指數(shù)平滑

一次指數(shù)平滑法的遞推關(guān)系如下:

si=αxi+(1?α)si?1,其中0≤α≤1s_{i}=\alpha x_{i}+(1-\alpha)s_{i-1},其中 0 \leq \alpha \leq 1si?=αxi?+(1?α)si?1?0α1

其中,sis_{i}si?是時(shí)間步長(zhǎng)i(理解為第i個(gè)時(shí)間點(diǎn))上經(jīng)過(guò)平滑后的值,xix_{i}xi? 是這個(gè)時(shí)間步長(zhǎng)上的實(shí)際數(shù)據(jù)。 α\alphaα可以是0和1之間的任意值,它控制著新舊信息之間的平衡:當(dāng) α\alphaα 接近1,就只保留當(dāng)前數(shù)據(jù)點(diǎn);當(dāng)α\alphaα 接近0時(shí),就只保留前面的平滑值(整個(gè)曲線都是平的)。我們展開(kāi)它的遞推關(guān)系式:

我們展開(kāi)它的遞推關(guān)系式:
si=αxi+(1?α)si?1=αxi+(1?α)[αxi?1+(1?α)si?2]=αxi+(1?α)[αxi?1+(1?α)[αxi?2+(1?α)si?3]]=α[xi+(1?α)xi?1+(1?α)2xi?2+(1?α)3si?3]=...=α∑j=0i(1?α)jxi?j\begin{aligned} s_{i}&=\alpha x_{i}+(1-\alpha)s_{i-1} \\ &=\alpha x_{i}+(1-\alpha)[\alpha x_{i-1}+(1-\alpha)s_{i-2}]\\ &=\alpha x_{i}+(1-\alpha)[\alpha x_{i-1}+(1-\alpha)[\alpha x_{i-2}+(1-\alpha)s_{i-3}]]\\ &=\alpha[x_{i}+(1-\alpha)x_{i-1}+(1-\alpha)^{2}x_{i-2}+(1-\alpha)^{3}s_{i-3}]\\ &=... \\ &=\alpha\sum_{j=0}^{i}(1-\alpha)^{j}x_{i-j} \end{aligned}si??=αxi?+(1?α)si?1?=αxi?+(1?α)[αxi?1?+(1?α)si?2?]=αxi?+(1?α)[αxi?1?+(1?α)[αxi?2?+(1?α)si?3?]]=α[xi?+(1?α)xi?1?+(1?α)2xi?2?+(1?α)3si?3?]=...=αj=0i?(1?α)jxi?j??

可以看出,在指數(shù)平滑法中,所有先前的觀測(cè)值都對(duì)當(dāng)前的平滑值產(chǎn)生了影響,但它們所起的作用隨著參數(shù) α\alphaα 的冪的增大而逐漸減小。那些相對(duì)較早的觀測(cè)值所起的作用相對(duì)較小。同時(shí),稱α為記憶衰減因子可能更合適——因?yàn)棣恋闹翟酱?#xff0c;模型對(duì)歷史數(shù)據(jù)“遺忘”的就越快。從某種程度來(lái)說(shuō),指數(shù)平滑法就像是擁有無(wú)限記憶(平滑窗口足夠大)且權(quán)值呈指數(shù)級(jí)遞減的移動(dòng)平均法。一次指數(shù)平滑所得的計(jì)算結(jié)果可以在數(shù)據(jù)集及范圍之外進(jìn)行擴(kuò)展,因此也就可以用來(lái)進(jìn)行預(yù)測(cè)。預(yù)測(cè)方式為:

xi+h=six_{i+h}=s_{i}xi+h?=si?

sis_{i}si?是最后一個(gè)已經(jīng)算出來(lái)的值。h等于1代表預(yù)測(cè)的下一個(gè)值。

我們可以通過(guò)statsmodels中的時(shí)間序列模型進(jìn)行指數(shù)平滑建模。官方文檔地址為:
https://www.statsmodels.org/stable/generated/statsmodels.tsa.holtwinters.SimpleExpSmoothing.html
具體代碼如下:

#一次指數(shù)平滑 from statsmodels.tsa.api import SimpleExpSmoothingy_hat_avg = test.copy() fit = SimpleExpSmoothing(np.asarray(train['Count'])).fit(smoothing_level=0.6, optimized=False) y_hat_avg['SES'] = fit.forecast(len(test))

之后同樣進(jìn)行數(shù)據(jù)可視化并查看模型效果

plt.figure(figsize=(16, 8)) plt.plot(train['Count'], label='Train') plt.plot(test['Count'], label='Test') plt.plot(y_hat_avg['SES'], label='SES') plt.legend(loc='best') plt.show()

可視化結(jié)果為:

RMSE結(jié)果為1040

二次指數(shù)平滑

在介紹二次指數(shù)平滑前介紹一下趨勢(shì)的概念。

趨勢(shì),或者說(shuō)斜率的定義很簡(jiǎn)單:b=Δy/Δxb=Δy/Δxb=Δy/Δx,其中ΔxΔxΔx為兩點(diǎn)在x坐標(biāo)軸的變化值,所以對(duì)于一個(gè)序列而言,相鄰兩個(gè)點(diǎn)的Δx=1Δx=1Δx=1,因此b=Δy=y(x)?y(x?1)b=Δy=y(x)-y(x-1)b=Δy=y(x)?y(x?1)。 除了用點(diǎn)的增長(zhǎng)量表示,也可以用二者的比值表示趨勢(shì)。比如可以說(shuō)一個(gè)物品比另一個(gè)貴20塊錢,等價(jià)地也可以說(shuō)貴了5%,前者稱為可加的(addtive),后者稱為可乘的(multiplicative)。在實(shí)際應(yīng)用中,可乘的模型預(yù)測(cè)穩(wěn)定性更佳,但是為了便于理解,我們?cè)谶@以可加的模型為例進(jìn)行推導(dǎo)。
指數(shù)平滑考慮的是數(shù)據(jù)的baseline,二次指數(shù)平滑在此基礎(chǔ)上將趨勢(shì)作為一個(gè)額外考量,保留了趨勢(shì)的詳細(xì)信息。即我們保留并更新兩個(gè)量的狀態(tài):平滑后的信號(hào)和平滑后的趨勢(shì)。公式如下:
基準(zhǔn)等式
si=αxi+(1?α)(si?1+ti?1)s_{i}=\alpha x_{i}+(1-\alpha)(s_{i-1}+t_{i-1})si?=αxi?+(1?α)(si?1?+ti?1?)
趨勢(shì)等式
ti=β(si?si?1)+(1?β)ti?1t_{i}=\beta (s_{i}-s_{i-1})+(1-\beta)t_{i-1}ti?=β(si??si?1?)+(1?β)ti?1?

第二個(gè)等式描述了平滑后的趨勢(shì)。當(dāng)前趨勢(shì)的未平滑“值”( tit_{i}ti? )是當(dāng)前平滑值( sis_{i}si? )和上一個(gè)平滑值(si?1s_{i-1}si?1?)的差;也就是說(shuō),當(dāng)前趨勢(shì)告訴我們?cè)谏弦粋€(gè)時(shí)間步長(zhǎng)里平滑信號(hào)改變了多少。要想使趨勢(shì)平滑,我們用一次指數(shù)平滑法對(duì)趨勢(shì)進(jìn)行處理,并使用參數(shù) β\betaβ (理解:對(duì) tit_{i}ti? 的處理類似于一次平滑指數(shù)法中的 sis_{i}si? ,即對(duì)趨勢(shì)也需要做一個(gè)平滑,臨近的趨勢(shì)權(quán)重大)。

為獲得平滑信號(hào),我們像上次那樣進(jìn)行一次混合,但要同時(shí)考慮到上一個(gè)平滑信號(hào)及趨勢(shì)。假設(shè)單個(gè)步長(zhǎng)時(shí)間內(nèi)保持著上一個(gè)趨勢(shì),那么第一個(gè)等式的最后那項(xiàng)就可以對(duì)當(dāng)前平滑信號(hào)進(jìn)行估計(jì)。

若要利用該計(jì)算結(jié)果進(jìn)行預(yù)測(cè),就取最后那個(gè)平滑值,然后每增加一個(gè)時(shí)間步長(zhǎng)就在該平滑值上增加一次最后那個(gè)平滑趨勢(shì):

xi+h=si+htix_{i+h}=s_{i}+ht_{i}xi+h?=si?+hti?


之后使用二次指數(shù)平滑進(jìn)行預(yù)測(cè):

from statsmodels.tsa.api import Holty_hat_avg = test.copy()fit = Holt(np.asarray(train['Count'])).fit(smoothing_level=0.3, smoothing_slope=0.1) y_hat_avg['Holt_linear'] = fit.forecast(len(test))

結(jié)果如圖:

得到對(duì)應(yīng)的RMSE為1033

三次指數(shù)平滑

在應(yīng)用這種算法前,我們先介紹一個(gè)新術(shù)語(yǔ)。假如有家酒店坐落在半山腰上,夏季的時(shí)候生意很好,顧客很多,但每年其余時(shí)間顧客很少。因此,每年夏季的收入會(huì)遠(yuǎn)高于其它季節(jié),而且每年都是這樣,那么這種重復(fù)現(xiàn)象叫做“季節(jié)性”(Seasonality)。如果數(shù)據(jù)集在一定時(shí)間段內(nèi)的固定區(qū)間內(nèi)呈現(xiàn)相似的模式,那么該數(shù)據(jù)集就具有季節(jié)性。

二次指數(shù)平滑考慮了序列的基數(shù)和趨勢(shì),三次就是在此基礎(chǔ)上增加了一個(gè)季節(jié)分量。類似于趨勢(shì)分量,對(duì)季節(jié)分量也要做指數(shù)平滑。比如預(yù)測(cè)下一個(gè)季節(jié)第3個(gè)點(diǎn)的季節(jié)分量時(shí),需要指數(shù)平滑地考慮當(dāng)前季節(jié)第3個(gè)點(diǎn)的季節(jié)分量、上個(gè)季節(jié)第3個(gè)點(diǎn)的季節(jié)分量…等等。詳細(xì)的有下述公式(累加法):

si=α(xi?pi?k)+(1?α)(si?1+ti?1)ti=β(si?si?1)+(1?β)ti?1pi=γ(xi?si)+(1?γ)pi?k\begin{aligned} s_{i}&=\alpha (x_{i}-p_{i-k})+(1-\alpha)(s_{i-1}+t_{i-1}) \\ t_{i} &=\beta (s_{i}-s_{i-1})+(1-\beta)t_{i-1}\\ p_{i}&=\gamma (x_{i}-s_{i})+(1-\gamma)p_{i-k} \end{aligned} si?ti?pi??=α(xi??pi?k?)+(1?α)(si?1?+ti?1?)=β(si??si?1?)+(1?β)ti?1?=γ(xi??si?)+(1?γ)pi?k??

其中, pip_{i}pi? 是指“周期性”部分。預(yù)測(cè)公式如下:

xi+h=si+hti+pi?k+hx_{i+h}=s_{i}+ht_{i}+p_{i-k+h}xi+h?=si?+hti?+pi?k+h?

k 是這個(gè)周期的長(zhǎng)度。

在使用二次平滑模型與三次平滑模型前,我們可以使用sm.tsa.seasonal_decompose分解時(shí)間序列,可以得到以下分解圖形——從上到下依次是原始數(shù)據(jù)、趨勢(shì)數(shù)據(jù)、周期性數(shù)據(jù)、隨機(jī)變量(殘差值)


根據(jù)分析圖形和數(shù)據(jù)可以確定對(duì)應(yīng)的季節(jié)參數(shù)

具體代碼為:

#三次指數(shù)平滑 from statsmodels.tsa.api import ExponentialSmoothingy_hat_avg = test.copy() fit1 = ExponentialSmoothing(np.asarray(train['Count']), seasonal_periods=7, trend='add', seasonal='add', ).fit() y_hat_avg['Holt_Winter'] = fit1.forecast(len(test))


得到的RMSE為575。我們可以看到趨勢(shì)和季節(jié)性的預(yù)測(cè)準(zhǔn)確度都很高。你可以試著調(diào)整參數(shù)來(lái)優(yōu)化這個(gè)模型。

AR模型

AR(Auto Regressive Model)自回歸模型是線性時(shí)間序列分析模型中最簡(jiǎn)單的模型。通過(guò)自身前面部分的數(shù)據(jù)與后面部分的數(shù)據(jù)之間的相關(guān)關(guān)系(自相關(guān))來(lái)建立回歸方程,從而可以進(jìn)行預(yù)測(cè)或者分析。服從p階的自回歸方程表達(dá)式如下:

xt=?1xt?1+?2xt?2+?+?pxt?p+μtx_{t}=\phi_{1}x_{t-1}+\phi_{2}x_{t-2}+\cdots+\phi_{p}x_{t-p}+\mu_{t}xt?=?1?xt?1?+?2?xt?2?+?+?p?xt?p?+μt?

表示為AR(p)AR(p)AR(p),。其中,μt\mu_{t}μt?表示白噪聲,是時(shí)間序列中的數(shù)值的隨機(jī)波動(dòng),但是這些波動(dòng)會(huì)相互抵消,最終是0。?\phi?表示自回歸系數(shù)。

所以當(dāng)只有一個(gè)時(shí)間記錄點(diǎn)時(shí),稱為一階自回歸過(guò)程,即AR(1)。其表達(dá)式為:
xt=?1xt?1+μtx_{t}=\phi_{1}x_{t-1}+\mu_{t}xt?=?1?xt?1?+μt?

利用Python建立AR模型一般會(huì)用到我們之后會(huì)說(shuō)到的ARIMA模型(AR模型中的p是ARIMA模型中的參數(shù)之一,只要將其他的參數(shù)設(shè)置為0即為AR模型)。您可以先閱讀后續(xù)ARIMA模型的內(nèi)容并參考文件中的代碼查看具體的內(nèi)容

MA模型

MA(Moving Average Model)移動(dòng)平均模型通過(guò)將一段時(shí)間序列中白噪聲(誤差)進(jìn)行加權(quán)和,可以得到移動(dòng)平均方程。如下模型為q階移動(dòng)平均過(guò)程,表示為MA(q)。

xt=μ+μt+θ1μt?1+θ2μt?2+?+θqμt?qx_{t}=\mu+\mu_{t}+\theta_{1}\mu_{t-1}+\theta_{2}\mu_{t-2}+\cdots+\theta_{q}\mu_{t-q}xt?=μ+μt?+θ1?μt?1?+θ2?μt?2?+?+θq?μt?q?

其中xtx_{t}xt?表示t期的值,當(dāng)期的值由前q期的誤差值來(lái)決定,μμμ值是常數(shù)項(xiàng),相當(dāng)于普通回歸中的截距項(xiàng),μt\mu_{t}μt?是當(dāng)期的隨機(jī)誤差。MA模型的核心思想是每一期的隨機(jī)誤差都會(huì)影響當(dāng)期值,把前q期的所有誤差加起來(lái)就是對(duì)t期值的影響。

同樣,利用Python建立MA模型一般會(huì)用到我們之后會(huì)說(shuō)到的ARIMA模型,您可以先閱讀后續(xù)ARIMA模型的內(nèi)容并參考文件中的代碼查看具體的內(nèi)容

ARMA模型

ARMA(Auto Regressive and Moving Average Model)自回歸移動(dòng)平均模型是與自回歸和移動(dòng)平均模型兩部分組成。所以可以表示為ARMA(p, q)。p是自回歸階數(shù),q是移動(dòng)平均階數(shù)。

xt=?1xt?1+?2xt?2+?+?pxt?p+μt+θ1μt?1+θ2μt?2+?+θqμt?qx_{t}=\phi_{1}x_{t-1}+\phi_{2}x_{t-2}+\cdots+\phi_{p}x_{t-p}+\mu_{t}+\theta_{1}\mu_{t-1}+\theta_{2}\mu_{t-2}+\cdots+\theta_{q}\mu_{t-q}xt?=?1?xt?1?+?2?xt?2?+?+?p?xt?p?+μt?+θ1?μt?1?+θ2?μt?2?+?+θq?μt?q?

從式子中就可以看出,自回歸模型結(jié)合了兩個(gè)模型的特點(diǎn),其中,AR可以解決當(dāng)前數(shù)據(jù)與后期數(shù)據(jù)之間的關(guān)系,MA則可以解決隨機(jī)變動(dòng)也就是噪聲的問(wèn)題。

ARIMA模型

ARIMA(Auto Regressive Integrate Moving Average Model)差分自回歸移動(dòng)平均模型是在ARMA模型的基礎(chǔ)上進(jìn)行改造的,ARMA模型是針對(duì)t期值進(jìn)行建模的,而ARIMA是針對(duì)t期與t-d期之間差值進(jìn)行建模,我們把這種不同期之間做差稱為差分,這里的d是幾就是幾階差分。ARIMA模型也是基于平穩(wěn)的時(shí)間序列的或者差分化后是穩(wěn)定的,另外前面的幾種模型都可以看作ARIMA的某種特殊形式。表示為ARIMA(p, d, q)。p為自回歸階數(shù),q為移動(dòng)平均階數(shù),d為時(shí)間成為平穩(wěn)時(shí)所做的差分次數(shù),也就是Integrate單詞的在這里的意思。

具體步驟如下:

xt=?1wt?1+?2wt?2+?+?pwt?p+μt+θ1μt?1+θ2μt?2+?+θqμt?qx_{t}=\phi_{1}w_{t-1}+\phi_{2}w_{t-2}+\cdots+\phi_{p}w_{t-p}+\mu_{t}+\theta_{1}\mu_{t-1}+\theta_{2}\mu_{t-2}+\cdots+\theta_{q}\mu_{t-q}xt?=?1?wt?1?+?2?wt?2?+?+?p?wt?p?+μt?+θ1?μt?1?+θ2?μt?2?+?+θq?μt?q?

上面公式中的wtw_{t}wt?表示t期經(jīng)過(guò)d階差分以后的結(jié)果。我們可以看到ARIMA模型的形式基本與ARMA的形式是一致的,只不過(guò)把XXX換成了www

使用ARIMA進(jìn)行預(yù)測(cè)代碼如下:

from statsmodels.tsa.arima_model import ARIMAts_ARIMA= train['Count'].astype(float) fit1 = ARIMA(ts_ARIMA, order=(7, 1, 4)).fit() y_hat_ARIMA = fit1.predict(start="2013-11-1", end="2013-12-31", dynamic=True)

并畫出預(yù)測(cè)值與實(shí)際值圖形:

plt.figure(figsize=(16, 8)) plt.plot(train['Count'], label='Train') plt.plot(test['Count'], label='Test') plt.plot(y_hat_ARIMA, label='ARIMA') plt.legend(loc='best') plt.show()


并計(jì)算RMSE:

from sklearn.metrics import mean_squared_error from math import sqrtrmse = sqrt(mean_squared_error(test['Count'],y_hat_ARIMA.to_frame())) print(rmse)

得到對(duì)應(yīng)的RMSE為3723

SARIMA模型

SARIMA季節(jié)性自回歸移動(dòng)平均模型模型在ARIMA模型的基礎(chǔ)上添加了季節(jié)性的影響,結(jié)構(gòu)參數(shù)有七個(gè):SARIMA(p,d,q)(P,D,Q,s)
其中p,d,q分別為之前ARIMA模型中我們所說(shuō)的p:趨勢(shì)的自回歸階數(shù)。d:趨勢(shì)差分階數(shù)。q:趨勢(shì)的移動(dòng)平均階數(shù)。
P:季節(jié)性自回歸階數(shù)。
D:季節(jié)性差分階數(shù)。
Q:季節(jié)性移動(dòng)平均階數(shù)。
s:單個(gè)季節(jié)性周期的時(shí)間步長(zhǎng)數(shù)。

import statsmodels.api as sm y_hat_avg = test.copy() fit1 = sm.tsa.statespace.SARIMAX(train.Count, order=(2, 1, 4), seasonal_order=(0, 1, 1, 7)).fit() y_hat_avg['SARIMA'] = fit1.predict(start="2013-11-1", end="2013-12-31", dynamic=True)

得到實(shí)際值與預(yù)測(cè)值如下:

plt.figure(figsize=(16, 8)) plt.plot(train['Count'], label='Train') plt.plot(test['Count'], label='Test') plt.plot(y_hat_avg['SARIMA'], label='SARIMA') plt.legend(loc='best') plt.show()


并計(jì)算RMSE:

from sklearn.metrics import mean_squared_error from math import sqrt rmse = sqrt(mean_squared_error(test['Count'], y_hat_avg['SARIMA'])) print(rmse)

結(jié)果為933

其他時(shí)間序列預(yù)測(cè)的模型還有SARIMAX模型(在ARIMA模型上加了季節(jié)性的因素),Prophet模型,ARCH模型,LSTM神經(jīng)網(wǎng)絡(luò)模型等。限于篇幅,感興趣的同學(xué)可以自行查看相關(guān)模型資料

在后續(xù)的文章中我們將講解如何確定數(shù)據(jù)的平穩(wěn)性與數(shù)據(jù)預(yù)處理,為后續(xù)時(shí)間序列的建模做準(zhǔn)備

參考文章:
https://www.analyticsvidhya.com/blog/2018/02/time-series-forecasting-methods/
https://blog.csdn.net/anshuai_aw1/article/details/82499095

相關(guān)代碼與數(shù)據(jù)可關(guān)注公眾號(hào)并回復(fù):時(shí)間序列獲取

總結(jié)

以上是生活随笔為你收集整理的时间序列(一):时间序列数据与时间序列预测模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。