为什么SARIMA精度会提高?

时间:2019-12-10 10:41:37

标签: python machine-learning graph prediction arima

我正在尝试着手ARIMA和SARIMA。 我有一个在海岸出售的三明治的数据集。

Data + differencing

在上图中显示了我的数据+我正在使用使其保持平稳的差异。

smodel = auto_arima(train, start_p=1, start_q=1,
                     test='adf',
                     max_p=3, max_q=3, m=12,
                     start_P=0, seasonal=True,
                     d=None, D=1, trace=True,
                     error_action='ignore',  
                     suppress_warnings=True, 
                     stepwise=True)

以上,我使用auto_arima拟合模型。

  n_periods = 6
fitted, confint = smodel.predict(n_periods=n_periods, return_conf_int=True)
index_of_fc = pd.date_range(train.index[-1], periods = n_periods, freq='MS')

# make series for plotting purpose
fitted_series = pd.Series(fitted, index=index_of_fc)
lower_series = pd.Series(confint[:, 0], index=index_of_fc)
upper_series = pd.Series(confint[:, 1], index=index_of_fc)

# Plot
plt.plot(train)
plt.plot(fitted_series, color='darkgreen')
plt.fill_between(lower_series.index, 
                 lower_series, 
                 upper_series, 
                 color='k', alpha=.15)

plt.title("SARIMA - Final Forecast")
plt.show()

我在这里绘制火车数据和预测,得出以下结果(我仍然不知道为什么它在图表中跳过了一个月但数字正确):

result

最后,我正在像这样测试我的准确性:

  # Accuracy metrics
def forecast_accuracy(forecast, actual):
    mape = np.mean(np.abs(forecast - actual)/np.abs(actual))  # MAPE
    me = np.mean(forecast - actual)             # ME
    mae = np.mean(np.abs(forecast - actual))    # MAE
    mpe = np.mean((forecast - actual)/actual)   # MPE
    rmse = np.mean((forecast - actual)**2)**.5  # RMSE
    corr = np.corrcoef(forecast, actual)[0,1]   # corr
    mins = np.amin(np.hstack([forecast[:,None], 
                              actual[:,None]]), axis=1)
    maxs = np.amax(np.hstack([forecast[:,None], 
                              actual[:,None]]), axis=1)
    minmax = 1 - np.mean(mins/maxs)             # minmax
    acf1 = acf(fitted-test)[1]                      # ACF1
    return({'mape':mape, 'me':me, 'mae': mae, 
            'mpe': mpe, 'rmse':rmse, 'acf1':acf1, 
            'corr':corr, 'minmax':minmax})

forecast_accuracy(fitted, test.values)

这是我的结果:

{'mape': 0.03461030567300854,
 'me': 6.729205725022392,
 'mae': 17.97150355923618,
 'mpe': 0.016813031496317913,
 'rmse': 20.42619043264491,
 'acf1': -0.13837977897549658,
 'corr': 0.9789628479818636,
 'minmax': 0.033630138432890866}

现在,如果我错了,请纠正我,但是MAPE在这里说0.034,这基本上说我的预测是准确的96.6%。

我已经针对不同的时间范围(预测未来3个月和5个月)进行了测试,但我无法理解的是5个月的准确性高于3。因为这对我来说似乎很奇怪想知道你们是否对此有一个解释。也许我的模型不正确?我只是从ARIMA开始,我的理论是auto_arima不会改变数据,并且仍然存在趋势,但这只是一个猜测,我不知道如何实现。

非常感谢您的帮助!

(哦,如果有人知道为什么我的图表跳过1个月,也请让我知道!我知道它必须在下一行中执行某些操作,但是我不确定如何绘制它)

index_of_fc = pd.date_range(train.index[-1], periods = n_periods, freq='MS')

0 个答案:

没有答案