刚开始接触深度学习时,准备数据可能会很困难。
长短期记忆(LSTM)循环神经网络在 Keras Python 深度学习库中需要三维输入。
如果你的时间序列数据中有数千个观测值,你必须将时间序列分割成样本,然后为你的 LSTM 模型重塑它。
在本教程中,你将了解如何使用 Keras 在 Python 中为 LSTM 模型准备单变量时间序列数据。
立即开始你的项目,阅读我的新书 《时间序列预测深度学习》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

如何为长短期记忆网络准备单变量时间序列数据
照片作者:Miguel Mendez,保留部分权利。
如何准备时间序列数据
也许我收到的最常见问题是如何为监督学习准备时间序列数据。
我写了几篇关于这个主题的文章,例如
但是,这些文章并不能帮助所有人。
我最近收到了这封电子邮件
我的数据文件中包含两列,有 5000 行,第一列是时间(每小时一个间隔),第二列是 bits/sec,我正在尝试预测 bits/sec。在这种情况下,你能帮我设置 LSTM 的样本、时间步和特征吗?
这里有几个问题
- LSTM 需要 3D 输入,第一次接触时可能会让你难以理解。
- LSTM 不喜欢超过 200-400 个时间步的序列,因此数据需要分割成样本。
在本教程中,我们将利用这个问题来展示一种专门为 Keras 中的 LSTM 网络准备数据的方法。
时间序列深度学习需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
1. 加载数据
我假设您知道如何将数据加载为 Pandas Series 或 DataFrame。
如果不知道,请参阅这些文章
在这里,我们将通过在内存中定义一个具有 5000 个时间步的新数据集来模拟加载。
1 2 3 4 5 6 7 8 9 10 |
from numpy import array # 加载... data = list() n = 5000 for i in range(n): data.append([i+1, (i+1)*10]) data = array(data) print(data[:5, :]) print(data.shape) |
运行这段代码会打印出前 5 行数据以及加载数据的形状。
我们可以看到我们有 5000 行和 2 列:一个标准的单变量时间序列数据集。
1 2 3 4 5 6 |
[[ 1 10] [ 2 20] [ 3 30] [ 4 40] [ 5 50]] (5000, 2) |
2. 删除时间
如果你的时间序列数据在时间上是均匀的,并且没有缺失值,我们可以删除时间列。
如果不是,你可能需要考虑填补缺失值、将数据重采样到新的时间尺度,或者开发一个可以处理缺失值的模型。请参阅类似的文章
在这里,我们只是删除第一列
1 2 3 |
# 删除时间 data = data[:, 1] print(data.shape) |
现在我们有了一个包含 5000 个值的数组。
1 |
(5000,) |
3. 分割成样本
LSTM 需要处理样本,每个样本都是一个单一的时间序列。
在这种情况下,5000 个时间步太长了;根据我读过的一些论文,LSTM 在 200 到 400 个时间步之间工作效果更好。因此,我们需要将这 5000 个时间步分割成多个较短的子序列。
我在这里写了更多关于分割长序列的内容
有很多方法可以做到这一点,具体取决于你的问题,你可能需要探索其中一些。
例如,也许你需要重叠的序列,也许不重叠的序列很好,但你的模型需要在子序列之间保持状态等等。
在这里,我们将这 5000 个时间步分割成 25 个子序列,每个子序列包含 200 个时间步。为了让你能看清楚,我们不使用 NumPy 或 Python 的技巧,而是用传统的方法来实现。
1 2 3 4 5 6 7 8 9 |
# 分割成样本(例如 5000/200 = 25) samples = list() length = 200 # 以 200 为步长遍历 5000 个数据 for i in range(0,n,length): # 从 i 到 i + 200 截取 sample = data[i:i+length] samples.append(sample) print(len(samples)) |
我们现在有 25 个长度为 200 个时间步的子序列。
1 |
25 |
如果你想用一行代码完成,请随意尝试。我很想看看你能想出什么方法。
在下面的评论区分享你的方法。
4. 重塑子序列
LSTM 需要 [样本数、时间步数、特征数] 格式的数据。
这里,我们有 25 个样本,每个样本有 200 个时间步,以及 1 个特征。
首先,我们需要将我们的数组列表转换为一个 25 x 200 的二维 NumPy 数组。
1 2 3 |
# 将数组列表转换为二维数组 data = array(samples) print(data.shape) |
运行这段代码,你应该会看到
1 |
(25, 200) |
接下来,我们可以使用 reshape() 函数为我们唯一的特征添加一个额外的维度。
1 2 3 4 |
# 重塑为 [样本数, 时间步数, 特征数] # 预期结果为 [25, 200, 1] data = data.reshape((len(samples), length, 1)) print(data.shape) |
这就完成了。
现在数据可以用作 LSTM 模型的输入 (X)。
1 |
(25, 200, 1) |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
相关文章
- 如何在 Python 中将时间序列转换为监督学习问题
- 将时间序列预测作为监督学习
- 如何在 Python 中加载和探索时间序列数据
- 如何在 Python 中加载机器学习数据
- 如何使用 Python 处理序列预测问题中的缺失时间步
- 如何使用 Python 处理缺失数据
- 如何使用 Python 重采样和插值时间序列数据
- 如何处理长短期记忆循环神经网络中的超长序列
- 如何在 Keras 中为截断反向传播准备序列预测
API
总结
在本教程中,你学会了如何将长单变量时间序列数据转换为可以在 Python 中用于训练 LSTM 模型的形式。
这篇帖子有帮助吗?你有什么问题吗?
在下面的评论中告诉我。
很棒的文章!我真希望几个月前我在为 TensorFlow 做同样的事情时能看到这篇文章。很高兴看到我的解决方案与你大体一致!
你提到了讨论最佳样本数量的一些论文。能否分享一下这些论文的链接?我想看看作者们是如何得出这个数字的。
谢谢。
也许可以看看这篇文章
https://machinelearning.org.cn/much-training-data-required-machine-learning/
这篇博文对我帮助很大!非常感谢你的文章。非常简单明了。
很高兴听到这个!
嗨 Jason,谢谢分享。
假设我有一个时间序列数据集 [1,2,3,4,5,6,7,8],需要以时间步长 4 进行分割,在你的文章中,结果将是 [1,2,3,4], [5,6,7,8]。但在我读过的其他文章中,结果有时是这样的:[1,2,3,4], [2,3,4,5],[3,4,5,6],[4,5,6,7],[5,6,7,8]。
那么分割样本的最佳方式是什么呢?谢谢。
你列出的所有 3 种方法都是有效的,尝试每种方法,看看哪种最适合你的问题。
有关于这个主题的文献吗?对于大型数据集,这 3 种解决方案似乎具有非常不同的训练时间。我假设对于第二种解决方案,我们应该保留单元格的内存,但对于第三种则不应该,对吗?
另外,是否存在训练在早期学习中过度暴露某些时间步(例如示例中的时间步 5)的风险,从而赋予这些数据更大的权重?
顺便说一句,你的博客很棒,你关于 LSTM 的书是我找到的最好的主题!谢谢。
并不是真的。
我建议你按照这 3 种方式来构建问题,并进行比较,看看哪种最适合你的具体数据。
也许这篇文章可以帮助你重新构建问题
https://machinelearning.org.cn/reshape-input-data-long-short-term-memory-networks-keras/
当原始单变量时间序列被分割成一个长度为 m 的子序列列表时,每个连续子序列之间的延迟为 d,这形成了一个新的样本,输入向量维度为 m。这被称为 Takens 嵌入。当 d = m = 4 时,这是第一种情况。当 d = 1, m = 4 时,这是第二种情况。事实上,任何 d > 1 都是有效的,m 也是如此。有多种方法可以确定 d 和 m 的“最佳”值。这里有一些关于这个主题的出版物
https://arxiv.org/pdf/1605.01571.pdf
https://file.scirp.org/pdf/JMP_2017083015084865.pdf
有意思,谢谢参考。
好文章。Python 的列表推导式是我很喜欢的功能。一个可能的单行代码是
samples = [data[i:i+length] for i in range(0,n, length)]
不错,谢谢。
Went,你想要的是“滑动窗口”,你可以用以下代码实现
from itertools import islice
def window(seq, n=2)
“返回一个滑动窗口(宽度为 n)的数据”
” s -> (s0,s1,…s[n-1]), (s1,s2,…,sn), … ”
it = iter(seq)
result = tuple(islice(it, n))
if len(result) == n
yield result
for elem in it
result = result[1:] + (elem,)
yield result
嗨 Jason!首先,我必须说我真的很喜欢你的文章,它们非常有帮助。
我面临一个时间序列分类问题(两个类别),其中我的序列大约有 120-200 个时间步,每个时间步有 7 个变量。问题是我只有 3000 个样本可以训练。你怎么看,一个 LSTM 网络是否可以先验地输入,还是我需要更多样本?
你提到 LSTM 不擅长处理超过 200-400 个时间步。那么特征的数量呢?你会进行降维吗?
提前非常感谢!
LSTM 可以支持多个特征。
这听起来数据量不够。
你可以尝试将序列分割成多个子序列看看是否有帮助?
嗨,Jason,
感谢你提供的这份精彩摘要,你的工作真的很出色……我对你花时间写这么多博客文章感到特别钦佩。
我想知道为什么 LSTM 网络更喜欢 200-400 个样本的序列,这是由于内存分配问题吗?或者更长的序列会影响准确性(我不会这么想,但也许有可能)?
批次大小在这里起什么作用?选择正确的批次大小是否可以减轻序列长度的限制?
此致
Staffan
这似乎是训练算法的一个限制。我在文献中看到过这个问题,但我自己并没有深入研究以更好地理解它。
我鼓励你在你的问题上测试不同的配置。
你好 jason,
好帖子!我对“time-steps”参数有点困惑。“time-steps”是指输入数据的跨度吗?例如,对于单变量问题和一步预测,我使用“滑动窗口”构建了数据。对于每个样本,结构是“t-6,t-5,t-4,t-3,t-2,t-1,t 作为输入(train_x),以及 t+1 作为输出(train_y)”。使用 7 个数据来预测第 8 个。我将输入(train_x)重塑为 [样本数, 7, 1]。这样对吗?
在这篇文章中了解更多关于时间步的信息
https://machinelearning.org.cn/gentle-introduction-backpropagation-time/
我想是的。
我认为 time steps 参数是表示行数,而 features 是表示参数的数量,正如 Jason 在一篇文章中所解释的那样
抱歉,features 是表示列数
看这里
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input
嗨,我能用同样的方法为 1D-CNN 准备数据吗?如果不行,是否有其他部分描述了 1D-CNN 的准备方法?
有很多关于 1d CNN 的教程,从这里开始
https://machinelearning.org.cn/how-to-develop-convolutional-neural-network-models-for-time-series-forecasting/
你好 Jason,抱歉我的英语。我是神经网络的新手,我正在尝试开发一个神经网络来生成音乐。
我有许多 .txt 文件,其中包含音符序列,如下所示:
[音符编号(整数), 时间(整数), 时长(整数)]
68 2357 159,
64 2357 260,
…
…
我应该选择哪种神经网络来实现这个目的?
我该如何预处理这类数据?
恭喜你的网站,谢谢你。
对于序列预测,像 LSTM 这样的 RNN 可能是一个不错的起点。
你好
我想对类别进行分类,每个类别包含 8 个时间步,每个时间步有 16 个特征。这个重塑是正确的吗?
reshape(124,8,1)
我认为应该是 (?, 6, 16),其中“?”是样本数,如果我理解你的情况,可能是 124。
你好,Jason,感谢你的辛勤工作。
我读了你关于将数据组织成 3D 的文章,但我的数据无法做到这一点,它总是出现类似这样的错误
“检查目标时出错:预期 dense_363 具有 2 个维度,但收到形状为 (3455, 1, 1) 的数组”
我的数据组织如下:
开胃菜
11,000 行,48 列,每行代表一天,每列代表 0.5 小时。
输出 Y (0, 1) 是二元的,它代表事件的发生 1=是,0=否。
所以我有 X = [0.1, 0.2, 0.3, ..., 0.48] Y = [0] 或 Y = [1]
更多详情请看我的代码
# 加载数据
dataframe = pd.read_csv(‘Parque_A_Classificado_V2.csv’, header=None)
dataset = dataframe.values
# 将数据分割成训练集和测试集变量
train_size = int(len(dataset) * 0.7)
test_size = len(dataset) – train_size
trainX, trainY = dataset[0:train_size,:48], dataset[train_size:len(dataset),48]
testX, testY = dataset[0:test_size, :48], dataset[test_size:len(dataset), 48]
# 重塑输入为 [样本,时间步,特征]
trainX = trainX.reshape(trainX.shape[0],trainX.shape[1], 1)
testX = testX.reshape(testX.shape[0], testX.shape[1], 1)
trainY = trainY.reshape(trainY.shape[0], 1, 1)
testY = testY.reshape(testY.shape[0], 1, 1)
# 创建模型
model = Sequential()
model.add(LSTM(100, input_shape=(48, 1)))
model.add(Dense(1, activation=’sigmoid’))
# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
model.fit(trainX, trainY, validation_data(testX, testY), epochs=1, batch_size=1)
我找不到错误,你能帮我吗?
也许这篇博文会让你更清楚
https://machinelearning.org.cn/reshape-input-data-long-short-term-memory-networks-keras/
非常感谢,Jason,你的态度值得称赞。
这次我成功运行了我的模型。
很高兴听到你解决了问题。
嗨,Jason,
我遇到的问题与这里描述的类似,但略有不同。
我正在解决一个分解问题,因此我的输出维度高于我的输入维度。为了简化,假设我的原始数据看起来像这样
X.shape == [1000,1]
Y.shape == [1000,10]
我做了一些输入来让事情正常工作
X = X.reshape(1,X.shape[0[,X.shape[1]) #将此参数设为依赖,以防我需要
稍后使用更多特征
我的网络看起来像这样
model.sequential()
model.add(LSTM(50,batch_input_shape = X.shape, stateful = True)
model.add(Dense(Y.shape[1],activation = ‘relu’) #我的输出值不在+/-1之间,所以我
选择了relu
我选择了状态化模型,因为在实际训练时我将不得不进行批量分离,因为我有近 10^6 个样本
然后我尝试了对 Y 向量做同样的事情,以及不碰它,无论哪种方式我都会得到一个错误(当我重塑 Y 时,我将 Y.shape[1] 改为 Y.shape[2])
有什么想法?
输出将是 2D 而不是 3D。
当我划分并重塑 5000 行数据集时,如何将其分割为训练集和测试集?
您可以在重塑之前或之后进行分割。
这篇帖子将教您更多关于如何处理数组
https://machinelearning.org.cn/index-slice-reshape-numpy-arrays-machine-learning-python/
感谢这篇文章以及关于重塑 LSTM 输入数据的那篇文章,我理解了如何分割/重塑 LSTM 网络的输入,但我不知道如何处理标签……
我的数据集是 3000 个时间步和 9 个特征。正如文章中所解释的,我将其分割以获得 15 个 200 个时间步长的样本,因此我的输入形状是 (15, 200, 9)。
我的标签是 (3000, 6) 的二进制矩阵,也就是说,我想解决一个 6 类分类问题。
如果我按原样输入标签,我会收到错误“找到 15 个输入样本和 3000 个目标样本”。
如何正确地将标签输入网络?让我困惑的是,目标应该是 2D(与输入不同),所以我看不到我该如何像分割输入那样分割它们,例如获得 (15, 200, 6) 的形状……
每个输入样本您都需要一个标签。
很棒的博客,谢谢!
据我理解,您展示了如何处理一个长时序列,但我无法理解如何处理多个输入。
例如,我的输入是 x1,维度是 (25, 200, 1)
但我有多个输入用于我的训练 X = [x1,x2…xn]
我应该如何为 model.fit 和 LSTM 层进行形状调整?一个 4D 张量?
我在这里解释了更多
https://machinelearning.org.cn/faq/single-faq/how-do-i-prepare-my-data-for-an-lstm
感谢精彩的博客。
重塑时,总训练样本数放在哪里?
据我理解:(子样本数量,时间步,每个时间步的特征)
正确:[样本数,时间步,特征数]。
我喜欢你所有的帖子!
我有点困惑
我猜时间步的数量限制了递归层的数量。因为时间步的数量等于你运行递归神经网络的时间步数。这是真的吗?如果是,LSTM 的内存如何能大于递归次数?
如果它不大于,为什么有人会选择 time steps = 1 就像你在一些帖子中所做的那样?
谢谢。
时间步和节点/层是无关的。
抱歉,我把问题表述得不好。
我的意思是:如果我有一个比如 100 个时间步长的样本序列,LSTM 的内存能大于这 100 个时间步长吗?
内存是否受序列中给定时间步数限制?
感谢您的时间。T
根据文献,LSTM 的限制似乎大约在 200-400 个时间步长。
嗨,Jason,
您能否解释一下您所说的 LSTM 对 200-400 个时间步长效果不佳,而您却回复 Daniel Salvador 说 3000 个训练样本不够?
200-400 是指预测 200-400 步吗?
您认为多少训练样本才算足够?
输入数据有一定数量的时间步。根据文献,如果输入时间步的数量超过大约 200-400 步,LSTM 的性能似乎会下降。
我自己还没有通过实验测试过。
在这种情况下请问,我想用 Keras 训练我的模型时,如何选择批次大小?
注意:我的数据形状如下:[3700, 200, 150],其中
– 3700:样本数(740 个样本 * 5 个类别)
– 200:时间步
– 150:特征
嗨 Ala…以下资源可能与您相关
https://machinelearning.org.cn/how-to-control-the-speed-and-stability-of-training-neural-networks-with-gradient-descent-batch-size/
亲爱的 Jason,
你能帮我解决这个问题吗?
我有许多短语,每个短语包含许多单词(我已经填充,使它们具有相同的长度),并且我已经为每个单词训练了词嵌入。那么,在这种情况下,如果我想在 Keras 中使用 LSTM 来执行一些分类任务(例如,每个短语的标签是 1 或 0,这与单词的顺序有关),那么 LSTM 层的输入形状是什么?它是否像形状(短语数量,短语中的单词数,词嵌入的维度数)?我有点困惑。感谢您的帮助。
可能是:[总短语数, 短语长度, 1]
感谢您的回复。但我仍然感到困惑。
1. 为什么最后是“1”?
2. 我认为我的输入 numpy 数组(将被输入到 Keras 顺序模型,其第一层是 LSTM 层)的形状是(短语数量,短语中的单词数,词嵌入的维度数)。这是否意味着 LSTM 的输入形状是(短语中的单词数,词嵌入的维度数)?因为我想根据单词之间的顺序学习东西。
我的任务与您帖子中的任务非常相似。 https://machinelearning.org.cn/sequence-classification-lstm-recurrent-neural-networks-python-keras/
在该帖子中,原始输入是一个单词向量。然后,它将被放入一个 keras 顺序模型,但是,第一层是 Word Embedding 层,然后是 LSTM 层。词嵌入层的输出形状应该是(2D)数组,对吧?那是否意味着在这种情况下 LSTM 的输入形状是 2D 而不是 3D?如果不是,那么在这种情况下输入形状是什么。
谢谢你的帮助。
因为您有一个 1D 整数序列要输入到您的模型中,例如作为嵌入的输入。
词嵌入将处理其自身的维度,不要为它重塑数据。
嗨 Jason,您能帮我一下吗?
我的数据集不是连续收集的,而是许多实验的结果,每个实验都代表我想让我的 LSTM 模型学习和预测的特定类别。
在训练阶段准备序列的最佳策略是什么?
我应该将所有可用的时间序列连接起来,然后使用滑动窗口生成序列吗?在这种情况下,我可能会冒险将不同类别的数据放在同一个序列中……
或者为每个单独的类别创建序列会更好吗?
提前感谢
也许可以构思 3-5 种不同的方法来构建预测问题,然后对其中一些进行原型设计。这将帮助您理清正确的方法。
嗨,Jason,
很棒的帖子!
您在 PM 2.5 多变量时间序列示例中没有像这样进行操作 https://machinelearning.org.cn/multivariate-time-series-forecasting-lstms-keras/ 。
# 分割成样本(例如 5000/200 = 25)
samples = list()
length = 200
# 以 200 为步长遍历 5000 个数据
for i in range(0,n,length)
# grab from i to i + 200
sample = data[i:i+length]
samples.append(sample)
print(len(samples))
这是因为 PM2.5 示例假设了重叠的子序列?还是您有其他原因?
为了方便您,您在该 PM2.5 示例中提供了以下代码片段
# 将输入重塑为 3D [样本, 时间步, 特征]
train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))
print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)
(8760, 1, 8) (8760,) (35039, 1, 8) (35039,)
在我更改 n_hours=3,即时间步后,我在 Spyder 中得到以下输出
(8760, 3, 8) (8760,) (35037, 3, 8) (35037,)
训练 8760 个样本,验证 35037 个样本
这意味着它们是重叠的子序列。
如果我的理解正确,请告诉我。
非常感谢。
因为我试图让教程保持简单和专注。
感谢您的回复。您没有在此教程中详细说明何时需要重叠子序列,何时不需要。您有关于此的教程或任何提示吗?
这 realmente 取决于问题,例如,输入样本的组成取决于您希望模型学习或映射到输出样本的内容。
这太棒了(就像您的整个系列一样)!我一直发现您的文章简洁、清晰、明了,所以谢谢您。
关于 LSTM 系列的一些小建议-您可以添加几行关于 Y 的形状和 return_sequence 选项。尽管读了您所有的 LSTM 文章,我之前在这方面遇到了困难,所以这可能会帮助其他人!
return_sequence 将是每个输入时间步一个值,每个节点一个值。
例如,如果层获得 10 个时间步的 1 个变量,并且层有 100 个节点,您将得到 [100, 10, 1]。
嗨 Jason,我有一个相关的问题
我聚合了房屋的电力消耗和电器的个体电力消耗(例如:洗碗机)。在这里,聚合电力是我的训练集,电器电力消耗是目标集。
我需要像您在这篇文章中那样重塑两者来训练我的模型吗?
也许。LSTM 在输入形状方面有特定的期望,请看这个
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input
您能否提供标签数据形状的示例?维度应该是多少?我们可以训练 24 个样本并预测第 25 个样本吗?
这是一个进行预测的示例
https://machinelearning.org.cn/make-predictions-long-short-term-memory-models-keras/
你好,
我只想说您的文章非常棒!
我的问题是
假设我们将数据分割成这样的形状
(100, 60, 5)
这意味着有 100 个样本,每个样本回顾 60 个时间步,包含 5 个特征。
我是否可以正确地假设,在按所述方式分割数据后,我们可以随意地对这 100 个样本进行洗牌,结果将是相同的。
这样我们就可以应用正常的交叉验证,而这对于 RNN 来说通常是不可能的?
谢谢。
不,您不能洗牌样本。您必须使用前向验证
https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/
嗨 Jason!首先,我必须说我真的很喜欢你的文章,它们非常有帮助。
我有一些关于时间序列的问题,您能给我一些建议吗?
1. 假设数据:t1, t2,…t10,我通过滚动窗口准备数据,窗口大小为 3,例如 [t1,t2,t3] -> t4,然后我训练了一个 LSTM 模型,我想知道如何预测未来一个时间步?例如:预测未来时间 t20 的值,但是历史特征 [t17, t18, t19] 为空。
2. 如果每个时间步都有一个标签,我需要通过滚动窗口来准备数据吗?例如二元分类问题
t1, f11, f12, f13, 1
t2, f21, f22, f23, 0
....
tn, fn1, fn2, fn3, 1
当我训练 LSTM 时,我将 N 个时间样本 [N, 3] 重塑为 [-1, timesteps, 3],N 是时间样本的数量,输入到 LSTM 的训练数据形状是 [-1, timesteps, 3],但这要求 N 必须等于 k * timesteps,例如,[60, 3] -> [-1, 12, 3] 是可以的,但 [50, 3] -> [-1, 12, 3] 是错误的。我想知道如何处理最后 2 个时间样本,我应该用零向量填充以获得序列大小 12 吗?
非常非常感谢。
我有许多例子,您可以从这里开始
https://machinelearning.org.cn/start-here/#deep_learning_time_series
嗨,Jason。感谢您的帖子。
我有一些问题。假设我要预测一个地区的人数。我们将该地区划分为 3x3 网格,每个网格具有当前人数的值。然后每小时时间间隔都有一个 3x3 的矩阵,例如 8:00 有一个 3x3 的矩阵,9:00 有一个 3x3 的矩阵,我们的目标是使用前两个时间间隔(即 10:00 和 11:00)来预测接下来的两个时间间隔(即 10:00 和 11:00)的人数。我应该如何处理这个任务?谢谢!
您可以使用 CNN-LSTM 或 ConvLSTM 来读取矩阵时间序列,然后使用编码器-解码器模型来输出多个时间步。
一切都很清楚,但我有一个问题。
代码行
data = array(samples)
返回的不是 (number_samples, time_steps),而只是 (number_samples,),因此重塑指令不起作用。
我该如何解决这个问题?
很抱歉您遇到了麻烦,也许这会有所帮助
https://machinelearning.org.cn/faq/single-faq/why-does-the-code-in-the-tutorial-not-work-for-me
非常感谢您的博文。我是这个领域的新手(我是机械工程专业的博士生),想请您对如何处理时空数据发表一下意见。我来解释一下,我有一些流体流动在二维域中的模拟结果,域中每个点的位置都有特定的 x 和 y 坐标,具有特定的速度、压力、涡量等。对于每个时间步,我都有一个单独的数据文件,每个数据文件包含多行和多列。每一行对应于域上的一个特定点,每一列包含该点的 x 坐标、y 坐标、速度、涡量等。您建议用哪种类型的神经网络来解决这个问题?如果您知道有类似的帖子或博客,如果您能指出,我将非常感激。
再次感谢您提供的博文内容!
我忘了补充
利用多个时间步的数据,我想训练一个模型,该模型将预测未来时间步在每个点的速度和涡量。同样,每个时间步都有包含多个数据点的单独文件。每个特定点的位置随时间保持不变。
很好的问题!
如果数据在空间上相关,例如像二维图像的时间序列,那么我建议您研究 CNN-LSTM 和 ConvLSTM。
感谢您的回复,我将研究 CNN-LSTM。还有一个问题。当每个时间步都有一个包含多个行的数据文件时,我如何输入多个时间步的数据?我找到的示例都将每个时间步表示为一个数据文件中的一行。但我的数据有多个时间步,每个时间步都有一个单独的文件。
也许可以将所有数据加载到内存中,或使用数据生成器逐步加载数据。
非常好的教程。我有一个关于 y_train 的问题。
在应用此教程后,我的 X_train 的形状是 (958, 75, 10)。但是,我的 y_train 只是 (71850, 9),这是一个包含 9 个可能类别的 one_hot_encoder 向量的长数组。
我不明白如何重塑 y_train 以便为 Keras 中的 LSTM 模型做好准备。
样本的输入和输出元素必须匹配。
例如,如果您有 958 个输入样本,则需要为这些相同样本提供 958n 个输出元素。
感谢您的回答。为了澄清,这意味着每个批次只需要一个 one_hot_encoder 向量?因为我在这两个地方(71850)都有样本,然后我使用 75 个样本的批次来重塑它。那么我只需要每 75 个样本捕获一个向量 [1,0,0,0,0,0,0,0,0,0]?
抱歉,我不太明白。我不知道独热编码或批次何时进入画面。
嗨,Jason,
我刚在 StackOverflow 上提问,也许更清楚
https://stackoverflow.com/questions/55983867/what-is-the-correct-format-of-y-train-when-the-output-is-one-of-8-classes-using
也许您可以用一两句话来总结一下?
你好,我有一个新问题, as updating the last one。
如果我没记错的话,y_train 的形状取决于模型,如果我训练一个状态化模型,它必须是 (958, 9),但是如果我训练一个非状态化模型,它必须是 (958, 75, 9)?
布朗利博士您好,
是否可以将向量的向量发送到 LSTM?我有单词标记(seq 1)“hello” “how” “are” “you” 等…每个单词都由 word2vec 中的一个向量表示。所以我得到一个向量的向量。这是 seq 1。我最多有 seq n。我如何将它们作为 LSTM 的输入?
是的,通常我们使用嵌入来存储向量。您可以直接将向量提供给 LSTM,每个向量的元素就是一个特征。
因此,您将拥有一个特征向量(特征或嵌入)的序列(单词或时间步)。
很棒的教程,我有一个问题
那么,如果我有一个单维数据,我是否必须通过添加时间步长来将其变成二维数据?
所以它变成例如
[1 20]
[2 25]
[3 30]
.
.
.
[10 65]
谢谢你
此致
好问题,这将帮助您理解
https://machinelearning.org.cn/time-series-forecasting-supervised-learning/
这是一个很好的资源,但我仍然对一件事感到困惑。我有一个分类问题,有 5 个特征,但我想训练模型来识别每个标签的时间步长序列。也就是说,sequence_feature1 + sequence_feature2 + sequence_feature3 + sequence_feature4 + sequence_feature5 = label。有没有办法修改 LSTM 的输入来解决这个问题?否则,我似乎是在训练模型,使 feature1+feature2 +feature3 + feature4 +feature5 = label 在每个时间步长(这是不正确的)。谢谢
抱歉,我不明白您问题的结构。
如果您需要记忆先前的预测,模型会拥有一些内部状态——至少在重置该状态之前是这样。
您准备好的最终数据是 3D numpy 数组,不重叠,对吗?
那么,不重叠意味着有些点我们无法预测。
在示例中([samples, timesteps, feature] = [25, 200, 1]),
・使用 1-200 的值预测 201 的值。
・使用 201-400 的值预测 401 的值,依此类推。
那么,我们无法预测,比如说 202 或 207,对吗?因为没有重叠。
我的理解正确吗?
您可以按照您希望的任何方式设计问题框架。
通常首选重叠,这实际上取决于您在实践中希望如何使用模型。
非常感谢您的回答。
不客气。
感谢 Jason 的精彩文章。根据您的文章,我们得到了以下数据形状
(25, 200, 1)。现在,让我们想象一下我们的模型已经训练好了。我们的模型现在期望的输入是(variable, 200, 1)。如果我只有一个数据点,并且我想预测二元输出(正面/负面),会发生什么?
即使重新整形,它也会变成(1, 1, 1),第二个维度会让模型崩溃,因为它期望每个批次有 200 行。我应该只调整第二个维度,然后用空值填充其余部分吗?(1, 200, 1)第一行将是我的数据点,但其余将是空行?
不客气。
也许这会有帮助。
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input
你好 Jason,
我很欣赏您的文章,我对 LSTM 有一个问题
当您将 (25, 200, 1) 输入 LSTM 层时,此 LSTM 层中将有 200 个 LSTM 处理器(其中存在输入、遗忘门)来处理从 10、20 开始的输入,然后一直到 2,000 并进行记忆吗?
对于您具有输入形状 (8760, 1, 8) 的多元示例,是否只有 1 个 LSTM 处理器,因为时间步长为 1?由于只有一个时间步长需要记忆,LSTM 会有效吗?
谢谢!
不行。
时间步的数量和层中的单元数量是不同的。
看这里
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input
你好 Jason,
感谢您提供学习资料。我想问一下,如果您有多个 5000 个序列(例如,来自多个不同的观察结果),您将如何进行?例如,如果您有 1000 个测量值,每个测量值有 5000 个,而您不关心个体,因为您想学习一些通用模式(因此没有必要在特征上区分它们)?
谢谢!
好问题,这会给你一些想法
https://machinelearning.org.cn/faq/single-faq/how-to-develop-forecast-models-for-multiple-sites
感谢您的回复,但链接中的答案仍然考虑了一些个性化。以传感器读数(例如加速度计)预测汽车速度为例。您可能有成千上万个会话,您不关心是哪辆车或哪个传感器。您关心的是会话(有开始和结束),加速度计读数和速度。您有成千上万个非常长的会话。
在这种情况下,为每个会话训练 stateful LSTM(会话可以是时间序列,切成较小的片段,作为预测的输入——就像文章中所述)并在重置状态之间通过所有会话循环进行训练是否有意义?
我正在努力理解循环神经网络,而大多数文章都基于可能有点过于简化的案例。
谢谢
可能不会,您必须从一个非常明确的定义开始,说明您想预测什么以及可能对做出预测有用的输入是什么。
https://machinelearning.org.cn/how-to-define-your-machine-learning-problem/
好的,以我的例子为例——我得到的源数据格式为 [2000, 30, 250, 3]——2000 个序列,每个序列分为 30 个时间序列,长度为 250,特征为 3(来自加速度计的读数)。对于每个时间序列,我想预测速度。
如何在此数据上进行训练?
for i in range(2000])
model.fit(X[i], y[i], epochs=1, verbose=0, batch_size=1)
其中 X[0] 的形状为 30x250x3,y[0] 的形状为 30×1(如果是多对一)?
抱歉打扰您,但如我所述,我从未见过使用此类数据的示例,因此我不确定如何处理。
再次感谢您的帮助。
这取决于每个样本的 300 个时间序列是如何相关的。
如果它们不相关,您就有 2000*300 个样本。
如果它们相关,可能上述方法,或者为每个样本拟合一个单独的模型。
或者可能是 convlstm 或 cnn lstm。
好的,谢谢您的回答。我只是不确定我是否错过了什么。
不客气。
抱歉,features 是表示列数
嘿 Jason,我喜欢您的解释方式,但我有一个疑问
我想用 LSTM 进行预测,但我遇到了问题。这是我的代码
def predict(self) -> list
"""
用于预测用于创建类的测试数据的方法
"""
yhat = []
if(self.train_test_split > 0)
# 获取最后的 n 个时间序列
_, X_test, _, _ = self.create_data_for_NN()
# 生成预测列表
yhat = [y[0] for y in self.model.predict(X_test)]
return yhat
def predict_n_ahead(self, n_ahead: int)
"""
用于预测 ahead n 个时间步长的方法
"""
X, _, _, _ = self.create_data_for_NN(use_last_n=self.lag)
# 生成预测列表
yhat = []
for _ in range(n_ahead)
# 生成预测
fc = self.model.predict(X)
yhat.append(fc)
# 为预测创建新的输入矩阵
X = np.append(X, fc)
# 忽略第一个变量
X = np.delete(X, 0)
# 为下一次迭代重新整形
X = np.reshape(X, (1, len(X), 1))
return yhat
您能为我推荐一个更好的预测方法吗?
因为在 predict() 函数中,有递归,这对我来说有点难理解
抱歉,我没有能力审查/调试您的代码。
也许您可以将您的问题总结为一两句话?
所以,如果您能理解我的代码,我实际上想要一种更短、更简单的方法来做预测
Jason,拜托,我需要您的帮助
我很乐意回答关于机器学习或教程的具体问题。
所以你能告诉我,也许用一个代码示例,如何使用 keras evaluate() 吗?
是的,您可以在博客上看到数百个示例,也许可以从这里开始
https://machinelearning.org.cn/start-here/#deeplearning
我尝试重塑我的数据集,它有 38881 行和 7 列。如果将目标变量也算进去,那就是 8 列,因为我的问题是一个分类问题。
在这个步骤上我遇到了很多困难。
您的示例对我来说不起作用,因为我的数据集已经是 2d 数组了(我认为)。
我该如何将我的数据集转换为 3d 数据集?
感谢您的帮助
也许这会有帮助。
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input
您好。谢谢您的回复。它有一定帮助,但是当我尝试 data.reshape (x, x ,x) 时,我的数组无法重塑为我想要的 3d 数组,因为这些数字不能整除而得到小数。有什么解决办法吗?例如,最后一个 2d 数组不必是完整的?
也许可以使用数字的因子来重塑您的数据。
您好 Jason。感谢您的指南,这是我找到的唯一一个清晰的指南。
但是,我无法运行我的案例。
主要问题似乎出在预测方面。
我试图使用时间序列来预测非线性系统的响应(这是一个由 f(t)=cost*sin(omega*t) 驱动的非线性质点弹簧系统)。
根据您在这篇文章中的说法,我有
– 2 个样本(在 2 个不同的 omega 值下的输入力)。
– 每个样本包含 2000 个时间步长。
– 1 个特征(输入力是我提供给模型的唯一输入)
=> (2,2000,1) 是输入张量。
我为 LSTM 层提供了 input_shape=(2000,1)。
此数据集以相当令人满意的方式训练了模型。但是
1- 我无法使用形状为 (1,2000,1) 的 validation_data。它对应于与训练集不同的 omega 值下的输入力。
2- 我无法预测系统在不同 omega 输入力下的响应。形状与验证数据相同,但输入力使用了不同的 omega。
您能帮我理解我哪里出错了吗?
我在预测代码行上收到以下错误
tensorflow.python.framework.errors_impl.InvalidArgumentError: Specified a list with shape [2,1] from a tensor with shape [1,1]
希望您能提供帮助!提前感谢。
2k 时间步太多了。尝试将其限制在 200-400。
也许这会有帮助。
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input
Jason,我已阅读过,并按照您的指示设置了数据维度。我问的是,如果我使用多于 1 个样本的数据进行训练,验证数据和输入数据必须是什么样的。我总是收到关于预测数据期望 [2,1] 维度的错误。我应该训练使用更多样本,并且可以预测其他数据,这些数据以 1 个样本(相同数量的特征、相同数量的时间步长)的形式给出,所以
训练数据:(2,2000,1)
验证数据:(1,2000,1)
预测数据:(1,2000,1)
我看到 2000 个时间步可能太长了,但即使我减少了时间步,predict() 函数也不接受预测数据的形状。
谢谢
不确定您为什么会收到错误——但您的数据形状看起来不对。时间步太多,样本太少。
精彩的文章。我想知道每个样本是如何标记的?假设时间序列心率数据用于预测一个人是静止的 (0) 还是移动的 (1)。心率:[1,2,3,4,5,6,7,8,9,10,11,12]。目标变量:[1,0,1,0,1,1,0,1,0,1,0,0]。假设我们将其分为 4 个时间步长。这将得到 3 个样本:[1,2,3,4]、[5,6,7,8]、[9,10,11,12]。每个样本的目标变量看起来会是什么样子?
每个输入序列(样本)将有一个输出值或输出序列。
我已阅读评论,但我仍然不明白如何更改每个样本的标签。我知道每个输入样本将有一个输出序列,但是:我们如何选择这个值?
以前我们有例如 5000 个时间步长,因此每个时间步长有 5000 个标签。现在我们有 25 个样本,每个样本有 200 个时间步长,但是我们如何分割标签以获得 25 个标签对应于 25 个样本?
先谢谢您了。
这会有帮助
https://machinelearning.org.cn/time-series-forecasting-supervised-learning/
还有这个。
https://machinelearning.org.cn/convert-time-series-supervised-learning-problem-python/
还有这个。
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input
您好 Jason,感谢您的文章。
我遇到了一个问题,我有一个约 9000 种不同产品的数据集,每种产品都有 5 年(60 个时期)的月度需求。所以一行代表一个产品,而 60 列中的每一列代表其 5 年的需求。
我想构建一个 LSTM 网络来为每个产品预测 1 年。LSTM 的输入格式需要是什么?我想让我的 LSTM 从所有产品中学习。
您好 David……不客气!您可能希望将您的问题处理为“多元 LSTM”。
https://machinelearning.org.cn/multivariate-time-series-forecasting-lstms-keras/