在 TensorFlow 中使用循环神经网络 (RNN) 进行时间序列预测

2023年 8月 14日 76.9k 0

时间序列数据:时间序列中的每个数据点都链接到一个时间戳,该时间戳显示观察或记录数据的准确时间。包括许多领域:金融、经济、天气预报和机器学习,都经常使用此类数据。

时间序列数据经常显示随时间变化的模式或趋势,例如季节性或周期性模式,这是与之相关的一个基本特征。为了进行预测或更多地了解所观察到的潜在过程或事件,可以对这些模式进行分析和建模。

递归神经网络 (RNN)对数据中存在的时间依赖性进行建模,因为它包含先前输入的隐式记忆。因此 RNN 中经常使用本质上是连续的时间序列数据。为了处理 RNN 中的时间序列数据,TensorFlow 提供了许多 API 和工具,例如 tf.keras.layers.RNN API,它允许创建独特的 RNN 单元类并将其与数据一起使用。该 API 还支持多种 RNN 单元类型,包括 Basic RNN、LSTM 和 GRU。 

此示例使用股票价格数据,这是最流行的时间序列数据类型。

第1步: 导入所需的库。

  • Numpy 和 Pandas – 用于数据操作和分析
  • Matplotlib – 用于数据可视化。
  • Yahoo Finance – 提供财务数据进行分析。
  • Datetime – 用于处理日期和时间。
  • Math – 提供 Python 中的基本数学函数。
import numpy as np
import pandas as pd
import yfinance as yf
import datetime as dt
import matplotlib.pyplot as plt
import math

步骤 2: 此代码使用 yfinance 库的 yf.download() 方法从雅虎财经下载 Google 的历史股票数据。使用 datetime 模块的 dt.datetime() 方法,给出已获取数据的时间段的开始日期和结束日期。

然后使用 print() 函数显示下载的数据,其中使用 pd.set_option() 配置 Pandas DataFrame 的显示选项。

#开始和结束日期
start_date = dt.datetime(2020,4,1)
end_date = dt.datetime(2023,4,1)

#从雅虎金融加载
data = yf.download("GOOGL",start_date, end_date)

pd.set_option('display.max_rows', 4)
pd.set_option('display.max_columns',5)
print(data)

输出:

[*********************100%***********************]  1 of 1 completed
                  Open        High  ...   Adj Close    Volume
Date                                ...                      
2020-04-01   56.200001   56.471001  ...   55.105000  51970000
2020-04-02   55.000000   56.138500  ...   55.851501  56410000
...                ...         ...  ...         ...       ...
2023-03-30  100.910004  101.160004  ...  100.889999  33086200
2023-03-31  101.300003  103.889999  ...  103.730003  36823200

[756 rows x 6 columns]

步骤3: 接下来,我们将数据集按照80:20的比例分为训练和测试。使用 iloc[:,:1] 仅选择数据的第一列,并且 train_data 包含原始数据的第一个 training_data_len 行。 test_data 包含从 training_data_len 开始到末尾的原始数据的所有剩余行。

# 为训练设置80%的数据
training_data_len = math.ceil(len(data) * .8)
training_data_len

# 拆分数据集
train_data = data[:training_data_len].iloc[:,:1]
test_data = data[training_data_len:].iloc[:,:1]
print(train_data.shape, test_data.shape)

输出:

(605, 1) (151, 1)

步骤 4:此代码创建一个名为 dataset_train 的 numpy 数组,并用训练数据中的“Open”定价值填充它。然后将一维数组转换为二维数组。shape 属性,返回表示 dataset_train 数组的最终形状的元组 (num_rows, num_columns)。

# 选择未结价格值
dataset_train = train_data.Open.values
# 将 1D 阵列重塑为 2D 阵列
dataset_train = np.reshape(dataset_train, (-1,1))
dataset_train.shape

输出:

(605, 1)

步骤5: 归一化是数据预处理中的关键步骤,可增强机器学习模型的有效性和可解释性。因此,导入 sklearn 中的 MinMaxScaler 将数据集从 0 缩放到 1。使用 sklearn fit_transform() 方法,对训练数据集进行缩放。

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
# 缩放数据集
scaled_train = scaler.fit_transform(dataset_train)

print(scaled_train[:5])

输出:

[[0.01246754]
 [0.        ]
 [0.00764156]
 [0.01714287]
 [0.0607844 ]]

步骤6: 对测试数据进行同样的数据预处理。

# 选择未结价格值
dataset_test = test_data.Open.values
# 将1D阵列重塑为2D阵列
dataset_test = np.reshape(dataset_test, (-1,1))
# 规范化0和1之间的值
scaled_test = scaler.fit_transform(dataset_test)
print(*scaled_test[:5])

输出:

[0.98362881] [1.] [0.83867656] [0.84481572] [0.86118691]

步骤7: 本阶段时间序列数据必须分为训练集的X_train和y_train以及测试集的X_test和y_test。这样做的目的是将时间序列数据转化为可用于训练模型的监督学习问题。该循环在迭代时间序列数据时生成长度为 50 的输入/输出序列。使用这种方法,我们可以预测未来值,同时考虑数据对先前观测值的时间依赖性。

对于训练集:

X_train = []
y_train = []
for i in range(50, len(scaled_train)):
X_train.append(scaled_train[i-50:i, 0])
y_train.append(scaled_train[i, 0])
if i

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论