Подтвердить что ты не робот

Использование Holt-Winters для прогнозирования в Python

Я пытаюсь использовать эту реализацию алгоритма Holt-Winters для прогнозирования временных рядов на Python, но столкнулся с контрольно-пропускным пунктом... в основном, для некоторых рядов (положительных) входов он иногда прогнозирует отрицательные числа, что явно не так. Даже если прогнозы не являются отрицательными, они иногда дико неточны - на порядок выше/ниже, чем они должны быть. Предоставление алгоритма большего количества периодов данных для работы не помогает, и на самом деле часто делает прогноз хуже.

Данные, которые я использую, имеют следующие характеристики, которые могут быть проблемы:

  • Очень часто сэмплированные (по одной точке данных каждые 15 минут, в отличие от ежемесячных данных, как пример) - но из того, что я прочитал, алгоритм Holt-Winters не должен иметь проблемы с этим. Возможно, это указывает на проблему с реализацией?

  • Имеет многократные периодичности - есть ежедневные пики (т.е. каждые 96 точек данных), а также еженедельный цикл выходных данных, значительно ниже, чем данные в будние дни - например, будние дни могут достигать около 4000, а выходные дни - на 1000 - но даже когда я даю только данные по будним дням, я сталкиваюсь с проблемой отрицательного числа.

Есть ли что-то, чего мне не хватает ни в реализации, ни в моем использовании алгоритма Holt-Winters вообще? Я не статистик, поэтому я использую "значения по умолчанию" альфа, бета и гамма, указанные в ссылке выше, - это, вероятно, проблема, и есть ли лучший способ рассчитать эти значения?

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

Любая помощь/ввод будет с благодарностью!

4b9b3361

Ответ 1

Я пытался генерировать случайные данные, пока не получил интересные результаты. Здесь я кормился всеми положительными цифрами и получал отрицательные прогнозы:

y = [0.92, 0.78, 0.92, 0.61, 0.47, 0.4, 0.59, 0.13, 0.27, 0.31, 0.24, 0.01]
holtwinters(y, 0.2, 0.1, 0.05, 4)

...
forecast: -0.104857182966
forecast: -0.197407475203
forecast: -0.463988558577
forecast: -0.258023593197

но обратите внимание, что прогноз соответствует отрицательному наклону данных.

Это могут быть порядки, о которых вы говорили:

y = [0.1, 0.68, 0.15, 0.08, 0.94, 0.58, 0.35, 0.38, 0.7, 0.74, 0.93, 0.87]
holtwinters(y, 0.2, 0.1, 0.05, 4)

...
forecast: 1.93777559066
forecast: 3.11109138055
forecast: 0.910967977635
forecast: 0.684668348397

Но я не уверен, как вы сочтете это дико неточным или судите, что это "должно быть" ниже.


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

Ответ 2

Вначале, если вы не уверены в своей конкретной реализации алгоритма, я рекомендую вам создать для этого тестовый файл. Возьмите другую реализацию, возможно, Matlab, что угодно, все, что вы знаете, это работает. Создайте несколько входов, передайте их в ссылку и в свою реализацию, и она должна быть идентичной. Таким образом, я перевел и проверил некоторые алгоритмы из Matlab. scipy.io.loadmat отлично подходит для этого.

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

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

Ответ 3

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

Это очень плохой метод, который не должен использоваться, поскольку тренд будет быть предвзятым по сезонной схеме. Представьте себе сезонный шаблон, например, где последний период года всегда является самым большим значение за год. Тогда тренд будет смещен вверх. К сожалению, Боверман, Оконнелл и Кёлер (2005) не чтобы рекомендовать плохие методы. Я видел подобное, и хуже, процедуры, рекомендованные в других книгах. [1]

лучший метод si разложения временных рядов в тренде и сезонности [1]

[1] http://robjhyndman.com/hyndsight/hw-initialization/

Ответ 4

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

1 - Прежде чем применять Holt-Winters, может быть важно проверить, является ли ваш временной ряд стационарным и, если это не так, дифференцировать его для достижения этого свойства, что помогает с точностью.

2 - Данные могут периодически меняться со временем, и, как представляется, тенденция может быть частью большого сезонного периода. Если это ваш случай (и это так), возможно, вам следует применять Holt-Winters дважды, один раз для каждого сезонного периода, так как он не может справляться с несколькими периодичностью, а затем анализировать, что лучше подходит в вашем сценарии.

3 - Может быть важным экспериментировать с различными параметрами сглаживания (альфа, бета и гамма). Чем они важнее, тем важнее последние последние наблюдения и последние вычисленные компоненты. Попробуйте найти адаптивную реализацию Holt-Winters, которая автоматически адаптирует эти параметры, чтобы увидеть, что происходит.

Я рекомендую вам использовать язык R, который содержит адаптивную и простую в использовании реализацию Holt-Winters, предоставляемую через пакет прогноза, поэтому вы можете легко экспериментировать с различными конфигурациями.

Ответ 5

То, что вы наблюдаете, есть периодичность в ваших данных, означает, что вы также должны попытаться использовать модель, которая может выражать такие характеристики.

Holt-Winters - простая модель сглаживания, которая не может выразить это.

Классический подход заключается в том, чтобы взглянуть на модель ARMA (Autoregressive Moving Average) и ее естественное расширение модели SARIMA (сезонно скорректированная...).

Bottom Line: Это действительно вопрос статистики. Одним из лучших текстов на эту тему является "Эконометрика" Маддалы.