RNN 中的时间序列2025年3月17日 | 阅读 8 分钟 在本教程中,我们将使用带有时间序列数据的 RNN。时间序列依赖于前一个时间,这意味着过去的值包含网络可以学习的重要信息。时间序列预测是估计任何序列的未来值,例如,股票价格、温度、GDP 等等。 RNN 和时间序列的数据准备有点棘手。目标是预测序列的其他值,我们将使用过去的信息来估计 t +1 时的成本。标签等于输入序列沿一个周期。 其次,输入的数量设置为 1,即每次一个观测值。最后,时间步长等于数值序列。如果我们将时间步长设置为 10,输入序列将返回十个连续的时间。 看下图,我们必须表示左侧的时间序列数据和右侧的虚构输入序列。我们创建一个函数来返回一个数据集,其中包含从 2001 年 1 月到 2016 年 12 月每天的随机值 输出 2016-08-31 -93.459631 2016-09-30 -95.264791 2016-10-31 -95.551935 2016-11-30 -105.879611 2016-12-31 -123.729319 Freq: M, dtype: float64 ts = create_ts(start = '2001', n = 222) ![]() 图的右侧显示了所有系列。它始于 2001 年,结束于 2019 年。将所有数据输入网络没有意义;相反,我们必须创建一个长度等于时间步长的数据批次。此批次将是 X 变量。 Y 变量与 X 相同,但偏移一个周期(即,我们想要预测 t+1)。 两个向量具有相同的长度。我们可以在上面图的右侧看到这一点。该线表示 x 输入的十个值,而红点标签具有十个值 y。请注意,标签从 X 向前一个周期开始,并在一个周期后结束。 构建一个 RNN 来分析 TensorFlow 中的时间序列是时候构建我们的第一个 RNN 来预测序列了。我们必须为模型指定一些超参数(模型的参数,即神经元数量等)。
我们的网络将从 10 天的序列中学习,并包含 120 个循环神经元。我们向模型输入一个输入。 在构建模型之前,我们需要将数据集拆分为训练集和测试集。完整的数据集有 222 个数据点;我们将使用前 201 个点来训练模型,使用最后 21 个点来测试我们的模型。 在我们定义训练集和测试集之后,我们需要创建一个包含批次的对象。在这些批次中,我们有 X 值和 Y 值。请记住,X 值滞后一个周期。因此,我们使用前 200 个观测值,时间步长等于 10。x_batches 对象必须有 20 个大小为 10 或 1 的批次。Y_batches 的大小与 X_batches 对象相同,但周期高于。 步骤 1)创建训练集和测试集首先,我们将序列转换为 numpy 数组;然后,我们定义窗口(网络将学习的时间数量)、输入、输出数量以及训练集的大小。 之后,我们将数组拆分为两个数据集。 步骤 2)创建函数返回 X_batches 和 y_batches我们可以创建一个函数,返回两个不同的数组,一个用于 X_batches,一个用于 y_batches。为了方便起见。 让我们创建一个函数来构建批次。 请注意,X_batches 按一个周期记录(我们取值 t-1)。该函数的输出具有三个维度。第一个维度等于批次数,第二个维度是窗口大小,最后一个维度是输入数量。 时间序列的棘手之处在于正确选择数据点。对于 X 数据点,我们选择来自 t = 1 到 t =200 的观测值,而对于 Y 数据点,我们返回来自 t = 2 到 201 的观测值。一旦我们有了正确的数据点,就可以轻松地重塑序列。 为了构建包含批次的对象,我们需要将数据集拆分为十个长度相同的批次。我们可以使用 reshape 方法并传递 -1,以便序列与批次大小相同。值 20 是每个批次的注释数,1 是输入数。 我们需要为标签执行相同的步骤。 请注意,我们需要将数据移动到我们要预测的次数。例如,如果我们想要预测一次,那么我们将序列移动 1。如果我们想预测两天,那么将数据移动 2 个点。现在函数已定义,我们调用它来创建批次。 我们可以打印形状以确保维度正确。 我们需要创建只有一批数据和 20 个观测值的测试集。 请注意,我们的预测日复一日,这意味着第二个预测值将基于测试数据集第一天(t+1)的实际值。真实值将被知道。 如果你想预测 t+2,我们需要使用预测值 t+1;如果你要预测 t+3,我们需要使用预期值 t+1 和 t+2。这使得精确预测 "t+n" 天变得困难。 我们的批次大小已准备就绪,我们可以构建 RNN 架构。请记住,我们有 120 个循环神经元。 步骤 3)构建模型要创建模型,我们需要定义三个部分
1. 变量 我们需要指定具有适当形状的 X 和 y 变量。这一步很简单。张量与对象 X_batches 和对象 y_batches 具有相同的维度。 例如,张量 X 是一个占位符,几乎有三个维度
结果是 2. 创建 RNN 在第二部分中,我们需要定义网络的架构。和以前一样,我们使用 TensorFlow 估计器的对象 BasicRNNCell 和 dynamic_rnn。 下一部分比较棘手,但可以实现更快的计算。我们需要将运行输出转换为密集层,然后将其转换为具有与输入字段相同的维度。 3. 创建损失和优化 模型优化取决于我们正在执行的任务。 这种差异很重要,因为它会改变优化问题。连续变量的优化问题通常是最小化均方误差。要在 TF 中构建这些指标,我们可以使用 持久性代码与以前相同;我们使用 Adam 优化器来减少损失。 我们可以将所有内容打包在一起,我们的模型就可以进行训练了。 我们将使用 1500 个 epoch 训练模型,并每 150 次迭代打印一次损失。训练模型后,我们在测试集上评估模型,并创建一个包含预测的对象。 最后,我们可以绘制序列的实际值和预测值。如果我们的模型是正确的,则预测值应该放在实际值的顶部。 正如我们所看到的,该模型还有改进的空间。我们可以更改超参数,例如窗口、批次大小以及当前文件中循环神经元的数量。 ![]() 循环神经网络是一种用于处理时间序列和文本分析的架构。前一个状态的输出用于在一段时间或一系列单词内保存系统的内存。 在 TensorFlow 中,我们可以使用 be;ow 给定的代码来训练 时间序列 的循环神经网络 模型参数 定义模型 构建优化函数 训练模型 |
我们请求您订阅我们的新闻通讯以获取最新更新。