Подставка пакета 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-го наблюдения, оно расширяет до n наблюдений.
- Переменные горизонты прогноза: вместо добавления 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
Я ищу способы улучшить свой существующий код, а также способы добавления переменных приращений к обучающему набору каждый раз.
Спасибо