我正在使用带有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")


另外,您有足够的样本吗?如果您真的是真的,那么请确保在预处理和超参数调整方面已经做了尽可能多的工作……生成一些合成数据或进行一些数据扩充有时对我有帮助。

10-06 12:18