Machine learning Keras验证精度获胜';如果超过75%,则预测效果不佳

Machine learning Keras验证精度获胜';如果超过75%,则预测效果不佳,machine-learning,keras,recurrent-neural-network,Machine Learning,Keras,Recurrent Neural Network,我正在使用keras库制作数据集以进行污染预测(NO2)。我对丢失的数据进行了插值,对风向进行了热编码。 在通过MinMaxScaler进行规范化后,列车/验证和测试集上的分割记录通过批处理生成器提供给keras 这是我使用的一些模型,但它们似乎都没有超过75%的验证准确率,并且所做的预测非常糟糕: #### MODEL TYPE DECLARATION AND CONFIGURATION ###################################### code_name =

我正在使用keras库制作数据集以进行污染预测(NO2)。我对丢失的数据进行了插值,对风向进行了热编码。 在通过MinMaxScaler进行规范化后,列车/验证和测试集上的分割记录通过批处理生成器提供给keras

这是我使用的一些模型,但它们似乎都没有超过75%的验证准确率,并且所做的预测非常糟糕:

#### MODEL TYPE DECLARATION AND CONFIGURATION 
######################################

code_name = {-1: "linear", 0: "ann_base_single", 1 : "ann_base_multi", 
             2 : "gru_single_layer", 3 : "gru_single_layer_w_dropout", 4 : "gru_multi_layer", 5 : "gru_multi_layer_2",
             6 : "lstm_single_layer", 7 : "lstm_single_layer_w_dropout", 8: "lstm_multi_layer", 9 : "lstm_multi_layer_2"}
model_type = 20

model = Sequential()
if model_type == -1:
    model.add(layers.Flatten(input_shape=(sequence_length, x_data.shape[1])))
    model.add(layers.Dense(num_y_signals, activation='linear'))
elif model_type == 0:
    model.add(layers.Flatten(input_shape=(sequence_length, x_data.shape[1])))
    model.add(layers.Dense(hidden_layer_size, activation='relu'))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))
elif model_type == 1:
    model.add(layers.Flatten(input_shape=(sequence_length, x_data.shape[1])))
    model.add(layers.Dense(hidden_layer_size, activation='relu'))
    model.add(layers.Dense(hidden_layer_size, activation='relu'))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))
elif model_type == 2:
    model.add(layers.GRU(hidden_layer_size, activation='relu', input_shape=(sequence_length, x_data.shape[1])))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))
elif model_type == 3:
    model.add(layers.GRU(hidden_layer_size, activation='relu', input_shape=(sequence_length, x_data.shape[1])))
    model.add(Dropout(0.2))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))
elif model_type == 4:
    model.add(layers.GRU(64, activation='relu', return_sequences=True, input_shape=(sequence_length, x_data.shape[1])))
    model.add(layers.GRU(32, activation='relu'))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))
elif model_type == 5:
    model.add(layers.GRU(64, activation='relu', return_sequences=True, input_shape=(sequence_length, x_data.shape[1])))
    model.add(layers.GRU(32, activation='relu', return_sequences=True))
    model.add(layers.GRU(16, activation='relu'))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))
elif model_type == 6:
    model.add(layers.LSTM(hidden_layer_size, activation='relu', input_shape=(sequence_length, x_data.shape[1])))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))
elif model_type == 7:
    model.add(layers.LSTM(hidden_layer_size, activation='relu', input_shape=(sequence_length, x_data.shape[1])))
    model.add(Dropout(0.2))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))
elif model_type == 8:
    model.add(layers.LSTM(64, activation='relu', return_sequences=True, input_shape=(sequence_length, x_data.shape[1])))
    model.add(layers.LSTM(32, activation='relu'))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))
elif model_type == 9:
    model.add(layers.LSTM(64, activation='relu', return_sequences=True, input_shape=(sequence_length, x_data.shape[1])))
    model.add(layers.LSTM(32, activation='relu', return_sequences=True))
    model.add(layers.LSTM(16, activation='relu'))
    model.add(layers.Dense(num_y_signals, activation='sigmoid'))

model.compile(optimizer=Adam(), loss='mae', metrics=[metrics.mae, 'accuracy'])
model.summary()

timenow = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S_")
run_name = '{7}_Nodes_{0}-Units_{1}-shift_steps_{2}-aq_parameter_{3}-train_split_{4}-batch_size_{5}-sequence_length_{6}'.format(code_name[model_type], hidden_layer_size, shift_steps, aq_parameter, train_split, batch_size, sequence_length, timenow)
path_checkpoint = 'checkpoints\\{0}.keras'.format(run_name)

#### CALLBACK DECLARATION #######################################

callback_checkpoint = ModelCheckpoint(filepath=path_checkpoint,
                                      monitor='val_loss',
                                      verbose=1,
                                      save_weights_only=True,
                                      save_best_only=True)

callback_early_stopping = EarlyStopping(monitor='val_loss',
                                        patience=4, verbose=1)

callback_reduce_lr = ReduceLROnPlateau(monitor='val_loss',
                                       factor=0.1,
                                       min_lr=1e-5,
                                       patience=3,
                                       verbose=1)

callbacks = [callback_checkpoint,
             callback_early_stopping,
             callback_reduce_lr,
             callback_reset_states]


#### FITTING DATA INTO MODEL

    history = model.fit_generator(generator=train_generator,
                              steps_per_epoch=int(train_data_size / batch_size),
                              epochs=epochs,
                              validation_data=validation_data,
                              callbacks = callbacks,
                              shuffle= False)
遵循教程


您的代码非常全面,但分析能力不够,无法准确指出是什么导致您的预测保持在75%的范围内

尝试实现keras的一些回调函数,这样您就可以在不同的阶段存储模型,并了解每一层的性能是如何变化的


您必须在Callack声明部分扩展代码,考虑到22种被比较的模型类型,并检查每个模型的结果。

您的问题是什么?我想知道,如何改进此模型,使其超过75%的val_acc并做出准确的预测。。。我是机器学习的新手,也许我在数据或其他方面犯了一些错误else@desertnaut你如何理解一个神经网络问题而不了解它的全貌?人们通常因为信息不好而投反对票,而不是反对票。请阅读链接(尤其是为什么这是一个问题&为什么这值得投反对票),以及;一些提示:1)您的22个(!)模型中的哪一个生成这些图?2) 它是否有状态?3) Tensorboard回调对于理解您的问题真的是必要的吗?因此,仅仅把你所有的代码都投入到问题中是行不通的,它需要你方采取一些额外的步骤,以帮助我们帮助你……你如何将MAE(回归指标)与准确性(分类指标)结合起来?你的问题是回归问题还是分类问题?这似乎是前者,在这种情况下,准确性是没有意义的…因为我从一开始就已经在使用这个回调,我无法面对同时比较所有模型的方法。。。您是否建议对所有模型进行一次while{}训练,然后比较检查点?是的,通过在while{}中插入模型,尝试比较检查点可能是解决方案。