LSTM自动编码器在测试数据中产生不良结果

时间:2019-11-07 01:07:39

标签: keras deep-learning lstm lstm-stateful

我正在将LSTM自动编码器用于异常检测。由于异常数据与正常数据相比非常少,因此仅将正常实例用于训练。测试数据包括异常和正常实例。在训练期间,模型损失看起来不错。但是,在测试中,模型产生的数据准确性较差。即异常点和法线点没有很好地分开。
我的代码段如下:

.............
.............
X_train = X_train.reshape(X_train.shape[0], lookback, n_features)
X_valid = X_valid.reshape(X_valid.shape[0], lookback, n_features)
X_test = X_test.reshape(X_test.shape[0], lookback, n_features)
.....................
......................
N = 1000
batch = 1000
lr = 0.0001
timesteps = 3
encoding_dim = int(n_features/2)
lstm_model = Sequential()
lstm_model.add(LSTM(N, activation='relu', input_shape=(timesteps, n_features), return_sequences=True))
lstm_model.add(LSTM(encoding_dim, activation='relu', return_sequences=False))
lstm_model.add(RepeatVector(timesteps))
# Decoder
lstm_model.add(LSTM(timesteps, activation='relu', return_sequences=True))
lstm_model.add(LSTM(encoding_dim, activation='relu', return_sequences=True))
lstm_model.add(TimeDistributed(Dense(n_features)))
lstm_model.summary()
adam = optimizers.Adam(lr)
lstm_model.compile(loss='mse', optimizer=adam)

cp = ModelCheckpoint(filepath="lstm_classifier.h5",
                     save_best_only=True,
                     verbose=0)

tb = TensorBoard(log_dir='./logs',
                 histogram_freq=0,
                 write_graph=True,
                 write_images=True)

lstm_model_history = lstm_model.fit(X_train, X_train,
                                    epochs=epochs,
                                    batch_size=batch,
                                    shuffle=False,
                                    verbose=1,
                                    validation_data=(X_valid, X_valid),
                                    callbacks=[cp, tb]).history


.........................
test_x_predictions = lstm_model.predict(X_test)
mse = np.mean(np.power(preprocess_data.flatten(X_test) - preprocess_data.flatten(test_x_predictions), 2), axis=1)

error_df = pd.DataFrame({'Reconstruction_error': mse,
                         'True_class': y_test})

# Confusion Matrix
pred_y = [1 if e > threshold else 0 for e in error_df.Reconstruction_error.values]
conf_matrix = confusion_matrix(error_df.True_class, pred_y)

plt.figure(figsize=(5, 5))
sns.heatmap(conf_matrix, xticklabels=LABELS, yticklabels=LABELS, annot=True, fmt="d")
plt.title("Confusion matrix")
plt.ylabel('True class')
plt.xlabel('Predicted class')
plt.show()

请提出可以在模型中进行哪些操作以提高准确性。

1 个答案:

答案 0 :(得分:0)

如果您的模型在测试集上表现不佳,我将确保检查某些内容;

  • 训练集不会被异常或测试集的任何信息污染。如果您使用缩放比例,请确保您没有使缩放比例适合训练和测试集的组合。
  • 根据我的经验;如果自动编码器不能很好地区别测试数据,但训练损失很小,而您的训练集是纯的,则意味着自动编码器确实了解了训练集的基本细节,但没有了解广义的思想。
  • 您的阈值可能已关闭,您可能需要提出一个更好的阈值设置步骤。可以在此处找到一个示例:https://dl.acm.org/citation.cfm?doid=3219819.3219845

如果问题是第二个,解决方案是增加概括性。使用自动编码器,最有效的泛化工具之一就是瓶颈的尺寸。再次基于我在飞行雷达数据异常检测方面的经验;降低瓶颈维度显着提高了我的多类别分类准确性。我使用的14个功能的encoding_dim为7,但encoding_dim为4则提供了更好的结果。在我的情况下,培训损失的价值并不重要,因为我只是比较重构错误,但是由于您要使用RE的阈值进行分类,因此鲁棒的阈值可用于提高准确性,就像我分享的论文一样。