使用具有各种参数的 GridSearch 进行超参数调整

Hyperparameter tuning with GridSearch with various parameters

我正在对神经网络进行超参数调整。我已经尝试了很多手动调整,但对我一直使用的数据集的预测能力仍然很差。我一直选择使用 GridSearch 为我的模型测试所有可能的参数组合

这样的事情是否可能(参见下面的代码)或者是否有 smarter/better 参数调整方法?代码能够运行;这当然需要一些时间,但确实有效。

我没有特别的错误,我只是在寻找一些好的见解来了解这是否合适。

数据框示例:

sequence                                         target     expression
-AQSVPWGISRVQAPAAH-NRGLRGSGVKVAVLDTGI-STHPDLNI...   0.00    50.0
-AQQVPYGVSQIKAPALH-EQGYTGQNVKVAVIDTGIDSSHPDLKV...   0.46    42.0
-AQSVPWGIRRVQAPAAH-NRGLTGSGVKVAVLDTGI-STHPDLNI...   0.34    46.0
-AQTVPWGISRVQAPAAH-NRGLTGAGVKVSVLDTGI-STHPDLNI...   0.95    45.0
-AQSVPYGVSQIKAPALH-SQGYTGSNVKVAVIDTGIDSSHPDLKV...   0.60    50.0

数据形状:3000 行和 3840 个特征

请注意,特征数很高,因为所有这些序列都是一个热编码的。

代码:

'Hyperparameter Tuning for Neurons, Batch_Size, Epochs and Learning Rate'

def build_regressor(n_neurons=1, learning_rate=0.01):
    regressor = Sequential()
    regressor.add(Dense(n_neurons, activation = 'relu', input_shape = (x_train.shape[1],)))
    #regressor.add(Dense(n_neurons, activation = 'relu'))
    regressor.add(Dense(units=1))
    optimizer = Adam(lr = learning_rate)
    regressor.compile(optimizer= optimizer, loss='mean_squared_error',  metrics=['mae','mse'])
    return regressor

#Create Model
model = KerasRegressor(build_fn=build_regressor, verbose=0)

# define the grid search parameters
batch_size = [10, 25, 50, 100, 150]
epochs = [5, 10, 25, 50]
n_neurons = [1, 32, 64, 128, 256, 512]
learning_rate = [0.001, 0.01, 0.1, 0.2, 0.3]

param_grid = dict(batch_size=batch_size, epochs=epochs, n_neurons=n_neurons, learning_rate = learning_rate)

#implement grid_search
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=3, scoring = 'r2')
grid_result = grid.fit(x_train, y_train)

# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
    print("%f (%f) with: %r" % (mean, stdev, param))

老实说,网格搜索看起来不错。正如你提到的,没有错误,从我这边来说,我认为如果你的数据集大小随着时间的推移而增加并且你不能进行网格搜索尝试查看 RandomizedSearchCV(它随机选择你的超参数的一个子集并对其进行处理,与检查所有组合的网格搜索不同)。 对于大数据集,GridSearch 在生产环境中有时变得不可行。

Grid Search CV 总能给出最优解,但执行时间较长。但是还有一些其他的超参数技术,例如 RandomizedSearchCV,它只在选定的点上迭代,您甚至可以在其中调整迭代,但它并不总是提供最佳解决方案,但它可以节省时间。但是你有一些其他的技巧,比如

  1. 超级优化
  2. 斯科普特
  3. TPOT

它比 RandomizedSearchCV 表现得更好,并且有充分的机会给出最优解。

对于较小的数据集,您可以使用 GridSearchCV,但对于较大的数据集,始终使用 hyperopt 或 TPOT,这比 RandomizedSearchCV 好得多。