R 機器學習預測時間序列模型

機器學習在時間序列數(shù)據(jù)上應用

隨著疫情的變化,急性傳染病數(shù)據(jù)經常會隨時間變化,我們通過對每天傳染病的記錄呀非,就形成了時間序列數(shù)據(jù)壁畸,周期可以是天,周霍骄,月,年。目前我們經常會用到ARIMA來預測疾病在未來的變化趨勢梭伐。


image.png

但是隨著機器學習的廣泛應用,在時間序列上仰担,也可以采用機器學習發(fā)方法去預測糊识,結果比傳統(tǒng)的ARIMA EST更加快速,簡潔摔蓝,準確赂苗。
這次將要介紹關于的時間序列預測的Modeltime包,旨在加快模型評估贮尉,選擇和預測的速度拌滋。modeltime通過將tidymodels機器學習軟件包生態(tài)系統(tǒng)集成到簡化的工作流中以進行tidyverse預測來實現(xiàn)此目的。modeltime結合了機器學習模型猜谚,經典模型和自動化模型等败砂。

image.png

主要優(yōu)點:
簡化數(shù)據(jù)建模預測流程赌渣,包括數(shù)據(jù)建模,評估吠卷,預測及輸出

  1. 預測的系統(tǒng)工作流程锡垄。modeltime_table(),modeltime_calibrate()modeltime_refit()
  2. 結合Tidymodels以期加入機器學習算法祭隔。如XGBoost货岭,GLMnetStan疾渴,Random Forest
  3. 改進傳統(tǒng)時間序列模型千贯。如arima_boost()prophet_boost()

1.數(shù)據(jù)

我們選取bike_sharing_daily時間序列數(shù)據(jù)集搞坝,其中包括自行車每日的使用數(shù)據(jù)搔谴。
這里只需要日期與當日的使用量“date” and “value”。然后可以簡單繪制一下桩撮。
注意這里的時間序列是tibble格式敦第。

install.packages("modeltime")
devtools::install_github("business-science/timetk")
library(tidyverse)
library(tidymodels)
library(modeltime)
library(timetk)   
library(lubridate)

# data
bike_transactions_tbl <- bike_sharing_daily %>%
  select(dteday, cnt) %>%
  set_names(c("date", "value")) 

bike_transactions_tbl

# plot
bike_transactions_tbl %>%
  plot_time_series(date, value, .interactive = FALSE)

2.模型構建

下面繼續(xù)對數(shù)據(jù)進行處理,在建模之前店量,我們需要將數(shù)據(jù)分成traintest芜果。
使用time_series_split()來分割我們的數(shù)據(jù),assess = "3 months"來確定后三個月為test數(shù)據(jù)集融师,cumulative = TRUE指定前面部分為train右钾。

# Split your time series into training and testing sets
splits <- bike_transactions_tbl %>%
  time_series_split(assess = "3 months", cumulative = TRUE)
  
splits
 <Analysis/Assess/Total>
<641/90/731>
  
# plot
splits %>%
  tk_time_series_cv_plan() %>%
  plot_time_series_cv_plan(date, value, .interactive = FALSE)

image.png

image.png

2.1經典ARIMA與Prophet

因為model time可以簡化數(shù)據(jù)建模流程,包括簡化參數(shù)的設置旱爆,自動模型通常是已經包含了自動化的建模方法舀射。包括“自動ARIMA”和“自動ETS”功能以及“ Prophet”算法。主要包含三個參數(shù)設置:

  • Model Spec: 指定預測模型種類(e.g. arima_reg(), prophet_reg())
  • Engine: 指定模型
  • Fit Model: 加載trian數(shù)據(jù)

結下來我們嘗試建立ARIMA模型與Prophet模型

# ARIMA
model_fit_arima <- arima_reg() %>%
  set_engine("auto_arima") %>%
  fit(value ~ date, training(splits))

model_fit_arima 
parsnip model object

Fit time:  426ms 
Series: outcome 
ARIMA(0,1,3) with drift 

Coefficients:
          ma1      ma2      ma3   drift
      -0.6106  -0.1868  -0.0673  9.3169
s.e.   0.0396   0.0466   0.0398  4.6225

sigma^2 estimated as 730568:  log likelihood=-5227.22
AIC=10464.44   AICc=10464.53   BIC=10486.74

# Prophet
model_fit_prophet <- prophet_reg() %>%
  set_engine("prophet", yearly.seasonality = TRUE) %>%
  fit(value ~ date, training(splits))

