我正在使用Python(使用Keras)运行递归神经网络来解决多元时间序列研究问题。总结一下问题:我有大约60个时间序列,其中包含三天的时间单位。我将它们输入到NN中以预测这些时间序列中约20个的值,然后根据模型在每次正确排名20个兴趣序列的前3个最高值的准确度来评估模型的性能单元。我正在为5个单独的对象(即组)执行此操作:时间序列的长度从最小的400点到2k不等。 “问题”是所有组和所有变量的时间序列极为稀疏。值在[0; 1]范围内,但是0值的数量占整个矩阵单元的90/95%以上。
正如我所料,我正在使用递归神经网络,特别是香草RNN,LSTM,GRU来比较性能。目前,香草RNN的表现要好于其他两个。我想知道为什么。时间序列的存储过程可能不是很长才能证明反馈回路和存储门是否合理? 另外,能否请您推荐给我调整网络超参数的好方法?
当前,这些是我正在尝试的超参数/配置:
回溯:1、2、5、10、20个单位 批次大小:10、20、30 时期:50、100 激活:乙状结肠,softmax 提前停止:验证损失(等于10后) 神经元数:6,100 n层:1个输入层,1个密集层 优化器:亚当
是否有任何修改体系结构的建议? 另外,值得注意的是 (1)验证准确性通常在前几个时期增加,然后对所有组保持稳定。这是不是某些事情不能正常工作的危险信号,或者仅仅是网络发现问题相当容易并且很快收敛了吗? (2)在通过S型或softmax激活的rnns之间,性能完全没有改变。
这是代码的中心部分:
lb = [1,2,5,10,20]
batch = [10,20,30]
epochs_nr = [50, 100]
activation = ['sigmoid', 'softmax']
neuron_cnt_rnn = 6
#architecture = ['SimpleRNN', 'GRU', 'LSTM']
for i in epochs_nr:
for j in lb:
for k in batch:
for l in activation:
# reshape into X=t and Y=t+1
look_back = j
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# reshape input to be [samples, time steps, features]
trainX = np.reshape(trainX, (trainX.shape[0], look_back, trainX.shape[2]))
testX = np.reshape(testX, (testX.shape[0], look_back, testX.shape[2]))
# pprint(trainX[0,:,:])
# print(trainX.shape)
epochs_cnt = i
batch_size_cnt = k
# create and fit the LSTM network
model = Sequential()
model.add(LSTM(neuron_cnt_rnn, input_shape=( look_back,nr_features)))
#model.add(Dropout(dropout))
model.add(Dense(nr_features,activation='sigmoid', kernel_initializer='glorot_uniform'))
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001,
beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False),
metrics=['accuracy','mae'])
tensorboard = TensorBoard(log_dir="logs/{}".format(time()))
callbacks = [EarlyStopping(monitor='val_loss', patience=10),
ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True)]
history=model.fit(trainX,
trainY,
validation_data=(testX,testY),
epochs=epochs_cnt,
batch_size=batch_size_cnt,
verbose=2,
callbacks=callbacks)
#_, train_acc = model.evaluate(trainX, trainY, verbose=0)
#_, test_acc = model.evaluate(testX, testY, verbose=0)
score = model.evaluate(testX,testY,batch_size=batch_size_cnt)
当前,出于我的工作目的,这些模型运行良好,达到了我在工作中定义的相当高的排名效果,但是我很好奇为什么会这么做
1)香草RNN的性能优于LSTM和GRU 2)softmax和Sigmoid之间没有区别 3)NN收敛很快 4)在处理时间序列时,有一种方法可以处理非常稀疏的矩阵。
任何评论或建议都将受到欢迎!
谢谢