我正在使用带有keras的tensorflow对一些历史数据进行回归。数据类型如下:
id,时间戳,比率
“ santalucia”,“ 2018-07-04T16:55:59.020000”,21.8
“ santalucia”,“ 2018-07-04T16:50:58.043000”,22.2
“ santalucia”,“ 2018-07-04T16:45:56.912000”,21.9
“ santalucia”,“ 2018-07-04T16:40:56.572000”,22.5
“ santalucia”,“ 2018-07-04T16:35:56.133000”,22.5
“ santalucia”,“ 2018-07-04T16:30:55.767000”,22.5
我将其重新格式化为时间序列问题(25个时间步长),以便可以预测(进行回归)该序列的下一个值(方差应该不大)。我还使用sklearn.preprocessing MinMaxScaler
将数据缩放到(-1,1)或(0,1)范围,这取决于我分别使用LSTM还是Dense。
我正在使用两种不同的体系结构进行培训:
密度如下:
def get_model(self, layers, activation='relu'):
model = Sequential()
# Input arrays of shape (*, layers[1])
# Output = arrays of shape (*, layers[1] * 16)
model.add(Dense(units=int(64), input_shape=(layers[1],), activation=activation))
model.add(Dense(units=int(64), activation=activation))
# model.add(Dropout(0.2))
model.add(Dense(units=layers[3], activation='linear'))
# activation=activation))
# opt = optimizers.Adagrad(lr=self.learning_rate, epsilon=None, decay=self.decay_lr)
opt = optimizers.rmsprop(lr=0.001)
model.compile(optimizer=opt, loss=self.loss_fn, metrics=['mae'])
model.summary()
return model
哪一个或多或少提供了良好的结果(与tensorflows教程中的用于预测房价的体系结构相同)。
但是,LSTM不能给出好的结果,它通常最终会卡在某个值附近(例如40(40.0123123,40.123123,41.09090 ...),我不知道为什么或如何对其进行改进。体系结构是:
def get_model(self, layers, activation='tanh'):
model = Sequential()
# Shape = (Samples, Timesteps, Features)
model.add(LSTM(units=128, input_shape=(layers[1], layers[2]),
return_sequences=True, activation=activation))
model.add(LSTM(64, return_sequences=True, activation=activation))
model.add(LSTM(layers[2], return_sequences=False, activation=activation))
model.add(Dense(units=layers[3], activation='linear'))
# activation=activation))
opt = optimizers.Adagrad(lr=0.001, decay=self.decay_lr)
model.compile(optimizer=opt, loss='mean_squared_error', metrics=['accuracy'])
model.summary()
return model
我目前以200的批次大小进行训练,每次调整以1.5的速度增加。每次拟合由50个历元组成,我使用至少20个历元的keras提早停止回调。
我曾尝试添加更多的层,更多的单元,减少层,单元,增加和降低学习率等,但是每当它陷入某个值时。有什么原因吗?
另外,您知道可用于此问题的任何良好做法吗?
干杯
最佳答案
您是否尝试过阻止验证集,以查看训练集上的模型性能跟踪验证集的效果如何?这通常是我发现自己过度拟合的方式。
一个简单的函数(adapted from here)可以帮助您做到这一点:
hist = model.fit_generator(...)
def gen_graph(history, title):
plt.plot(history.history['categorical_accuracy'])
plt.plot(history.history['val_categorical_accuracy'])
plt.title(title)
gen_graph(hist, "Accuracy, training vs. validation scores")
另外,您有足够的样本吗?如果您真的是真的,那么请确保在预处理和超参数调整方面已经做了尽可能多的工作……生成一些合成数据或进行一些数据扩充有时对我有帮助。