model_fit_prophet
parsnip model object

Fit time:  455ms 
PROPHET Model
- growth: 'linear'
- n.changepoints: 25
- seasonality.mode: 'additive'
- extra_regressors: 0

2.2機器學習算法

機器學習模型前面設置比自動化經典模型更為復雜怀伦。通常在進行機器學習建模之前脆烟,對數(shù)據(jù)進行預處理,稱之為workflow一般過程如下:

  • 創(chuàng)建預處理配方 Preprocessing Recipe
  • 創(chuàng)建模型規(guī)格 Model Specifications
  • 使用工作流將模型規(guī)格和預處理相結合房待,并擬合模型 Fit Model

首先邢羔,我將使用配recipe()創(chuàng)建預處理數(shù)據(jù)的先前步驟。該過程使用“日期”列創(chuàng)建了我要建模的45個新的列吴攒。這些列包含了時間序列的詳細信息及傅立葉變化的數(shù)據(jù)张抄。

recipe_spec <- recipe(value ~ date, training(splits)) %>%
  step_timeseries_signature(date) %>%
  step_rm(contains("am.pm"), contains("hour"), contains("minute"),
          contains("second"), contains("xts")) %>%
  step_fourier(date, period = 365, K = 5) %>%
  step_dummy(all_nominal())

recipe_spec %>% prep() %>% juice()

有了recipe砂蔽,我們可以建立機器學習模型了洼怔。
為什么需要recipe是因為在tidymodel里面,設置了建立機器學習模型的一套準則左驾,感興趣可以去:

機器學習模型

這里我們新建了glmnet與RF模型镣隶。
主要參數(shù)包括:

  • Start with a workflow()
  • Add a Model Spec: add_model(model_spec_glmnet)
  • Add Preprocessing: add_recipe(recipe_spec %>% step_rm(date))
  • Fit the Workflow: fit(training(splits))
# Elastic NET model
model_spec_glmnet <- linear_reg(penalty = 0.01, mixture = 0.5) %>%
  set_engine("glmnet")

workflow_fit_glmnet <- workflow() %>%
  add_model(model_spec_glmnet) %>%
  add_recipe(recipe_spec %>% step_rm(date)) %>%
  fit(training(splits))

# Random Forest
model_spec_rf <- rand_forest(trees = 500, min_n = 50) %>%
  set_engine("randomForest")

workflow_fit_rf <- workflow() %>%
  add_model(model_spec_rf) %>%
  add_recipe(recipe_spec %>% step_rm(date)) %>%
  fit(training(splits))

2.3機器學習結合傳統(tǒng)算法

Prophet Boost算法將Prophet與XGBoost結合使用极谊,從而獲得了兩全其美的效果(即Prophet Automation + Machine Learning)

  1. 首先使用prophet對單個時間序列建模
  2. 使用通過預處理配方提供的回歸數(shù)據(jù)(生成的45個新列),并使用XGBoost模型對prophet殘差進行回歸
model_spec_prophet_boost <- prophet_boost() %>%
  set_engine("prophet_xgboost", yearly.seasonality = TRUE) 

workflow_fit_prophet_boost <- workflow() %>%
  add_model(model_spec_prophet_boost) %>%
  add_recipe(recipe_spec) %>%
  fit(training(splits))
  
## [05:22:38] WARNING: amalgamation/../src/learner.cc:480: 
## Parameters: { validation } might not be used.
## 
##   This may not be accurate due to some parameters are only used in language bindings but
##   passed down to XGBoost core.  Or some parameters are not used but slip through this
##   verification. Please open an issue if you find above cases.

workflow_fit_prophet_boost

3.模型調整

image.png

Modeltime工作流程旨在加速模型評估和選擇安岂。
現(xiàn)在我們有了幾個時間序列模型轻猖,讓我們對其進行分析,并通過模型時間工作流程預測未來變化趨勢域那。
Modeltime使用ID來定位我們之前建立的模型咙边,以幫助我們識別模型。
讓我們將模型添加到modeltime_table()中次员。
[圖片上傳中...(image.png-ccae46-1593703307979-0)]

model_table <- modeltime_table(
  model_fit_arima, 
  model_fit_prophet,
  workflow_fit_glmnet,
  workflow_fit_rf,
  workflow_fit_prophet_boost
) 

