Использование k-кратной перекрестной проверки для выбора модели временных рядов

70

Вопрос: Я хочу быть уверенным в чем-то, является ли использование перекрестной проверки в k-кратном порядке с временными рядами простым или нужно обратить особое внимание перед использованием?

Предыстория: я моделирую временной ряд 6 лет (с цепью полумарков) с выборкой данных каждые 5 минут. Чтобы сравнить несколько моделей, я использую 6-кратную перекрестную проверку, разделяя данные за 6 лет, поэтому мои тренировочные наборы (для расчета параметров) имеют длину 5 лет, а тестовые наборы имеют длину 1 год. Я не принимаю во внимание порядок времени, поэтому мои различные наборы:

  • сгиб 1: тренировка [1 2 3 4 5], тест [6]
  • сгиб 2: тренировка [1 2 3 4 6], тест [5]
  • сгиб 3: тренировка [1 2 3 5 6], тест [4]
  • сгиб 4: тренировка [1 2 4 5 6], тест [3]
  • сгиб 5: тренировка [1 3 4 5 6], тест [2]
  • сгиб 6: тренировка [2 3 4 5 6], тест [1].

Я выдвигаю гипотезу о том, что каждый год независимы друг от друга. Как я могу это проверить? Есть ли какая-либо ссылка, показывающая применимость перекрестной проверки в k-кратном порядке с временными рядами.

Микаэль С
источник
Посмотрите на эту статью, которую я нашел helful francescopochetti.com/...
Henok S Менгисту

Ответы:

69

Временные ряды (или другие внутренне упорядоченные данные) могут быть проблематичными для перекрестной проверки. Если какой-то шаблон появляется в 3-м году и остается в течение 4-6 лет, то ваша модель может его использовать, даже если он не был частью 1 и 2 лет.

Подход, который иногда более принципиален для временных рядов, - это прямая цепочка, где ваша процедура будет выглядеть примерно так:

  • сгиб 1: тренировка [1], тест [2]
  • сгиб 2: тренировка [1 2], тест [3]
  • сгиб 3: тренировка [1 2 3], тест [4]
  • сгиб 4: тренировка [1 2 3 4], тест [5]
  • сгиб 5: тренировка [1 2 3 4 5], тест [6]

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

Кен Уильямс
источник
1
Благодарю. Я понимаю, как сказал Зак, это канонический способ сделать это. И я понимаю почему. Проблема, с которой я столкнулся, заключается именно в том, что она будет учитывать изменение размера данных, поэтому я не получу «истинную» ошибку обобщения моей модели. Но смешанная ошибка: обобщение и размер данных. Знаете ли вы некоторые другие ссылки (кроме М.Хиндмана), которые имеют дело с перекрестной проверкой во временных рядах? Не поймите меня неправильно, это не я не доверяю тому, что вы говорите, и тому, что говорит мистер Хиндман, это имеет смысл. Мне просто нравится иметь несколько точек зрения на проблему
Mickaël S
Боюсь, я не знаю такой ссылки, но мне было бы интересно увидеть ее, если кто-то другой ее знает.
Кен Уильямс
1
@ Уэйн, я имею в виду, что это решение использует все больше и больше лет данных обучения в каждом случае. По моим данным, между годами есть определенная разница, но нет явной тенденции или сезонности.
Mickaël S
3
@Mickael: Вы можете использовать сложение 1: train [1 2] test [3]; сгиб 2: поезд [2 3] тест [4]; сгиб 3: тренировка [3 4], тест [5] и т. д., если вы беспокоитесь об использовании все большего и большего количества данных с каждым сгибом. Я предполагаю, что с техникой полу-MC вы не можете действительно карабкаться годами, даже если нет тенденции.
Уэйн
3
@ MickaëlS: я нашел этот документ sciencedirect.com/science/article/pii/S0020025511006773 и подумал, что он может представлять интерес. Они сравнивают этот «канонический» подход с двумя другими методами - «блок-надстройка» и «исключение из зависимости».
thebigdog
26

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

Чтобы сделать вещи интуитивно понятными, вот изображение для того же:

введите описание изображения здесь

Эквивалентный код R будет:

i <- 36    #### Starting with 3 years of monthly training data 
pred_ets <- c()
pred_arima <- c()
while(i <= nrow(dt)){
  ts <- ts(dt[1:i, "Amount"], start=c(2001, 12), frequency=12)

  pred_ets <- rbind(pred_ets, data.frame(forecast(ets(ts), 3)$mean[1:3]))
	  pred_arima <- rbind(pred_arima, data.frame(forecast(auto.arima(ts), 3)$mean[1:3]))

  i = i + 3
}
names(pred_arima) <- "arima"
names(pred_ets) <- "ets"

