выполнение поиска по сетке для 8 гиперпараметров на Python

#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)] ? Спасибо,