我正在尝试着手ARIMA和SARIMA。 我有一个在海岸出售的三明治的数据集。
在上图中显示了我的数据+我正在使用使其保持平稳的差异。
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()
我在这里绘制火车数据和预测,得出以下结果(我仍然不知道为什么它在图表中跳过了一个月但数字正确):
最后,我正在像这样测试我的准确性:
# 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')