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

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

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

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

Это также влияет на разработку функций. (но это тема для другого дня) Так почему мы должны по-разному относиться к временным рядам?

Без смеси

Большинство общих методов перекрестной проверки неверны, когда речь идет о данных / проблемах временных рядов. Передискретизация начальной загрузки (кроме начальной загрузки временных рядов), k-кратная или стратифицированная k-кратная перестановка данных перетасовывает данные и не гарантирует, что в ваших свернутых данных валидации будет такая же согласованность по сравнению с фактическим набором тестов. Фактически, напомним, что ваши тестовые данные относятся к некоторому периоду из будущего.

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

В kaggle мы часто сталкиваемся с так называемой встряской в ​​таблице лидеров. Это происходит по таким причинам, как

1. переобучение на небольшом% тестовой выборки (оценки в таблице лидеров)

2. Распределение тестового набора отличается от валидации, что приводит к неправильному выбору модели.

(Это определенно тема другого уровня) Но я хочу указать на важность проверки, особенно для данных временных рядов. Иначе гнилые яблоки не отличишь!

Большинство моделей / задач временных рядов в действительности также увеличивается в размерах. Например, наши обучающие данные растут каждый период времени. Мы можем прогнозировать краткосрочный период (в следующем месяце) или экстраполировать некоторый горизонт h в зависимости от того, используем ли мы классические модели временных рядов, машинное обучение или нейронные сети. В последующий период мы получим больше данных, и процесс повторится. Кроме того, в большинстве случаев модель должна быть подогнана / обучена новым данным, прежде чем можно будет снова спрогнозировать горизонт h.

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

Идем вперед

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

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

Профессор Роб Хайндман очень хорошо иллюстрирует эту концепцию на диаграмме выше. Фактически, мы делаем «множественное» разбиение по разному периоду времени, при этом обучающие данные расширяются в каждом сгибе. Во многих случаях, особенно в той работе, которую я лично выполняю для прогнозирования спроса на продукцию, это дает более надежную оценку эффективности вашей модели.

Затем мы усредняем производительность для разных складок на основе выбранной вами метрики (например, MAPE, WMAPE ... и т. Д.).

Конечно, ходовая проверка не ограничивается только расширением на один период. Вот где вы хотели бы как можно точнее сопоставить свои тестовые данные. В зависимости от частоты ваших данных, типа модели (arima, ets, GBM… и т. Д.) Или даже от вашей цели вы можете захотеть определить различную начальную длину, период сбора данных, а также горизонт для проверки.

Мое решение Python - вперед cv

Если вы используете пакет прогнозов профессора Хайндмана в R, вы можете просто вызвать функцию tsCv, которая оборачивается вокруг. Вам нужно будет определить функцию, которая принимает ваши данные x, а также горизонт h, которые вам нужно будет уместить в tsCv ().

#Fit an AR(2) model to each rolling origin subset far2 <- function(x, h){forecast(Arima(x, order=c(2,0,0)), h=h)} 
e <- tsCV(lynx, far2, h=1)  #Fit the same model with a rolling window of length 30 e <- tsCV(lynx, far2, h=1, window=30) 

Но пользователям Python не повезло. Для sklearn существует разделение временных рядов. Но он не позволяет настраивать начальный период обучения (что важно, например, если вы хотите тренироваться с минимальным объемом данных за 2–3 года для учета сезонности), определите период данных, которые будут добавляться на каждом этапе. шаг вперед и горизонт h. Версия Sklearn позволяет нам определять только n_splits, где разделение между поездом и проверкой определяется следующим образом:

Таким образом, я написал свою собственную версию расширяющегося окна, которая следует грамматике sklearn ниже:

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

Закрытие

Перекрестная проверка временных рядов не ограничивается перекрестной проверкой с прямым ходом. Также можно использовать подход «скользящего окна», и профессор Хайндман также обсудил в своем учебнике самонастройку временных рядов. Возможно, я коснусь этого в другом посте. Но пока надеемся, что подход с расширяющимся окном предоставит более простой метод тестирования на истории данных временных рядов!