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

我正在对神经网络进行超参数调整。我尝试了很多手动调整,但对我一直使用的数据集的预测能力仍然很差。我一直选择使用 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))


慕妹3146593
浏览 118回答 2
2回答

12345678_0001

网格搜索 CV 总是给出最优解决方案,但执行时间较长。但是还有一些其他超参数技术,例如 RandomizedSearchCV,它仅在选定的点上迭代,您甚至可以在其中调整迭代,但它并不总是给出最佳解决方案,但它可以节省时间。但你还有其他一些技巧,比如超视踢TPOT它的性能比 RandomizedSearchCV 好得多,并且完全有机会给出最佳解决方案。对于较小的数据集,您可以使用 GridSearchCV,但对于较大的数据集,始终使用 hyperopt 或 TPOT,这比 RandomizedSearchCV 好得多。

当年话下

老实说,网格搜索看起来不错。正如您提到的,没有错误,从我的角度来看,我认为如果您的数据集大小随着时间的推移而增加并且您无法进行网格搜索,请尝试查看 RandomizedSearchCV (它随机选择超参数的子集并对其进行处理,这与网格搜索不同检查所有组合)。对于大数据集,GridSearch 在生产环境中有时变得不可行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python