奇怪的序列分类性能在打乱序列元素后

我有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个条目。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注