Настройка гиперпараметров с помощью 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))

person machine_apprentice    schedule 05.10.2020    source источник


Ответы (2)


Grid Search CV всегда дает оптимальное решение, но требует больше времени для выполнения. Но есть и другие методы гиперпараметров, такие как RandomizedSearchCV, которые выполняют итерацию только в выбранных точках, и вы даже можете настроить итерацию в этом, но это не всегда дает оптимальное решение, но позволяет сэкономить время. Но у вас есть и другие техники, например

  1. Hyperopt
  2. скопт
  3. TPOT

который работает намного лучше, чем RandomizedSearchCV, и имеет все шансы дать оптимальное решение.

Что вы можете сделать, так это для небольших наборов данных вы можете использовать GridSearchCV, но для больших наборов данных всегда используйте гиперопт или TPOT, что намного лучше, чем RandomizedSearchCV.

person Mohd Abdul Azeem    schedule 05.10.2020
comment
Ого, даже не рассматривал эти другие алгоритмы, не знал об их существовании. Можно ли использовать их также для регрессионного анализа? TPOT действительно показывает регресс, но я не уверен в других. - person machine_apprentice; 05.10.2020

Если честно, поиск по сетке выглядит неплохо. Как вы упомянули, ошибки нет, и со своей стороны я думаю, что если размер вашего набора данных увеличивается со временем, и вы не можете выполнять поиск по сетке, попробуйте поискать RandomizedSearchCV (он выбирает подмножество ваших гиперпараметров случайным образом и работает с этим, в отличие от поиск по сетке, проверяющий все комбинации). Для больших наборов данных GridSearch иногда становится невозможным в производственных средах.

person Doodle    schedule 05.10.2020
comment
Спасибо за отзыв, просто нужны были ответы от сообщества специалистов по науке о данных. Я ценю это, я обязательно дважды проверю параметр RandomizedSearch. Не хотел туда прыгать из-за двусмысленности. - person machine_apprentice; 05.10.2020