首页 > 解决方案 > Keras Tuner:“最优”模型过拟合,搜索停止在极端超参数值处

问题描述

我正在使用 Keras Tuner 为我的神经网络找到最佳超参数。我正在处理一个非常小的样本(227 个训练样本和 57 个验证样本)。

#3.4: Feed-forward neural network


params = ['batch_size', 'epochs', 'drop_rate', 'learning_rate', 'num_layers','units_1','units_2','units_3','units_4']
params_nn = pd.DataFrame(np.zeros((len(params), len(commodities))), index = params, columns = commodities)

for l in range(len(commodities)):
    def build_model(hp):
    
        drop_rate = hp.Choice('drop_rate', values = [0.0, 0.2, 0.4])
    
        model_full = keras.Sequential()
        
        for i in range(hp.Int('num_layers', 1, 5)):
            model_full.add(keras.layers.Dense(units = hp.Int('units_'+str(i+1),
                                             min_value=3,
                                             max_value=24,
                                             step=3), activation="relu",
                              input_shape=(1, x_nn_train[0].shape[2])))
            model_full.add(keras.layers.Dropout(drop_rate))
    
        model_full.add(keras.layers.Dense(1))

        model_full.compile(loss='huber_loss',
                      optimizer = keras.optimizers.Adam(hp.Choice('learning_rate',
                                                             values = [1e-2, 1e-3, 1e-4])))
        return model_full

    bayesian_opt_tuner = MyTuner(
        build_model,
        objective = 'val_loss',
        max_trials=35,
        executions_per_trial=3,
        directory=os.path.normpath('C:/keras_tuning'),
        project_name='kerastuner_bayesian_poc',
        overwrite=True)

    bayesian_opt_tuner.search(x_nn_train[l], y_nn_train[l],  
                                validation_data=(x_nn_validation[l], y_nn_validation[l]), verbose=1)
    
    best_params = bayesian_opt_tuner.get_best_hyperparameters(1)[0]
    


    for k in range(len(params)):
        try:
            params_nn.iloc[k,l] = best_params.get(params[k])
        except ValueError:
            params_nn.iloc[k,l] = "-"
    

鉴于样本量较小,我预计最佳层数在 1 到 3 之间;然而,调谐器会立即选择极端的超参数值(比如五层,每层有 24 个神经元)。因此,模型预测都是相同的并且接近于零。

模型预测与真实数据

  1. 无论模拟次数如何,我都会得到相同的结果
  2. 我尝试将特征数量减少到 5 个主成分,结果是一样的
  3. 我正在预测回报,并使用 MinMaxScaler 对特征进行了缩放。

我设置优化的方式有问题吗?谢谢你。

标签: pythonkerasneural-networkhyperparameterskeras-tuner

解决方案


推荐阅读