gpt4 book ai didi

python - 多元时间序列的 Keras 递归神经网络

转载 作者:太空宇宙 更新时间:2023-11-04 00:12:38 25 4
gpt4 key购买 nike

我一直在阅读有关 Keras RNN 模型(LSTM 和 GRU)的文章,作者似乎主要关注使用由先前时间步长组成的训练实例的语言数据或单变量时间序列。我的数据有点不同。

我有 10 年每年测量 100,000 人的 20 个变量作为输入数据,第 11 年测量的 20 个变量作为输出数据。我想做的是预测第 11 年的其中一个变量(而不是其他 19 个)的值。

我的数据结构为 X.shape = [persons, years, variables] = [100000, 10, 20]Y.shape = [persons, variable] = [ 100000, 1]。下面是我的 LSTM 模型的 Python 代码。

## LSTM model.

# Define model.

network_lstm = models.Sequential()
network_lstm.add(layers.LSTM(128, activation = 'tanh',
input_shape = (X.shape[1], X.shape[2])))
network_lstm.add(layers.Dense(1, activation = None))

# Compile model.

network_lstm.compile(optimizer = 'adam', loss = 'mean_squared_error')

# Fit model.

history_lstm = network_lstm.fit(X, Y, epochs = 25, batch_size = 128)

请问我有四个(相关)问题:

  1. 我是否为我拥有的数据结构正确编码了 Keras 模型?我从全连接网络(使用扁平化数据)和 LSTM、GRU 和 1D CNN 模型获得的性能几乎相同,我不知道我是否在 Keras 中犯了错误,或者循环模型是否只是在这种情况下没有帮助。

  2. 我是否应该将 Y 作为一个形状为 Y.shape = [persons, years] = [100000, 11] 的系列,而不是将变量包含在 X 中,这将有shape X.shape = [persons, years, variables] = [100000, 10, 19]?如果是这样,如何让 RNN 输出预测序列?当我使用 return_sequences = True 时,Keras 返回错误。

  3. 这是使用我拥有的数据进行预测的最佳方式吗? Keras RNN 模型甚至其他模型是否有更好的选项可供选择?

  4. 我如何模拟类似于我拥有的数据结构的数据,以便 RNN 模型的性能优于全连接网络?

更新:

我尝试了一个模拟,我希望这是一个非常简单的案例,其中 RNN 应该优于 FNN。

虽然 LSTM 在隐藏层较少 (4) 时往往优于 FNN,但在隐藏层较多 (8+) 时性能变得相同。谁能想到一个更好的模拟,其中 RNN 有望优于具有类似数据结构的 FNN?

from keras import models
from keras import layers

from keras.layers import Dense, LSTM

import numpy as np
import matplotlib.pyplot as plt

下面的代码模拟了 10,000 个实例、10 个时间步长和 2 个变量的数据。如果第二个变量在第一个时间步中为 0,则 Y 为第一个变量在最后一个时间步中的值乘以 3。如果第二个变量在第一个时间步中为 1,则 Y 为最后一个时间步的第一个变量的值乘以 9。

我希望 RNN 会在内存的第一个时间步中保留第二个变量的值,并使用它来知道哪个值(3 或 9)与最后一个时间步中的第一个变量相乘。

## Simulate data.

instances = 10000

sequences = 10

X = np.zeros((instances, sequences * 2))

X[:int(instances / 2), 1] = 1

for i in range(instances):

for j in range(0, sequences * 2, 2):

X[i, j] = np.random.random()

Y = np.zeros((instances, 1))

for i in range(len(Y)):

if X[i, 1] == 0:

Y[i] = X[i, -2] * 3

if X[i, 1] == 1:

Y[i] = X[i, -2] * 9

下面是 FNN 的代码:

## Densely connected model.

# Define model.

network_dense = models.Sequential()
network_dense.add(layers.Dense(4, activation = 'relu',
input_shape = (X.shape[1],)))
network_dense.add(Dense(1, activation = None))

