ARIMA模型(英语:Autoregressive Integrated Moving Average model),差分整合移动平均自回归模型,又称整合移动平均自回归模型(移动也可称作滑动),是时间序列预测分析方法之一。

所以随机生成一个时序数据来体验一下这个模型,如果感觉数据眼熟纯属巧合。

1
2
3
4
5
6
7
8
9
10
11
12
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error as MSE
import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score

# 载入数据 arima需要pandas来运算
data = np.loadtxt('test.csv', dtype=int,delimiter=',', unpack=True)
y = data[2].T
y = pd.DataFrame(y)
1
plt.plot(y) #将数据可视化 发现没什么规律很随机

png

1
2
3
# 由于数据过于随机 所以使用差分将数据归于平稳 这里使用了二阶差分
y1 = y.diff(1)
y2 = y1.diff(1)
1
2
plt.plot(y1)
plt.plot(y2) #发现还是波动很大

png

1
2
3
4
5
6
7
8
9
10
11
12
13
# 画一下拖尾和截尾情况 来进一步确定回归参数
fig = plt.figure(figsize=(12,8))

ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(y, lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()

ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(y, lags=20, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')
fig.tight_layout()
plt.show()

png

应该差不多就AR(2)

1
2
3
4
5
# 使用自带的函数算一下最优参数
train_results = sm.tsa.arma_order_select_ic(y, ic=['aic', 'bic'], trend='n', max_ar=8, max_ma=8)

print('AIC', train_results.aic_min_order)
print('BIC', train_results.bic_min_order)
AIC (3, 0)
BIC (2, 0)
1
2
3
4
5
6
7
# 根据结果选择200参数
model = sm.tsa.ARIMA(y, order=(2, 0, 0))
results = model.fit()
resid = results.resid #赋值
fig = plt.figure(figsize=(12,8))
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=40)

png

可以看到效果还不错 那么模型应该还行

1
2
3
4
5
6
7
# 将模型拟合结果和原始数据进行对比
pred = results.predict()
print(pred)
fig, ax = plt.subplots(figsize=(12, 8))
ax = y.plot(ax=ax)
pred.plot(ax=ax)

0     200.149179
1     377.197543
2     390.971790
3     371.277539
4     291.312595
         ...    
75    142.792734
76    125.375138
77    125.383622
78    166.839263
79    307.552031
Name: predicted_mean, Length: 80, dtype: float64





<AxesSubplot: >

png

可以说是很相像了,接下来预测未来几十天的情况

1
2
3
r = results.forecast(82)
r = pd.DataFrame(r)
r

predicted_mean
80 409.403039
81 404.147892
82 391.591249
83 377.637572
84 364.042914
... ...
157 200.570884
158 200.537803
159 200.507317
160 200.479222
161 200.453332

82 rows × 1 columns

1
2
3
4
# 将预测结果接到原始数据后面并且绘画
plt.plot(y)
plt.plot(pred)
plt.plot(r)
[<matplotlib.lines.Line2D at 0x2461d51da30>]

png

可以看出来几天后将开始下降,但不收敛于0,应该数据集过于波动并且数据量太少。

ARIMA建模过程大概就是这样,感兴趣的可以自己拿数据试着运行一下。如果有大佬对这个模型有好的建议的可以告诉我交流学习一下捏。