时间序列模型R语言实现-批量建模,预测(ARIMA, 随机森林)
時間序列預測首先要確定預測的內容。
- 首先安裝加載本文所需要的包
1.數據準備/處理
我們研究的數據集為共享自行車的租用量,我們將數據集簡化為具有“日期”和“值”列的單變量時間序列。
df_bike = bike_sharing_daily %>% select(dteday, cnt) %>% set_names(c("date", "value"))glimpse(df_bike) ## Rows: 731 ## Columns: 2 ## $ date <date> 2011-01-01, 2011-01-02, 2011-01-03, 2011-01-04, 2011-01-05, 201… ## $ value <dbl> 985, 801, 1349, 1562, 1600, 1606, 1510, 959, 822, 1321, 1263, 11…接下來,使用 plot_time_series() 函數可視化數據集。調參 .interactive = TRUE 以獲得可交互的繪圖,若為FALSE 返回 ggplot2 靜態圖,默認為TRUE。
df_bike %>% plot_time_series(date, value, .interactive = F) + xlab("Date") +ylab("Count of total rent bikes")數據的時間跨度為2011-01-11至2013-01-01,共計731個數據,從圖中可以看出數據量較大,不易于分析,為更好地觀察趨勢,應該將數據再劃分為更小的時間跨度,具體根據結果確定。可以看出,這張圖沒有特別明顯的趨勢,是否有很強的季節性(每周/每月)?
- 接著檢測數據是否具有季節性
可以看到共享單車租用量具有月度季節性,在第2、3季度租用量大于第1、4季度。這很可能是因為第1、4季度是冬天。
2.訓練/測試
使用函數time_series_split() 去創建訓練集和測試集
- 設置 assess = "3 months 表明后3個月為測試集
- 設置 cumulative = TRUE 表明采樣使用所有前面的先驗數據作為訓練集。
接下來可視化訓練/測試集
- tk_time_series_cv_plan(): 將拆分的對象轉化為數據框
- plot_time_series_cv_plan(): 使用數據里的"date"和"value"列畫圖
3. 建模
處理并觀察為數據之后,現在就可以建模了。 我們主要用modeltime和parsnip函數建模。
3.1 Automatic Models
自動模型通常是已經自動化的建模方法。這包括來自forecast包的“Auto ARIMA”和“Auto ETS”功能以及來自prophet包的“Prophet”算法。這些算法已集成到modeltime包中中。設置過程很簡單:
- 模型選擇:使用規范函數(例如 arima_reg()、prophet_reg())來初始化算法和關鍵參數
- 引擎:使用可用于選擇模型的引擎訓練模型。
- 擬合模型:將模型擬合到訓練數據
Auto ARIMA
接下來先擬合自動ARIMA模型:
- 模型選擇: arima_reg() 這將設置您的通用模型算法和關鍵參數
- 設置訓練引擎: set_engine(“auto_arima”) 選擇要使用的特定包函數,可以在此處添加任何函數級參數。
- 擬合模型:fit(value ~ date, training(splits)) <– 所有模型時間模型都需要一個日期列作為回歸量。
Prophet
類似于 Auto Arima模型,同理我們訓練 Prophet模型如下:
model_prophet = prophet_reg(seasonality_yearly = TRUE) %>% set_engine("prophet") %>% fit(value ~ date, training(splits)) model_prophet3.2機器學習模型
首先,我將使用 **recipe()**函數 創建一個預處理配方并添加時間序列步驟。該過程使用“日期”列來創建我想要建模的 45 個新特征。其中包括時間序列特征和傅立葉級數。
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()Elastic Net
訓練 Elastic NET 模型很容易。只需使用 linear_reg() 和 set_engine(“glmnet”) 設置模型。請注意,我們還沒有擬合模型(正如我們在前面的步驟中所做的那樣)。
model_spec_glmnet <- linear_reg(penalty = 0.01, mixture = 0.5) %>%set_engine("glmnet")接下來,制作一個適合的工作流程:
- 添加模型設定:add_model(model_spec_glmnet)
- 添加預處理:add_recipe(recipe_spec %>% step_rm(date)) <– 請注意,我正在刪除“日期”列,因為機器學習算法通常不知道如何處理日期或日期時間特征
- 擬合工作流程: fit(training(splits))
隨機森林模型
同理類似于 Elastic Net模型
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))3.3Hybrid ML Models
我已經包含了幾個混合模型(例如 arima_boost() 和 prophet_boost()),它們將兩種自動化算法與機器學習相結合。接下來我將展示prophet_boost()!
Prophet Boost
Prophet Boost 算法將 Prophet 與 XGBoost 相結合,以實現兩全其美(即 Prophet 自動化 + 機器學習)。該算法的工作原理是:
我們可以像使用機器學習算法一樣使用工作流來設置模型。
model_spec_prophet_boost <- prophet_boost(seasonality_yearly = TRUE) %>%set_engine("prophet_xgboost") workflow_fit_prophet_boost <- workflow() %>%add_model(model_spec_prophet_boost) %>%add_recipe(recipe_spec) %>%fit(training(splits))4. Modeltime 工作流
通過modeltime包加速模型評估和模型選擇
modeltime 工作流旨在加快模型評估和選擇。現在我們有幾個時間序列模型,讓我們分析它們并使用 modeltime 工作流來進行預測。
4.1 Modeltime Table
Modeltime Table 用 ID 組織模型并創建通用描述以幫助我們跟蹤我們的模型。讓我們將模型添加到 modeltime_table() 中。
model_table <- modeltime_table(model_arima, model_prophet,workflow_fit_glmnet,workflow_fit_rf,workflow_fit_prophet_boost ) model_table4.2 校準 Calibration
模型校準用于量化誤差和估計置信區間。我們將使用 modeltime_calibrate() 函數對樣本外數據(又名測試集)執行模型校準。生成了兩個新列(“.type”和“.calibration_data”),其中最重要的是“.calibration_data”。這包括測試集的實際值、擬合值和殘差。
calibration_table = model_table %>% modeltime_calibrate(testing(splits))calibration_table4.3 預測(測試集)
使用校準數據,我們可以可視化測試預測(預測)。
- 使用 modeltime_forecast() 將測試集的預測數據生成為tibble數據框格式。
- 使用 plot_modeltime_forecast() 以交互式和靜態繪圖格式可視化結果。
4.4 準頭率(測試集)
接下來,計算測試精度以比較模型。
- 使用 modeltime_accuracy() 生成樣本外準確度指標生成為tibble數據框格式。
- 使用 table_modeltime_accuracy() 生成交互式和靜態表格
4.5 分析結果
從準確度度量和預測結果中,我們看到:
- Auto ARIMA 模型不太適合此數據。
- 最好的模型是 Prophet + XGBoost
我們從最終模型中排除 Auto ARIMA,然后使用其余模型進行未來的預測。
5.重新擬合向前預測
- modeltime_refit(): 我們重新訓練完整的數據集(df_bike)
- modeltime_forecast(): 對于只依賴“日期”特征的模型,可以使用h(horizon)來進行向前預測。設置h = “12個月” 預測模型接下來12個月的數據。
6.如何讓模型擬合的更好?
本文只是觸及了表面,modeltime 包的功能比這里介紹的要豐富得多,以下是沒有涵蓋的內容:
-
特征工程:時間序列分析的藝術是特征工程。 Modeltime 與尖端的時間序列預處理工具配合使用,包括recipes和 timetk 包中的工具。
-
超參數調整:可以調整 ARIMA 模型和機器學習模型。有對與錯的方式(兩種類型都不一樣)。
-
可擴展性:訓練多個時間序列組和自動化是組織中一個巨大的需求領域。您需要知道如何將分析擴展到數千個時間序列。
-
優勢和劣勢:您是否知道某些機器學習模型更適合趨勢、季節性,但不是兩者兼而有之?為什么 ARIMA 對于某些數據集更好?隨機森林和 XGBoost 什么時候會失敗?
-
深度學習:循環神經網絡 (RRN) 一直在壓制時間序列競賽。它們會用于業務數據嗎?你如何實施它們?
總結
以上是生活随笔為你收集整理的时间序列模型R语言实现-批量建模,预测(ARIMA, 随机森林)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程导论(张海藩第六版)期末考试、考
- 下一篇: Lingoes 一款功能强大、简明易用的