Вопрос или проблема
Я пытаюсь использовать нейронную сеть LSTM для многошагового / многовыходного прогнозирования (я предсказываю несколько значений за одно время, зная некоторые значения из прошлого). Но я осознал, что должен быть осторожным при разделении моей унивариантной серии на обучающую и тестовую выборки. В этом посте я собираюсь поделиться тем, что, по моему мнению, необходимо сделать, но мне действительно хотелось бы узнать ваше мнение.
- $(X_k)_{1\leq k\leq N}$ обозначает мою унивариантную временную серию.
В основном многовыходные модели сложны, так как они обучаются для изучения зависимостей между входами и выходами, а также между выходами. Это может быть проблемой, поскольку я преобразую свою временную серию таким образом:
$ D = (x=(X_k, …, X_{k+p-1}) , y=(X_{k+p},…, X_{k+p+n-1}))_k $
где $p$ — это число моих шагов, а $n$ — это число моих выходов ($1 \leq k\leq N + 1 – (n+p)$). Я хочу разделить это на обучающую и тестовую выборки. Итак, я должен получить:
$ D_{\text{train}} = (x=(X_j, …, X_{j+p-1}) , y=(X_{j+p},…, X_{j+p+n-1}))_j $ где $j \leq N – 2(n+1) – p$
$ D_{\text{test}} = (x=(X_i, …, X_{i+p-1}) , y=(X_{i+p},…, X_{i+p+n-1}))_i $ где $i+p+n-1=N$
В этом случае я могу избежать переобучения из-за наивного разделения моего набора данных $D = D_{\text{train}} + D_{\text{test}}$, где $+$ обозначает оператор конкатенации (сохранение временной линии). Действительно, это могло бы привести к переобучению, на мой взгляд, так как у меня в обучающей выборке оказалась бы часть тестовой.
Для лучшего понимания давайте возьмем пример:
Моя унивариантная серия обозначена как $(X_1,…,X_6)$. Я хочу предсказать $n=2$ значения в будущем, зная $p=2$ значения ближайшего прошлого. Итак, я преобразую свой набор данных следующим образом:
$ D = (x=[(X_1,X_2),(X_2,X_3), (X_3,X_4)] , y=[(X_3,X_4),(X_4,X_5), (X_5,X_6)])$
Если я разделю его наивно, я получу:
$ D_{\text{train}} = (x=[(X_1,X_2),(X_2,X_3)] , y=[(X_3,X_4)])$
$ D_{\text{test}} = (x=[(X_3,X_4)], y=[(X_4, X_5)]) $
Я боюсь, что это приведет к переобучению, так как данные $(X_3, X_4)$ присутствуют в обоих наборах данных. Может, я неправ, поэтому и хочу знать 🙂
Не могли бы вы сказать мне, неправ ли я, и что вы об этом думаете?
Спасибо.
** Правки написаны жирным шрифтом **
Предположим, у вас есть данные о продажах за 36 месяцев, и вы хотите спрогнозировать на следующие 6 или 9 месяцев. Давайте создадим обучающие и тестовые данные в пропорции 70 и 30.
обучающие данные = 36*70/100= 26(округленное значение 25.2)
тестовые данные = 10(оставшаяся выборка)
Теперь мы построим модель на обучающих данных и спрогнозируем значения на тестовых данных (те 10 точек), чтобы измерить производительность модели, мы используем MAE или MSE, всегда значения MAE или MSE должны быть меньше. Как только ваша модель будет работать хорошо, спрогнозируйте на будущее 6-9 месяцев. т.е. многовыходное прогнозирование за одно время.
Ответ или решение
Разделение набора данных на обучающую и тестовую выборки для временных рядов, особенно в контексте многопериодного и многовыходного прогнозирования, является важной задачей, которая требует особого подхода. Ваша озабоченность по поводу возможности переобучения из-за неверного разделения данных обоснована, и я рад помочь вам разобраться в этой теме.
Исходные данные
Предположим, у вас есть одновременный временной ряд, обозначаемый как ( (Xk){1\leq k\leq N} ). Для задачи многопериодного многовыходного прогнозирования важно учитывать, что ваши данные состоят из следующих компонентов:
- ( p ) – количество шагов, которые вы хотите использовать для прогноза,
- ( n ) – количество значений, которые вы хотите предсказать одновременно.
Таким образом, вы формируете набор данных ( D = (x=(Xk, …, X{k+p-1}) , y=(X{k+p},…, X{k+p+n-1}))_k ).
Правильное разделение на обучающую и тестовую выборки
Первое, что необходимо отметить, – это принципы, по которым происходит разделение данных. В отличие от обычных задач машинного обучения, где данные могут быть разделены случайным образом, во временных рядах важно учитывать последовательность данных, чтобы избежать утечек информации и переобучения.
Шаги по разделению
-
Определение границ разбиения:
Для выбора границ, разделяющих обучающую и тестовую выборки, используйте данные с конца временного ряда:- Обучающая выборка: ( D_{\text{train}} = (x=(Xj, …, X{j+p-1}) , y=(X{j+p},…, X{j+p+n-1}))_j ), где ( j \leq N – 2(n + 1) – p ).
- Тестовая выборка: ( D_{\text{test}} = (x=(Xi, …, X{i+p-1}) , y=(X{i+p},…, X{i+p+n-1}))_i ), где ( i + p + n – 1 = N ).
-
Пример разделения:
Рассмотрим ваш пример с временным рядом ( (X_1, …, X_6) ), где вы хотите предсказать 2 значения при помощи 2 предыдущих значений:- Полный набор: ( D = (x=[(X_1,X_2),(X_2,X_3), (X_3,X_4)] , y=[(X_3,X_4),(X_4,X_5), (X_5,X_6)]) ).
- В этом случае правильным делением будет:
- Обучающая выборка: ( D_{\text{train}} = (x=[(X_1,X_2),(X_2,X_3)] , y=[(X_3,X_4)]) ).
- Тестовая выборка: ( D_{\text{test}} = (x=[(X_3,X_4)], y=[(X_4, X_5)]) ).
Обратите внимание, что в этом случае значения ( X_3 ) и ( X_4 ) не должны находиться в обеих выборках одновременно. Это способ избежать утечки информации (data leakage).
Общие рекомендации
- Объем выборки: На этапе подготовки данных подумайте о балансе между обучающей и тестовой выборками. Популярный подход – разделение 70/30 или 80/20, в зависимости от объема ваших данных.
- Метрики оценки: При оценке качества модели используйте метрики, такие как MAE (средняя абсолютная ошибка) или MSE (средняя квадратичная ошибка), чтобы удостовериться в стабильности и надежности вашей модели.
Заключение
Временные ряды представляют собой уникальную структуру данных, и подход к их разделению требует внимания к временной последовательности. Правильное разбиение на обучающую и тестовую выборки является критически важным для избегания переобучения и неточных прогнозов. Будьте внимательны к организации данных и следите за тем, чтобы в процессе обучения модель никогда не «видела» тестовые данные. Это обеспечит адекватность ваших прогнозов и позволит объективно оценить результаты работы модели.