繁体   English   中英

如何使用 keras 和 tensorflow 改进预测

[英]How to improve prediction with keras and tensorflow

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

ID,时间戳,比率“圣卢西亚”,“2018-07-04T16:55:59.020000”,21.8“圣卢西亚”,“2018-07-04T16:50:58.043000”,22.2“圣卢西亚”,“22.2“桑塔卢西亚”,“ 45:56.912000",21.9"santalucia","2018-07-04T16:40:56.572000",22.5"santalucia","2018-07-04T16:35:56.133000",70lucia.8"-2048" :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 个 epoch 组成,我使用至少 20 个 epoch 的 keras 早期停止回调。

我曾尝试添加更多层、更多单元、减少层、单元、增加和减少学习率等,但每次都卡在一个值附近。 这有什么原因吗?

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

干杯

您是否尝试保留验证集,看看训练集上的模型性能与验证集的跟踪情况如何? 这通常是我发现自己过度拟合的方式。

执行此操作的简单函数(改编自此处)可以帮助您做到这一点:

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

另外,你有足够的样品吗? 如果您真的非常确定您在预处理和超参数调整方面已经做了尽可能多的工作……生成一些合成数据或进行一些数据增强偶尔会对我有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM