提交 8b058dc0 编写于 作者: W wizardforcel

2020-12-09 19:32:51

上级 4259ba6f
......@@ -4,7 +4,7 @@
如果在上一章中在移动设备上玩过涂鸦和构建(并运行模型以识别涂鸦),当您在股市上赚钱时会感到很开心,而如果您不认真的话会变得很认真。 一方面,股价是时间序列数据,一系列离散时间数据,而处理时间序列数据的最佳深度学习方法是 RNN,这是我们在前两章中使用的方法。 AurélienGéron 在他的畅销书*和 Scikit-Learn 和 TensorFlow* 的动手机器学习中,建议使用 RNN“分析时间序列数据,例如股票价格,并告诉您何时买卖”。 另一方面,其他人则认为股票的过去表现无法预测其未来收益,因此,随机选择的投资组合的表现与专家精心挑选的股票一样好。 实际上,Keras(在 TensorFlow 和其他几个库之上运行的非常受欢迎的高级深度学习库)的作者 FrançoisChollet 在他的畅销书 *Python 深度学习*中表示,使用 RNN。 仅用公开数据来击败市场是“一项非常困难的努力,您可能会浪费时间和资源,而无所作为。”
如果在上一章中在移动设备上玩过涂鸦和构建(并运行模型以识别涂鸦),当您在股市上赚钱时会感到很开心,而如果您不认真的话会变得很认真。 一方面,股价是时间序列数据,一系列离散时间数据,而处理时间序列数据的最佳深度学习方法是 RNN,这是我们在前两章中使用的方法。 AurélienGéron 在他的畅销书《Scikit-Learn 和 TensorFlow 机器学习实战》中,建议使用 RNN“分析时间序列数据,例如股票价格,并告诉您何时买卖”。 另一方面,其他人则认为股票的过去表现无法预测其未来收益,因此,随机选择的投资组合的表现与专家精心挑选的股票一样好。 实际上,Keras(在 TensorFlow 和其他几个库之上运行的非常受欢迎的高级深度学习库)的作者 FrançoisChollet 在他的畅销书《Python 深度学习》中表示,使用 RNN。 仅用公开数据来击败市场是“一项非常困难的努力,您可能会浪费时间和资源,而无所作为。”
因此,冒着“可能”浪费我们时间和资源的风险,但是可以肯定的是,我们至少将了解更多有关 RNN 的知识,以及为什么有可能比随机 50% 的策略更好地预测股价,我们将 首先概述如何使用 RNN 进行股票价格预测,然后讨论如何使用 TensorFlow API 构建 RNN 模型来预测股票价格,以及如何使用易于使用的 Keras API 来构建 RNN LSTM 模型 价格预测。 我们将测试这些模型是否可以击败随机的买入或卖出策略。 如果我们对我们的模型感到满意,以提高我们在市场上的领先优势,或者只是出于专有技术的目的,我们将了解如何冻结并准备 TensorFlow 和 Keras 模型以在 iOS 和 Android 应用程序上运行。 如果该模型可以提高我们的机会,那么我们支持该模型的移动应用程序可以在任何时候,无论何时何地做出买或卖决定。 感觉有点不确定和兴奋? 欢迎来到市场。
......@@ -24,15 +24,15 @@
前馈网络(例如密集连接的网络)没有内存,无法将每个输入视为一个整体。 例如,表示为像素向量的图像输入在单个步骤中由前馈网络处理。 但是,使用具有内存的网络可以更好地处理时间序列数据,例如最近 10 或 20 天的股价。 假设过去 10 天的价格为 X <sub>1</sub> ,X <sub>2</sub> ,...,X <sub>10</sub> ,其中 X <sub>1</sub> 为 最早的和 X <sub>10</sub> ,然后将所有 10 天价格视为一个序列输入,并且当 RNN 处理此类输入时,将发生以下步骤:
前馈网络(例如密集连接的网络)没有内存,无法将每个输入视为一个整体。 例如,表示为像素向量的图像输入在单个步骤中由前馈网络处理。 但是,使用具有内存的网络可以更好地处理时间序列数据,例如最近 10 或 20 天的股价。 假设过去 10 天的价格为`X1, X2, ..., X10`,其中`X1`为最早的和`X10`为最晚,然后将所有 10 天价格视为一个序列输入,并且当 RNN 处理此类输入时,将发生以下步骤:
1. 按顺序连接到第一个元素 X <sub>1</sub> 的特定 RNN 单元处理 X <sub>1</sub> 并获取其输出 y <sub>1</sub>
2. 在序列输入中,连接到下一个元素 X <sub>2</sub> 的另一个 RNN 单元使用 X <sub>2</sub> 以及先前的输出 y <sub>1</sub> , 获得下一个输出 y <sub>2</sub>
3. 重复该过程:在时间步长使用 RNN 单元处理输入序列中的 X <sub xmlns:epub="http://www.idpf.org/2007/ops">i</sub> 元素时,先前的输出 y <sub xmlns:epub="http://www.idpf.org/2007/ops">i-1</sub> ],在时间步 i-1 与 X <sub xmlns:epub="http://www.idpf.org/2007/ops">i</sub> 一起使用,以在时间步 i 生成新的输出 y <sub xmlns:epub="http://www.idpf.org/2007/ops">i</sub>
1. 按顺序连接到第一个元素`X1`的特定 RNN 单元处理`X1`并获取其输出`y1`
2. 在序列输入中,连接到下一个元素`X2`的另一个 RNN 单元使用`X2`以及先前的输出`y1`, 获得下一个输出`y2`
3. 重复该过程:在时间步长使用 RNN 单元处理输入序列中的`Xi`元素时,先前的输出`y[i-1]`,在时间步`i-1``Xi`一起使用,以在时间步`i`生成新的输出`yi`
因此,在时间步长 i 的每个 y <sub>i</sub> 输出 都具有有关输入序列中直到时间步长 i 以及包括时间步长 i 的所有元素的信息:X <sub>1</sub> ,X <sub>2</sub> ,... X <sub>i-1</sub> 和 X <sub>i</sub> 。 在 RNN 训练期间,预测价格 y <sub>1</sub> ,y <sub>2</sub> ,...,y <sub>9 将</sub> 和 y <sub>10</sub> 的每个时间步长与每个时间步长的真实目标价格进行比较,即 X <sub>2</sub> ,X <sub>3</sub> ,...,X <sub>10</sub> 和 X <sub>11 ,</sub> 和损失函数因此被定义并用于优化以更新网络参数。 训练完成后,在预测期间,将 X <sub>11</sub> 用作输入序列的预测,X <sub>1</sub> ,X <sub>2</sub> ,...,X <sub>10</sub>
因此,在时间步长`i`的每个`yi`输出 都具有有关输入序列中直到时间步长`i`以及包括时间步长`i`的所有元素的信息:`X1, X2, ..., X[i-1]``Xi`。 在 RNN 训练期间,预测价格`y1, y2, ..., y9``y10`的每个时间步长与每个时间步长的真实目标价格进行比较,即`X2, X3, ..., X10``X11`和损失函数因此被定义并用于优化以更新网络参数。 训练完成后,在预测期间,将`X11`用作输入序列的预测,`X1, X2, ..., X10`
这就是为什么我们说 RNN 有内存。 RNN 对于处理股票价格数据似乎很有意义,因为直觉是,今天(以及明天和后天等等)的股票价格可能会受其前 N 天的价格影响。
这就是为什么我们说 RNN 有内存。 RNN 对于处理股票价格数据似乎很有意义,因为直觉是,今天(以及明天和后天等等)的股票价格可能会受其前`N`天的价格影响。
LSTM 只是解决 RNN 已知梯度消失问题的一种 RNN,我们在第 6 章,“用自然语言描述图像”中引入了 LSTM。 基本上,在训练 RNN 模型的过程中,,如果到 RNN 的输入序列的时间步太长,则使用反向传播更新较早时间步的网络权重可能会得到 0 的梯度值, 导致没有学习发生。 例如,当我们使用 50 天的价格作为输入,并且如果使用 50 天甚至 40 天的时间步长变得太长,则常规 RNN 将是不可训练的。 LSTM 通过添加一个长期状态来解决此问题,该状态决定可以丢弃哪些信息以及需要在许多时间步骤中存储和携带哪些信息。
......@@ -46,11 +46,11 @@ The other type of RNN that solves the vanishing gradient problem nicely is calle
所有这些技术已经实现,并且可以在 TensorFlow 和 Keras API 中轻松访问。
那么,我们如何使用 RNN 和 LSTM 测试股价预测? 我们将在[这个页面](https://www.alphavantage.co)上使用免费的 API 收集特定股票代码的每日股票价格数据,将其解析为训练集和测试集,并在每次输入时提供 对 RNN / LSTM 模型的一批训练输入(每个训练输入有 20 个时间步长,即,连续 20 天的价格),对模型进行训练,然后进行测试以查看模型在测试数据集中的准确性。 我们将同时使用 TensorFlow 和 Keras API 进行测试,并比较常规 RNN 和 LSTM 模型之间的差异。 我们还将测试三个略有不同的序列输入和输出,看看哪个是最好的:
那么,我们如何使用 RNN 和 LSTM 测试股价预测? 我们将在[这个页面](https://www.alphavantage.co)上使用免费的 API 收集特定股票代码的每日股票价格数据,将其解析为训练集和测试集,并在每次输入时提供 对 RNN/LSTM 模型的一批训练输入(每个训练输入有 20 个时间步长,即,连续 20 天的价格),对模型进行训练,然后进行测试以查看模型在测试数据集中的准确性。 我们将同时使用 TensorFlow 和 Keras API 进行测试,并比较常规 RNN 和 LSTM 模型之间的差异。 我们还将测试三个略有不同的序列输入和输出,看看哪个是最好的:
* 根据过去 N 天预测一天的价格
* 根据过去 N 天预测 M 天的价格
* 基于将过去 N 天移动 1 并使用预测序列的最后输出作为第二天的预测价格进行预测
* 根据过去`N`天预测一天的价格
* 根据过去`N`天预测 M 天的价格
* 基于将过去`N`天移动 1 并使用预测序列的最后输出作为第二天的预测价格进行预测
现在让我们深入研究 TensorFlow RNN API 并进行编码以训练模型来预测股票价格,以查看其准确性如何。
......@@ -105,7 +105,7 @@ seq_len = 20
learning_rate = 0.001
```
[NumPy](http://www.numpy.org) 是用于 n 维数组操作的最受欢迎的 Python 库,而 [Matplotlib](https://matplotlib.org) 是领先的 Python 2D 绘图库。 我们将使用 numpy 处理数据集,并使用 Matplotlib 可视化股票价格和预测。 `num_neurons`是 RNN(或更准确地说是 RNN 单元)在每个时间步长上的神经元数量-每个神经元在该时间步长上都接收输入序列的输入元素,并从前一个时间步长上接收输出。 `num_inputs``num_outputs`指定每个时间步长的输入和输出数量-我们将从每个时间步长的 20 天输入序列中将一个股票价格提供给带有`num_neurons`神经元的 RNN 单元,并期望 每个步骤的库存量。 `seq_len`是时间步数。 因此,我们将使用 Google 的 20 天股票价格作为输入序列,并将这些输入发送给具有 100 个神经元的 RNN 单元。
[NumPy](http://www.numpy.org) 是用于 N 维数组操作的最受欢迎的 Python 库,而 [Matplotlib](https://matplotlib.org) 是领先的 Python 2D 绘图库。 我们将使用 numpy 处理数据集,并使用 Matplotlib 可视化股票价格和预测。 `num_neurons`是 RNN(或更准确地说是 RNN 单元)在每个时间步长上的神经元数量-每个神经元在该时间步长上都接收输入序列的输入元素,并从前一个时间步长上接收输出。 `num_inputs``num_outputs`指定每个时间步长的输入和输出数量-我们将从每个时间步长的 20 天输入序列中将一个股票价格提供给带有`num_neurons`神经元的 RNN 单元,并期望 每个步骤的库存量。 `seq_len`是时间步数。 因此,我们将使用 Google 的 20 天股票价格作为输入序列,并将这些输入发送给具有 100 个神经元的 RNN 单元。
2. 打开并读取包含所有价格的文本文件,将价格解析为`float`数字列表,颠倒列表顺序,以便最早的价格首先开始,然后每次添加`seq_len+1`值(第一个`seq_len`值将 是 RNN 的输入序列,最后的`seq_len`值将是目标输出序列),从列表中的第一个开始,每次移动 1 直到列表的末尾,直到一个 numpy `result`数组:
......@@ -136,7 +136,7 @@ test = result[row:, :]
np.random.shuffle(train)
```
制定训练集和测试集`X_train``X_test`的输入序列,以及训练集和测试集`y_train``y_test`的目标输出序列。 请注意,大写字母 X 和小写字母 y 是机器学习中常用的命名约定,分别代表输入和目标输出:
制定训练集和测试集`X_train``X_test`的输入序列,以及训练集和测试集`y_train``y_test`的目标输出序列。 请注意,大写字母`X`和小写字母`y`是机器学习中常用的命名约定,分别代表输入和目标输出:
```py
X_train = train[:, :-1] # all rows with all columns except the last one
......@@ -285,7 +285,7 @@ python tensorflow/python/tools/freeze_graph.py --input_meta_graph=/tmp/amzn_mode
Keras 是一个非常易于使用的高级深度学习 Python 库,它运行在 TensorFlow,Theano 和 CNTK 等其他流行的深度学习库之上。 您很快就会看到,Keras 使构建和使用模型变得更加容易。 要安装和使用 Keras 以及 TensorFlow 作为 Keras 的后端,最好首先设置一个 virtualenv:
Keras 是一个非常易于使用的高级深度学习 Python 库,它运行在 TensorFlow,Theano 和 CNTK 等其他流行的深度学习库之上。 您很快就会看到,Keras 使构建和使用模型变得更加容易。 要安装和使用 Keras 以及 TensorFlow 作为 Keras 的后端,最好首先设置一个 VirtualEnv:
```py
sudo pip install virtualenv
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册