内容简介:人工神经网络(Artificial Neural Network ,ANN)https://en.wikipedia.org/wiki/Artificial_neural_network
图片来源:Pixabay 本文的目的是演示人工神经网络(Artificial Neural Network ,ANN)和长短期记忆循环神经网络(Long Short-Term Memory Recurrent Neural Network ,LSTM RNN)工作过程,使您能够在现实生活中使用它们,并对时间序列数据建立最简单的ANN和LSTM循环神经网络。
人工神经网络(Artificial Neural Network ,ANN)
https://en.wikipedia.org/wiki/Artificial_neural_network
长短期记忆循环神经网络(Long Short-Term Memory Recurrent Neural Network ,LSTM RNN)
https://en.wikipedia.org/wiki/Long_short-term_memory
数据
CBOE(Chicago Board Options Exchange,芝加哥期权交易所)波动性指数是用来衡量标准普尔500指数期权的一种常用隐含波动率,以其代号VIX(Volatility Index,也称“恐惧指数”)而闻名。
CBOE(Chicago Board Options Exchange,芝加哥期权交易所)波动性指数
https://en.wikipedia.org/wiki/VIX
芝加哥期权交易所CBOE实时计算出VIX指数后,将其推出。
芝加哥期权交易所
https://en.wikipedia.org/wiki/Chicago_Board_Options_Exchange
可以从这里(https://ca.finance.yahoo.com/quote/%5Evix/history?ltr=1)下载波动性标准普尔500数据集,时间范围是:2011年2月11日至2019年2月11日。我的目标是采用ANN和LSTM来预测波动性标准普尔500时间序列。
首先,我们需要导入以下库:
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import r2_score
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping
from keras.optimizers import Adam
from keras.layers import LSTM
并将数据加载到Pandas 的dataframe中。
df = pd.read_csv("vix_2011_2019.csv")
我们可以快速浏览前几行。
print(df.head())
删除不需要的列,然后将“日期”列转换为时间数据类型,并将“日期”列设置为索引。
df.drop(['Open', 'High', 'Low', 'Close', 'Volume'], axis=1, inplace=True)
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index(['Date'], drop=True)
df.head(10)
接下来,我们绘制一个时间序列线图。
plt.figure(figsize=(10, 6))
df['Adj Close'].plot();
可以看出,“Adj close”数据相当不稳定,既没有上升趋势,也没有下降趋势。
按日期“2018–01–01”将数据拆分为训练集和测试集,即在此日期之前的数据是训练数据,此之后的数据是测试数据,我们再次将其可视化。
split_date = pd.Timestamp('2018-01-01')
df = df['Adj Close']
train = df.loc[:split_date]
test = df.loc[split_date:]
plt.figure(figsize=(10, 6))
ax = train.plot()
test.plot(ax=ax)
plt.legend(['train', 'test']);
我们将训练和测试数据缩放为[-1,1]。
scaler = MinMaxScaler(feature_range=(-1, 1))
train_sc = scaler.fit_transform(train)
test_sc = scaler.transform(test)
获取训练和测试数据。
X_train = train_sc[:-1]
y_train = train_sc[1:]
X_test = test_sc[:-1]
y_test = test_sc[1:]
用于时间序列预测的简单人工神经网络
我们创建一个序列模型。
通过.add()方法添加层。
将“input_dim”参数传递到第一层。
激活函数为线性整流函数Relu(Rectified Linear Unit,也称校正线性单位)。
通过compile方法完成学习过程的配置。
损失函数是mean_squared_error,优化器是Adam。
当监测到loss停止改进时,结束训练。
patience =2,表示经过数个周期结果依旧没有改进,此时可以结束训练。
人工神经网络的训练时间为100个周期,每次用1个样本进行训练。
nn_model = Sequential()
nn_model.add(Dense(12, input_dim=1, activation='relu'))
nn_model.add(Dense(1))
nn_model.compile(loss='mean_squared_error', optimizer='adam')
early_stop = EarlyStopping(monitor='loss', patience=2, verbose=1)
history = nn_model.fit(X_train, y_train, epochs=100, batch_size=1, verbose=1, callbacks=[early_stop], shuffle=False)
我不会把整个输出结果打印出来,它早在第19个周期就停了下来。
y_pred_test_nn = nn_model.predict(X_test)
y_train_pred_nn = nn_model.predict(X_train)
print("The R2 score on the Train set is:\t{:0.3f}".format(r2_score(y_train, y_train_pred_nn)))
print("The R2 score on the Test set is:\t{:0.3f}".format(r2_score(y_test, y_pred_test_nn)))
LSTM
LSTM网络的构建和模型编译和人工神经网络相似。
LSTM有一个可见层,它有1个输入。
隐藏层有7个LSTM神经元。
输出层进行单值预测。
LSTM神经元使用Relu函数进行激活。
LSTM的训练时间为100个周期,每次用1个样本进行训练。
lstm_model = Sequential()
lstm_model.add(LSTM(7, input_shape=(1, X_train_lmse.shape[1]), activation='relu', kernel_initializer='lecun_uniform', return_sequences=False))
lstm_model.add(Dense(1))
lstm_model.compile(loss='mean_squared_error', optimizer='adam')
early_stop = EarlyStopping(monitor='loss', patience=2, verbose=1)
history_lstm_model = lstm_model.fit(X_train_lmse, y_train, epochs=100, batch_size=1, verbose=1, shuffle=False, callbacks=[early_stop])
训练早在第10个周期就停了下来。
y_pred_test_lstm = lstm_model.predict(X_test_lmse)
y_train_pred_lstm = lstm_model.predict(X_train_lmse)
print("The R2 score on the Train set is:\t{:0.3f}".format(r2_score(y_train, y_train_pred_lstm)))
print("The R2 score on the Test set is:\t{:0.3f}".format(r2_score(y_test, y_pred_test_lstm)))
训练和测试R^2均优于人工神经网络模型。
比较模型
我们比较了两种模型的测试MSE
nn_test_mse = nn_model.evaluate(X_test, y_test, batch_size=1)
lstm_test_mse = lstm_model.evaluate(X_test_lmse, y_test, batch_size=1)
print('NN: %f'%nn_test_mse)
print('LSTM: %f'%lstm_test_mse)
进行预测
nn_y_pred_test = nn_model.predict(X_test)
lstm_y_pred_test = lstm_model.predict(X_test_lmse)
plt.figure(figsize=(10, 6))
plt.plot(y_test, label='True')
plt.plot(y_pred_test_nn, label='NN')
plt.title("NN's Prediction")
plt.xlabel('Observation')
plt.ylabel('Adj Close Scaled')
plt.legend()
plt.show();
plt.figure(figsize=(10, 6))
plt.plot(y_test, label='True')
plt.plot(y_pred_test_lstm, label='LSTM')
plt.title("LSTM's Prediction")
plt.xlabel('Observation')
plt.ylabel('Adj Close scaled')
plt.legend()
plt.show();
就是这样!在这篇文章中,我们发现了如何采用 python 语言基于Keras深度学习网络框架,开发用于时间序列预测的人工神经网络和LSTM循环神经网络,以及如何利用它们更好地预测时间序列数据。
Jupyter笔记本可以在Github上找到。星期一快乐!
原文标题:
An Introduction on Time Series Forecasting with Simple Neural Networks & LSTM
原文链接:
https://www.kdnuggets.com/2019/04/introduction-time-series-forecasting-simple-neural-networks-lstm.html
以上所述就是小编给大家介绍的《教你使用简单神经网络和LSTM进行时间序列预测(附代码)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- [译]在 Keras 中使用一维卷积神经网络处理时间序列数据
- 时间序列的聚类
- Pinterest 如何构建时间序列
- [译]时间序列异常检测算法
- 使用Prophet进行时间序列预测
- python时间日期函数与利用pandas进行时间序列处理详解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ant Colony Optimization
Marco Dorigo、Thomas Stützle / A Bradford Book / 2004-6-4 / USD 45.00
The complex social behaviors of ants have been much studied by science, and computer scientists are now finding that these behavior patterns can provide models for solving difficult combinatorial opti......一起来看看 《Ant Colony Optimization》 这本书的介绍吧!