Ударенный с несколькими временными рядами, нуждаюсь в помощи.

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

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

формат данных

Дата Компания Продукт Регион Продажи
2024-11-4 Apple iPhone Азия 1300

аналогично у нас есть другие продукты Apple в различных регионах, теперь я надеюсь, вы поняли, как выглядят данные.

Примечание: разные временные ряды имеют разную сезонность

Я сопоставил колонки Компания, Продукт и Регион в одну колонку с номером, представляющим уникальное значение для каждой серии
как
[Apple, iPhone, Азия] = 1
[Apple, iPad, Азия] = 2
[Apple, Mac, Азия] = 3
[Apple, iPhone, Европа] = 4

Надеюсь, вы поняли.

Дата Серия Продажи
2024-11-4 1 1300

Продажи – это целевая переменная, извлеченные признаки, такие как день, месяц, квартал, day_from_start (time_idx)

Я реализовал Temporal Fusion Transformer

training= TimeSeriesDataSet(
    data=train_df, 
    time_idx='days_from_start',
    target="Sales",
    group_ids= ['Series'],
    min_encoder_length=max_encoder_length // 2,
    max_encoder_length=max_encoder_length,
    max_prediction_length=max_prediction_length,
    static_categoricals= ['Series'],
    time_varying_known_reals= ['day', 'day_of_week', 'month', 'days_from_start'],
    time_varying_unknown_reals=["Sales"],
    target_normalizer=GroupNormalizer(
        groups=["Series"], transformation="softplus"
    ),
)
validation = TimeSeriesDataSet.from_dataset(training, df, predict=True, stop_randomization=True)

batch_size = 32
train_dataloader = training.to_dataloader(train=True, batch_size=batch_size, num_workers=0)
val_dataloader = validation.to_dataloader(train=False, batch_size=batch_size, num_workers=0)
from pytorch_lightning.callbacks import EarlyStopping, LearningRateMonitor
from pytorch_lightning.loggers import TensorBoardLogger

early_stop_callback = EarlyStopping(monitor="val_loss", min_delta=1e-4, patience=5, verbose=True, mode="min")
lr_logger = LearningRateMonitor()
logger = TensorBoardLogger("lightning_logs")
import lightning as pl
from lightning.pytorch.callbacks import EarlyStopping, LearningRateMonitor
from lightning.pytorch.loggers import TensorBoardLogger

from pytorch_forecasting import TemporalFusionTransformer, QuantileLoss

early_stop_callback = EarlyStopping(monitor="val_loss", min_delta=1e-4, patience=5, verbose=True, mode="min")
lr_logger = LearningRateMonitor(logging_interval="epoch")
logger = TensorBoardLogger(save_dir="lightning_logs")

trainer = pl.Trainer(
    max_epochs=45,
    # accelerator="gpu", 
    devices=1,
    enable_model_summary=True,
    gradient_clip_val=0.1,
    callbacks=[lr_logger, early_stop_callback],
    logger=logger
)

tft= TemporalFusionTransformer.from_dataset(
    training,
    learning_rate= 0.03,
    hidden_size= 16,
    attention_head_size= 1,
    dropout= 0.1,
    hidden_continuous_size= 8,
    output_size= 1,
    loss= MeanSquaredError(),
    log_interval= 10
)```

пожалуйста, помогите мне, где я ошибаюсь или предложите лучший подход

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

Чтобы успешно решить проблему, с которой вы столкнулись при работе с многими временными рядами продаж, важно учитывать несколько ключевых аспектов. Вы уже сделали значительный шаг, применив Temporal Fusion Transformer (TFT) для предсказания данных. Однако давайте рассмотрим, как можно улучшить ваш подход и повысить качество ваших прогнозов.

Фокус на уникальных временных рядах

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

  1. Разделение моделей на группы: В зависимости от сложности данных, вы можете рассмотреть возможность использования отдельных моделей для различных групп товаров или регионов, где поведение продаж может значительно отличаться.

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

Улучшение предобработки данных

Следующий аспект — подготовка данных. Вы правильно извлекаете функции (такие как день месяца, месяц и т.д.), однако:

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

Настройка гиперпараметров

С точки зрения настройки гиперпараметров модели TFT:

  • Проверка learning_rate и hidden_size: Попробуйте выполнить сеточный или случайный поиск для tuning этих параметров. Рекомендую также протестировать разные значения dropout для предотвращения переобучения.
  • Увеличение максимального количества эпох: Если ваши данные разнообразны и обширны, может понадобиться большее количество эпох для достижения более глубокого обучения.

Работа с распределением целевой переменной

Поскольку продажи могут не всегда придерживаться нормального распределения:

  • Используйте нормализацию: Ваша текущая настройка с использованием GroupNormalizer является хорошей практикой. Однако стоитетельно проверить, как работает с данными, где есть выбросы или аномалии.
  • Измените функции потерь: Рассмотрите возможность использования других функций потерь, таких как Quantile Loss, которые могут лучше отражать ваши интересы в предсказании.

Результаты и валидация

Важным аспектом остается разделение обучающей и валидационной выборки. Убедитесь:

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

Заключение

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

Если проблема остается нерешенной, также имеет смысл обратиться к сообществам или форумы, где эксперты по Machine Learning могут предложить дополнительные рекомендации, основанные на других аналогичных ситуациях.

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

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