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