在上一篇中,我们发现knn和线性回归一样,表现的不是特别好,来看看时间序列的表现
时间序列预测法其实是一种回归预测方法,属于定量预测,其基本原理是;一方面承认事物发展的延续性,运用过去时间序列的数据进行统计分析,推测出事物的发展趋势;另一方面充分考虑到偶然因素影响而产生的随机性,为了消除随机波动的影响,利用历史数据进行统计分析,并对数据进行适当处理,进行趋势预测。
自动ARIMA
ARIMA是一种非常流行的时间序列预测统计方法。ARIMA模型使用过去的值来预测未来的值。ARIMA中有三个重要参数:
-
p(用来预测下一个值的过去值)
-
q(用来预测未来值的过去预测误差)
-
d(差分的顺序)
ARIMA的参数优化需要大量时间。因此我们将使用自动 ARIMA,自动选择误差最小的(p,q,d)最佳组合。
顺便插一句,如果不使用自动选择误差的话,你可以通过计算数据的差分,作图然后手动选择p d q的大小,如果你对这一个方向感兴趣,可以小窗我或者底下留言,在这里不多做介绍。
#导入库
from pyramid.arima import auto_arima
#按照索引排序
data = df.sort_index(ascending=True, axis=0)
#划分训练集、测试集
train = data[:987]
valid = data[987:]
# 取出两个集合中close这列的数据,第二行不是很清楚感觉没用到,知道的大佬留言区指点迷津
training = train['Close']
validation = valid['Close']
#建立模型(自动选择参数)
model = auto_arima(training, start_p=1, start_q=1,max_p=3, max_q=3, m=12,start_P=0, seasonal=True,d=1, D=1, trace=True,error_action='ignore',suppress_warnings=True)
model.fit(training)
#预测
forecast = model.predict(n_periods=248)
forecast = pd.DataFrame(forecast,index = valid.index,columns=['Prediction'])
结果
#计算rms
rms=np.sqrt(np.mean(np.power((np.array(valid['Close'])-np.array(forecast['Prediction'])),2)))
#下面两行为结果,可不执行
rms
44.954584993246954
#plot绘图 训练的close,测试的close 和预测值
plt.plot(train['Close'])
plt.plot(valid['Close'])
plt.plot(forecast['Prediction'])
推论
正如我们前面看到的,自动ARIMA模型使用过去的数据来理解时间序列中的模式。利用这些值,该模型捕捉到该系列中的增长趋势。
虽然使用这种技术的预测比以前实现的机器学习模型的预测要好得多,但是这些预测仍然与实际值相距甚远。
从图中可以明显看出,该模型在序列中捕捉到了一种趋势,但忽略了季节的影响。
参考:https://www.jiqizhixin.com/articles/2019-01-04-16