RNN使用Keras进行多变量时间序列预测 - LSTM

时间:2017-11-13 11:04:34

标签: keras rnn

我想构建一个模型,以便在多变量时间序列中执行异常检测。实际上,我有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,))

你认为我有正确的方法吗?有人可以给我一些修改代码或数据整形的技巧吗?

感谢。

1 个答案:

答案 0 :(得分:0)

由于数据输出和模型输出形状不一致,因此无法运行此代码。以下是一些要修复并尝试的事情:

  1. 您的train_Y形状似乎不正确。如果您确实希望train_Y是train_X的t + 1观测值,则train_Y.shape =(80,1,21)。

  2. 为什么要使用“ validation_split”进行辍学。似乎对于辍学变量的名称选择不多,因为它与validation_split无关。

  3. model.add(Activation(“ linear”))似乎多余,因为Dense已经进行了线性变换。一个以上的线性变换将是多余的。因此,可以将其替换为适当的非线性。

  4. 由于您的最终目标是进行异常检测,因此必须提出一个“检测”阈值。因此,如果abs(y_true-y_pred)>阈值,则将其称为异常。