Вопрос или проблема
Мы используем данные за целый год для предсказания определенной целевой переменной. Модель работает как данные – OneHot кодирование категориальных переменных – MinMaxScaler – PCA (для выбора подмножества из 2000 компонентов из 15к) – MLPRegressor. Когда мы проводим кросс-валидацию ShuffleSplit и всё выглядит отлично (значения r^2 выше 0.9 и низкие коэффициенты ошибок), однако в реальной жизни они не будут использовать данные в том же формате (например, данные за целый год), а скорее подмножество, которое ожидается в этом месяце (например, в марте им нужно, чтобы алгоритм предсказал строки, ожидаемые в марте), и на этом этапе алгоритм терпит неудачу.
Ожидание таково, что у нас есть некоторые данные (например, с декабря 2018 по декабрь 2019 года), на которых мы проводим обучение, а затем нам нужно предсказать элементы, ожидаемые в январе 2020 года (которые ещё недоступны). Снова, если мы делаем случайное разделение на обучающую, тестовую и валидационную выборки, значения r^2 превосходны, но руководитель группы не согласен с этим, так как он сказал, что реальный случай использования заключается в том, что мы обучаемся на данных 2019 года, а затем предсказываем на ежемесячной основе, так что он хочет, чтобы мы обучались не на всех данных, а только с декабря 2018 по ноябрь 2019 года, а затем проверяли на данных декабря 2019 года.
Я вижу, как это методически неправильно, так как мы обучаемся на данных, которые имеют разные свойства (данные за целый год против данных, ожидаемых за конкретный месяц), и это отражается на результатах валидации. Если я изолирую определённый месяц, чтобы смоделировать реальный сценарий (например, обучаться на данных за 11 месяцев и тестировать на одном конкретном месяце), в зависимости от месяца мы получаем значения r^score между 0.3 и 0.7 в зависимости от изолированного месяца (что сильно отличается от 0.9, если выборка была случайной из всего набора данных).
Что я не могу понять, так это как мы можем структурировать это моделирование так, чтобы тестовые данные (элементы, ожидаемые в конкретном месяце) имели те же свойства, что и обучающая выборка (остальные месяцы, или, возможно, 12 месяцев, включая 1 месяц с прошлого года), сохраняя информацию за весь год? Или нам следует создавать 12 моделей для каждого месяца?
Похоже, ваша проблема состоит в предсказании значения для конкретного месяца, исходя из исторических данных. Это можно смоделировать как задачу временного ряда.
Кроме того, вы также говорите, что стратегия работы с данными изменялась с течением времени. Это означает, что вы не можете сделать предположение о стационарном процессе.
Ответ или решение
Чтобы оптимально структурировать данные для эксперимента или обучения модели с учетом временных месяцев, важно учитывать несколько ключевых аспектов, которые обеспечивают не только точность, но и применимость вашей модели в реальных условиях. Давайте углубимся в этот процесс.
1. Понимание проблемы
Ваша задача заключается в предсказании значения целевой переменной на основе данных, имеющихся за определенный период (например, с декабря 2018 по ноябрь 2019 года) с последующей оценкой модели на данных за декабрь 2019 года. Данные за разные месяцы могут существенно различаться по фактору сезонности, активным (или неактивным) событиям и внутренним корреляциям, что приводит к разным свойствам.
2. Стратегия разделения данных
Как вы отметили, простое случайное распределение данных может привести к переобучению модели, когда она выдает высокие значения r², не отражая реальных кейсов. Для решения этой проблемы можно использовать временную проверку разбиения данных (Time-Based Split). Это означает, что ваш тренировочный набор должен состоять только из данных, предшествующих тестовым данным.
- Тренировочный набор: Декабрь 2018 – Ноябрь 2019
- Тестовый набор: Декабрь 2019
Такой подход обеспечивает соответствие предсказательной модели реальным условиям, потому что вы обучаете модель на исторических данных, которые могут использоваться для предсказания будущих значений.
3. Учет специфики каждого месяца
Каждый месяц может иметь свои уникальные характеристики и шаблоны. Вместо создания одной модели для всех месяцев, вы можете рассмотреть возможность построения отдельных моделей. Например:
- 12 моделей для каждого месяца: Каждая модель будет адаптирована к специфическим паттернам и однородности данных за конкретные месяцы. Это позволит наиболее точно учитывать сезонность и другие временные изменения.
Однако такой подход может усложнить процесс обслуживания моделей, и вам, возможно, придется переобучать каждую модель с учетом новых данных по мере их поступления.
4. Использование временных рядов
Рассмотрите возможность применения методов анализа временных рядов, таких как ARIMA, SARIMA или модели, основанные на LSTM (долговременная краткосрочная память) для обработки временной зависимости. Эти модели могут быть более устойчивы к временным изменениям и сезонным паттернам, чем традиционные регрессионные модели.
5. Явные специальные признаки
Создайте дополнительные явные признаки на основе временных данных, такие как:
- Month: Номер месяца
- Year: Год
- Season: Учет сезона для выявления влияния.
- Lag features: Значения целевой переменной за предыдущие месяцы, которые могут оказать влияние на текущую оценку.
6. Валидация и метрики
Помните о корректной валидации результатов. Используйте k-fold временной валидации для проверки, что модель действительно хорошо обрабатывает временные аспекты. Это позволит вам гибко адаптироваться к особенностям данных и избегать подвохов случайного выбора сегментов данных.
Итог
Ваша задача требует комплексного подхода, где каждое решение ориентировано на использование временной информации. Сфокусируйтесь на обучении моделей, способных полноценно учитывать специфику каждого месяца, а также учитывайте важность применения методов временных рядов для достижения лучших показателей. Знание динамики и временных изменений данных позволит вам создать надежную и эффективную модель, адаптированную к реальным условиям.
Таким образом, вы сможете улучшить качество ваших прогнозов и работа вашей модели будет ближе к реальным потребностям бизнеса.