# Compile model.

network_dense.compile(optimizer = 'rmsprop', loss = 'mean_absolute_error')

# Fit model.

history_dense = network_dense.fit(X, Y, epochs = 100, batch_size = 256, verbose = False)

plt.scatter(Y[X[:, 1] == 0, :], network_dense.predict(X[X[:, 1] == 0, :]), alpha = 0.1)
plt.plot([0, 3], [0, 3], color = 'black', linewidth = 2)
plt.title('FNN, Second Variable has a 0 in the Very First Time Step')
plt.xlabel('Actual')
plt.ylabel('Predicted')

plt.show()

plt.scatter(Y[X[:, 1] == 1, :], network_dense.predict(X[X[:, 1] == 1, :]), alpha = 0.1)
plt.plot([0, 9], [0, 9], color = 'black', linewidth = 2)
plt.title('FNN, Second Variable has a 1 in the Very First Time Step')
plt.xlabel('Actual')
plt.ylabel('Predicted')

plt.show()

下面是 LSTM 的代码:

## Structure X data for LSTM.

X_lstm = X.reshape(X.shape[0], X.shape[1] // 2, 2)

X_lstm.shape

## LSTM model.

# Define model.

network_lstm = models.Sequential()
network_lstm.add(layers.LSTM(4, activation = 'relu',
input_shape = (X_lstm.shape[1], 2)))
network_lstm.add(layers.Dense(1, activation = None))

# Compile model.

network_lstm.compile(optimizer = 'rmsprop', loss = 'mean_squared_error')

# Fit model.

history_lstm = network_lstm.fit(X_lstm, Y, epochs = 100, batch_size = 256, verbose = False)

plt.scatter(Y[X[:, 1] == 0, :], network_lstm.predict(X_lstm[X[:, 1] == 0, :]), alpha = 0.1)
plt.plot([0, 3], [0, 3], color = 'black', linewidth = 2)
plt.title('LSTM, FNN, Second Variable has a 0 in the Very First Time Step')
plt.xlabel('Actual')
plt.ylabel('Predicted')

plt.show()

plt.scatter(Y[X[:, 1] == 1, :], network_lstm.predict(X_lstm[X[:, 1] == 1, :]), alpha = 0.1)
plt.plot([0, 9], [0, 9], color = 'black', linewidth = 2)
plt.title('LSTM, FNN, Second Variable has a 1 in the Very First Time Step')
plt.xlabel('Actual')
plt.ylabel('Predicted')

plt.show()

最佳答案

  1. 是的,使用的代码对于您要执行的操作是正确的。 10 年是用于预测下一年的时间窗口,因此它应该是 20 个变量中每个变量的模型输入数。 100,000 个观测值的样本量与模型的输入形状无关。

  2. 您最初塑造因变量 Y 的方式是正确的。您为 1 个变量预测 1 年的窗口,并且您有 100,000 个观测值。关键字参数 return_sequences=True 将导致抛出错误,因为您只有一个 LSTM 层。如果您要实现多个 LSTM 层并且相关层后跟另一个 LSTM 层,请将此参数设置为 True

我希望我能为 3 提供一些指导,但如果没有你的数据集,我不知道是否可以肯定地回答这个问题。

我要说的是,LSTM 旨在解决常规 RNN 中存在的所谓长期依赖性问题。这个问题归结为随着相关信息被观察到信息有用的时间点之间的差距越来越大,标准 RNN 将更难学习它们之间的关系。考虑根据 3 天的事件与全年的事件来预测股票价格。

这导致了第 4 点。如果我宽松地使用术语“相似”并将您的时间窗口进一步延伸到 50 年而不是 10 年,那么使用 LSTM 获得的优势将变得更加明显。虽然我确信更有经验的人能够提供更好的答案,但我期待看到它。

我发现此页面有助于理解 LSTM:

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

关于python - 多元时间序列的 Keras 递归神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51975951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com