機器學習在時間序列數(shù)據(jù)上應用
隨著疫情的變化,急性傳染病數(shù)據(jù)經常會隨時間變化,我們通過對每天傳染病的記錄呀非,就形成了時間序列數(shù)據(jù)壁畸,周期可以是天,周霍骄,月,年。目前我們經常會用到ARIMA來預測疾病在未來的變化趨勢梭伐。
但是隨著機器學習的廣泛應用,在時間序列上仰担,也可以采用機器學習發(fā)方法去預測糊识,結果比傳統(tǒng)的ARIMA
EST
更加快速,簡潔摔蓝,準確赂苗。
這次將要介紹關于的時間序列預測的Modeltime
包,旨在加快模型評估贮尉,選擇和預測的速度拌滋。modeltime
通過將tidymodels
機器學習軟件包生態(tài)系統(tǒng)集成到簡化的工作流中以進行tidyverse
預測來實現(xiàn)此目的。modeltime
結合了機器學習模型猜谚,經典模型和自動化模型等败砂。
主要優(yōu)點:
簡化數(shù)據(jù)建模預測流程赌渣,包括數(shù)據(jù)建模,評估吠卷,預測及輸出
- 預測的系統(tǒng)工作流程锡垄。
modeltime_table(
),modeltime_calibrate()
和modeltime_refit()
- 結合Tidymodels以期加入機器學習算法祭隔。如
XGBoost
货岭,GLMnet
,Stan
疾渴,Random Forest
等 - 改進傳統(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ù)分成train
與test
芜果。
使用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)
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)
- 首先使用prophet對單個時間序列建模
- 使用通過預處理配方提供的回歸數(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.模型調整
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)
5.模型評估
接下來,計算預測值與實際值的差異來評估模型好壞邮旷。
使用modeltime_accuracy()
生成樣本外準確性指標數(shù)據(jù)黄选。
使用table_modeltime_accuracy()
生成預測結果表格
calibration_table %>%
modeltime_accuracy() %>%
table_modeltime_accuracy(.interactive = FALSE)
后續(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