独家 | 教你使用简单神经网络和LSTM进行时间序列预测(附代码)

    xiaoxiao2021-07-11  242

    翻译:张玲

    校对:丁楠雅

    本文约1500字,建议阅读5分钟

    作者基于波动性标准普尔500数据集和Keras深度学习网络框架,利用python代码演示RNN和LSTM RNN的构建过程,便于你快速搭建时间序列的预测模型。

    图片来源: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/^vix/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

    编辑:王菁

    校对:龚力

    译者简介

    张玲,在岗数据分析师,计算机硕士毕业。从事数据工作,需要重塑自我的勇气,也需要终生学习的毅力。但我依旧热爱它的严谨,痴迷它的艺术。数据海洋一望无境,数据工作充满挑战。感谢数据派THU提供如此专业的平台,希望在这里能和最专业的你们共同进步!

    翻译组招募信息

    工作内容:将选取好的外文前沿文章准确地翻译成流畅的中文。如果你是数据科学/统计学/计算机专业的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友,数据派翻译组欢迎你们加入!

    你能得到:提高对于数据科学前沿的认知,提高对外文新闻来源渠道的认知,海外的朋友可以和国内技术应用发展保持联系,数据派团队产学研的背景为志愿者带来好的发展机遇。

    其他福利:和来自于名企的数据科学工作者,北大清华以及海外等名校学生共同合作、交流。

    点击文末“阅读原文”加入数据派团队~

    转载须知

    如需转载,请在开篇显著位置注明作者和出处(转自:数据派THU ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

    发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

    点击“阅读原文”拥抱组织


    最新回复(0)