字體:小 中 大 | |
|
|
2019/11/29 09:39:15瀏覽2118|回應0|推薦3 | |
<<Python練習 時間序列的滾動式自我迴歸(Rolling Autoregression)>> 一、依過去的資料預測未來 – 自我迴歸(Autoregression,AR)與滾動式自我迴歸(Rolling Autoregression,Rolling AR) (一)自我迴歸(AR) 先前的練習,我利用1972/2 ~ 2017/12各月的台鐵通勤列車(區間列車 + 普通車)的乘客數資料,於分離出季節性因素後,使用AR模式來預測2018/1 ~ 2019/8 的通勤列車乘客數.這次則進一步練習如何利用滾動式自我迴歸(Rolling AR)觀念做時間序列的預測. (二)滾動式自我迴歸(Rolling AR) 所謂滾動式,是指隨著時間遞嬗,會有新的實際值發生,因此預測時,將這些實際值依時間順序納入AR模型考量,且每次僅預測下一期數值.如 1.2017/12月實際值產生後,利用1972/2 ~ 2017/12的資料,預測2018/1數值. 2.2018/1月實際值產生後,利用1972/2 ~ 2018/1的資料,預測2018/2數值. 3.2018/2月實際值產生後, 利用1972/2 ~ 2018/2的資料,預測2018/3數值. 4. 依此類推,2019/1月實際值產生後, 利用1972/2 ~ 2019/1的資料,預測2019/2數值. 二、Python語法 (一)前置作業 延續先前的練習:
(1) 趨勢值(trend) (2) 季節性因素 (3) 殘差值
(三)模型預測流程
#產生一個空的Python字典裝預測值 predictions_dict = dict() #基準點日期 base_date = datetime(2017,12,1) #跑Rolling AR迴圈 d = base_date.day #設定datetime物件之月資料 train_due_date = base_date #指定第一圈迴圈訓練集迄日 for i in range(1,14+1): #預測2018/1~2019/2資料,要跑14次迴圈 trend對數差分訓練集 = trend對數差分[:train_due_date] #設定新的訓練集,滾進新的實際值 model_rolling = AR(trend對數差分訓練集) #設定模型 model_rolling_fit = model_rolling.fit() #訓練資料 m_before_fix = base_date.month + I #計算當前迴圈在計算的預測月份 #設定datetime物件之月資料 if m_before_fix % 12 == 0: #表示已滿一年 y = base_date.year + ((m_before_fix // 12) - 1) #滿12個月,還未跨年度.設定datetime物件年資料 m = 12 #因整除,表示在十二月 else: y = (base_date.year) + (m_before_fix // 12) #起過12個月,跨年.設定datetime物件年資料 m = (m_before_fix % 12) new_day = datetime(y,m,d) #預測當前月份資料 predictions_dict[new_day] = model_rolling_fit.predict(end=new_day)[-1] # predict()回傳陣列的最後一筆,即是針對new_day的預測值 train_due_date = new_day #訓練集資料,增加一個月的實際值
三、預測結果 (一)圖一為對trend對數差分的預測結果.藍色線為2018/1~2019/2的實際值,紅色線為AR模型預測結果,綠色線則是Rolling AR模型預測結果.我們發現綠色線與紅色線相較,綠色線與代表實際值的藍色線吻合度較高,即Rolling AR的預測結果優於AR模型. (二)圖二為對通勤列車乘客數的預測結果.藍色線為2018/1~2019/2的實際值,紅色線為AR模型預測結果,綠色線則是Rolling AR模型預測結果.我們發現綠色線與紅色線相較,紅色線較貼近於代表實際值的藍色線,即Rolling AR略遜於AR模型,可能原因或許是預測期間有較大的模型未解釋的殘差值波動因素造成的 |
|
( 知識學習|其他 ) |