#python #numpy #machine-learning #grid-search #hyperparameters
#python #numpy #машинное обучение #поиск по сетке #гиперпараметры
Вопрос:
Я пытаюсь выполнить поиск по сетке для функции затрат, которая имеет 8 разных переменных:
cost_function_1 = lambda x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8: (675 (x_1-15)**2 x_1**2 * np.cos(x_1*np.pi)) x_2^2 x_3^2 x_4^2 x_5^2 x_6^2 x_7^2 x_8^2
Переменные x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8
являются гиперпараметрами для моей модели. Их значения определяются как сетка в интервале [-10,30]:
X_MIN_1 = -10
X_MAX_1 = 30
x_1 = x_2 = x_3 = x_4 = x_5 = x_6 = x_7 = x_8 = np.linspace(X_MIN_1, X_MAX_1, 10)
Если моя функция затрат имеет cost_function_1
только 1 переменную, я бы выполнил поиск по сетке следующим образом:
def get_best_value(f, candidates):
"""
Return the candidate that yielded the lowest cost in the function f.
:param f: cost function
:param candidates: x candidates
:return: the best candidate
"""
idx_min = np.argmin(f(candidates))
return candidates[idx_min]
def run_grid_search_experiment(f, n_trials, X_MIN, X_MAX):
"""
Run the experiment for grid search.
:param f: cost function
:param n_trials: number of trials
:param show_plot: show plot if true
:return: the best candidate
"""
gs_candidates = np.linspace(X_MIN, X_MAX, n_trials)
selected_value = get_best_value(f, gs_candidates)
return selected_value
gs_selected_value = run_grid_search_experiment(cost_function_1,
10, -10, 30)
Однако я не совсем уверен, как я могу изменять функции get_best_value
и run_grid_search_experiment
работать с моей функцией затрат cost_function_1
, которая имеет 8 разных переменных. Например, оператор idx_min = np.argmin(f(candidates))
внутри функции python get_best_value
не будет работать, поскольку каждый кандидат будет представлять собой массив numpy размером 1 x 8 (поскольку необходимо учитывать 8 переменных).
Может кто-нибудь помочь мне, как я могу изменить функции get_best_value
и run_grid_search_experiment
выполнить поиск по сетке для 8 переменных?
Комментарии:
1. В sklearn есть базовая, но достойная реализация поиска по сетке: scikit-learn.org/stable/modules/generated /…
2. @Swier Здравствуйте, спасибо за ваш комментарий. В этой
model_selection
функции я вижу, чтоestimator
аргумент можно использовать для указания «функции оценки». Будет ли эта «функция оценки» моей функцией затратcost_function_1
? извините, если я медленно понимаю.3. Вы имели в виду
x_2**2
вместоx_2^2
в вашей функции?
Ответ №1:
Предполагая, что вы имели в виду, что ваша функция должна быть:
cost_function_1 = lambda x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8: (675 (x_1-15)**2 x_1**2 * np.cos(x_1*np.pi)) x_2**2 x_3**2 x_4**2 x_5**2 x_6**2 x_7**2 x_8**2
X_MIN_1 = -10.
X_MAX_1 = 30.
n_trials = 10
x = np.linspace(X_MIN_1, X_MAX_1, n_trials)
#create a grid for 8-dimensional search, you can have per dimension specific linespace too.
X = np.meshgrid(x,x,x,x,x,x,x,x)
#find function values on grid
out = cost_function_1(*X)
#find index of minimum
idx = np.unravel_index(out.argmin(), out.shape)
#find corresponding value of grid
[x[idx[i]] for i in np.arange(8)]
вывод для вышеуказанных значений:
[-1.1111111111111107, 21.111111111111114, -1.1111111111111107, -1.1111111111111107, -1.1111111111111107, -1.1111111111111107, -1.1111111111111107, -1.1111111111111107]
Комментарии:
1. Здравствуйте, спасибо за ваш ответ. Из вашего кода выше, каким был бы наиболее эффективный способ найти минимальное
cost_function_1
значение, полученное из этих сеток для 8 переменных? Итак, в принципе, что, если я хочу найти значениеcost_function_1
в значениях[x[idx[i]] for i in np.arange(8)]
? Спасибо,