результаты модели arima сдвинуты - Python - PullRequest
0 голосов
/ 25 мая 2020

У меня есть набор данных временных рядов. Я использую python, pandas и statsmodels, чтобы попытаться спрогнозировать следующий месяц моих данных.

У меня есть данные за день:

enter image description here

Сначала я запускаю autoarima, чтобы посмотреть, какие переменные мне нужно добавить в мою модель Sarimax:

auto_arima(df['data'],seasonal=True,m=7).summary()

enter image description here

Я обучаю свою модель с этими параметрами:

train = df.loc[:'2019-12-31']
test = df.loc['2020-01-01':'2020-01-31']

model = SARIMAX(train['n_transactions'],order=autoarima.order,seasonal_order= autoarima.seasonal_order)
results = model.fit()
start=len(train)
end=len(train)+len(test)-1
predictions = results.predict(start=start, end=end, dynamic=False, typ='levels').rename(f'Daily SARIMA{autoarima.order}{autoarima.seasonal_order} Predictions')


ax = test['n_transactions'].plot(legend=True,figsize=(12,6))
predictions.plot(legend=True)
ax.autoscale(axis='x',tight=True)
ax.set(xlabel=xlabel, ylabel=ylabel);

enter image description here

SARIMA MSE Error: 4.088022969
SARIMA RMSE Error: 2.021885993
SARIMA average:         8.7
SARIMA std: 4.539544925
results.plot_diagnostics(figsize=(16, 8))
plt.show()

enter image description here

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

all_df = pd.DataFrame()
test = df.iloc[-62:]
i = -62
for index, row in test.iterrows():

    train = df.iloc[:i:]
    model = SARIMAX(train['n_transactions'],order=autoarima.order,seasonal_order= autoarima.seasonal_order)
    results = model.fit()
    start = len(train)
    end = len(train)
    predictions = results.predict(start=start, end=end, dynamic=False, typ='levels')
    test_df = pd.DataFrame(columns = {'predictions'})
    test_df['predictions'] = predictions
    all_df = pd.concat([all_df, test_df], axis=0, sort=False)
    i += 1

ylabel='n_transactions'
xlabel=''

ax = test['n_transactions'].plot(legend=True,figsize=(12,6))
all_df['predictions'].plot(legend=True)
ax.autoscale(axis='x',tight=True)
ax.set(xlabel=xlabel, ylabel=ylabel);

enter image description here

Может быть. На изображении ниже видно, что однажды модель получает сдвиг в хорошем прогнозе. Есть ли способ исправить это?

...