ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

拓端tecdat|R语言用RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测

2022-02-04 14:02:06  阅读:219  来源: 互联网

标签:状态 RNN 模型 tecdat 拓端 序列 时间 LSTM 数据


原文链接:http://tecdat.cn/?p=25133

原文出处:拓端数据部落公众号

2017 年年中,R 推出了 Keras 包 这是一个在 Tensorflow 之上运行的综合库,具有 CPU 和 GPU 功能。本文将演示如何在 R 中使用 LSTM 实现时间序列预测。


简单的介绍

时间序列涉及按时间顺序收集的数据。我用 xt∈R 表示单变量数据,其中 t∈T 是观察数据时的时间索引。时间 t 在 T=Z 的情况下可以是离散的,或者在 T=R 的情况下是连续的。为简化分析,我们将仅考虑离散时间序列。

长短期记忆 (LSTM) 网络是一种特殊的循环神经网络 (RNN),能够学习长期依赖关系。在常规的 RNN 中,小权重通过几个时间步一遍又一遍地相乘,并且梯度逐渐减小到零——这种情况称为梯度消失问题。

LSTM 网络通常由通过层连接的内存块(称为单元)组成。单元中的信息同时包含在单元状态 Ct 和隐藏状态 ht 中,并由称为门的机制通过 sigmoid 和 tanh 激活函数进行调节。

sigmoid 函数/层输出 0 到 1 之间的数字,其中 0 表示 没有通过 , 1 表示 全部通过。因此,LSTM 能够有条件地从单元状态中添加或删除信息。

一般来说,门将前一时间步 ht-1 和当前输入 xt 的隐藏状态作为输入,并将它们逐点乘以权重矩阵 W,并将偏差 b 添加到乘积中。

三个主要门:

  • 遗忘门:
  • 这决定了哪些信息将从单元状态中删除。
  • 输出是一个介于 0 和 1 之间的数字,0 表示 全部删除 ,1 表示 全部记住
  • 更新门:
  • 在这一步中,  tahn 激活层创建一个潜在候选向量,如下所示:
  • sigmoid 层创建一个更新过滤器,如下所示:
  • 接下来,旧单元状态 Ct-1 更新如下:
  • 输出门:
  • 在这一步中,sigmoid 层过滤将要输出的单元状态。
  • 然后将单元状态 Ct 通过 tanh 函数将值标准化到范围 [-1, 1]。
  • 最后,标准化后的单元格状态乘以过滤后的输出,得到隐藏状态 ht 并传递给下一个单元格:

加载必要的库和数据集

  1.   # 加载必要的包
  2.   library(keras)

或者安装如下:

  1.    
  2.   # 然后按如下方式安装 TensorFlow :
  3.   install_keras()
  4.    

我们将使用可用的长期利率数据 ,这是从 2007 年 1 月到 2018 年 3 月的月度数据。

前五个观察样本

数据准备

将数据转换为平稳数据

这是通过获取系列中两个连续值之间的差异来完成的。这种转换(通常称为差分)会删除数据中与时间相关的成分。此外,使用差分而不是原始值更容易建模,并且生成的模型具有更高的预测能力。

  1.   #将数据转换为平稳性
  2.   did = diff
  3.   head

滞后数据集

LSTM 期望数据处于监督学习模式。也就是说,有一个目标变量 Y 和预测变量 X。为了实现这一点,我们通过滞后序列来变换序列,并将时间 (t−k)的值作为输入,将时间 t 的值作为输出,用于 ​​k 步滞后数据集。

  1.    
  2.   sps= laorm
  3.   head(sps)

将数据集拆分为训练集和测试集

与大多数分析中训练和测试数据集是随机抽样的不同,对于时间序列数据,观察的顺序确实很重要。以下代码将系列的  70% 作为训练集,其余 30% 作为测试集。

  1.   ## 分成训练集和测试集
  2.    
  3.   N = nrow
  4.   n = round
  5.   tran = sud[1:n, ]
  6.   tt = sud[(n+1):N, ]

标准化数据

就像在任何其他神经网络模型中一样,我们将输入数据 X 重新标准化到激活函数的范围。如前所述,LSTM 的默认激活函数是 sigmoid 函数,其范围为 [-1, 1]。下面的代码将有助于这种转换。请注意,训练数据集的最小值和最大值是用于标准化训练和测试数据集以及预测值的标准化系数。这确保了测试数据的最小值和最大值不会影响模型。

  1.   ## 标准化数据
  2.    
  3.    
  4.    
  5.   Sad = scaa(trin, et, c(-1, 1))
  6.    
  7.   y_in = Sed$slrn[, 2]
  8.   x_tn = Scd$sldin[, 1]
  9.    
  10.   y_st = Sald$sleet[, 2]
  11.   x_st = Saed$sett[, 1]

将需要以下代码将预测值恢复为原始比例。

  1.   ## 逆变换
  2.   invtg = function(sle, slr, fue = c(0, 1))

定义

定义模型

我们设置参数 stateful = TRUE 以便在处理一批样本后获得的内部状态被重新用作下一批样本的初始状态。由于网络是有状态的,我们必须从当前 [ samples ,  features ] 中以 [ samples ,  timesteps ,  features ]形式的 3 维数组提供输入批次,其中:

样本:每批中的观察数,也称为批大小。

时间步长:给定观察的单独时间步长。在此示例中,时间步长 = 1

特征:对于单变量情况,如本例所示,特征 = 1

批量大小必须是训练样本和测试样本大小的共同因素。可以找到 LSTM 输入的一个很好的解释 

  1.    
  2.   # 将输入重塑为 3-维
  3.    
  4.   # 指定所需的参数
  5.    
  6.   bahse = 1 # 必须是训练样本和测试样本的公因子
  7.   ni = 1 # 可以调整这个,在模型调整阶段
  8.    
  9.   #====================
  10.    
  11.   keras_model_sequential
  12.   layer_lstm%>%
  13.   layer_dense
  14.    

编译模型

在这里,我将 mean_squared_error指定 为损失函数,将自适应估计 Adam指定为优化算法,并在每次更新时指定学习率和学习率衰减。最后,我使用 准确性 作为评估模型性能的指标。

  1.   compile(
  2.    
  3.   optimizer = optimizer_adam
  4.   )

模型汇总

summary

拟合模型

我们设置参数 shuffle  = FALSE 以避免打乱训练集并保持 xixi 和 xi+txi+t 之间的依赖关系。LSTM 还需要在每个 epoch 之后重置网络状态。为了实现这一点,我们在 epoch 上运行一个循环,在每个 epoch 中我们拟合模型并通过参数 reset_states()重置状态。

  1.   for(i in 1:phs ){
  2.   model %>% fit
  3.   model %>% reset_states
  4.   }

作出预测

  1.   for(i in 1:L){
  2.   # 反转缩放
  3.   yhat = invert_scaling
  4.   # 逆差分
  5.   yhat = yhat + Sis[(n+i)]
  6.    
  7.   }

绘制值


最受欢迎的见解

1.用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

2.Python中利用长短期记忆模型LSTM进行时间序列预测分析 – 预测电力消耗数据

3.python在Keras中使用LSTM解决序列问题

4.Python中用PyTorch机器学习分类预测银行客户流失模型

5.R语言多元Copula GARCH 模型时间序列预测

6.在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析

7.R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数

8.R语言估计时变VAR模型时间序列的实证研究分析案例

9.用广义加性模型GAM进行时间序列分析

标签:状态,RNN,模型,tecdat,拓端,序列,时间,LSTM,数据
来源: https://www.cnblogs.com/tecdat/p/15862741.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有