Я экспериментирую с алгоритмами 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 для того же прогноза.
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")
Я думаю, что прогноз 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