gpt4 book ai didi

python - 使用 Keras TimeseriesGenerator 函数通过一些 ID 生成序列组

转载 作者:太空宇宙 更新时间:2023-11-04 04:17:42 28 4
gpt4 key购买 nike

我需要使用 TimeseriesGenerator 将数据输入 LSTM 网络。情况是,TimeseriesGenerator 函数生成的序列只需要考虑 ID 内的值。例如,考虑以下数据:

dt = pd.DataFrame({'ids':[1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3], 'values':[1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7]})

对于序列长度为 3,我需要以下输出:

[[[1., 1.], [1., 2.], [1., 3.]]
,[[1., 2.], [1., 3.], [1., 4.]]
,[[1., 3.], [1., 4.], [1., 5.]]
,[[1., 4.], [1., 5.], [1., 6.]]
,[[1., 5.], [1., 6.], [1., 7.]]
,[[2., 1.], [2., 2.], [2., 3.]]
,[[2., 2.], [2., 3.], [2., 4.]]
...
]

但是,当我运行以下命令时:

X = TimeseriesGenerator(dt.values,dt.values,3,batch_size = dt.shape[0])

在 ID = 2 的序列开始之前,我得到 2 个额外的不需要的元素,如下所示:

[[1., 6.], [1., 7.],[2., 1.]],[[1., 7.],[2., 1.],[2., 2.]]

我知道循环遍历所有 ID 是一种解决方案,但是当我在现实生活中这样做时会花费大量时间,有什么捷径可以实现吗?

最佳答案

您必须编写自定义数据生成器。下面的代码应该适合您自定义的基于 ids 的批处理生成,您可以将其用作基线并根据需要对其进行自定义。

import keras
import numpy as np
class DataGenerator(keras.utils.Sequence):
def __init__(self, dt, length, batch_size=128):
self.tgs = list()
for i in range(dt['ids'].min(),dt['ids'].max()+1):
adf = dt[dt['ids'] == i]
self.tgs.append(TimeseriesGenerator(adf.values,adf.values,length,batch_size =batch_size))
self.len = sum([len(tg) for tg in self.tgs])
self.idx_i = list()
self.idx_j = list()

for i, tg in enumerate(self.tgs):
self.idx_i.extend(list(range(len(tg))))
self.idx_j.extend([i]*len(tg))
#print ( self.idx_i, self.idx_j)

def __len__(self):
return self.len

def __getitem__(self, index):
return self.tgs[self.idx_j[index]][self.idx_i[index]]

# Test
g = DataGenerator(dt,3,3)
for i in range(len(g)):
print (g[i])
  • 我正在为每个 id 创建一个生成器并将其存储在 tgs
  • no:of batches 是每个生成器中的批处理之和
  • idx_j 将索引映射到相应的生成器
  • idx_i 将索引映射到由 idx_j
  • 映射的生成器中的批处理

输出:

(array([[[1., 1.], [1., 2.], [1., 3.]],
[[1., 2.], [1., 3.], [1., 4.]],
[[1., 3.], [1., 4.], [1., 5.]]]),
array([[1., 4.], [1., 5.], [1., 6.]]))
(array([[[2., 1.], [2., 2.], [2., 3.]],
[[2., 2.], [2., 3.], [2., 4.]],
[[2., 3.], [2., 4.], [2., 5.]]]),
array([[2., 4.], [2., 5.], [2., 6.]]))
(array([[[3., 1.], [3., 2.],[3., 3.]],
[[3., 2.], [3., 3.], [3., 4.]],
[[3., 3.], [3., 4.], [3., 5.]]]),
array([[3., 4.], [3., 5.], [3., 6.]]))

关于python - 使用 Keras TimeseriesGenerator 函数通过一些 ID 生成序列组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55116638/

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