LSTM Autoencoder дает плохие результаты в тестовых данных - PullRequest
0 голосов
/ 07 ноября 2019

Я использую автокодер 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 голосов
/ 08 ноября 2019

Если ваша модель не работает хорошо на тестовом наборе, я бы обязательно проверил некоторые вещи:

  • Тренировочный набор не загрязнен аномалиями или какой-либо информацией из тестового набора. Если вы используете масштабирование, убедитесь, что вы не подобрали скейлер к совокупности тренировок и тестов.
  • Исходя из моего опыта;если автоэнкодер не может достаточно хорошо различать тестовые данные, но имеет низкую потерю обучения, при условии, что ваш тренировочный набор чистый, это означает, что автоэнкодер узнал о базовых деталях обучающего набора , но не об обобщенномidea.
  • Возможно, ваше пороговое значение отключено, и вам может потребоваться более эффективная процедура определения порога. Один пример можно найти здесь: https://dl.acm.org/citation.cfm?doid=3219819.3219845

Если задача 2-ая, решение заключается в увеличении обобщения. В случае автоэнкодеров одним из наиболее эффективных инструментов обобщения является измерение узкого места. Опять же, основываясь на моем опыте с обнаружением аномалий в полетных данных радара;уменьшение размера узкого места значительно увеличило мою точность классификации по нескольким классам. Я использовал 14 функций с encoding_dim 7, но encoding_dim 4 обеспечил еще лучшие результаты. Значение потери при обучении не имело значения в моем случае , потому что я только сравнивал ошибок реконструкции, но поскольку вы делаете классификацию с пороговым значением RE, более надежный порогможет быть использован для повышения точности, как в статье, которой я поделился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...