model_table
## # Modeltime Table
## # A tibble: 5 x 3
##   .model_id .model     .model_desc              
##       <int> <list>     <chr>                    
## 1         1 <fit[+]>   ARIMA(0,1,3) WITH DRIFT  
## 2         2 <fit[+]>   PROPHET                  
## 3         3 <workflow> GLMNET                   
## 4         4 <workflow> RANDOMFOREST             
## 5         5 <workflow> PROPHET W/ XGBOOST ERRORS

模型校準用于量化誤差并估計置信區(qū)間败许。
我們將使用modeltime_calibrate()函數(shù)對test數(shù)據(jù)進行模型校準。
將生成兩個新列(“ .type”“ .calibration_data”)淑蔚,其中最重要的是“ .calibration_data”市殷。
包括l測試集的實際值,擬合值和殘差刹衫。

calibration_table <- model_table %>%
  modeltime_calibrate(testing(splits))

calibration_table
## # Modeltime Table
## # A tibble: 5 x 5
##   .model_id .model     .model_desc               .type .calibration_data
##       <int> <list>     <chr>                     <chr> <list>           
## 1         1 <fit[+]>   ARIMA(0,1,3) WITH DRIFT   Test  <tibble [90 × 4]>
## 2         2 <fit[+]>   PROPHET                   Test  <tibble [90 × 4]>
## 3         3 <workflow> GLMNET                    Test  <tibble [90 × 4]>
## 4         4 <workflow> RANDOMFOREST              Test  <tibble [90 × 4]>
## 5         5 <workflow> PROPHET W/ XGBOOST ERRORS Test  <tibble [90 × 4]>

4.模型預測

利用校準后的數(shù)據(jù)醋寝,我們可以對test數(shù)據(jù)進行預測。
使用modeltime_forecast()生成測試集的預測數(shù)據(jù)带迟。
使用plot_modeltime_forecast()繪制預測結果音羞。

calibration_table %>%
  modeltime_forecast(actual_data = bike_transactions_tbl) %>%
  plot_modeltime_forecast(.interactive = FALSE)
image.png

5.模型評估

接下來,計算預測值與實際值的差異來評估模型好壞邮旷。
使用modeltime_accuracy()生成樣本外準確性指標數(shù)據(jù)黄选。
使用table_modeltime_accuracy()生成預測結果表格

calibration_table %>%
  modeltime_accuracy() %>%
  table_modeltime_accuracy(.interactive = FALSE)
image.png

后續(xù)還有對最優(yōu)模型進行預測,使用全部數(shù)據(jù)作為training婶肩,預測未來1年的變化趨勢办陷。

參考

Modeltime GitHub Page - Give it a Star if you like it!
Timetk Documentation - Data wrangling, visualization, and preprocessing for time series.
Tidymodels.org - The tidymodels framework is a collection of packages for modeling and machine learning using tidyverse principles.
Introducing Modeltime

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市律歼,隨后出現(xiàn)的幾起案子民镜,更是在濱河造成了極大的恐慌,老刑警劉巖险毁,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件制圈,死亡現(xiàn)場離奇詭異,居然都是意外死亡畔况,警方通過查閱死者的電腦和手機鲸鹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跷跪,“玉大人馋嗜,你說我怎么就攤上這事〕痴埃” “怎么了葛菇?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵甘磨,是天一觀的道長。 經常有香客問我眯停,道長济舆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任莺债,我火速辦了婚禮滋觉,結果婚禮上,老公的妹妹穿的比我還像新娘齐邦。我一直安慰自己椎瘟,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布侄旬。 她就那樣靜靜地躺著肺蔚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儡羔。 梳的紋絲不亂的頭發(fā)上宣羊,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音汰蜘,去河邊找鬼仇冯。 笑死,一個胖子當著我的面吹牛族操,可吹牛的內容都是我干的苛坚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼色难,長吁一口氣:“原來是場噩夢啊……” “哼泼舱!你這毒婦竟也來了?” 一聲冷哼從身側響起枷莉,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤娇昙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笤妙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冒掌,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年蹲盘,在試婚紗的時候發(fā)現(xiàn)自己被綠了股毫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡召衔,死狀恐怖铃诬,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤氧急,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站毫深,受9級特大地震影響吩坝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜哑蔫,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一钉寝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闸迷,春花似錦嵌纲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至今阳,卻和暖如春师溅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盾舌。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工墓臭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妖谴。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓窿锉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膝舅。 傳聞我的和親對象是個殘疾皇子嗡载,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354