前一篇的 Theta 模型(以下通稱「Theta」為該模型的方法論本身)介紹文章當中,筆者主要提到的是 Python 程式語言的統計分析工具 statsmodels 當中所呈現的 ThetaModel(以下通稱「ThetaModel」為 statsmodels 當中實作 Theta 模型的程式物件)。而在本系列的第二篇文章,將提到 Theta 的相關軼事,以及另外一個基於 Python 程式語言的時間序列預測整合工具 Darts當中所呈現的 FourTheta (以下通稱「FourTheta」為 Darts 當中實作 Theta 的模型程式物件)。
# Theta 的應用與事蹟
綜觀上一篇文章的內容,Theta 模型設計看似簡單且沒什麼高深的數學理論,但正因為其設計概念簡單且具預測結果具有高度可解釋性,也因此,在一些十分重視 input 與 output 因果關聯的時間序列預測應用當中(例如:製造業的產銷計劃),相較於一些廣義的機器學習、深度學習的時間序列預測演算法,還要更加可靠。實際上,Theta 模型最早被提出的時候,就已在現今知名的時間序列預測建模競賽「MOFC - M Competition 」的第三屆競賽,也就是在 M3 Competition 當中,有非常優異的表現。
這系列的競賽會讓參賽者(即各方高手提出來的時間序列預測模型)使用多條不同領域、不同類型、不同時間顆粒度的序列資料來進行預測建模,並以多種預測準確度評鑑指標,綜合比較參賽方法的預測成效。也由於在 M3 Competition 大放異彩,包含之後的 M4 Competition,也將 Theta 作為 benchmark 的模型之一,與 ARIMA、ETS 等經典模型具有等同的份量。雖然其在M4 Competition 的預測準確表現不再獨占鰲頭,但是在各種自動化、智慧型預測演算法蓬勃發展的現代,也獲得不俗的表現。尤其,若把運算的時間與軟硬體資源成本納入綜合評鑑指標的話,會發現 Theta 模型根本就是個高 CP 值的選擇。
# Theta 的改良與拓展
作為曾經風光一時的預測模型標竿,有一些相關的改良、拓展模型,也都是很正常的。實際上,ThetaModel 所呈現的 Theta 模型,本身就已經融入 2001 與 2015 的兩篇改良版模型的一部份概念在裡面了。但實際上,原始的論文裡頭其實還有些東西是沒被實裝在 ThetaModel 上的。例如:根據 2000 的基礎論文,任意給定一個 theta 參數,理論上都可以配適出一條對應的,震盪幅度不同的未來趨勢線。只是在 ThetaModel 當中只有用震盪係數固定為 0 的那條趨勢線。
而在 2015 的那篇論文的預測流程當中,採用所謂的 fixed origin evaluation的方法(概念可參考下方的論文截圖),以 {1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5} 這個範圍的數字,逐一帶入 theta 來進行 fixed origin evaluation,並以總測試誤差最小的那一個數字,作為最終要使用的那個 theta 參數(也就是對應到 ThetaModel 的 forecast 函數當中所使用的 theta 參數)。但實際上,ThetaModel 並沒有採用上述的 fixed origin evaluation 流程
筆者猜想,當初在 statsmodels 當中建立 ThetaModel 的開發人員可能認為,fixed origin evaluation 這道流程可以由使用者來自行實作,也就沒把這項功能放入 ThetaModel 裡面去了。玩過機器學習建模,且用 Grid Search 來找尋最佳參數組合的讀者們應當都能同意,這個過程是多麼枯燥且耗時。而也因為省略了這道流程,才得以使得 ThetaModel 的配適速度如此神速!
# FourTheta
除了 ThetaModel 所採用的那三篇論文之外,當然還有其他基於Theta 的強化版模型。另一個 Python 的時間序列預測整合套件Darts,就提供了另一個強化版的 Theta 模型:FourTheta。其主要是基於下面這篇論文刻出來的:
Evangelos Spiliotis, Vassilios Assimakopoulos, Spyros Makridakis. (2020). Generalizing the Theta method for automatic forecasting. European Journal of Operational Research. Vol 284 (2).
- 趨勢項包含:Addictive trend (A)、Multiplicative trend (M)
- 週期項包含:No cycle (N)、Addictive cycle (A)、Multiplicative cycle (M)
- 震盪項包含:Addictive expression (A)、Multiplicative expression (M)
藉由上述三種構成成份的排列組合,再以模型產出的歷史模擬值與真實資料比對準確度,以找出配適誤差最小的那個組合的。藉以解決使用者不一定知道原始序列到底比較適合哪種類型的趨勢、週期、震盪類型的問題。理論上總共會有 2 x 3 x 2 = 12 種排列組合。但由於特定組合的模型,有可能使模型產生出來的預測值為負,或者為 0(或者趨近於 0)。2020 的論文當中提出了總共有 4 種組合可能會發生這類情形:{M,A,N}、{M,A,A}、{M,A,N}、{M,M,A}、{M,A,M}。(根據 2020 的論文,以 {M,M,A} 為例,其表示的是:{Multiplicative expression, Multiplicative trend, Addictive cycle})所以實際上會拿來比較配適誤差的排列組合,只有 12 - 4 = 8 種。
FourTheta 則是真有將這些排列組合的預測成效比較流程,包成一個 gridsearch 的函數實作出來。筆者認為,加入了這一項自動判定流程,主要的優點是讓使用者在不知道原始資料的趨勢與週期類型的情況下,能夠藉由 FourTheta 來自動判定,但使用者也可以選擇不執行這項比較流程,而直接採用特定的趨勢、週期、與震盪類型。
可以參照上方範例圖片:圖例當中的 STM 代表的是 ThetaModel的結果產出;Darts則代表 FourTheta 的結果產出。同樣是 Addictive trend 與 No cycle,以及相同的 theta 參數。ThetaModel 與 FourTheta 的預測結果,還是有些不同。而 FourTheta 的預測成效是否比 ThetaModel 還要好,實際上還是要看怎麼用。以及可以確定的是,若加入了這道排列組合的比較流程,FourTheta 的配適時間一定比 ThetaModel 還要來得久(只跑一條序列的時候可能感受不出來,但是當你需要預測幾百條幾千,甚至更多條的序列資料時,就有感覺了……)。
# 尾聲
關於 Theta 的介紹文章,就到此為止。總結而言,筆者認為Theta 模型的實用性是無庸置疑的尤其在建構一個複雜的客製化預測系統時,很適合作為產出 baseline 的方法論。而筆者也希望這兩篇文章能帶來點磚引玉的效果,讓更多中文圈的使用者,認識 Theta 這個好用的方法!