python - TF LSTM 多步预测似乎是错误的

标签 python tensorflow machine-learning keras deep-learning

enter image description here

您可以在此处查看完整源代码

https://colab.research.google.com/drive/1kk24KjpZQEZpdlBxr4D4DO-IGHJ0439v?usp=sharing

x_test的原始数据具有非线性随机游走特性,

但是新预测的 20 个值具有线性形状。

显然,我的预测是错误的吗?

最佳答案

我继续阅读了一些你的数据。对您的训练和模型的一些评论:

1) 您专门训练了一个 LSTM,以根据 20 个过去的值预测 future 的一个值。您为什么期望该模型能够根据第一个值推断出另外 19 个值?您的模型没有接受过这样做的训练,并且不知道这很重要。

2) 你的模型非常小。您的模型有 491 个变量 (model.summary()),这是非常小的。您认为有多少特征会影响股市?您认为对每个特征建模有多少变量?大多数深度学习需要数百万个变量来学习像股票市场这样复杂的东西。此外,这是一个高度复杂的领域,需要全世界数百万人进行研究。

3) 您几乎没有对数据的复杂程度进行任何类型的培训。您在 GPU 上运行了 100 个 epoch,即大约 250 秒的训练。

4) 你的模型极度过度拟合。我认为你错误地认为“低损失”==“良好的预测模型”,这根本不是事实。这是我在谷歌上搜索的一个例子,它显示了我的意思,

https://towardsdatascience.com/regularization-the-path-to-bias-variance-trade-off-b7a7088b4577

https://miro.medium.com/max/552/1%[email protected]

在此示例中,经过训练的模型基本上具有零损失,并且可以完美地对输入数据进行预测。但该模型显然对驱动带有一些噪声的输入数据的底层特征曲线一无所知。因此,如果您尝试使用模型预测下一个值,它将非常不准确。

5)我认为您误解了模型训练的作用。当您训练模型时,您将收敛到产生低损失的“通用”答案。模型永远不会找到能够很好预测的权重的极端例子;它只会找到并慢慢收敛到一个产生低损耗的通用解决方案。例如,如果将权重稍微调整为零,使损失变小,那么在训练过程中就会反复强调这一点。如果预测统一的线性答案在看似随机的数据集中产生最小的损失,那么在训练过程中将一遍又一遍地强化这一点。一般来说(就像我上面评论的那样),当模型面对均匀随机信息时,它倾向于选择信息的平均值(因为这会在批处理之间产生更少的损失)。

我相信您提供的代码和您得到的结果是预期的。


编辑:

以下是时间序列数据模型的一些示例(它们好不好,谁知道呢,这取决于您的数据):

# Basic LSTM that attempts to produce a prediction vector from a sequence of time data. 
model = tf.keras.Sequential([
    tf.keras.layers.LSTM(20), 
])

# Maybe throw a few LSTM layers to help learn the information, add some dimensions. 
model = tf.keras.Sequential([
    tf.keras.layers.LSTM(5,return_sequences=True), 
    tf.keras.layers.LSTM(50,return_sequences=True),
    tf.keras.layers.LSTM(20),
])

# Maybe some Dense layers should be used to re-arrange information. 
model = tf.keras.Sequential([
    tf.keras.layers.LSTM(20), 
    tf.keras.layers.Dense(500),
    tf.keras.layers.Dense(20),
])

也许加入一些激活,relu 可能会很有用(有点像给图层一个垃圾桶来删除无用的值)。或者可能是一些 sigmoid(保持较小的值)或 softmax(将值视为概率)。您还可以添加一些 Dropout 层以防止过度拟合(让您的模型保持警惕,不要让它很快稳定下来)。此外,标准化数据也很有用。如果您发现权重增长得很快,请添加一些正则化以强制模型在尝试学习数据时使用较小的权重。

model = tf.keras.Sequential([
    tf.keras.layers.LSTM(5,return_sequences=True,activation='relu'), 
    tf.keras.layers.Dropout(0.10),
    tf.keras.layers.LSTM(50,return_sequences=True,activation='relu'),
    tf.keras.layers.Dropout(0.10),
    tf.keras.layers.LSTM(20),
])

如果您认为学习效果不好,请从“adam”切换到另一种学习算法。也许你的“均方误差”损失函数对大误差过于苛刻,可能会减慢学习速度;尝试使用“logcosh”代替。连续24小时运行,最好使用GPU。

如果 LSTM 层太慢。也许改用一些注意力层或残差层(通过谷歌搜索这个自定义想法)。

您始终可以尝试 GRU 层而不是 LSTM。具有大致相同的性能,但训练速度更快一些。

关于python - TF LSTM 多步预测似乎是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61949771/

相关文章:

python - 从 python 列表中创建降序值的子列表

python - 具有未知batch_size的Keras重复元素

r - 对于 R 中的随机森林模型,predict() 函数和 model$predicted 有什么区别?

python - 如何在Python中对满足特定条件的行进行子集化

Python:从文件夹导入每个模块?

python - Tensorflow 模型到 Numpy

Tensorflow 哪些操作是可微的,哪些不是?

machine-learning - 神经网络盲猜

php - 捕获用户数据以进行机器学习和推荐

python - 正则表达式匹配字符串中任意数量的标记