Я провожу гиперпараметрическую настройку нейронной сети. Я много пробовал настраивать вручную и по-прежнему получаю довольно плохую предсказательную силу для набора данных, который я использовал. Я решил использовать 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))