【问题标题】:Hyperparameter tuning with GridSearch with various parameters使用具有各种参数的 GridSearch 进行超参数调整
【发布时间】:2021-01-20 09:20:08
【问题描述】:

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

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

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

数据框示例:

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

【问题讨论】:

    标签: python machine-learning scikit-learn deep-learning hyperparameters


    【解决方案1】:

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

    【讨论】:

    • 感谢您的反馈,只是需要数据科学社区的一些答案。我很感激,我肯定会仔细检查 RandomizedSearch 参数。由于它的模棱两可,不想跳进去。
    【解决方案2】:

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

    1. Hyperopt
    2. skopt
    3. TPOT

    它的性能比 RandomizedSearchCV 好得多,并且有充分的机会提供最佳解决方案。

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

    【讨论】:

    • 哦,哇,甚至从未考虑过这些其他算法,不知道它们的存在。是否也可以将这些用于回归分析? TPOT 确实显示回归,但我不确定其他人。
    猜你喜欢
    • 2018-09-01
    • 2021-08-11
    • 2021-02-15
    • 2021-05-08
    • 2018-12-07
    • 1970-01-01
    • 2022-07-01
    • 2018-09-21
    • 2018-09-24
    相关资源
    最近更新 更多