pred_ets <- ts(pred_ets$ets, start=c(2005, 01), frequency = 12)
	pred_arima <- ts(pred_arima$arima, start=c(2005, 01), frequency =12)

accuracy(pred_ets, ts_dt)
accuracy(pred_arima, ts_dt)
Джатин Гарг
источник
Есть ли способ сделать это для таких методов, как логистическая регрессия с использованием R?
hlyates
1
@hlyates, в моем понимании это возможно, вам просто нужно немного изменить вышеприведенный код. Включите pred_lr (прогнозы по логистической регрессии) и измените название столбцов соответственно.
Джатин
22

«Канонический» способ перекрестной проверки временных рядов (по крайней мере, как описано в @Rob Hyndman) - это «пролистать» набор данных.

то есть:

  • сгиб 1: тренировка [1], тест [2]
  • сгиб 2: тренировка [1 2], тест [3]
  • сгиб 3: тренировка [1 2 3], тест [4]
  • сгиб 4: тренировка [1 2 3 4], тест [5]
  • сгиб 5: тренировка [1 2 3 4 5], тест [6]

По сути, ваш тренировочный набор не должен содержать информацию, которая появляется после тестового набора.

Zach
источник
13

В большинстве случаев нет ничего плохого в использовании блоков «будущих» данных для перекрестной проверки временных рядов. В большинстве случаев я ссылаюсь на модели для стационарных данных, которые мы обычно используем. Например, когда вы подгоняете с к ряду, вы берете разностей ряда и подгоняете модель для стационарных данных к остаткам.d > 0 dARIMA(p,d,q)d>0d

Чтобы перекрестная проверка работала в качестве инструмента выбора модели, вам необходима приблизительная независимость между данными обучения и испытаний. Проблема с данными временных рядов заключается в том, что смежные точки данных часто сильно зависят, поэтому стандартная перекрестная проверка не удастся. Для этого необходимо оставить зазор между тестовым образцом и тренировочными образцами по обе стороны от тестового образца . Причина, по которой вам также необходимо пропустить пробел перед тестовым образцом, заключается в том, что зависимость является симметричной, когда вы движетесь вперед или назад во времени (подумайте о корреляции).

Этот подход называется перекрестной проверкой (оставьте out, удалите наблюдений с обеих сторон тестового образца) и описан в этой статье. В вашем примере это будет выглядеть так:v hhvvh

  • сгиб 1: тренировка [1 2 3 4 5h], тест [6]
  • сгиб 2: тренировка [1 2 3 4h h6], тест [5]
  • сгиб 3: тренировка [1 2 3 ч h5 6], тест [4]
  • сгиб 4: тренировка [1 2h h4 5 6], тест [3]
  • сгиб 5: тренировка [1 ч х 3 4 5 6], тест [2]
  • сгиб 6: тренировка [h2 3 4 5 6], тест [1]

Где h указывает, что h наблюдений обучающей выборки удаляются на этой стороне.

Матиас Шмидтблайхер
источник
3

Как прокомментировал @thebigdog, «Об использовании перекрестной проверки для оценки предиктора временных рядов» Bergmeir et al. обсуждает перекрестную проверку в контексте стационарных временных рядов и определяет прямую цепочку (предложенную другими ответчиками) как бесполезную. Обратите внимание, что прямая цепочка называется оценкой последнего блока в этой статье:

Используя стандартную 5-кратную перекрестную проверку, не было найдено никакого практического эффекта зависимостей в данных относительно того, была ли окончательная ошибка занижена или переоценена. Напротив, оценка последнего блока имеет тенденцию давать менее надежные показатели ошибок, чем перекрестная проверка и блокированная перекрестная проверка.

« Оценка моделей прогнозирования временных рядов: эмпирическое исследование методов оценки эффективности », Cerqueira et al. согласен с этой оценкой. Однако для нестационарных временных рядов они рекомендуют вместо этого использовать вариант Hold-Out, называемый Rep-Holdout. В Rep-Holdout точка aвыбирается во временном ряду, Yчтобы отметить начало данных тестирования. Точка aопределяется как находящаяся в окне. Это показано на рисунке ниже:

иллюстрация повторной задержки

Эта вышеупомянутая статья является длинной и исчерпывающей проверкой практически всех других методов, упомянутых в ответах на этот вопрос, с помощью общедоступного кода . Это включает в себя заявление @Matthias Schmidtblaicher о включении пробелов до и после данных тестирования. Кроме того, я только суммировал статью. Фактическое заключение статьи включает в себя дерево решений для оценки моделей временных рядов!

Seanny123
источник