Разделение данных на обучающую и тестовую выборки для регрессии

Вопрос или проблема

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

Мой вопрос заключается в том, как разделить данные на обучающую и тестовую выборки.

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

Это имеет смысл или мне следует разделить данные случайным образом?

Попробуйте сделать разбиение на основе времени. Например: если у вас данные за 1 год, первые 1-8 месяцев для обучения, 9-10 для валидации, 11-12 для тестирования. После этого лучшим вариантом будет использование метода скользящего окна для создания задачи машинного обучения, используя продажи за последние 10-15 дней плюс статические и динамические характеристики дня для прогнозирования продаж на день или на следующий день.

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

data = train + validation + test
        |            |         |
        V            V         V
     (2 года)  (2 месяца)  (2 месяца)

  1. Разобрать колонку с датами.
  2. Преобразовать колонку с датами в индекс для датафрейма.
  3. Данные должны быть разделены по времени/дате.

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

https://www.analyticsvidhya.com/blog/2018/09/multivariate-time-series-guide-forecasting-modeling-python-codes/

Надеюсь, это поможет.

Вы можете использовать разбиение временных рядов из sklearn здесь.

Как это работает

Ответ или решение

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

1. Временное разделение данных

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

  • Обучающая выборка: Данные за первые 8 месяцев (или 2/3 года).
  • Валидационная выборка: Данные за последние 2 месяца, которые можно использовать для подбора гиперпараметров.
  • Тестовая выборка: Данные за последний месяц, предназначенные для окончательной проверки качества модели.

2. Реализация разделения данных

  • Парсинг столбца даты: Убедитесь, что у вас есть столбец с датами, и преобразуйте его в формат даты, если это необходимо.
  • Установка индекса: Установите колонку с датами в качестве индекса вашего DataFrame.
  • Использование временного индекса: Разделите данные по времени, так чтобы будущие наблюдения оставались вне обучающей выборки.

Пример кода на Python с использованием библиотеки pandas:

import pandas as pd

# Предполагаем, что your_data - это ваш DataFrame
your_data['date'] = pd.to_datetime(your_data['date'])
your_data.set_index('date', inplace=True)

train_data = your_data['2019-01-01':'2019-08-31']
validation_data = your_data['2019-09-01':'2019-10-31']
test_data = your_data['2019-11-01':'2019-12-31']

3. Дальнейшие советы

  1. Скользящее окно: Рассмотрите возможность использования метода скользящего окна для подготовки задачи обучения. Например, используйте данные за последние 10-15 дней для предсказания объемов продаж на следующий день. Это позволит модели лучше учитывать недавние тренды.

  2. Мультивариантный временной ряд: Убедитесь, что в модели учтены все релевантные переменные (факторы), так как это может улучшить прогнозы. Разработка такой модели потребует особенного подхода.

  3. Временной разбиение из scikit-learn: Вы также можете использовать функцию TimeSeriesSplit из библиотеки scikit-learn для создания множества разбиений и улучшения надежности вашей модели.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...