我有100万个序列需要分类为0或1。结果分布相当平衡(类0:70%,类1:30%)。最大序列长度为50,我在序列末尾用零进行填充。序列中有100个独特的符号。嵌入长度为30。这是一个LSTM神经网络,训练在两个输出上(一个是主输出节点,另一个紧跟在LSTM之后)。代码如下所示。
作为一种健全性检查,我运行了三个版本的实验:一个是随机化结果标签(我预期表现会很差),另一个是标签正确但我随机化了每个序列中的事件顺序而结果标签保持正确(我也预期表现会差),最后一个是所有内容都不打乱(我预期表现会好)。
但我发现的结果如下:
- 打乱标签:准确率 = 69.5%(模型预测每个序列都是类0)
- 打乱序列符号:准确率 = 88%!
- 没有任何打乱:准确率 = 90%
你对此有何看法?我能想到的是,从分析序列中获得的信号很少,可能大部分信号来自于序列中符号的存在或不存在。也许RNN和LSTM在这里有些大材小用?
# Input 1: event type sequences# Take the event integer sequences, run them through an embedding layer to get float vectors, then run through LSTMmain_input = Input(shape =(max_seq_length,), dtype = 'int32', name = 'main_input')x = Embedding(output_dim = embedding_length, input_dim = num_unique_event_symbols, input_length = max_seq_length, mask_zero=True)(main_input)lstm_out = LSTM(32)(x)# Auxiliary loss here from first inputauxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)# An abitrary number of dense, hidden layers herex = Dense(64, activation='relu')(lstm_out)# The main output nodemain_output = Dense(1, activation='sigmoid', name='main_output')(x)## Compile and fit the modelmodel = Model(inputs=[main_input], outputs=[main_output, auxiliary_output])model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'], loss_weights=[1., 0.2])print(model.summary())np.random.seed(21)model.fit([train_X1], [train_Y, train_Y], epochs=1, batch_size=200)
回答:
假设你已经尝试调整LSTM的大小,你的结论似乎是合理的。除此之外,很难说,因为这取决于数据集是什么。例如,可能是较短的序列更难以预测,如果你的大多数序列都很短,那么这也支持你的结论。
值得一试的是,将你的序列长度截断到前25个条目。