ARIMA 和 SARIMA 预测模型失败

时间:2021-02-04 17:01:33

标签: python time-series arima forecast

我正在尝试实施 ARIMA 模型来预测我的以下时间序列数据(用户随时间发送的短信,每 10 分钟收集一次):

data plot

在可视化 ACF 和 PACF 图后,我选择了 (2,1,0) 模型。我是这样设置的。

ACF plot

PACF plot

from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(train['sms_out'],order=(2,1,0))
model=model.fit()
pred=model.predict(start=start,end=end,typ='levels').rename('ARIMA Predictions')

然而,我在做预测时只能得到一条直线。

ARIMA forecast plot

现在,当我运行这个滚动的 ARIMA 代码时,我在一次输出和相应的实际值之间得到了很好的匹配。

from sklearn.metrics import mean_squared_error

# split into train and test sets
X = df.values
size = int(len(X) * 0.66)
train, test = X[0:size], X[size:len(X)]
history = [x for x in train]
predictions = list()

# walk-forward validation
for t in range(len(test)):
    model = ARIMA(history, order=(2,1,0))
    model_fit = model.fit()
    output = model_fit.forecast()
    yhat = output[0]
    predictions.append(yhat)
    obs = test[t]
    history.append(obs)

# plot forecasts against actual outcomes
plt.plot(test)
plt.plot(predictions, color='red')
plt.show()

Rolling ARIMA plot

由于我的目标是预测多个值,因此我更改了代码,将预测值添加到历史记录中,以便我可以继续这样做并根据需要进行预测。

    yhat = output[0]
    predictions.append(yhat)
    #obs = test[t]
    history.append(yhat)

但我又得到一条直线。

New Rolling ARIMA plot

我理解这可能是由于我的模型的季节性(144 个时间步长,即 24 小时的季节性),尽管它没有解释为什么初始滚动 ARIMA 算法有效。所以我尝试了如下的 SARIMA(2,1,0)(1,1,0,144) 模型。

# define model configuration
my_order = (2, 1, 0)
my_seasonal_order = (1, 1, 0, 144)

# define model
model = SARIMAX(train['sms_out'], order=my_order, seasonal_order=my_seasonal_order)

# fit model
model_fit = model.fit()

# forecast
yhat = model_fit.predict(start=len(train), end=len(df))
plt.plot(yhat,label='pred')
plt.plot(test,label='test')
plt.legend()
plt.show()

现在 SARIMA 的预测随着时间的推移而增加,这也是不正确的。

SARIMA plot

有人知道我做错了什么以及如何改进这个模型吗?

我知道这是可行的,因为它已在本文中实现:Call Detail Records Driven Anomaly Detection and Traffic Prediction in Mobile Cellular Networks - Kashif Sultan, Hazrat Ali, Zhongshan Zhang (第 9 页)

0 个答案:

没有答案
相关问题