多步提前时间序列预测:使用插入符号进行迭代预测

时间:2019-02-08 16:17:23

标签: r time-series random-forest forecasting arima

我正在尝试使用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, .)) 

但是我不确定这是否是正确的方法,我将尝试向自己解释一下。 在测试数据中,我具有所有功能(月,日,星期,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

0 个答案:

没有答案