我正在尝试构建用于异常检测的LSTM Autoendoer。
但是该模型似乎不适用于我的数据。
这是我用于训练的常规数据。
这是我用来验证的异常数据。
如果模型能够正常工作,其损失应该会在#200000〜#500000之间。
不幸的是,这是我将有效数据放入模型的结果:
在异常间隔内,损失仍然很低。
这是我的训练模型代码。
如果您能给我任何建议,我将不胜感激。
scaler = MinMaxScaler(feature_range=(0, 1))
scaler.fit(healthy_data)
data_scaled = scaler.transform(healthy_data)
data_broken_scaled = scaler.transform(broken_data)
timesteps=32
data = data_scaled
dim = 1
data.shape = (-1,timesteps,dim)
lr = 0.0001
Nadam = optimizers.Nadam(lr=lr)
model = Sequential()
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(Dense(dim))
model.compile(loss='mae', optimizer=Nadam ,metrics=['mse'])
EStop = EarlyStopping(monitor='val_loss', min_delta=0.001,patience=150, verbose=2, mode='auto',restore_best_weights=True)
history = model.fit(data,data,validation_data=(data,data),epochs=3000,batch_size=72,verbose=2,shuffle=False,callbacks=[EStop]).history
pred_broken = model.predict(data_broken_scaled)
loss_broken = np.mean(np.abs(pred_broken-data_broken_scaled),axis=1)
fig, ax = plt.subplots(figsize=(20, 6), dpi=80, facecolor='w', edgecolor='k')
ax.plot(range(0,len(loss_broken)), loss_broken, '-', color='red', animated = True, linewidth=1)
答案 0 :(得分:0)
我认为,最好使用傅立叶变换来检测频率视图中的异常。 我的意思是,火车和测试数据将通过傅立叶变换转换为频域。另外,我建议使用时间窗口。 如果大多数AI有足够的训练数据,它们的性能就会更好。您的异常点应标记为1(通过数据的预处理步骤),并且在您的时间步长(时间窗口)中应很高。
简而言之,我认为您的火车数据现在可能不足以代表异常。