Використання 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-кратної з часовими рядами.


Погляньте на цю статтю, яку я знайшов корисною francescopochetti.com/…
Henok S Mengistu

Відповіді:


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

Боюся, я не знаю такої посилання, але мені було б цікаво подивитися її, якщо хтось ще її знає.
Ken Williams

1
@Wayne, я маю на увазі, що це рішення використовує все більше і більше років тренувальних даних на кожному етапі. У моїх даних, безумовно, є різниці між роками, але жодної видимої тенденції чи сезонності.
Mickaël S

3
@Mickael: Ви можете використовувати складку 1: поїзд [1 2] тест [3]; складка 2: поїзд [2 3] тест [4]; складіть 3: тренуйте [3 4] тест [5] тощо, якщо ви турбуєтесь про те, щоб використовувати більше та більше даних з кожним складанням. Я здогадуюсь, що за допомогою напівмобільної техніки ви не зможете реально подолати роки, навіть якщо немає тенденції.
Уейн

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?
Хлатес

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]

В основному, ваш навчальний набір не повинен містити інформації, яка виникає після тестового набору.


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 3h h5 6], тест [4]
  • складка 4: тренування [1 2h h4 5 6], тест [3]
  • складка 5: тренування [1h h3 4 5 6], тест [2]
  • складка 6: тренування [h2 3 4 5 6], тест [1]

Там, де h вказує, що h спостереження з навчального зразка видаляються на цій стороні.


3

Як коментують @thebigdog, "Про використання перехресної валідації для прогнозування часових рядів" Bergmeir та ін. обговорює перехресну валідацію в контексті стаціонарних часових рядів і визначає, що Forward Chaining (запропонований іншими відповідями) не є корисним. Зауважте, в цьому документі Forward Chaining називається Оцінка останнього блоку:

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

" Оцінка моделей прогнозування часових рядів: емпіричне дослідження методів оцінки ефективності " Cerqueira et al. погоджується з цією оцінкою. Однак для нестаціонарних часових рядів вони рекомендують замість цього використовувати варіант утримування, який називається Rep-Holdout. У Rep-Holdout aв часовому ряду вибирається точка, Yщоб позначити початок даних тестування. Точка aвизначається у вікні. Це проілюстровано на малюнку нижче:

ілюстрація повторного проведення

Цей згаданий документ довгий і вичерпно перевіряє майже всі інші методи, згадані у відповідях на це питання, з загальнодоступним кодом . Сюди входить заява @Matthias Schmidtblaicher про включення прогалин до і після даних тестування. Також я лише підсумував папери. Фактичний висновок статті включає дерево рішень для оцінки моделей часових рядів!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.