您好,登錄后才能下訂單哦!
預(yù)測(cè)未來永遠(yuǎn)是一件讓人興奮而又神奇的事。為此,人們研究了許多時(shí)間序列預(yù)測(cè)模型。然而,大部分的時(shí)間序列模型都因?yàn)轭A(yù)測(cè)的問題過于復(fù)雜而效果不理想。這是因?yàn)闀r(shí)間序列預(yù)測(cè)不光需要大量的統(tǒng)計(jì)知識(shí),更重要的是它需要將問題的背景知識(shí)融入其中。為此,Prophet充分的將兩者融合了起來,提供了一種更簡(jiǎn)單、靈活的預(yù)測(cè)方式,并且在預(yù)測(cè)準(zhǔn)確率上達(dá)到了與專業(yè)分析師相媲美的程度。如果你還在為時(shí)間序列預(yù)測(cè)而苦惱,那就一起走進(jìn)興奮而又神奇的Prophet世界吧。
前言
時(shí)間序列預(yù)測(cè)一直是預(yù)測(cè)問題中的難點(diǎn),人們很難找到一個(gè)適用場(chǎng)景豐富的通用模型,這是因?yàn)楝F(xiàn)實(shí)中每個(gè)預(yù)測(cè)問題的背景知識(shí),例如數(shù)據(jù)的產(chǎn)生過程,往往是不同的,即使是同一類問題,影響這些預(yù)測(cè)值的因素與程度也往往不同,再加上預(yù)測(cè)問題往往需要大量專業(yè)的統(tǒng)計(jì)知識(shí),這又給分析人員帶來了難度,這些都使得時(shí)間序列預(yù)測(cè)問題變得尤其復(fù)雜。
傳統(tǒng)的時(shí)間序列預(yù)測(cè)方法,例如ARIMA(autoregressive integrated moving average)模型,在R與Python中都有實(shí)現(xiàn)。雖然這些傳統(tǒng)方法已經(jīng)用在很多場(chǎng)景中了,但它們通常有如下缺陷:
a.適用的時(shí)序數(shù)據(jù)過于局限
例如最通用的ARIMA模型,其要求時(shí)序數(shù)據(jù)是穩(wěn)定的,或者通過差分化后是穩(wěn)定的,且在差分運(yùn)算時(shí)提取的是固定周期的信息。這往往很難符合現(xiàn)實(shí)數(shù)據(jù)的情況。
b.缺失值需要填補(bǔ)
對(duì)于數(shù)據(jù)中存在缺失值的情況,傳統(tǒng)的方法都需要先進(jìn)行缺失值填補(bǔ),這很大程度上損害了數(shù)據(jù)的可靠性。
c.模型缺乏靈活性
傳統(tǒng)模型僅在于構(gòu)建數(shù)據(jù)中的臨時(shí)依賴關(guān)系,這種模型過于不夠靈活,很難讓使用者引入問題的背景知識(shí),或者一些有用的假設(shè)。
d.指導(dǎo)作用較弱
當(dāng)前,雖然R與Python中實(shí)現(xiàn)了這些方法并提供了可視化效果,降低了模型的使用門檻。但由于模型本身的原因,這些展現(xiàn)的結(jié)果也很難讓使用者更清楚地分析影響預(yù)測(cè)準(zhǔn)確率的潛在原因。
總之,傳統(tǒng)的時(shí)間序列預(yù)測(cè)在模型的準(zhǔn)確率以及與使用者之間的互動(dòng)上很難達(dá)到理想的融合。
近期,facebook發(fā)布了prophet(“先知”)項(xiàng)目,它以更簡(jiǎn)單、靈活的預(yù)測(cè)方式以及能夠獲得與經(jīng)驗(yàn)豐富的分析師相媲美的預(yù)測(cè)結(jié)果引起了人們的廣泛關(guān)注。下面我們介紹一下Prophet。
Prophet介紹
上圖是prophet的整體框架,整個(gè)過程分為四部分:Modeling、Forecast Evaluation、Surface Problems以及Visually Inspect Forecasts。從整體上看,這是一個(gè)循環(huán)結(jié)構(gòu),而這個(gè)結(jié)構(gòu)又可以根據(jù)虛線分為分析師操縱部分與自動(dòng)化部分,因此,整個(gè)過程就是分析師與自動(dòng)化過程相結(jié)合的循環(huán)體系,也是一種將問題背景知識(shí)與統(tǒng)計(jì)分析融合起來的過程,這種結(jié)合大大的增加了模型的適用范圍,提高了模型的準(zhǔn)確性。按照上述的四個(gè)部分,prophet的預(yù)測(cè)過程為:
a.Modeling:建立時(shí)間序列模型。分析師根據(jù)預(yù)測(cè)問題的背景選擇一個(gè)合適的模型。
b.Forecast Evaluation:模型評(píng)估。根據(jù)模型對(duì)歷史數(shù)據(jù)進(jìn)行仿真,在模型的參數(shù)不確定的情況下,我們可以進(jìn)行多種嘗試,并根據(jù)對(duì)應(yīng)的仿真效果評(píng)估哪種模型更適合。
c.Surface Problems:呈現(xiàn)問題。如果嘗試了多種參數(shù)后,模型的整體表現(xiàn)依然不理想,這個(gè)時(shí)候可以將誤差較大的潛在原因呈現(xiàn)給分析師。
d.Visually Inspect Forecasts:以可視化的方式反饋整個(gè)預(yù)測(cè)結(jié)果。當(dāng)問題反饋給分析師后,分析師考慮是否進(jìn)一步調(diào)整和構(gòu)建模型。
a.有至少幾個(gè)月(最好是一年)的每小時(shí)、每天或每周觀察的歷史數(shù)據(jù);
b.有多種人類規(guī)模級(jí)別的較強(qiáng)的季節(jié)性趨勢(shì):每周的一些天和每年的一些時(shí)間;
c.有事先知道的以不定期的間隔發(fā)生的重要節(jié)假日(比如國(guó)慶節(jié));
d.缺失的歷史數(shù)據(jù)或較大的異常數(shù)據(jù)的數(shù)量在合理范圍內(nèi);
e.有歷史趨勢(shì)的變化(比如因?yàn)楫a(chǎn)品發(fā)布);
f.對(duì)于數(shù)據(jù)中蘊(yùn)含的非線性增長(zhǎng)的趨勢(shì)都有一個(gè)自然極限或飽和狀態(tài)。
模型(1)整體由三部分組成:growth(增長(zhǎng)趨勢(shì))、seasonality(季節(jié)趨勢(shì))以及holidays(節(jié)假日對(duì)預(yù)測(cè)值的影響)。其中g(shù)(t)表示增長(zhǎng)函數(shù),用來擬合時(shí)間序列中預(yù)測(cè)值的非周期性變化;s(t)用來表示周期性變化,比如說每周,每年中的季節(jié)等;h(t)表示時(shí)間序列中那些潛在的具有非固定周期的節(jié)假日對(duì)預(yù)測(cè)值造成的影響。最后為噪聲項(xiàng),表示模型未預(yù)測(cè)到的波動(dòng),這里假設(shè)是高斯分布的。
可以看出這是一種類似generalized additive model(GAM)的模型,不同于以往的時(shí)間序列預(yù)測(cè)模型(例如ARIMA),上述的模型將預(yù)測(cè)問題視作曲線擬合問題。這樣做具有很多實(shí)踐價(jià)值:
a.靈活度高,許多具有不同周期以及不同假設(shè)的季節(jié)性趨勢(shì)能很容易的被引入;
b.時(shí)間序列中無需有一個(gè)固定的周期,也不需要在擬合前對(duì)缺失值進(jìn)行填補(bǔ),這是傳統(tǒng)的(例如ARIMA)模型所辦不到的;
c.擬合非???,允許分析師交互式的探索模型的效果;
d.模型中參數(shù)的解釋性很強(qiáng),可以讓分析師根據(jù)啟發(fā)來增強(qiáng)某部分假設(shè)。
下面分別介紹模型中各部分的構(gòu)建。
1.Non-linear growth
非線性增長(zhǎng)的公式采用了邏輯回歸的模型:
這里,C是承載量,它限定了所能增長(zhǎng)的最大值,k表示增長(zhǎng)率,b為偏移量。
當(dāng)然,實(shí)際的增長(zhǎng)模型遠(yuǎn)沒有這么簡(jiǎn)單,Prophet主要考慮了兩個(gè)現(xiàn)實(shí)問題:
(1)C值并不一定是常數(shù);(2)增長(zhǎng)率也不一定是一沉不變的。對(duì)于(1),將C構(gòu)建成隨時(shí)間變化的函數(shù):C(t) = K 或者 C(t) = Mt + K。下面詳細(xì)論述。
(2)的解決:首先模型定義了增長(zhǎng)率k發(fā)生變化時(shí)對(duì)應(yīng)的點(diǎn),我們將其稱作changepoints,用表示,這些點(diǎn)對(duì)應(yīng)的斜率調(diào)整值用表示,所有的斜率調(diào)整值形成一個(gè)向量。此時(shí),每個(gè)changepoint點(diǎn)對(duì)應(yīng)的增長(zhǎng)率就變?yōu)?/span>。如果有如下定義:
則t時(shí)刻的增長(zhǎng)率就可以表示為:
當(dāng)增長(zhǎng)率k調(diào)整后,每個(gè)changepoint點(diǎn)對(duì)應(yīng)的偏移量b也應(yīng)該相應(yīng)調(diào)整以連接每個(gè)分段的最后一個(gè)時(shí)間點(diǎn),表達(dá)式如下:
綜上,結(jié)合(1)和(2),最終的分段式邏輯回歸增長(zhǎng)模型為:
2.Linear growth
如果認(rèn)為時(shí)間序列的整體增長(zhǎng)趨勢(shì)是線性的,那么就可以采用線性模型:
這里的參數(shù)定義與非線性增長(zhǎng)一樣,唯一不同的是每個(gè)changepoint對(duì)應(yīng)的
結(jié)合上述兩種增長(zhǎng)模型,我們可以看到,對(duì)于增長(zhǎng)趨勢(shì)的預(yù)測(cè),最重要的就是對(duì)這些changepoint的指定。使用時(shí),既可以手動(dòng)指定這些changepoint,也可以根據(jù)公式(3)和(4)自動(dòng)識(shí)別。此時(shí),認(rèn)為
其中控制著模型整體的平滑程度。
由于時(shí)間序列中有可能包含多種周期類型的季節(jié)性趨勢(shì),因此,傅里葉級(jí)數(shù)可以用來近似表達(dá)這個(gè)周期屬性,公式如下:
其中,P表示某個(gè)固定的周期(例如用”天”做單位統(tǒng)計(jì)的數(shù)據(jù)中,年數(shù)據(jù)的P = 365.25,周數(shù)據(jù)的P = 7)。2N表示我們希望在模型中使用的這種周期的個(gè)數(shù),較大的N值可以擬合出更復(fù)雜的季節(jié)性函數(shù),然而也會(huì)帶來更多的過擬合問題。按照經(jīng)驗(yàn)值,年周期的N取10,周周期的N取3。
當(dāng)將s(t)中的所有季節(jié)性時(shí)間序列模型組合成一個(gè)向量X(t),那么最終的季節(jié)性模型為:
其中,,以此提高季節(jié)性模型的平滑性。
很多實(shí)際經(jīng)驗(yàn)告訴我們,節(jié)假日或者是一些大事件都會(huì)對(duì)時(shí)間序列造成很大影響,而且這些時(shí)間點(diǎn)往往不存在周期性。對(duì)這些點(diǎn)的分析是極其必要的,甚至有時(shí)候它的重要度遠(yuǎn)遠(yuǎn)超過了平常點(diǎn)。
鑒于每個(gè)節(jié)假日(或者某個(gè)已知的大事件)的日期與影響程度存在差異,節(jié)假日模型將不同節(jié)假日在不同時(shí)間點(diǎn)下的影響視作獨(dú)立的模型。同時(shí)為每個(gè)模型設(shè)置了時(shí)間窗口,這主要是考慮到節(jié)假日的影響有窗口期(例如中秋節(jié)的前幾天與后幾天),模型將同一個(gè)窗口期中的影響設(shè)置為相同的值。例如,i表示節(jié)假日表示窗口期中包含的時(shí)間t,則節(jié)假日模型h(t)可表示為:
其中,表示窗口期中的節(jié)假日對(duì)預(yù)測(cè)值的影響。同季節(jié)性趨勢(shì)的模型,這里可以定義:
那么
其中
Prophet的使用
下面是這個(gè)模塊的參數(shù)解釋,使用者可充分利用這些參數(shù)調(diào)整模型:
a.增長(zhǎng)趨勢(shì)的模型參數(shù)
growth:增長(zhǎng)趨勢(shì)模型。整個(gè)預(yù)測(cè)模型的核心組件,分為兩種:”linear”與”logistic”,分別代表線性與非線性的增長(zhǎng),默認(rèn)值:”linear”。
cap:承載量。非線性增長(zhǎng)趨勢(shì)中限定的最大值,預(yù)測(cè)值將在該點(diǎn)達(dá)到飽和。當(dāng)選擇非線性增長(zhǎng)時(shí),該項(xiàng)值必須給出。
changepoints(growth模型中的):改變點(diǎn)。使用者可以自主填寫已知時(shí)刻的標(biāo)示著增長(zhǎng)率發(fā)生改變的”改變點(diǎn)”,如果不填則系統(tǒng)自動(dòng)識(shí)別。默認(rèn)值:“None”。
n_changepoints:用戶指定潛在的”changepoint”的個(gè)數(shù),默認(rèn)值:25。
changepoint_prior_scale(growth模型中的):增長(zhǎng)趨勢(shì)模型的靈活度。調(diào)節(jié)”changepoint”選擇的靈活度,值越大,選擇的”changepoint”越多,從而使模型對(duì)歷史數(shù)據(jù)的擬合程度變強(qiáng),然而也增加了過擬合的風(fēng)險(xiǎn)。默認(rèn)值:0.05。
b.季節(jié)趨勢(shì)的模型參數(shù)
seasonality_prior_scale(seasonality模型中的):調(diào)節(jié)季節(jié)性組件的強(qiáng)度。值越大,模型將適應(yīng)更強(qiáng)的季節(jié)性波動(dòng),值越小,越抑制季節(jié)性波動(dòng),默認(rèn)值:10.0。
c.節(jié)假日的模型參數(shù)
holidays_prior_scale(holidays模型中的):調(diào)節(jié)節(jié)假日模型組件的強(qiáng)度。值越大,該節(jié)假日對(duì)模型的影響越大,值越小,節(jié)假日的影響越小,默認(rèn)值:10.0。
holidays:節(jié)假日的定義,設(shè)置節(jié)假日的json格式的配置文件,例如:
其中”holiday”表示某類節(jié)假日的名稱,”ds”指定具體的節(jié)假日期,”lower_window”表示該節(jié)假日包括指定日期之前的多少天,”upper_window”表示該節(jié)假日包括指定日期之后的多少天,上述四個(gè)參數(shù)均需要配置。
d.預(yù)測(cè)中需要的其他參數(shù)
freq:數(shù)據(jù)中時(shí)間的統(tǒng)計(jì)單位(頻率),默認(rèn)為”D”,按天統(tǒng)計(jì),具體可參考這里。
periods:需要預(yù)測(cè)的未來時(shí)間的個(gè)數(shù)。例如按天統(tǒng)計(jì)的數(shù)據(jù),想要預(yù)測(cè)未來一年時(shí)間內(nèi)的情況,則需填寫365。
mcmc_samples:mcmc采樣,用于獲得預(yù)測(cè)未來的不確定性。若大于0,將做mcmc樣本的全貝葉斯推理,如果為0,將做最大后驗(yàn)估計(jì),默認(rèn)值:0。
interval_width:衡量未來時(shí)間內(nèi)趨勢(shì)改變的程度。表示預(yù)測(cè)未來時(shí)使用的趨勢(shì)間隔出現(xiàn)的頻率和幅度與歷史數(shù)據(jù)的相似度,值越大越相似,默認(rèn)值:0.80。當(dāng)mcmc_samples = 0時(shí),該參數(shù)僅用于增長(zhǎng)趨勢(shì)模型的改變程度,當(dāng)mcmc_samples > 0時(shí),該參數(shù)也包括了季節(jié)性趨勢(shì)改變的程度。
uncertainty_samples:用于估計(jì)未來時(shí)間的增長(zhǎng)趨勢(shì)間隔的仿真繪制數(shù),默認(rèn)值:1000。
完成以上的配置后,接下來就可以直接運(yùn)行模型并獲得結(jié)果了。
整體預(yù)測(cè)情況是我們衡量模型整體預(yù)測(cè)效果的一個(gè)最直接的方式,它是我們?cè)u(píng)估當(dāng)前模型的預(yù)測(cè)水平的重要來源。同時(shí)可視化的展示可以幫助我們有效分析預(yù)測(cè)結(jié)果中各個(gè)時(shí)間階段的預(yù)測(cè)效果。
上圖是一個(gè)整體的預(yù)測(cè)結(jié)果圖,它包含了從歷史數(shù)據(jù)的時(shí)間起點(diǎn)到期望預(yù)測(cè)的未來時(shí)間終點(diǎn)的結(jié)果。圖中的ds坐標(biāo)表示時(shí)間,y坐標(biāo)對(duì)應(yīng)預(yù)測(cè)值。圖中的黑點(diǎn)表示已知的歷史數(shù)據(jù),由圖上我們很容易發(fā)現(xiàn)數(shù)據(jù)中的異常點(diǎn),藍(lán)色曲線表示模型的預(yù)測(cè)值。仔細(xì)查看藍(lán)色曲線,我們可以發(fā)現(xiàn),曲線輪廓的上下邊界有淺藍(lán)色區(qū)域,它表示模型預(yù)測(cè)值的上、下邊界。在評(píng)估結(jié)果時(shí),我們將藍(lán)色曲線的預(yù)測(cè)值視作主預(yù)測(cè)值,上、下邊界的預(yù)測(cè)值作為參考。除此之外,淺藍(lán)色區(qū)域還可以很好的用于模型評(píng)估,例如對(duì)于下面這個(gè)圖:
在2016年之后的模型預(yù)測(cè)部分,淺藍(lán)色區(qū)域就過于寬泛,模型預(yù)測(cè)的上、下邊界被逐漸放大很多倍。這說明模型的平滑性過大,導(dǎo)致異常點(diǎn)對(duì)結(jié)果造成了很大影響。因此,該模型不夠合理,需要使用者重新設(shè)置參數(shù)或者對(duì)歷史數(shù)據(jù)中的異常點(diǎn)進(jìn)行預(yù)處理。
上述圖是growth選擇”linear”時(shí)的結(jié)果,如果認(rèn)為時(shí)間序列呈非線性增長(zhǎng)趨勢(shì),我們用如下的圖例來說明:
體上與線性增長(zhǎng)的結(jié)果表達(dá)沒有太大差異,唯一需要注意的是,上圖中的水平虛線表示了非線性增長(zhǎng)趨勢(shì)的承載量cap,預(yù)測(cè)結(jié)果將在該虛線處達(dá)到飽和。
除了上述的整體預(yù)測(cè)情況外,Prophet還提供了組成成分分析(簡(jiǎn)稱成分分析),所謂成分分析就是指對(duì)公式(1)中的三大部分模型單獨(dú)進(jìn)行分析,成分分析有助于我們考察模型中的各個(gè)組件分別對(duì)預(yù)測(cè)結(jié)果的影響,通過可視化的展示,我們可以準(zhǔn)確判斷影響預(yù)測(cè)效果的具體原因,從而針對(duì)性的解決。成分分析是我們提高模型準(zhǔn)確性的重要來源。例如下圖結(jié)果:
上述四個(gè)圖從上至下依次是對(duì)增長(zhǎng)趨勢(shì)模型(trend)、節(jié)假日模型(holidays)以及季節(jié)性模型(weekly和yearly)的展示。需要注意的是,如果沒有在holidays參數(shù)里注明具體的節(jié)假日信息,模塊也不會(huì)自動(dòng)對(duì)這一部分進(jìn)行分析。如果對(duì)于上面的結(jié)果你覺得有不合理的地方,那么可以根據(jù)2.1中參數(shù)使用說明更改相應(yīng)的成分影響,這里應(yīng)該盡可能的利用你的專業(yè)背景知識(shí),以使各部分組成的影響更符合實(shí)際。舉個(gè)例子,如果在每年趨勢(shì)”yearly”中你認(rèn)為當(dāng)前的效果過擬合了,那么就可以調(diào)解seasonality_prior_scale這個(gè)參數(shù),值越小,這里的季節(jié)性波動(dòng)就越小。
對(duì)于上面的可視化分析,這里總結(jié)幾點(diǎn)建議,方便大家定位預(yù)測(cè)中的問題:
a.如果預(yù)測(cè)結(jié)果的誤差很大,考慮選取的模型是否準(zhǔn)確,嘗試調(diào)整增長(zhǎng)率模型(growth)的參數(shù),在必要的情況下也需要調(diào)整季節(jié)性(seasonality)參數(shù)。
b.如果在嘗試的大多數(shù)方法中,某些日期的預(yù)測(cè)依然存在很大的誤差,這就說明歷史數(shù)據(jù)中存在異常值。最好的辦法就是找到這些異常值并剔除掉。使用者無需像其他方法那樣對(duì)剔除的數(shù)據(jù)進(jìn)行插值擬合,可以僅保留異常值對(duì)應(yīng)的時(shí)間, 并將異常值修改為空值(NA),模型在預(yù)測(cè)時(shí)依然可以給出這個(gè)時(shí)間點(diǎn)對(duì)應(yīng)的預(yù)測(cè)結(jié)果。
c.如果對(duì)歷史數(shù)據(jù)進(jìn)行仿真預(yù)測(cè)時(shí)發(fā)現(xiàn),從一個(gè)截點(diǎn)到下一個(gè)截點(diǎn)誤差急劇的增加,這說明在兩個(gè)截點(diǎn)期間數(shù)據(jù)的產(chǎn)生過程發(fā)生了較大的變化,此時(shí)兩個(gè)截點(diǎn)之間應(yīng)該增加一個(gè)”changepoint”,來對(duì)這期間的不同階段分別建模。
Sean J. Taylor and Benjamin Letham.Forecasting at Scale.https://research.fb.com/prophet-forecasting-at-scale
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。