fbprophet論文翻譯:Forecasting at Scale

prophet論文翻譯:Forecasting at Scale

     爲啥要做這一篇翻譯,因爲在實際工作中用到了fbprophet,其次,prophet模型與我之間接觸到的X13建模框架非常相似,差異在於具體的各成分的估計方法,比較好奇它如何估計出各個成分的;最後,prophet模型與我之前寫過的一篇預測文章中都用到了皮爾增長曲線,且都對增長率進行了擴展,想看下他們的拓展方法。
論文下載地址: https://pan.baidu.com/s/11l0I0nTZWZSQX2usWCtDDg,提取碼:ubo7

1 Introduction

     提供瞭如下圖所示的建立預測模型的架構:
在這裏插入圖片描述

     上圖是prophet的整體框架,整個過程分爲四部分:Modeling、Forecast Evaluation、Surface Problems以及Visually Inspect Forecasts。從整體上看,這是一個循環結構,而這個結構又可以根據虛線分爲分析師操縱部分與自動化部分,因此,整個過程就是分析師與自動化過程相結合的循環體系,也是一種將問題背景知識與統計分析融合起來的過程,這種結合大大的增加了模型的適用範圍,提高了模型的準確性。按照上述的四個部分,prophet的預測過程爲:

  • Modeling:建立時間序列模型。分析師根據預測問題的背景選擇一個合適的模型。
  • Forecast Evaluation:模型評估。根據模型對歷史數據進行仿真,在模型的參數不確定的情況下,我們可以進行多種嘗試,並根據對應的仿真效果評估哪種模型更適合。
  • Surface Problems:呈現問題。如果嘗試了多種參數後,模型的整體表現依然不理想,這個時候可以將誤差較大的潛在原因呈現給分析師。
  • Visually Inspect Forecasts:以可視化的方式反饋整個預測結果。當問題反饋給分析師後,分析師考慮是否進一步調整和構建模型。

2 Features of Business Time Series

  • 受節假日的影響;
  • 具有一定的週期性,比如週末效應和季節效應;
  • 時間序列的趨勢增長率非固定。

3 The Prophet Forecasting Model

     本段不想詳細翻譯了,簡單概況一下:根據上述分析的時間序列特徵,作者採用(Harvey & Peters 1990)中對時間序列的處理,即假設時間序列可以分解爲趨勢、循環和節假日以及隨機干擾,其中趨勢、循環成分和節假日都假設爲時間的函數:
y(t)=g(t)+s(t)+h(t)+ϵty(t)=g(t)+s(t)+h(t)+\epsilon_t
其中:g(t)g(t)表示趨勢成分,s(t)s(t)表示季節/週末等循環成分,h(t)h(t)表示節假日等事件成分,這部分類似於週期成分但又不同,比如春節,春節的話雖然一年一次,但是出現的陽曆日期每一年是不一樣的,所以其週期並不固定;
譯者注:時間序列的這種分解方法比較古老了,估計各成分的方法也有很多種,比如X13中用線性濾波器以及迭代法來估計趨勢循環成分,再比如可以用卡爾曼濾波來估計時間序列的各個成分,還有一種時間序列的分解方法是經驗模態分解法(EMD),EMD分解出來的時間序列與上述的模型假設不同,其分解出來的各個成分沒有物理意義,且分解幾部分也是不確定的。

3.1 The Trend Model

     提供了兩種趨勢建模:一種是假設趨勢與時間是非線性關係,這裏假設趨勢皮爾生長曲線,另一種是假設趨勢與時間是線性關係。

3.1.1 Nonlinear, Saturating Growth

     假設趨勢與時間是非線性關係,具體方程如下:
y(t)=C(t)1+exp(k(tm))y(t)=\frac{C(t)}{1+exp(-k(t-m))}
     其中,C是承載力,表示y(t)y(t)能達到最大或最小的值,kk是增長率,mm是其他參數,用於曲線的左右平移。但是真實的數據往往是kk不是一個確定性的常數,而是一個隨着時間變化的量,這裏作者把kk擴展成了一個分段階梯函數;後面的內容都是按文章翻譯的:
     通過定義允許增長率變化的變化點,我們將趨勢變化納入了增長模型;假設增長率在時刻sj,j=1,...,Ss_j,j=1,...,S,有SS個變化點,定義一個增長率調整向量δRS\vec{\delta} \in R^S,其中δj\delta_j是時刻sjs_j的增長率變化量,將所有時期的變化量加上期初的增量量,就得到tt時刻的增長率:k+j:t>sjδjk+\displaystyle {\sum_{j:t>s_j}{\delta_j}}(譯者注:j:t>sj\displaystyle {\sum_{j:t>s_j}}表示遍歷jj的取值範圍,然後找出滿足條件:t>Sjt>S_jjj,然後再按照這個index取出δj\delta_j做加法彙總,所以這麼理解的話,這裏文章應該有誤,即選取jj的條件:t>Sjt>S_j應該包含等號,才能跟下文向量的表述結果一致,因此,這裏將kk修正的表達式更改爲:k+j:tsjδjk+\displaystyle {\sum_{j:t \ge s_j}{\delta_j}}).這可以通過定義一個向量a(t){0,1}S\vec{a}(t)\in\{0,1\}^S,其中:

