日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

时间序列模型R语言实现-批量建模,预测(ARIMA, 随机森林)

發布時間:2023/12/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 时间序列模型R语言实现-批量建模,预测(ARIMA, 随机森林) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

時間序列預測首先要確定預測的內容。

  • 本文預測共享單車的日租借量
  • 使用的是每日數據
  • 預測的時間范圍是需要提前一個月、半年還是一年?根據預測范圍,會使用到不同的模型。
    • 首先安裝加載本文所需要的包
    install.packages("modeltime") library(tidymodels) library(modeltime) library(timetk) library(lubridate) library(tidyverse) library(forecast)

    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個數據,從圖中可以看出數據量較大,不易于分析,為更好地觀察趨勢,應該將數據再劃分為更小的時間跨度,具體根據結果確定。可以看出,這張圖沒有特別明顯的趨勢,是否有很強的季節性(每周/每月)?

    • 接著檢測數據是否具有季節性
    df_bike %>% plot_seasonal_diagnostics(date, value, .interactive = FALSE)

    可以看到共享單車租用量具有月度季節性,在第2、3季度租用量大于第1、4季度。這很可能是因為第1、4季度是冬天。

    2.訓練/測試

    使用函數time_series_split() 去創建訓練集和測試集

    • 設置 assess = "3 months 表明后3個月為測試集
    • 設置 cumulative = TRUE 表明采樣使用所有前面的先驗數據作為訓練集。
    splits = df_bike %>% time_series_split(assess = "3 months", cumulative = T) ## Using date_var: date

    接下來可視化訓練/測試集

    • tk_time_series_cv_plan(): 將拆分的對象轉化為數據框
    • plot_time_series_cv_plan(): 使用數據里的"date"和"value"列畫圖
    splits %>% tk_time_series_cv_plan() %>% plot_time_series_cv_plan(date, value, .interactive = F)

    3. 建模

    處理并觀察為數據之后,現在就可以建模了。 我們主要用modeltimeparsnip函數建模。

    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)) <– 所有模型時間模型都需要一個日期列作為回歸量。
    model_arima = arima_reg() %>% set_engine("auto_arima") %>% fit(value ~ date, training(splits)) ## frequency = 7 observations per 1 week model_arima ## parsnip model object ## ## Fit time: 382ms ## 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

    類似于 Auto Arima模型,同理我們訓練 Prophet模型如下:

    model_prophet = prophet_reg(seasonality_yearly = TRUE) %>% set_engine("prophet") %>% fit(value ~ date, training(splits)) model_prophet

    3.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))
    workflow_fit_glmnet <- workflow() %>%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 自動化 + 機器學習)。該算法的工作原理是:

  • 首先使用 Prophet 對單變量序列進行建模
  • 使用通過預處理配方提供的回歸器(記住我們的配方生成了 45 個新特征),并使用 XGBoost 模型回歸 Prophet Residuals
  • 我們可以像使用機器學習算法一樣使用工作流來設置模型。

    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_table

    4.2 校準 Calibration

    模型校準用于量化誤差和估計置信區間。我們將使用 modeltime_calibrate() 函數對樣本外數據(又名測試集)執行模型校準。生成了兩個新列(“.type”和“.calibration_data”),其中最重要的是“.calibration_data”。這包括測試集的實際值、擬合值和殘差。

    calibration_table = model_table %>% modeltime_calibrate(testing(splits))calibration_table

    4.3 預測(測試集)

    使用校準數據,我們可以可視化測試預測(預測)。

    • 使用 modeltime_forecast() 將測試集的預測數據生成為tibble數據框格式。
    • 使用 plot_modeltime_forecast() 以交互式和靜態繪圖格式可視化結果。
    calibration_table %>%modeltime_forecast(actual_data = df_bike) %>%plot_modeltime_forecast(.interactive = FALSE) ## Using '.calibration_data' to forecast. ## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning - ## Inf

    4.4 準頭率(測試集)

    接下來,計算測試精度以比較模型。

    • 使用 modeltime_accuracy() 生成樣本外準確度指標生成為tibble數據框格式。
    • 使用 table_modeltime_accuracy() 生成交互式和靜態表格
    calibration_table %>%modeltime_accuracy() %>%table_modeltime_accuracy(.interactive = FALSE)

    4.5 分析結果

    從準確度度量和預測結果中,我們看到:

    • Auto ARIMA 模型不太適合此數據。
    • 最好的模型是 Prophet + XGBoost

    我們從最終模型中排除 Auto ARIMA,然后使用其余模型進行未來的預測。

    5.重新擬合向前預測

    • modeltime_refit(): 我們重新訓練完整的數據集(df_bike)
    • modeltime_forecast(): 對于只依賴“日期”特征的模型,可以使用h(horizon)來進行向前預測。設置h = “12個月” 預測模型接下來12個月的數據。
    calibration_table %>%# Remove ARIMA model with low accuracyfilter(.model_id != 1) %>%# Refit and Forecast Forwardmodeltime_refit(df_bike) %>%modeltime_forecast(h = "12 months", actual_data = df_bike) %>%plot_modeltime_forecast(.interactive = FALSE)

    6.如何讓模型擬合的更好?

    本文只是觸及了表面,modeltime 包的功能比這里介紹的要豐富得多,以下是沒有涵蓋的內容:

    • 特征工程:時間序列分析的藝術是特征工程。 Modeltime 與尖端的時間序列預處理工具配合使用,包括recipestimetk 包中的工具。

    • 超參數調整:可以調整 ARIMA 模型和機器學習模型。有對與錯的方式(兩種類型都不一樣)。

    • 可擴展性:訓練多個時間序列組和自動化是組織中一個巨大的需求領域。您需要知道如何將分析擴展到數千個時間序列。

    • 優勢和劣勢:您是否知道某些機器學習模型更適合趨勢、季節性,但不是兩者兼而有之?為什么 ARIMA 對于某些數據集更好?隨機森林和 XGBoost 什么時候會失敗?

    • 深度學習:循環神經網絡 (RRN) 一直在壓制時間序列競賽。它們會用于業務數據嗎?你如何實施它們?

    總結

    以上是生活随笔為你收集整理的时间序列模型R语言实现-批量建模,预测(ARIMA, 随机森林)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。