Вопрос или проблема
Я использую модель Prophet
для прогнозирования временных рядов с целью предсказания ежемесячных расходов. Однако я заметил проблему, при которой мои прогнозы показывают неожиданные всплески в будущих значениях. Вот краткий обзор моего процесса:
- Данные: У меня есть набор данных временных рядов с ежемесячными расходами за несколько лет. Данные предварительно обработаны с помощью расширенных функций, таких как лаговые переменные (
lag_1
доlag_6
), скользящие средние (ma_6
,ma_3
) и скользящие стандартные отклонения. - Сезонность: Я динамически анализировал сезонность с помощью
seasonal_decompose
и добавил сезонные компоненты для годовых и квартальных паттернов. - Моделирование: Я подогнал модель
Prophet
с динамической конфигурацией сезонности на основе анализа сезонности. Модель обучена с регрессорами, такими какtahun
,bulan
,quarter
,ma_6
и лаговые функции. - Прогнозирование: После обучения я прогнозирую будущие значения (на 42 месяца вперед), динамически обновляя лаги на каждой итерации.
Несмотря на то что модель достаточно хорошо подходит к обучающим и тестовым данным, прогнозируемые значения демонстрируют всплески, особенно в более поздних периодах. Я пытаюсь понять, почему модель ведет себя таким образом и как я могу улучшить прогнозы.
Вот упрощенная версия моего цикла прогнозирования для будущих периодов:
# Цикл прогнозирования на будущее
for i in range(future_periods):
future_input = {
'ds': lags['ds'],
'tahun': lags['ds'].year,
'bulan': lags['ds'].month,
'quarter': lags['ds'].quarter,
'ma_6': lags['ma_6'],
'ma_3': lags['ma_3'],
'rolling_std': lags['rolling_std']
}
for lag in range(1, 7):
future_input[f'lag_{lag}'] = lags[f'lag_{lag}']
future_df = pd.DataFrame([future_input])
# Прогноз Prophet
prophet_forecast = prophet_model.predict(future_df)
final_prediction = max(prophet_forecast['yhat'].values[0], 0)
predictions.append(final_prediction)
# Обновление лагов
lags['ds'] = forecast_dates[i + 1] if i + 1 < future_periods else lags['ds']
for j in range(6, 1, -1):
lags[f'lag_{j}'] = lags[f'lag_{j-1}']
lags['lag_1'] = final_prediction
lags['ma_6'] = np.mean([lags[f'lag_{k}'] for k in range(1, 7)])
lags['ma_3'] = np.mean([lags[f'lag_{k}'] for k in range(1, 4)])
lags['rolling_std'] = np.std([lags[f'lag_{k}'] for k in range(1, 7)])
Наблюдения:
- Модель, похоже, резко реагирует на незначительные колебания лагов и скользящих средних в самых недавних месяцах, что приводит к значительным изменениям в прогнозах.
Что я пробовал:
- Я добавил расширенные функции и лаги для учета более детализированных паттернов, но всплески остаются.
- Я пытался отрегулировать шкалу предварительного изменения точки и шкалу предварительной сезонности, но это не решило проблему.
- Я ограничил максимальное значение прогнозов, чтобы избежать экстремальных всплесков, но модель продолжает выдавать нестабильные результаты.
Вопросы:
- Почему модель показывает такие всплески в будущих прогнозах, особенно после определенного момента?
- Как я могу настроить модель или шаги предварительной обработки, чтобы сгладить всплески и получить более стабильные прогнозы?
- Может ли динамическое обновление значений лагов привести к нестабильности модели, и если да, то как я могу решить эту проблему?
Ответ или решение
Почему модель Prophet выводит пики в прогнозах на будущее?
Проблема и ее контекст
Ваши наблюдения о неожиданных пиках в прогнозах временных рядов, особенно в более поздних периодах, представляют собой распространенную ситуацию при использовании модели Prophet. Эти пики могут возникать из-за различных факторов, связанных как с самим моделированием, так и с обработкой данных. Давайте подробно рассмотрим возможные причины и рекомендации для их устранения.
Причины возникновения пиков
-
Чувствительность к последним данным: Модель Prophet может быть довольно чувствительной к изменчивости последних наблюдений в данных. Если в последние месяцы были резкие изменения или аномалии (например, высокая волатильность в ваших расходах), это может привести к резким колебаниям в прогнозах, так как модель пытается "дополнить" эти изменения в будущем.
-
Параметры модели: Числовые параметры, такие как "changepoint prior scale" и "seasonality prior scale", управляют тем, насколько модель восприимчива к изменениям. Если они установлены слишком высоко, модель будет генерировать резкие изменения даже из небольших колебаний в данных.
-
Динамическое обновление лагов: Ваш подход к обновлению значений лагов может создавать дополнительную шумность. Резкое изменение последнего наблюдения (через лаги или скользящие средние) может иметь непропорционально сильное влияние на последующие прогнозы.
Рекомендации по улучшению прогнозов
-
Сглаживание данных: Рассмотрите возможность применения более агрессивного сглаживания данных перед их подачей в модель. Это может снизить влияние краткосрочных колебаний. Например, использование экспоненциального сглаживания или дополнительных методов фильтрации может помочь.
-
Настройка параметров модели: Поскольку вы уже пытались настраивать параметры модели, стоит сделать это снова, проведя серию экспериментов с меньшими значениями для "changepoint prior scale" и "seasonality prior scale". Это позволит модели быть менее чувствительной к изменениям в данных.
-
Устранение динамического обновления лагов: Вместо динамического обновления значений лагов, попробуйте использовать фиксированные значения или менее чувствительные инструменты. Это позволит избежать резких изменений в будущих прогнозах, что может снизить вероятность появления пиков.
-
Анализ отстающих показателей и дополнительных переменных: Если возможно, попробуйте исследовать влияние внешних факторов (например, экономических показателей или сезонных трендов) и добавьте их в модель. Это может помочь модели лучше захватывать более широкие тренды, а не сосредотачиваться на резких изменениях.
-
Проверка на аномалии: Периодически проверяйте данные на наличие аномальных значений. Вы можете использовать методы обнаружения аномалий для анализируемой последовательности и исключить или скорректировать такие значения.
Заключение
Ваша ситуация с пиками в прогнозах при использовании модели Prophet является типичной, и сопутствующие причины, как правило, связаны с чувствительностью модели к колебаниям и параметрами, которые необходимо точно настраивать. Вышеописанные рекомендации могут помочь вам улучшить результаты и добиться более стабильного прогноза. Не забывайте тестировать каждое изменение на валидационном наборе данных, чтобы убедиться в его эффективности.