aj(t)={1tSj0t<Sja_j(t)=\begin{cases} 1\qquad & t \ge S_j \\ 0 \qquad & t \lt S_j \end{cases}
     則第tt期調整後的增長率計算公式如下( 注意:文章中的向量均是指列向量):
kt=k+atδk_t=k+\overrightarrow {a_t}'·\overrightarrow{\delta}

     舉例說明:假設給定的時間序列長度爲10,其中在第5(S1=5S_1=5)和第7(S2=7S_2=7)時刻出現增長率的結構突變,那麼每一時刻的增長率計算如下:

t tS1t\ge S_1 a1(t)a_1(t) tS2t \ge S_2 a2(t)a_2(t)
1 False 0 False 0
2 False 0 False 0
3 False 0 False 0
4 False 0 False 0
5 True 1 False 0
6 True 1 False 0
7 True 1 True 1
8 True 1 True 1
9 True 1 True 1
10 True 1 True 1

t=it=i時,增長率rir_i爲:
ri=k+a1(i)δ1+a2δ2=a(i)δr_i=k+a_1(i)·\delta_1+a_2·\delta_2=\vec{{a(i)}}'·\vec{\delta}
其中:
a(i)=(a1(i)a2(i)),δ=(δ1δ2)\vec{{a(i)}}= \begin{pmatrix} a_1(i) \\ a_2(i) \end{pmatrix},\vec{\delta}=\begin{pmatrix} \delta_1 \\ \delta_2 \end{pmatrix}
i=5i=5時:
r5=k+a1(5)δ1+a2(5)δ5=k+1δ1+0δ2=k+δ1r_5=k+a_1(5)*\delta_1+a_2(5)*\delta_5=k+1·\delta_1+0·\delta_2=k+\delta_1

    因爲對曲線修正了增長率,可能破壞了曲線的連續可微性,由於改變增長率,可微性被破壞了,因此,這裏需要調整下曲線,使得曲線仍然保持可微的性質,爲什麼要這麼做呢,因爲作者最後解決參數的方法是利用數值法 ,即對似然函數進行求導,所以,這裏無論怎麼變形,都要得到一個連續可導的函數,下面是文章中給出的修正因子:
γj=(sjml<jγl)(1k+l<jδlk+ljδl)\gamma_j=(s_j-m-\sum_{l<j}{\gamma_l})(1-\frac{k+\sum_{l<j}{\delta_l}}{k+\sum_{l\le j}{\delta_l}})
    最後,分段邏輯增長函數可以寫爲:
g(t)=C(t)1+exp((k+atδ))(t(m+atγ))(3)g(t)=\frac{C(t)}{1+exp(-(k+\overrightarrow {a_t}'·\overrightarrow{\delta}))·(t-(m+\overrightarrow {a_t}'·\overrightarrow{\gamma}))} \tag{3}
    模型的另一組重要的參數是C(t)C(t),C(t)C(t)表示在時刻tt的模型承載力,也就是增長曲線的極大值。分析師通常對市場可達到的最大值有一定的瞭解,可以設定不同時期的承載力。 也可以根據其他數據來推斷承載能力,例如世界銀行的人口預測。
    這裏介紹的邏輯增長模型是廣義邏輯增長的一個特例,它只是S型曲線的一種。 將此趨勢模型擴展到其他曲線族也很簡單。

3.1.2 Linear Trend with Changepoints

    爲了預測不會出現飽和增長的問題,分段的恆定增長率模型提供了一個簡化且常用的模型。 這裏的趨勢模型可以寫爲:
g(t)=(k+atδ)t+(m+atγ)(4)g(t)=(k+\overrightarrow {a_t}'·\overrightarrow{\delta})·t+(m+\overrightarrow {a_t}'·\overrightarrow{\gamma}) \tag{4}
    其中kk是增長率,δ\overrightarrow{\delta}是增長率調整量,γj=Sjδj\gamma_j=-S_j·\delta_jγ\overrightarrow{\gamma}的作用也是爲了曲線更平滑;
    下面給出一個例子:已知時間序列長度爲10,其中在t=5t=5t=7t=7處產生了結構突變,增長率分別增加了0.3和0.45,即S1=5,S2=7,δ=[0.3,0.45]S_1=5,S_2=7,\overrightarrow {\delta}=[0.3,0.45]',增長率kk的初始值爲0.5,截距mm的初始值爲0.02,求γ\overrightarrow {\gamma}、未修正的g(t)g(t)和修正後的g(t)g(t).
γ=[S1,S2].δ=[5,7].[0.3,0.45]=[1.5,3.15]\overrightarrow{\gamma}=[-S_1,-S_2].*\overrightarrow {\delta}=-[5,7]'.*[0.3,0.45]'=[-1.5,-3.15]';
not_adjust_g(t)=(k+atδ)t+mnot\_adjust\_g(t)=(k+ \overrightarrow {a_t}'·\overrightarrow{\delta})·t+m
adjust_g(t)adjust\_g(t)按(4)式計算,則計算結果如下表所示:

t a1(t)a_1(t) a2(t)a_2(t) atδ\overrightarrow {a_t}'·\overrightarrow{\delta} atγ\overrightarrow {a_t}'·\overrightarrow{\gamma} not_adjust_g(t)not\_adjust\_g(t) adjust_g(t)adjust\_g(t)
1 0 0 0 0 0.52 0.52
2 0 0 0 0 1.02 1.02
3 0 0 0 0 1.52 1.52
4 0 0 0 0 2.02 2.02
5 1 0 0.3 -1.5 4.02 2.52
6 1 0 0.3 -1.5 4.82 3.32
7 1 1 0.75 -4.65 8.77 4.12
8 1 1 0.75 -4.65 10.02 5.37
9 1 1 0.75 -4.65 11.27 6.62
10 1 1 0.75 -4.65 12.52 7.87

3.1.3 Automatic Changepoint Selection

自動的選擇突變點
    突變點SjS_j可以由分析師指定,或者可以根據一組可能的點進行自動選擇。通過指定δ\delta的先驗分佈,可以很自然的根據公式(3)和(4)選出突變點;
    我們通常會指定大量的突變點(例如,若干年的每一個月設置一個突變點),並使用先驗分佈:δjLaplace(0;τ)δ_j〜Laplace(0;\tau)。 參數τ\tau直接靈活的控制模型增長率的變化。 重要的是,稀疏的δδ對初始增長率kk沒有影響,所以當τ\tau爲0時,模型退化爲標準的皮爾曲線或線性增長曲線。

3.1.4 Trend Forecast Uncertainty

趨勢預測的不確定性
(譯者:文章中用到了一個縮寫符號w. p. = with probability)
    當用模型從歷史數據外推預測時,模型將採用固定增長率。那麼未來的預測就是一個確定性的點預測,怎麼才能獲取一個未來預測的概率分佈呢, 我們通過擴展趨勢的一般化模型估計預測趨勢中的不確定性。 對時間序列中的趨勢建模,通用模型如本文中所給的兩個模型,都是假設長度爲TT的時間序列歷史數據中有S個突變點,每個突變點增長率的變化量都是一個服從Laplace分佈的隨機變量,即δjLaplace0;τδ_j〜Laplace(0;\tau)。我們通過將ττ替換爲從(現有)數據推斷出的方差應用到過去的數據中來模擬變化率,從而得到將來的變化率。(We simulate future rate changes that emulate those of the past by replacing τ with a variance inferred from data. ),要做這個事情,完全可以在貝葉斯框架中,給定τ\tau的先驗分佈,得到其後驗分佈,從而完成對δ\delta的採樣;否則話,我們可以用λ\lambda的極大似然估計值:
λ=1Sj=1Sδj\lambda= \frac{1}{S}\sum_{j=1}^{S}|\delta_j|
未來的拐點隨機出現,且分佈與歷史上拐點出現的頻率一致,具體拐點的採樣分佈函數如下:
j>T,{δj=0w.p.TSS,δjLaplace(0,λ)w.p.TS.\forall j>T,\begin{cases} \delta_j=0 w.p. \frac{T-S}{S},\\ \delta_j\sim Laplace(0,λ) w.p. \frac{T}{S}. \end{cases}

    因此,我們通過假設未來將看到與歷史上出現次數同頻率和大小的增速變化值。一旦獲取到λ\lambda的估計值,就可以利用上述對趨勢的建模來模擬可能的未來趨勢並且可以得到趨勢的預測區間。
    趨勢增速的變化假設和歷史同分布是一個比較強的假設,因此我們不期望預測區間有較高的精度。但是預測區間起碼能說明預測的不確定性程度,尤其是可以從中看出是否過擬合。因爲隨着τ\tau越大,擬合誤差越小,然而,當做樣本外預測時,這種增加變量的方法將導致更大的預測不確定性;

3.2 Seasonality

季節效應
    構造一個周期函數,這個周期函數的自變量是時間tt,假設循環成分爲s(t)s(t),P = 365:25 for yearly data or P = 7 for weekly data,其傅里葉變換爲:
s(t)=n=1N(ancos(2πntP)+bnsin(2πbtP))s(t)=\sum_{n=1}^{N}{(a_ncos(\frac{2\pi nt}{P})+b_nsin(\frac{2\pi bt}{P}))}
估計循環成分,需要2N2N個參數:β=[a1,b1,...,aN,bN]T\beta=[a_1,b_1,...,a_N,b_N]^T,把傅里葉變換的基函數寫作一個向量,那麼傅里葉變換可以寫作兩個向量的點乘,這裏給個例子,假設給定20個基函數(10個coscos,10個sinsin),假設時間序列的週期爲1年(即365天),則基函數向量可以寫成如下行向量:
X(t)=[cos(2π(1)t365),...,sin(2π(10)t365)]\overrightarrow{X(t)}=[cos(\frac{2\pi(1)t}{365}),...,sin(\frac{2\pi(10)t}{365})]
則季節循環成分可以寫爲:
s(t)=X(t)βs(t)=\overrightarrow{X(t)}·\overrightarrow{\beta}
文章中假設 βNormal(0,σ2)β ∼ Normal(0, σ^2) ,目的是給出季節性成分一個平滑的先驗分佈;

3.3 Holidays and Events

節假日和事件
    假期和一些事件會給許多業務的時間序列預測帶來了巨大的,可預測的衝擊,並且通常不遵循週期性模式,即這些節假日出現的日期並不是間隔相同的日期,不是標準的週期性運動,因此,其效果不能通過平穩的週期很好地建模。 例如,美國的感恩節發生在11月的第四個星期四。 超級碗是美國最大的電視轉播賽事之一,發生在1月或2月的星期日,因此很難通過編程方式宣佈。世界上許多國家/地區都有農曆假期。 特定假期對時間序列的影響通常年復一年,因此將其納入預測很重要。
    我們允許分析員提供過去和未來事件的自定義列表,由事件或假日的唯一名稱標識,如表1所示。我們爲country列了一個列,以便在全球假日之外保留一個針對特定國家的假日列表。對於給定的預測問題,我們結合了全球假日集和特定國家假日集。
    通過假設假日的影響是獨立的,將上述列表中的節假日併入到模型中是很簡單的。對於每個假期ii,設DiD_i作爲該假期的過去和未來日期的集合,即Di{D_i}包含了節假日ii的所有日期或受影響日期;對於具體某個時刻tt,用一個指數函數來表示該時刻是否屬於某個節假日,並且給定一個參數kik_i來表示第ii個節假日的影響效應,就好季節效應一樣,這裏構造一個迴歸矩陣來實現這種來估計這些參數:
Z(t)=[1(tD1)...1(tDL)]Z(t) = [1(t \in D_1)... 1(t \in D_L)]
構造的迴歸矩陣:
h(t)=Z(t)κ(7)h(t) = Z(t)\overrightarrow{κ} \tag{7}
跟季節效應類似, 假設kk的先驗分佈:κNormal(0,ν2)κ \sim Normal(0, ν^2).
譯者注:其實就是引入了虛擬變量來估計節假日和事件型的影響;這裏舉一個例子說明模型如何引入節假日的,作者把每一時刻按是否是節假日進行分類,然後以一個one_hot編碼的形式把節假日表示出來,以國內的節假日爲例,假設只研究春節和國慶,如果給定一年的日度數據,那麼每一天是否是節假日,是哪個節假日,可以用一個數字來表示,比如,不是節假日標註爲0,是春節,標準爲1,是國慶,標註爲2,然後對這個時間序列做一個one hot編碼,就得到了沒個時刻的節假日表示;

日期 節假日類型
2020-02-22 0
2020-02-23 0
2020-02-24 1
2020-02-25 1
2020-10-01 2
2020-10-02 2

one hot編碼爲:

日期 非節假日 春節 國慶節
2020-02-22 1 0 0
2020-02-23 1 0 0
2020-02-24 0 1 0
2020-02-25 0 1 0
2020-10-01 0 0 1
2020-10-02 0 0 1

    節假日的影響往往不僅僅就是節假日的那幾天,可能節假日的前後一段事件都會受到影響。爲了說明這一點,因此設置了一個參數,用於表示節假日影響範圍的。
譯者總結

  • 將時間序列採取加法模型分解爲趨勢+週期+事件影響+隨機干擾,時間序列的分解方法,最常規的就是加法模型和乘法模型,prophet僅支持加法模型,在有些場景是必須對數據做變換,纔可以利用加法分解模型;這裏要說道說道加法模型和乘法模型的區別:
    加法模型:yt=Tt+Ct+Holidayty_t=T_t+C_t+Holiday_t
    乘法模型:yt=TtCtHolidayty_t=T_t*C_t*Holiday_t
    對於乘法模型,所代表的物理意義是表示增長率可以分解爲加法模型,爲了說明,這裏假設所涉及的數據都是非負,且只考慮趨勢和循環成分:
    yt=TtCtyt1=Tt1Ct1logyt=logTt+logCtlogyt1=logTt1+logCt1logytlogyt1=logTtlogTt1+logCtlogCt1logytyt1=logTtTt1+logCtCt1y_t=T_t*C_t\\ y_{t-1}=T_{t-1}*C_{t-1}\\ \Rightarrow logy_t=logT_t+logC_t\\ \Rightarrow logy_{t-1}=logT_{t-1}+logC_{t-1}\\ \Rightarrow logy_t- logy_{t-1}=logT_t-logT_{t-1}+logC_t-logC_{t-1} \Rightarrow log \frac{y_t}{y_{t-1}}=log\frac{T_t}{T_{t-1}}+log\frac{C_t}{C_{t-1}}
    即對數增長率可以分解爲各成分的對數增長率之和,這個就是乘法模型的物理意義。

  • 趨勢構造了兩個趨勢表示方式,一個是皮爾生長曲線(logistic),一個是時間tt線性函數,並允許加入結構突變,目前結構突變只允許發生在增長率變量上,即logistic的增長率,和線性迴歸的斜率項,結構突變其實也可以發生在其他變量上,但要有對應的物理意義;

  • 節假日效應作者用了一個虛擬變量來表示,且假設節假日的影響是一個常量,這個往往不符合現實,比如,國慶假,那10月1日的客流量和10月3日以及10月7日的效應其實是不一樣的,即相同的節假日,對每一天的影響其實效應都有可能不同,這裏作者直接假設爲常數,合理性有待商榷;

  • 文中的季節效應作者假設了是固定週期的效應,其實在現實中很對場景都是變頻的,比如生產活動,在淡季時,可能是兩週調休一次,而在旺季中,有可能是一週調休一次,如果預測生產或者與生產有關的變量時,固定頻率就不合適;

  • 在估計趨勢成分時,作者對模型做了調整,以使得模型continue,這裏不知道有沒有必要,如果作者的求參算法是迭代法,用到了微分,那麼要求函數平滑是合理的,但如果用的是隨機抽樣法,就對連續性和可微性沒有要求;

3.4 Model Fitting

模型擬合
    用矩陣AA表示趨勢成分的增長率突變量,利用 Stan code 可以將模型簡單的寫出,並且利用 Stan’s L-BFGS 算法,可以求出最大後驗估計,也可以估計出參數的後驗分佈後,預測時考慮這些參數的後驗分佈,從而獲取預測值的分佈;如下代碼是求參時的模型設置:
model{//Priors:knormal(0,5);mnormal(0,5);epsilonnormal(0,0.5);deltadouble_exponential(0,tau);betanormal(0,sigma);//Logistic likelihood: ynormal(C./(1+exp((k+Adelta).(t(m+Agamma))))+Xbeta,epsilon);//Linear likelihood:ynormal((k+Adelta).t+(m+Agamma)+Xbeta,sigma);}model\{\\ // Priors: \\ k ∼ normal(0, 5) ; \\ m ∼ normal(0, 5) ; \\ epsilon ∼ normal(0, 0.5) ;\\ delta ∼ double\_exponential(0, tau); \\ beta ∼ normal(0, sigma);\\ //Logistic \ likelihood:\\ \ y ∼ normal(C ./ (1 + exp(-(k + A * delta) .* (t - (m + A * gamma)))) + X * beta, epsilon);\\ // Linear \ likelihood:\\ y ∼ normal((k + A * delta) .* t + (m + A * gamma) + X * beta, sigma); \}
我們利用正則化來控制列表1中的參數τ\tauσ\sigma,用於防止過擬合,但是可能沒有足夠的歷史數據來通過交叉驗證選擇最佳正則化參數。 正則化參數給出了默認值,這組默認值適用於大部分場景,同時,也允許模型開發者參與到參數優化中來。

3.5 Analyst-in-the-Loop Modeling

分析師如何建模
    做預測的分析師通常對他們所預測的數量有廣泛的領域知識,但統計知識有限。在Prophet模型規範中,有幾個地方分析師可以更改模型以應用他們的專業知識和外部知識,而不需要了解任何底層統計數據。

  • 承載力:分析師擁有相關領域的知識,知道要預測的標的的極大值/極小值。
  • 突變點:可以直接指定變更點的日期,如產品變更日期。
  • 節假日和季節性:分析師根據經驗,指定哪些節假日有影響,他們可以直接輸入相關的節假日所在的日期和週期長度。
  • 平滑參數:通過調整ττ,分析員可以從一系列不同趨勢增長模型中進行選擇,比如是否包含突變點,突變點的個數等。季節性和假日平滑參數(σ,ν)(σ,ν)允許分析人員告訴模型未來的歷史季節變化。

    有了良好的可視化工具,分析師可以使用這些參數來改進模型。當在歷史數據上繪製模型模型的預測和真實值對比時,很快就可以看出是否遺漏了結構突變點。ττ參數是一個參數,可以用來增加或減少趨勢靈活性,而σσ是另一個參數,用來增加或減少季節性成分的強度。可視化爲高效的人爲調整模型提供了許多其他機會:是線性趨勢或邏輯增長,識別季節性的週期長度,以及是否應該異常一些異常點。所有這些干預措施都可以在沒有統計專業知識的情況下進行,是分析師應用其個人見解或其專業知識的重要方法。
    預測文獻通常將數據挖掘而做出來的模型與人類專家使用其所學的任何過程產生的判斷預測(也稱爲管理預測)區分開來,後者往往適用於特定的時間序列。每種方法都有其優點。統計預測(數據挖掘)需要較少的領域知識和來自人類預測者的努力,而且它們可以很容易地擴展到許多預測。判斷性預測可以包含更多信息,並對不斷變化的條件作出更大的反應,但可能需要分析師的密集工作(Sanders 2005)。
    我們提供的分析師循環建模法(analyst-in-the-loop) ,提供了一種建模的替代方法,它試圖通過在必要時集中分析員的精力改進模型,而不是關注統計模型上,用於融合統計模型和分析師的經驗判斷。我們發現我們的方法與循環的"transform-visualize model" (Wickham&Grolemund(2016)提出)非常相似,其中人類的知識在經過多次模型的迭代改進後,融合到了模型之中。

    大規模的預測依賴於自動化,但判斷性預測在許多應用中顯示出很高的準確性(Lawrence et al。2006年)。我們提出的方法允許分析師通過一小部分直觀的模型參數和選項對預測進行判斷,同時保留在必要時依靠全自動統計預測的能力。在撰寫本文時,我們只有一些經驗性的證據可以證明準確度可能有所提高,但我們期待着未來的研究能夠評估出分析師在提升模型精度的作用。
   &#8194大規模的“anylyst-in-the-loop”能力在很大程度上取決於對預測質量的自動評估和良好的可視化工具。現在,我們將介紹如何自動的進行預測評估,以識別與分析師輸入最相關的預測。

4 Automating Evaluation of Forecasts

自動評估預測精度

4.1 Use of Baseline Forecasts

使用基準模型預測作爲對照
    評價預測方法時,與一組基準模型做比較是一個重要的方法。我們更喜歡使用簡單的預測方法,這些模型可以對數據做出比較強的假設,但在對未來的預測時會更加合理。我們發現了最簡單的模型往往比較有用(例如最後時刻的值和樣本平均值作爲預測)和第2節所述的其他預測方法。

4.2 Modeling Forecast Accuracy

模型的預測精度
    預測是在一定的時間範圍內進行的,我們稱之爲HH。我們關注的是對未來一段時間的預測,我們的預測場景往往是對未來30天,90天、180天或者365天做預測。因此,對於任何有每日觀測的預報,我們可以得到日度預測值,與之而來的是每個預測點的誤差。我們需要定義一個衡量預測誤差的指標。另外,清楚模型在預測過程中精確度,則在實際業務中,就知道是否可以相信模型的預測值。
    設y^(tT)\hat{y}(t|T)表示基於截止到T時刻的信息,對tt時刻做出的預測,預測值和真實值的差距用d(y,y)d(y,y')表示,其中,yy表示真實值,yy'表示預測值,常用的評價指標有mae,mse,mape等,假設未來預測的最大長度爲H,歷史樣本的最大時間爲T,則定義預測精度:

φ(T,h)=d(y^(T+hT),y(T+h))h[1,H]φ(T,h) = d(\hat{y}(T + h|T),y(T + h))\\ h \in [1,H]
    爲了研究預測精度隨着對未來預測日期長度hh的變化,需要對誤差項進行建模,這裏對誤差建立ARMA模型,ARIMA的參數採取1階自迴歸模型,即:
y(t)=α+β(t1)+v(t)v(t)Normal(0,σv2)y(t)=\alpha+\beta(t-1)+v(t)\\ v(t)\sim Normal(0,\sigma_v^2)
    參數σv2\sigma_v^2可以通過歷史數據估計出來。然而這種方法必須把模型的形式設置正確,否則誤差估計是不對的,但是在實踐中往往很難保證模型的設置是正確的。
    我們傾向於採取非參數發估計期望的預測誤差,這適用於各種模型。這種方法類似於採取交叉驗證對獨立的樣本進行樣本外的預測,然後估計樣本外的誤差分佈,每一個預測步長hh都對應一系列的預測誤差,因此,可以取誤差期望作爲該預測步長的預測精度:
ξ(h)=E[φ(T,h)](8)\xi(h) = E[φ(T, h)] \tag{8}
    這個模型很靈活,但是可以強加一些簡單的假設。首先,假設誤差函數關於hh連續,因爲我們期望在日期相近的時間裏,預測誤差也儘量的相似;其次,假設誤差函數隨着預步長hh的增加而增加(但不是嚴格遞增),在實踐操作中,我們選擇瞭如下非線性迴歸來擬合誤差曲線:局部線性迴歸?(a local regression (Cleveland & Devlin 1988)) 或者 保序迴歸isotonic regression (Dykstra 1981) as flexible non-parametric models of error curves。
    爲了產生歷史預測誤差來估計這個模型,我們使用了一個我們稱之爲仿真歷史預測(simulated historical forecasts)的程序。

4.3 Simulated Historical Forecasts

仿真的歷史預測
    我們希望擬合公式(8)中的預期誤差模型,以便做模型選擇和評估。不幸的是,很難使用交叉驗證,因爲時間序列的時序特性,決定了觀測值是不可交換的,我們不能簡單地隨機劃分數據。
    我們使用模擬歷史預測(SHFs),在歷史的不同截止時間點生成KK個預測,預測的時間點是在歷史數據內,因此可以評估總誤差。該思路來源於經典的“滾動原點”(rolling origin,請參見附件1的說明)預測評估法(Tashman 2000),但僅使用一小截日期序列(一部分歷史數據),而不是對每個歷史日期都做預測。使用較少模擬日期的主要優點(rolling origin法每個日期都會產生一個預測)是因爲它可以節省計算時間,同時,給出的精度相關性較低。
    如果我們在過去的這些時間點使用這種預測方法,SHF會模擬我們在預測時會犯的錯誤。如圖3和圖4中SHF的示例。這種方法的優點是簡單,易於向分析師和決策者解釋,並且對於生成對預測誤差的洞察力而言也相對沒有爭議。使用SHF方法評估和比較不同的預測模型時,要注意兩個主要問題。
    首先,我們做出的模擬預測越多,他們的誤差估計就越相關。這裏考慮一種極端情況,即每天都做模擬預測,鑑於每天增加的信息量,預測不太可能發生太大變化,而且從一天到第二天的誤差幾乎相同。另一方面,如果我們進行的模擬預測很少,那麼對歷史預測誤差的觀察就更少了,根據我們的模型選擇作爲一種啓發式方法,對於預測範圍H,我們通常每H/2H/2 個週期進行一次模擬預測。儘管誤差測相關性不會對我們對模型準確性的估計帶來偏差,但這樣做也沒什麼益處,並且還需浪費時間來計算。
譯者注:作者根據時間序列的歷史數據構造了一個移動時間窗,這個移動時間窗包含兩部分內容,前部分是train集,後部分是test集,train集用於訓練模型,test集用於測試模型,那麼這個時間窗的移動步長也是一個參數(cutoff的間隔),所以這段內容作者在講述如何設置這個時間窗的移動步長,如果移動步長太小,假設極端情況下,每一個時間點,移動一次,那麼這兩次做出來的樣本外誤差是高度相關的,作者認爲儘管相關性不會造成預測精度的估計偏差,但是會浪費計算時間,因此,作者建議時間窗的移動步長要大一點,但是過大了,會導致時間窗的個數減少,可用於分析的樣本外誤差數據就少了,因此,這裏他們建議時間窗的移動步長應該是樣本外預測長度的一半,假設未來做100天的預測,那麼時間窗的移動步長應該設置爲50
    其次,有了更多的數據,預測方法就可以做得更好或更差。當模型設定不正確或過擬合時,歷史樣本越多,誤差越大,例如使用樣本均值來預測含有趨勢增長的時間序列。圖7顯示了我們對函數ξ(h)ξ(h)的估計,即用局部迴歸法,給出的圖3和圖4中的時間序列,在整個預測期間的預期平均絕對百分比誤差(mape); 誤差估計是使用9個模擬的預測日期進行的,從第一年開始每季度做一次。prophet在所有預測範圍內的預測誤差都較低。prophet模型參數用的是默認值,調參可能會進一步提高預測精度。

Figure 7: Smoothed mean absolute percentage errors for the forecasting methods and time series of Figs. 3 and 4. Prophet forecasts had substantially lower prediction error than the other automated forecast methods.

    在可視化預測時,我們更喜歡使用點而不是直線來表示歷史數據,因爲這些數據代表了非插值的預測誤差。然後,我們用線把每個預測誤差連接起來。 對於SHF,可視化可以幫助找出哪些模型在哪些長度的預測誤差比較大,既可以是時間序列(如圖3所示),也可以在SHF上彙總(如圖7所示)。

4.4 Identifying Large Forecast Errors

識別較大的預測誤差
    當分析師的預測太多而無法手動檢查每個預測時,重要的是能夠自動識別可能有問題的預測。自動識別不良預測可以使分析師最有效地利用有限的時間,並利用他們的專業知識來糾正問題。 SHF可以通過多種方式用於找出預測中可能存在的問題。

  • 當預測相對於基線有較大誤差時,可能是因爲模型設置錯誤。分析師可以需要調整趨勢模型或季節性模型。
  • 當所有的預測值對特定日期預測誤差都很大時,表示這一天可能是離羣值。分析師可以識別異常值並將其刪除。
  • 當某方法的SHF誤差從一個水平急劇增加到另一個水平時,可能表明數據的生成過程已發生改變。添加結構突變點或分別爲不同的階段建模。
        有些病態的預測問題無法輕易糾正,但是我們遇到的大多數問題都是可以通過指定結構突變點以及除去異常值來糾正的。一旦該預測值被標記,就可以用於審覈和可視化展示,那麼這些問題就很容易識別和糾正。

5 Conclusion

結論
    大規模預測的一個主要問題是,不同知識背景的分析師要做的預測場景可能遠遠超過其手動可以做的範圍。我們預測系統的第一部分是我們通過對Facebook上的各種數據進行多次迭代開發而形成的建模框架。我們使用了一個簡單的模塊化迴歸模型,該模型通常可以在給定默認參數情況下表現很好,並且允許分析師選擇與其預測問題相關的組件,並根據需要輕鬆的進行調整。第二個部分是計算預測誤差與跟蹤系統,讓分析師可以找出 那些應該手動檢查的預測值,幫助提升模型預測預測精度。這很關鍵,該組件使分析人員能夠確定何時需要對模型進行調整,或者什麼時候應該使用完全不同的模型。並且,一個操作簡單、可調整的模型和可擴展的精度監控體系相結合,使大量分析人員能夠預測大量不同的時間序列(也即我們定義的大規模預測)。

References

Byrd, R. H., Lu, P. & Nocedal, J. (1995), ‘A limited memory algorithm for bound constrained optimization’, SIAM Journal on Scientific and Statistical Computing 16(5), 1190–1208.
Carpenter, B., Gelman, A., Hoffman, M., Lee, D., Goodrich, B., Betancourt, M., Brubaker, M. A., Guo, J., Li, P. & Riddell, A. (2017), ‘Stan: A probabilistic programming language’, Journal of Statistical Software 76(1).
Chang, W., Cheng, J., Allaire, J., Xie, Y. & McPherson, J. (2015), shiny: Web Application
Framework for R. R package version 0.11.
URL: http://CRAN. R-project. org/package= shiny
Cleveland, W. S. & Devlin, S. J. (1988), ‘Locally weighted regression: an approach to regression analysis by local fitting’, Journal of the American Statistical Association 83(403), 596–610.
De Gooijer, J. G. & Hyndman, R. J. (2006), ‘25 years of time series forecasting’, International Journal of Forecasting 22(3), 443–473.
De Livera, A. M., Hyndman, R. J. & Snyder, R. D. (2011), ‘A state space framework for automatic forecasting using exponential smoothing methods’, Journal of the American Statistical Association 106(496), 1513–1527.
Dykstra, R. L. (1981), ‘An isotonic regression algorithm’, Journal of Statistical Planning and Inference 5(4), 355–363.
Gardner, E. S. (1985), ‘Exponential smoothing: the state of the art’, Journal of Forecasting
4, 1–28.
Harvey, A. C. & Shephard, N. (1993), Structural time series models, in G. Maddala, C. Rao & H. Vinod, eds, ‘Handbook of Statistics’, Vol. 11, Elsevier, chapter 10, pp. 261–302.
Harvey, A. & Peters, S. (1990), ‘Estimation procedures for structural time series models’, Journal of Forecasting 9, 89–108.
Hastie, T. & Tibshirani, R. (1987), ‘Generalized additive models: some applications’, Journal of the American Statistical Association 82(398), 371–386.
Hutchinson, G. E. (1978), ‘An introduction to population ecology’.
Hyndman, R. J., Khandakar, Y. et al. (2007), Automatic time series for forecasting: the forecast package for R, number 6/07, Monash University, Department of Econometrics
and Business Statistics.
Hyndman, R. J., Koehler, A. B., Snyder, R. D. & Grose, S. (2002), ‘A state space framework for automatic forecasting using exponential smoothing methods’, International Journal of Forecasting 18(3), 439–454.
Lawrence, M., Goodwin, P., O’Connor, M. & Onkal,¨ D. (2006), ‘Judgmental forecasting: a review of progress over the last 25 years’, International Journal of Forecasting 22(3), 493 – 518.
Sanders, N. (2005), ‘When and how should statistical forecasts be judgementally adjusted?’, Foresight 1(1), 5 – 7.
Tashman, L. J. (2000), ‘Out-of-sample tests of forecasting accuracy: an analysis and review’, International journal of forecasting 16(4), 437–450.
Tashman, L. J. & Leach, M. L. (1991), ‘Automatic forecasting software: a survey and
evaluation’, International Journal of Forecasting 7, 209–230.
Wickham, H. & Grolemund, G. (2016), ‘R for data science’.

附錄1 Rolling OriginRolling \ Origin

    當需要爲數據選擇最合適的預測模型或方法時,預測人員通常將可用樣本分爲兩部分:樣本內(也稱爲“訓練集”)和保留樣本(或樣本外,或“測試集”)。然後用樣本內數據對模型進行估計,並使用樣本外的數據計算預測誤差,從而達到評估模型預測性能的目的。
    如果這樣的程序僅執行一次,則稱爲“固定原點”評估。但是,時間序列可能包含異常值或水平移位,並且僅由於此原因,較差的模型可能會比更合適的模型表現更好。爲了加強對模型的評估,使用了一種稱爲“滾動原點”的方法。
    滾動原點是一種評估技術,根據該技術可以連續更新預測原點,並根據每個原點生成預測(Tashman 2000)。該技術可以獲取時間序列的幾個預測誤差,從而更好地瞭解模型的性能。如何執行此操作有不同的選擇。
How can this be done?How \ can \ this \ be \ done?
    假設時間序列長度爲25,初始樣本內長度爲15,即Origin=15,樣本外預測長度爲3,則Origin可以從15取到22,共形成8組樣本內-樣本外預測數據集,如下圖,白色表示樣本內,灰色表示樣本外預測,可以理解對預測區間按一個時間窗進行滑動,滑動步長爲1,其實滑動步長也可以作爲一個參數;這樣我們可以求8組樣本的平均預測誤差,來比較不同模型的平均預測誤差,從而可以進行模型選擇。
在這裏插入圖片描述
    從8個子樣本生成成預測的另一個選擇是從第17個歷史樣本開始預測,而不是從原來第15個開始(見下圖)。在這種情況下,該過程一直持續到時間點22,即生成前面最後三個步驟的預測,然後隨着預測範圍的減小而繼續。因此,提前兩步預測是從原點23產生的,而只有一步預測是從原點24產生的。結果得到8個一步預測、7個二步預測和6個三步預測。這可以被視爲具有非恆定持留率樣本大小的Rolling Origin。這在小樣本的情況下非常有用,因爲我們沒有多餘的觀測數據。
在這裏插入圖片描述
    最後,在上述兩種情況下,我們都增加了樣本內的數據量。然而,出於某些研究目的,我們可能需要保持樣本內數據長度不變,比如就是需要用過去100個歷史數據,預測未來10步。下圖顯示了這種情況。在這種情況下,在每次迭代中,我們在序列的末尾添加一個觀測值,並從序列的開頭刪除一個觀測值(深灰色單元格)。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章