[keras]使用LSTM的多对多概率预测

[keras]使用LSTM的多对多概率预测,keras,lstm,rnn,Keras,Lstm,Rnn,我的问题是预测时间序列数据的错误概率。 在数据中,我们有(n_样本、时间步长、特征),其中时间步长是时间序列的最大长度。培训y_序列的每个时间点都有一个热标签,标明是否存在错误 X_列和y_列用零填充,因此添加了掩蔽层 为了预测错误概率,我有一个如下实现: model = Sequential() model.add(Masking(mask_value = 0, input_shape = (X_train.shape[1], X_train.shape[2]))) model.add(Bi

我的问题是预测时间序列数据的错误概率。 在数据中,我们有(n_样本、时间步长、特征),其中时间步长是时间序列的最大长度。培训y_序列的每个时间点都有一个热标签,标明是否存在错误

X_列和y_列用零填充,因此添加了掩蔽层

为了预测错误概率,我有一个如下实现:

model = Sequential()
model.add(Masking(mask_value = 0, input_shape = (X_train.shape[1], 
X_train.shape[2])))
model.add(Bidirectional(LSTM(para['hiddenStateSize'], 
return_sequences = True)))

model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(2)))
model.add(TimeDistributed(Activation('softmax')))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam')
print(model.summary())

model.fit(X_train, y_train, epochs = epochs, batch_size = batch_size, shuffle = False)

问题是:样本中的第一个数据点总是预测过高。这个问题有更好的解决方案吗?

我没有对时间序列预测的双向LSTM进行过太多试验,但以下是我将在您的模型中改变的两件事:

我会使用
categorical\u crossentropy
Dense(2)
softmax

model.add(TimeDistributed(Dense(2)))
model.add(TimeDistributed(Activation('softmax')))
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam')
binary\u交叉熵
density(1)
sigmoid

model.add(TimeDistributed(Dense(1)))
model.add(TimeDistributed(Activation('sigmoid')))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam')
还可以尝试LSTM的
dropout
(或
returnal_dropout
)参数

model.add(Bidirectional(LSTM(64, dropout=0.2, return_sequences = True)))

你说的过度预测是什么意思?LSTM确实需要采取一些步骤来开始理解序列是如何工作的。您可以使用更长的序列并丢弃边缘?(由于您使用的是双向
,这可能也发生在另一端-请注意掩蔽)。@MarcinMożejko,我所说的过度预测是指预测的错误概率高于应有的概率。但此数据集不平衡,99%的数据点是正确的(不是错误)。您能否测试数据以检查第一步出错的概率是否明显高于其他步骤?也许你的人际网络正在学习一种合适的模式?@MarcinMożejko,谢谢你的评论。误差实际上是累积的超时,这意味着前几个时间点的误差应该小于后几个时间点的误差。thanks@Julio. 为什么分类交叉熵在一个热的上有效,而二进制交叉熵在标签上有效?对于公式和差异,让我给你们介绍一下,但基本上两者都是对数似然估计量,假设分类交叉熵是期望多个输出但二进制交叉熵只期望一个输出的一般情况,输出值必须是0或1。