在上一篇中,咱们发现knn和线性回归同样,表现的不是特别好,来看看时间序列的表现html
时间序列预测法实际上是一种回归预测方法,属于定量预测,其基本原理是;一方面认可事物发展的延续性,运用过去时间序列的数据进行统计分析,推测出事物的发展趋势;另外一方面充分考虑到偶然因素影响而产生的随机性,为了消除随机波动的影响,利用历史数据进行统计分析,并对数据进行适当处理,进行趋势预测。机器学习
ARIMA是一种很是流行的时间序列预测统计方法。ARIMA模型使用过去的值来预测将来的值。ARIMA中有三个重要参数:学习
p(用来预测下一个值的过去值)测试
q(用来预测将来值的过去预测偏差)优化
d(差分的顺序)spa
ARIMA的参数优化须要大量时间。所以咱们将使用自动 ARIMA,自动选择偏差最小的(p,q,d)最佳组合。htm
顺便插一句,若是不使用自动选择偏差的话,你能够经过计算数据的差分,做图而后手动选择p d q的大小,若是你对这一个方向感兴趣,能够小窗我或者底下留言,在这里很少作介绍。blog
#导入库排序
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模型使用过去的数据来理解时间序列中的模式。利用这些值,该模型捕捉到该系列中的增加趋势。
虽然使用这种技术的预测比之前实现的机器学习模型的预测要好得多,可是这些预测仍然与实际值相距甚远。
从图中能够明显看出,该模型在序列中捕捉到了一种趋势,但忽略了季节的影响。