基于Keras的RNN-LSTM多变量时间序列预测

基于Keras的RNN-LSTM多变量时间序列预测,keras,rnn,Keras,Rnn,我想建立一个模型,以便在多变量时间序列中执行异常检测。事实上,我有21个特性,每个时间窗口有21个时间序列。该方法基于RNN-LSTM和Keras,在100个视为正常数据的时间窗口上进行训练,目的是将该模型应用于一个新的时间窗口,以检测某些时间实例是否被视为异常。 该模型预测每个特征的下一个实例,因此该模型有21个输出 我的“正常”数据的形状如下: 100个时间窗口,1650个观测值和21个特征 我的方法是建立一个模型来预测21个特征向量的t+1实例,因此我尝试塑造X和Y,给出: train_X

我想建立一个模型,以便在多变量时间序列中执行异常检测。事实上,我有21个特性,每个时间窗口有21个时间序列。该方法基于RNN-LSTM和Keras,在100个视为正常数据的时间窗口上进行训练,目的是将该模型应用于一个新的时间窗口,以检测某些时间实例是否被视为异常。 该模型预测每个特征的下一个实例,因此该模型有21个输出

我的“正常”数据的形状如下: 100个时间窗口,1650个观测值和21个特征

我的方法是建立一个模型来预测21个特征向量的t+1实例,因此我尝试塑造X和Y,给出:

train_X.shape = (80, 1649, 21)

train_Y.shape = (80, 1649, 21) 
列Y是列X向量的t+1向量

我在培训过程中也有一个验证集(用于解决过度装配问题)

我在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,))
你认为我的方法对吗?有人能给我一些修改代码或数据成形的技巧吗


谢谢。

此代码不会运行,因为数据输出和模型输出形状不一致。以下是一些需要解决和尝试的问题:

  • 你的火车形状似乎不正确。如果确实希望train_Y是train_X的t+1观测值,那么train_Y.shape=(80,1,21)

  • 为什么对辍学学生使用“验证分离”。为dropout变量选择名称似乎很糟糕,因为它与验证无关

  • add(激活(“线性”)似乎是多余的,因为稠密已经可以进行线性转换了。多个线性变换是多余的。所以用适当的非线性来代替它

  • 因为您的最终目标是进行异常检测,所以必须提出一个“检测”阈值。所以,如果abs(y_true-y_pred)>阈值,您会将该样本称为异常


  • 此代码不会运行,因为数据输出和模型输出形状不一致。以下是一些需要解决和尝试的问题:

  • 你的火车形状似乎不正确。如果确实希望train_Y是train_X的t+1观测值,那么train_Y.shape=(80,1,21)

  • 为什么对辍学学生使用“验证分离”。为dropout变量选择名称似乎很糟糕,因为它与验证无关

  • add(激活(“线性”)似乎是多余的,因为稠密已经可以进行线性转换了。多个线性变换是多余的。所以用适当的非线性来代替它

  • 因为您的最终目标是进行异常检测,所以必须提出一个“检测”阈值。所以,如果abs(y_true-y_pred)>阈值,您会将该样本称为异常


  • 模型运行吗?演出怎么样?你有没有将它与其他模型或基准进行过比较?我有同样的问题@PythAzzMax。不幸的是,许多在线的例子是错误的,甚至不考虑数据的形状,只是通过输入数据,最后才预测过去(如果你在把数据放在LSTM之前不正确地对数据进行修改,就会发生这种情况)。我没有解决方案,但整个社区都需要一个好的答案模型运行吗?演出怎么样?你有没有将它与其他模型或基准进行过比较?我有同样的问题@PythAzzMax。不幸的是,许多在线的例子是错误的,甚至不考虑数据的形状,只是通过输入数据,最后才预测过去(如果你在把数据放在LSTM之前不正确地对数据进行修改,就会发生这种情况)。我没有解决办法,但整个社区都需要一个好的答案
    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,))