Имитация createFolds с использованием перекрестной проверки временных рядов - PullRequest
4 голосов
/ 06 октября 2011

Подставка пакета R предоставляет удобную функцию createFolds , которая возвращает список индексов для обучающих наборов, которые будут использоваться при перекрестной проверке:

set.seed(1)
require(caret)
x <- rnorm(10)
createFolds(x,k=5,returnTrain=TRUE)

$Fold1
[1]  1  2  5  6  7  8  9 10

$Fold2
[1]  1  3  4  5  6  8  9 10

$Fold3
[1]  1  2  3  4  5  7  8 10

$Fold4
[1] 1 2 3 4 6 7 8 9

$Fold5
[1]  2  3  4  5  6  7  9 10

Я хотел бы создатьаналогичная функция, за исключением того, что я хочу вернуть список индексов, которые будут использоваться в перекрестной проверке временных рядов .Я нашел пример кода в R , но я хочу обобщить и функционализировать вещи больше.Вот то, что я изначально придумал:

createTSfolds <- function(y, Min=max(frequency(y),3)) {
    i <- seq(along=y)
    stops <- i[Min:(length(i)-1)]
    starts <- rep(1,length(stops))
    out <- mapply(seq,starts,stops)
    names(out) <- paste("Fold", gsub(" ", "0", format(seq(along = out))), sep = "")
    out
}
createTSfolds(x)

$Fold1
[1] 1 2 3

$Fold2
[1] 1 2 3 4

$Fold3
[1] 1 2 3 4 5

$Fold4
[1] 1 2 3 4 5 6

$Fold5
[1] 1 2 3 4 5 6 7

$Fold6
[1] 1 2 3 4 5 6 7 8

$Fold7
[1] 1 2 3 4 5 6 7 8 9

(Min - минимальное количество наблюдений, необходимое для подгонки модели)

Эта функция пока работает довольно хорошо, но я бы хотелдобавить 2 функции, которые Роб Хиндман обсуждает :

  1. Оконное управление: вместо обучающего набора, продолжающегося до 1-го наблюдения, оно расширяет до n наблюдений.
  2. Переменные горизонты прогноза: вместо добавления 1 индекса к тренировочному набору каждый раз, добавьте k к обучающему набору каждый раз.

Вот как я реализовал управление окнами:

createTSfolds <- function(y, Min=max(frequency(y),3), lookback=NA) {
    i <- seq(along=y)
    stops <- i[Min:(length(i)-1)]
    if (is.na(lookback)) { 
        starts <- as.list(rep(1,length(stops)))
        out <- mapply(seq,starts,stops)
    } else {
        starts <- stops-Min+1
        out <- mapply(seq,starts,stops)
        out <- split(t(out),1:nrow(t(out)))
    }
    names(out) <- paste("Fold", gsub(" ", "0", format(seq(along = out))), sep = "")
    out
}
createTSfolds(x,Min=4,lookback=4)

Я не могу понять, как реализовать переменные горизонты прогноза, которые выглядели бы так: Например, если k = 3:

$Fold1
[1] 1 2 3

$Fold2
[1] 1 2 3 4 5 6

$Fold3
[1] 1 2 3 4 5 6 7 8 9

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

Спасибо

1 Ответ

3 голосов
/ 06 октября 2011

Вот один из подходов.Это не совсем надежно, так как я не уверен насчет вывода, который вы ищете, когда присутствуют оба параметра lookback и k.Дайте мне знать, если это то, что вы искали.

 createTSfolds2 <- function(y, Min = max(frequency(y), 3), lookback = NA, k = NA){
   out = llply(Min:(length(y) - 1), seq)
   if (!is.na(k)) {out = out[seq(1, length(out), k)]}
   if (!is.na(lookback)) {
     out = plyr::llply(out, function(z) z[(length(z) - lookback + 1):length(z)])
   }
   names(out) <- paste("Fold", gsub(" ", "0", format(seq(along = out))), sep = "")
   return(out)
 }

createTSfolds2(x, Min = 3, lookback = NA, k = 3)

$Fold1
[1] 1 2 3

$Fold2
[1] 1 2 3 4 5 6

$Fold3
[1] 1 2 3 4 5 6 7 8 9

createTSfolds2(x, Min = 3, lookback = 3, k = 3)

$Fold1
[1] 1 2 3

$Fold2
[1] 4 5 6

$Fold3
[1] 7 8 9
...