原文链接: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 并传递给下一个单元格:
加载必要的库和数据集
# 加载必要的包
library(keras)
或者装置如下:
# 而后按如下形式装置 TensorFlow:install_keras()
咱们将应用可用的长期利率数据,这是从 2007 年 1 月到 2018 年 3 月的月度数据。
前五个察看样本
数据筹备
将数据转换为安稳数据
这是通过获取系列中两个间断值之间的差别来实现的。这种转换(通常称为差分)会删除数据中与工夫相干的成分。此外,应用差分而不是原始值更容易建模,并且生成的模型具备更高的预测能力。
# 将数据转换为平稳性
did = diff
head
滞后数据集
LSTM 冀望数据处于监督学习模式。也就是说,有一个指标变量 Y 和预测变量 X。为了实现这一点,咱们通过滞后序列来变换序列,并将工夫 (t−k) 的值作为输出,将工夫 t 的值作为输入,用于 k 步滞后数据集。
sps= laorm
head(sps)
将数据集拆分为训练集和测试集
与大多数剖析中训练和测试数据集是随机抽样的不同,对于工夫序列数据,察看的程序的确很重要。以下代码将系列的 前 70% 作为训练集,其余 30% 作为测试集。
## 分成训练集和测试集
N = nrow
n = round
tran = sud\[1:n, \]
tt = sud\[(n+1):N, \]
标准化数据
就像在任何其余神经网络模型中一样,咱们将输出数据 X 从新标准化到激活函数的范畴。如前所述,LSTM 的默认激活函数是 sigmoid 函数,其范畴为 [-1, 1]。上面的代码将有助于这种转换。请留神,训练数据集的最小值和最大值是用于标准化训练和测试数据集以及预测值的标准化系数。这确保了测试数据的最小值和最大值不会影响模型。
## 标准化数据
Sad = scaa(trin, et, c(-1, 1))
y_in = Sed$slrn\[, 2\]
x_tn = Scd$sldin\[, 1\]
y_st = Sald$sleet\[, 2\]
x_st = Saed$sett\[, 1\]
将须要以下代码将预测值复原为原始比例。
## 逆变换
invtg = function(sle, slr, fue = c(0, 1))
定义
定义模型
咱们设置参数 _stateful_ = TRUE 以便在解决一批样本后取得的外部状态被从新用作下一批样本的初始状态。因为网络是有状态的,咱们必须从以后 [samples , features ] 中以 [ _samples_ , timesteps , features ] 模式的 3 维数组提供输出批次,其中:
样本:每批中的察看数,也称为批大小。
工夫步长:给定察看的独自工夫步长。在此示例中,工夫步长 = 1
特色:对于单变量状况,如本例所示,特色 = 1
批量大小必须是训练样本和测试样本大小的独特因素。能够找到 LSTM 输出的一个很好的解释
# 将输出重塑为 3- 维
# 指定所需的参数
bahse = 1 # 必须是训练样本和测试样本的公因子
ni = 1 # 能够调整这个,在模型调整阶段
#====================
keras\_model\_sequential
layer_lstm%>%
layer_dense
编译模型
在这里,我将 _mean\_squared\_error_指定 为损失函数,将_自适应_矩_预计_ _Adam_指定为优化算法,并在每次更新时指定学习率和学习率衰减。最初,我应用 _准确性_ 作为评估模型性能的指标。
compile(optimizer = optimizer_adam)
模型汇总
summary
拟合模型
咱们设置参数 _shuffle_ = FALSE 以防止打乱训练集并放弃 xixi 和 xi+txi+t 之间的依赖关系。LSTM 还须要在每个 epoch 之后重置网络状态。为了实现这一点,咱们在 epoch 上运行一个循环,在每个 epoch 中咱们拟合模型并通过参数 _reset_states()_重置状态。
for(i in 1:phs){
model %>% fit
model %>% reset_states
}
作出预测
for(i in 1:L){
# 反转缩放
yhat = invert_scaling
# 逆差分
yhat = yhat + Sis\[(n+i)\]
}
绘制值
最受欢迎的见解
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 进行工夫序列剖析