4

我有一个序列预测问题,给定n序列中的最后一项,我需要预测下一项。

我有超过 200 万个序列,每个序列都有不同的timesteps( length of sequence),比如有些只有 5 个,有些是 50/60/100/200 到 500。

    seq_inputs = [
    ["AA1", "BB3", "CC4",…,"DD5"], #length/timeteps 5
    ["FF1", "DD3", "FF6","KK8","AA5", "CC8",…, "AA2"]   #length/timeteps 50
   ["AA2", "CC8", "CC11","DD3", "FF6","AA1", "BB3",……,”DD11”]#length/timesteps 200
    ..
    ..
    ] # there are 2million + of them 

为了预测序列中的下一项,我trim将序列的最大长度设为 60,post/pre padding并且只取所有序列的最后一个元素

例如,X 将是

[[0,0,0,….,'AA1', 'BB3', 'CC4'],#lenght 60
 [0,0,0,….,'FF1', 'DD3', 'FF6', 'KK8', 'AA5', 'CC8'],#lenght 60
 [0,0,0,….,'AA2', 'CC8', 'CC11', 'DD3', 'FF6', 'AA1', 'BB3']#lenght 60
 ....
 ]

y 是最后一个元素

['DD5', 'AA2', 'DD11',...]

首先,我将它们标记化并使用数字形式将它们转换keras tokenizer.text_to_sequence()为 60 个时间步和每个序列的一个特征:**

X = [
    [[0],[0],[0],[0],[1], ..., [10], [200], [5], [3], [90] ],
    [[0],[0],[0],[0],[95],...,  [15], [4],[11],[78], [43]]
    ..
    ..
    ] 
y = [40,3, ... , ... ]

我正在使用带有如下嵌入的 LSTM

model = Sequential()
model.add(Embedding(vocabulary_size, 32, input_length=seq_len)) #seq_length
model.add(LSTM(80,return_sequences=True))
..
..
model.fit(train_inputs,train_targets,epochs=50,verbose=1,batch_size=32)

对于我在序列中预测下一个项目的问题,这种方法(使用后/预填充将序列修剪到最大长度 60 并且仅将最后一个项目作为目标)是否合适?在我的示例中,每个目标将是不同的时间步长,例如 5th,50th,200th 等等。

我应该制作每个序列 n-gram/滑动窗口吗?例如对于我的数据集的第一个序列

   ["AA1", "BB3", "CC4",…,"DD5"]

滑动窗口 5 ,第一个例子将被转换为

seq_inputs = [
   [0,0,0,0,"AA1"]
   [0,0,0,"AA1", "BB3"]
   [0,0,"AA1", "BB3","CC4"],
…,
... 
] 

同样其他的也将转换为滑动窗口。

再次总结问题和疑问:

使用当前的方法,将最后一个元素作为y,我对 30 个验证准确度感到震惊,但我关心的不是性能,我关心的是我是否做得对。因此,需要以下指导

  1. 由于我需要按顺序预测下一项,是否将最后一项作为每个序列的输出正确的方法?
  2. 由于我的输入长度不同(从 5 到 500)并且我将其限制为 60 个时间步,我应该增加还是减少它?
  3. 我应该像我分享的那样采用滑动窗口方法,而不是采用整个序列吗?
  4. 在滑动窗口的情况下我需要有状态的 LSTM 吗?
4

0 回答 0