ARIMA 模型预测不准确
ARIMA model not accurate prediction
我正在尝试使用 ARIMA 模型预测时间序列中的下一个值。
这是我的代码:(对不起打字错误)
split_val = floor(len(data_file)*0.8)
train = data_file[["Daily Confirmed"]][:split_val]
tesst = data_file[["Daily Confirmed"]][split_val:]
print(train.head())
print(tesst.head())
p = d = q = range(1, 5)
pdq = list(itertools.product(p, d, q))
# print(pdq)
bestvalues = {}
for i in pdq:
try:
p, d, q = i
moodel = ARIMA(train, order=(p, d, q))
trained_model = moodel.fit()
bestvalues[trained_model.aic] = i
print(trained_model.aic, " ", i)
except:
continue
print(bestvalues)
minaic = min(bestvalues.keys())
moodel = ARIMA(train, order=bestvalues[minaic])
trained_model = moodel.fit()
pridiction = trained_model.forecast(steps=len(tesst))[0]
comparisionn = tesst.copy()
comparisionn["forcastted"] = pridiction.tolist()
comparisionn.plot()
print(comparisionn)
print(trained_model.aic)
plt.show()
(数据经过预处理)
我可以获得的最小 aic 是2145.930883796257
,这是针对测试数据的预测(仅前 5 个):
Daily Confirmed forcastted
Date
2020-06-22 13560 15048.987970
2020-06-23 15656 15349.247935
2020-06-24 16868 15905.260648
2020-06-25 18205 16137.086959
2020-06-26 18255 16237.232886
这是情节
如您所见,预测不准确,我已将 p、d 和 q 的所有值强行强制为 4....
可能是什么问题?
谢谢
如果您“每天”更新模型,您应该会得到更好的结果。您的模型在 7 月 21 日之后没有看到任何数据,而它可能是 8 月 14 日。 ARIMA 可能很难预测提前 20-30 步。相反 - 尝试逐步预测,如下所示:
history_endog = list(train.copy(deep=True))
y_true = []
y_pred = []
for obs in test:
model = ARIMA(endog=history_endog, order=(p,d,q))
model_fit = model.fit()
forecast = model_fit.forecast()[0]
y_true.append(obs)
y_pred.append(forecast)
history_endog.append(obs)
然后绘制 y_true
和 y_pred
,您的结果应该会有所改善。为简单起见,上面的代码示例使用了列表。
我正在尝试使用 ARIMA 模型预测时间序列中的下一个值。 这是我的代码:(对不起打字错误)
split_val = floor(len(data_file)*0.8)
train = data_file[["Daily Confirmed"]][:split_val]
tesst = data_file[["Daily Confirmed"]][split_val:]
print(train.head())
print(tesst.head())
p = d = q = range(1, 5)
pdq = list(itertools.product(p, d, q))
# print(pdq)
bestvalues = {}
for i in pdq:
try:
p, d, q = i
moodel = ARIMA(train, order=(p, d, q))
trained_model = moodel.fit()
bestvalues[trained_model.aic] = i
print(trained_model.aic, " ", i)
except:
continue
print(bestvalues)
minaic = min(bestvalues.keys())
moodel = ARIMA(train, order=bestvalues[minaic])
trained_model = moodel.fit()
pridiction = trained_model.forecast(steps=len(tesst))[0]
comparisionn = tesst.copy()
comparisionn["forcastted"] = pridiction.tolist()
comparisionn.plot()
print(comparisionn)
print(trained_model.aic)
plt.show()
(数据经过预处理)
我可以获得的最小 aic 是2145.930883796257
,这是针对测试数据的预测(仅前 5 个):
Daily Confirmed forcastted
Date
2020-06-22 13560 15048.987970
2020-06-23 15656 15349.247935
2020-06-24 16868 15905.260648
2020-06-25 18205 16137.086959
2020-06-26 18255 16237.232886
这是情节
如您所见,预测不准确,我已将 p、d 和 q 的所有值强行强制为 4....
可能是什么问题? 谢谢
如果您“每天”更新模型,您应该会得到更好的结果。您的模型在 7 月 21 日之后没有看到任何数据,而它可能是 8 月 14 日。 ARIMA 可能很难预测提前 20-30 步。相反 - 尝试逐步预测,如下所示:
history_endog = list(train.copy(deep=True))
y_true = []
y_pred = []
for obs in test:
model = ARIMA(endog=history_endog, order=(p,d,q))
model_fit = model.fit()
forecast = model_fit.forecast()[0]
y_true.append(obs)
y_pred.append(forecast)
history_endog.append(obs)
然后绘制 y_true
和 y_pred
,您的结果应该会有所改善。为简单起见,上面的代码示例使用了列表。