Python 如何利用keras和tensorflow改进预测

Python 如何利用keras和tensorflow改进预测,python,tensorflow,keras,Python,Tensorflow,Keras,我使用tensorflow和keras对一些历史数据进行回归。数据类型如下: id、时间戳、比率 《圣塔卢西亚》,《2018-07-04T16:55:59.020000》,第21.8页 《圣塔卢西亚》,《2018-07-04T16:50:58.043000》,第22.2页 《圣塔卢西亚》,《2018-07-04T16:45:56.912000》,第21.9页 《圣塔卢西亚》,《2018-07-04T16:40:56.572000》,第22.5页 《圣塔卢西亚》,《2018-07-04T16:35

我使用tensorflow和keras对一些历史数据进行回归。数据类型如下:

id、时间戳、比率 《圣塔卢西亚》,《2018-07-04T16:55:59.020000》,第21.8页 《圣塔卢西亚》,《2018-07-04T16:50:58.043000》,第22.2页 《圣塔卢西亚》,《2018-07-04T16:45:56.912000》,第21.9页 《圣塔卢西亚》,《2018-07-04T16:40:56.572000》,第22.5页 《圣塔卢西亚》,《2018-07-04T16:35:56.133000》,第22.5页 《圣塔卢西亚》,《2018-07-04T16:30:55.767000》,第22.5页

我将其重新表述为一个时间序列问题(25个时间步),这样我就可以预测(进行回归)序列的下一个值(方差应该不高)。我还使用
sklearn.preprocessing MinMaxScaler
将数据缩放到范围(-1,1)或(0,1),具体取决于我使用的是LSTM还是密集型(分别)。 我正在使用两种不同的体系结构进行培训:

详情如下:

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 earlystopping回调

我试过增加更多的层,更多的单元,减少层,单元,增加和减少学习率,等等,但每次都会被一个值卡住。有什么原因吗

另外,您知道可以应用于此问题的任何良好实践吗


干杯

您是否尝试过保留验证集,以查看模型在训练集上的性能与验证集的匹配情况?这通常是我发现自己过度拟合的原因

一个简单的函数()可以帮助您做到这一点:

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")

另外,您有足够的样本吗?如果您真的非常确定您在预处理和超参数优化方面做了尽可能多的工作……生成一些合成数据或进行一些数据扩充偶尔对我有所帮助。

我目前没有那么多样本(大约700个)但是,它们的方差非常小(以+-3.0为单位).你认为即使这种微小的变化也会影响训练吗?是的,我认为这确实可能是罪魁祸首!如果回答有助于你回答最初的问题,请将其标记为已回答。@AdriánArroyoPerez我认为获取更多数据、研究生成合成数据和/或数据扩充可能是你下一步可行的方法,正如回答中提到的那样,我明天会试一试,因为训练真的需要很多时间。