我正在使用 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 个神经元)。因此,模型预测都是相同的并且接近于零。
- 无论模拟次数如何,我都会得到相同的结果
- 我尝试将特征数量减少到 5 个主成分,结果是一样的
- 我正在预测回报,并使用 MinMaxScaler 对特征进行了缩放。
我设置优化的方式有问题吗?谢谢你。