我正在尝试使用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模型来进行相同的预测。
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