如何使用keras和tensorflow改善预测

时间:2018-11-12 15:28:06

标签: python tensorflow keras

我正在使用带有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提早停止回调。

我尝试添加更多的层,更多的单元,减少层,单元,提高和降低学习率等,但是每次它卡在某个值周围时。有什么原因吗?

此外,您知道可用于解决此问题的任何良好做法吗?

欢呼

1 个答案:

答案 0 :(得分:1)

您是否尝试过保留验证集,以查看训练集上的模型性能跟踪验证集的情况如何?这通常是我发现自己过头的原因。

执行此操作的简单功能(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")

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