Многоэтапное прогнозирование временных рядов: итеративное прогнозирование с каретой - PullRequest
0 голосов
/ 08 февраля 2019

Я экспериментирую с алгоритмами ML и DL для прогнозирования временных рядов в R. Я уже немного знаком с пакетом прогноза и пытался реализовать модель прогноза на основе randomForest.

Однако некоторые вопросыпришло мне в голову.Я создал свои функции следующим образом:

lags <- seq(672)
lag_names <- paste("lag", formatC(lags, width = nchar(max(lags)), flag = "0"), 
                   sep = "")
lag_functions <- setNames(paste("dplyr::lag(., ", lags, ")"), lag_names)

DemandGlobal.noNA <- DemandGlobal %>% mutate_at(vars(Global), funs_(lag_functions))
DemandGlobal.noNA <- DemandGlobal.noNA %>% drop_na()
Demand.new<-DemandGlobal.noNA %>% select(Global, snsr_ts, qlty_good_global, year, quarter, 
                             month, day, wday, lag001, lag002, lag003, lag004, 
                             lag024, lag048, lag072, lag096, lag144, lag192, 
                             lag336, lag384, lag432, lag480, lag528, lag576, 
                             lag624,lag672)

Затем я проводил простой тест (без настройки гиперпараметров и стратегии обратного тестирования):

train_data<-Demand.new[1:(672*4),]
test_data<-Demand.new[(672*4):(672*8),]

library(parallel)
library(doParallel)
cluster <- makeCluster(detectCores() - 1) # convention to leave 1 core for OS
registerDoParallel(cluster)

model.test<-train(Global~+year+quarter+month+day+wday+lag001, data = train_data, method="rf", allowParallel=TRUE)

Затем я предсказывалв тестовом наборе следующим образом:

test_data <- test_data %>% mutate(pred=predict(model.test, .)) 

Но я не уверен, что это правильный подход , и я попытаюсь объяснить себя. В тестовых данных у меня есть все функции (месяц, день, wday, lag001 и т. Д.), Но если я хочу прогнозировать в режиме реального времени, единственными функциями, которые у меня будут, будут функции, связанные со временем (день, месяц и т. д.)

Затем я начал думать о том, как с этим справляется пакет прогнозов, и я провел несколько экспериментов, и я применил модель ARIMA + STL для того же прогноза.

enter image description here

train_ts<-msts(train_data$Global, seasonal.periods = c(96,96*7))
mstl(train_ts, s.window = "periodic", robust = TRUE) %>% autoplot(decomp_msts)
for_arima<-forecast(train_ts, method="arima", h=nrow(test_data))

И наконец я получил результаты:

ggplot(test_data, aes(snsr_ts, Global*2.45, colour="original"))+geom_line()+geom_line(aes(y=pred_arima*2.45, colour="Forecast ARIMA+STL"))+geom_line(aes(y=pred*2.45, colour="RF"))+ylab("value")

enter image description here

Я думаю, что прогноз ARIMA выглядит слишком плохо, а также я думаю, что случайный лес выглядит хорошо. Знаете ли вы, как выполнять итеративный прогноз как :

prediction(t+1) = model(obs(t-1), obs(t-2), ..., obs(t-n))
prediction(t+2) = model(prediction(t+1), obs(t-1), ..., obs(t-n))

BR, / E

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...