如何解决Keras Lstm预测下一项,采用整个序列或滑动窗口滑动窗口是否需要状态LSTM?
我有一个序列预测问题,其中给定序列中的最后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","CC11","AA1",……,”DD11”]#length/timesteps 200
..
..
] # there are 2million + of them
为了预测序列中的下一个项目,我用trim
post/pre padding
序列最大长度为60,并取所有序列的最后一个元素
例如,X是
[[0,….,'AA1','BB3','CC4'],#lenght 60
[0,'FF1','DD3','FF6','KK8','AA5','CC8'],'AA2','CC8','CC11','BB3']#lenght 60
....
]
y是最后一个元素
['DD5','DD11',...]
首先,我将它们标记化,并使用keras tokenizer.text_to_sequence()
将它们转换为数字形式,并将其整形为60个时间步长,并且每个序列都有一个特征:**
X = [
[[0],[0],[1],...,[10],[200],[5],[3],[90] ],[[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","DD5"]
5的滑动窗口,第一个示例将被转换为
seq_inputs = [
[0,"AA1"]
[0,"BB3"]
[0,"CC4"],...
]
类似地,其他人也将转换为滑动窗口。
再次总结问题和疑问:
使用当前方法,以最后一个元素为y
,我对30的验证准确性感到震惊,但我关心的不是性能,我关心的是我做得是否正确。因此,需要以下指导
- 由于我需要预测序列中的下一个项目,因此将每个序列的最后一项作为输出正确吗?
- 由于我的输入长度有所不同(从5到500),并且我将其限制为60个时间步长,因此我应该增加还是减少它?
- 我应该像分享一样使用滑动窗口方法,而不是整个序列?
- 如果要滑动窗口,我是否需要有状态LSTM?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。