Как предсказать набор временных рядов с помощью statsmodels Holt-Winters - PullRequest
2 голосов
/ 30 мая 2020

У меня есть набор данных с января 2012 года по декабрь 2014 года, которые показывают некоторые тенденции и сезонность. Я хочу сделать прогноз на следующие 2 года (с января 2015 года по декабрь 2017 года), используя метод Холта-Винтерса из statsmodels. Набор данных следующий:

date,Data
Jan-12,153046
Feb-12,161874
Mar-12,226134
Apr-12,171871
May-12,191416
Jun-12,230926
Jul-12,147518
Aug-12,107449
Sep-12,170645
Oct-12,176492
Nov-12,180005
Dec-12,193372
Jan-13,156846
Feb-13,168893
Mar-13,231103
Apr-13,187390
May-13,191702
Jun-13,252216
Jul-13,175392
Aug-13,150390
Sep-13,148750
Oct-13,173798
Nov-13,171611
Dec-13,165390
Jan-14,155079
Feb-14,172438
Mar-14,225818
Apr-14,188195
May-14,193948
Jun-14,230964
Jul-14,172225
Aug-14,129257
Sep-14,173443
Oct-14,188987
Nov-14,172731
Dec-14,211194

Что выглядит следующим образом:

enter image description here

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

# Data loading
data = pd.read_csv('setpoints.csv', parse_dates=['date'], index_col=['date'])
df_data = pd.DataFrame(datos_matric, columns=['Data'])

df_data['Data'].index.freq = 'MS'
train, test = df_data['Data'], df_data['Data']
model = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=12).fit()
period = ['Jan-12', 'Dec-14']
pred = model.predict(start=period[0], end=period[1])


df_data['Data'].plot(label='Train')
test.plot(label='Test')
pred.plot(label='Holt-Winters')
plt.legend(loc='best')
plt.show()

Это выглядит так:

enter image description here

Кто-нибудь теперь как это прогнозирует?

1 Ответ

1 голос
/ 30 мая 2020

Я думаю, вы здесь ошибаетесь. Вы не должны использовать одни и те же данные для train и test. Тестовые данные - это точки данных, которые ваша модель «еще не видела». Таким образом вы можете проверить, насколько хорошо работает ваша модель. Поэтому я использовал ваши данные за последние три месяца как test.

Что касается прогноза, мы можем использовать разные start и end точки.

Также обратите внимание, что я использовал mul как seasonal component, что лучше работает с вашими данными:

# read in data and convert date column to MS frequency
df = pd.read_csv(data)
df['date'] = pd.to_datetime(df['date'], format='%b-%y')
df = df.set_index('date').asfreq('MS')

# split data in train, test
train = df.loc[:'2014-09-01']
test = df.loc['2014-10-01':]

# train model and predict
model = ExponentialSmoothing(train, seasonal='mul', seasonal_periods=12).fit()
#model = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=12).fit()
pred_test = model.predict(start='2014-10-01', end='2014-12-01')
pred_forecast = model.predict(start='2015-01-01', end='2017-12-01')

# plot data and prediction
df.plot(figsize=(15,9), label='Train')
pred_test.plot(label='Test')
pred_forecast.plot(label='Forecast')
plt.legend()
plt.show()
plt.savefig('figure.png')

figure

...