Самая первая ссылка в вашем вопросе фактически содержит ответ:
# Жестко запрограммированные значения были получены путем оптимизации оценки CV с использованием имитации отжига
Также позже Комментарии автора:
Сначала я оптимизировал параметры один за другим, но затем я переключился на их оптимизацию одновременно путем комбинации поиска по сетке и имитации отжига. Я не уверен, что нашел глобальный максимум оценки CV, даже после экспериментов с различными настройками имитации отжига. Возможно, вам помогут алгоритмы geneti c.
Решение второй ссылки имеет те же значения, потому что (вероятно) автор скопировал их из первого решения (см. В своих комментариях):
Вдохновлено: https://www.kaggle.com/mariopasquato/prudential-life-insurance-assessment/linear-model/code
Проще говоря - вы можете просто рассматривать эти значения, как если бы они были метапараметрами вашего алгоритма обучения (ну, они ). Таким образом, вы можете определить функцию F(metaparameters)
так, чтобы для вычисления одного ее значения вы выполняли полное обучение на своем обучающем наборе и выводили потери на проверочном наборе (или лучше просто использовать n-кратную перекрестную проверку и использовать потерю CV). Затем ваша задача сводится к оптимизации функции F
таким образом, чтобы найти лучший набор метапараметров, используя любой метод оптимизации, который вам нравится - например, автор первого решения утверждает, что они использовали поиск по сетке и имитировали отжиг.
Small пример без мета-настройки для самой оптимизации:
import numpy as np
cnt = 0
def use_a_function_which_calls_training_and_computes_cv_instead_of_this(x):
global cnt
cnt += 1
return ((x - np.array([-1.6, 0.7, 0.3, 3.15, 4.53, 6.5, 6.77, 9.0]))**2).sum()
my_best_guess_for_the_initial_parameters = np.array([1.,2.,3.,4.,5.,6.,7.,8.])
optimization_results = scipy.optimize.basinhopping(
use_a_function_which_calls_training_and_computes_cv_instead_of_this,
my_best_guess_for_the_initial_parameters,
niter=100)
print("Times function was called: {0}".format(cnt))
print(optimization_results.x)
Пример вывода:
Times function was called: 3080
[-1.6 0.7 0.3 3.15 4.52999999 6.5
6.77 8.99999999]
Возможно, вы захотите поэкспериментировать с параметрами самой оптимизации, возможно, даже напишите ваш настраиваемый оптимизатор и / или обратный вызов для выполнения шагов. Но также возможно, что даже параметры по умолчанию будут работать для вас хоть в какой-то степени. Если у вас слишком много времени на одно вычисление функции, вы можете, например, попытаться выполнить начальную оптимизацию с меньшим подмножеством ваших полных данных, et c.