Аномалии имеют значения ошибок, аналогичные нормальным данным - PullRequest
0 голосов
/ 18 июня 2020

У меня есть данные инерциального измерительного блока (IMU), для которых я создаю нейронную систему автокодера обнаружения аномалий net. У меня около 5 тысяч обучающих образцов, из которых я использую 10% для проверки. У меня также есть около 50 (хотя я могу сделать больше) образцов для проверки обнаружения аномалий. В моем наборе данных 12 функций IMU. Я тренируюсь около 10 000 эпох и получаю среднеквадратичные ошибки реконструкции (MSE) около 0,004 во время тренировки. После обучения я выполняю расчет MSE для тестовых данных и получаю значения, очень похожие на значения в данных поезда (0,003), и я не знаю почему!

Я делаю свой тестовый набор, разрезая 50 образцов из общих данных (не являющихся частью X_train) и изменения одной из функций на все нули. Я также пробовал добавить шум к одной из функций, а также обнулить несколько функций. В качестве примера я показываю топологию типа [12-7-4-7-12]:

input_dim = num_features

input_layer = Input(shape=(input_dim, ))
encoder = Dense(int(7), activation="tanh", activity_regularizer=regularizers.l1(10e-5))(input_layer)
encoder = Dense(int(4), activation="tanh")(encoder)
decoder = Dense(int(7), activation="tanh")(encoder)
decoder = Dense(int(input_dim), activation="tanh")(decoder)

autoencoder = Model(inputs=input_layer, outputs=decoder)
autoencoder.compile(optimizer='adam', loss='mse', metrics=['mse'])
history = autoencoder.fit(X_train, X_train,
                    epochs=nb_epoch,
                    batch_size=batch_size,
                    shuffle=True,
                    validation_split=0.1,
                    verbose=1,
                    callbacks=[checkpointer, tensorboard]).history
pred_train = autoencoder.predict(X_train)
pred_test = autoencoder.predict(X_test)
mse_train = np.mean(np.power(X_train - pred_train, 2), axis=1)
mse_test = np.mean(np.power(X_test - pred_test, 2), axis=1)
print('MSE mean() - X_train:', np.mean(mse_train))
print('MSE mean() - X_test:', np.mean(mse_test))

После этого я получаю средние значения MSE 0,004 для Train и 0,003 для Test. Поэтому я не могу выбрать хороший порог для аномальных данных, так как есть много нормальных точек, которые имеют более высокие оценки MSE, чем «аномальные» данные. Есть какие-либо мысли относительно того, почему эта сеть не может обнаружить эти аномалии?

...