拆分数据以进行时间序列预测

splitting data for time series prediction

我正在寻找一个 R 包,它允许我进行 n-fold CV 类型超参数优化(例如 n = 10)。让我们说这是我可以用来调整超参数的数据(我倾向于使用 rBayesianOptimization 所以让我们抽象它):

dates <- seq(as.Date('2017-01-01'), as.Date('2019-12-31'), by = 'days')

df <- data.frame(date = dates)
df$y <- 42

这里的因变量 y 显然是一个众所周知的常量,它只是在没有被利用的情况下添加到这里。

我遇到了插入符函数 createTimeSlices,这可能是一种拆分数据的方法:

slices <- createTimeSlices(df$date, initialWindow = 365 * 2.5, horizon = 30, fixedWindow = TRUE)

我最终得到这样的列表:

List of 2
 $ train:List of 153
  ..$ Training0912.5: int [1:912] 1 2 3 4 5 6 7 8 9 10 ...
  ..$ Training0913.5: int [1:912] 2 3 4 5 6 7 8 9 10 11 ...
...   
  ..$ Training1010.5: int [1:912] 99 100 101 102 103 104 105 106 107 108 ...
  .. [list output truncated]
 $ test :List of 153
  ..$ Testing0912.5: num [1:30] 914 914 916 916 918 ...
  ..$ Testing0913.5: num [1:30] 914 916 916 918 918 ...

有人可以指点一下如何使用这个或者推荐我另一个包吗?就我个人而言,我对训练数据指数仅移动 1 天(?)感到有点困惑。我原以为它会改变 30 天(参见 horizon)。

谢谢。

我找到了一种使用受 Shambho's SO answer 启发的 createTimeSlices 的方法。

library(caret)

dates <- seq(as.Date('2017-01-01'), as.Date('2019-12-31'), by = 'days')

df <- data.frame(date = dates)
df$x <- 1
df$y <- 42

timeSlices <- createTimeSlices(1:nrow(df), initialWindow = 365 * 2, horizon = 30, fixedWindow = TRUE, skip = 30)

#str(timeSlices, max.level = 1)

trainSlices <- timeSlices[[1]]
testSlices <- timeSlices[[2]]

for (i in 1:length(trainSlices)) {

    train <- df[trainSlices[[i]],]
    test <- df[testSlices[[i]],]

    # fit and calculate performance on test to ultimately get average etc.

    print(paste0(min(train$date), " - ", max(train$date)))
    print(paste0(min(test$date), " - ", max(test$date)))
    print("")
}

对我来说关键是要指定跳过,否则 window 只会移动 1 天,最后会有很多“折叠”。