我想构建一个模型,以便在多变量时间序列中执行异常检测。实际上,我有21个功能,每个时间窗口有21个时间序列。该方法使用Keras进行RNN-LSTM,在100个时间窗上进行训练,将其视为正常数据,目标是在新的时间窗上应用该模型,以检测某些时间实例是否被视为异常。 该模型预测每个特征的下一个实例,因此该模型有21个输出。
我和#34;正常"数据形状如下: 100个时间窗口,1650个观测值和21个特征。
我的方法是构建一个模型来预测21个特征的向量的t + 1实例,所以我尝试将X和Y赋予形状:
train_X.shape = (80, 1649, 21)
train_Y.shape = (80, 1649, 21)
train_Y是train_X vector的t + 1向量。
我在训练过程中也有一套验证(以解决过度拟合问题)
test_X.shape = (20, 1649, 21)
test_Y.shape = (20,1649, 21)
我在machinelearningmastery.com上找到了这个代码并尝试处理它:
config = {'sequence_length': 100, 'epochs': 120, 'batch_size': 30,
'validation_split': 0.2}
layers = {'input': 21, 'hidden1': 60, 'hidden2':60, 'output': 21}
model = Sequential()
model.add(LSTM(output_dim=4, layers['hidden1'], input_shape=(1649, 21),
return_sequences=True))
model.add(Dropout(config['validation_split']))
model.add(LSTM(units=layers['hidden2'], return_sequences=False) )
model.add(Dropout(config['validation_split']))
model.add(Dense(units=layers['output']))
model.add(Activation("linear"))
model.add(Dense(1))
model.compile(loss='mse', optimizer='rmsprop')
适合网络
history = model.fit(train_X, train_y, epochs=config['epochs'],
batch_size=config['batch_size'], validation_data=(test_X, test_y),
verbose=2, shuffle=False)
print("Predicting...")
predicted = model.predict(test_X)
print("Reshaping predicted")
predicted = np.reshape(predicted, (predicted.size,))
你认为我有正确的方法吗?有人可以给我一些修改代码或数据整形的技巧吗?
感谢。
答案 0 :(得分:0)
由于数据输出和模型输出形状不一致,因此无法运行此代码。以下是一些要修复并尝试的事情:
您的train_Y形状似乎不正确。如果您确实希望train_Y是train_X的t + 1观测值,则train_Y.shape =(80,1,21)。
为什么要使用“ validation_split”进行辍学。似乎对于辍学变量的名称选择不多,因为它与validation_split无关。
model.add(Activation(“ linear”))似乎多余,因为Dense已经进行了线性变换。一个以上的线性变换将是多余的。因此,可以将其替换为适当的非线性。
由于您的最终目标是进行异常检测,因此必须提出一个“检测”阈值。因此,如果abs(y_true-y_pred)>阈值,则将其称为异常。