def suggest(self, utility_function): """Most promissing point to probe next""" if len(self._space) == 0: continuous_sample = self._space.random_sample() discrete_sample = np.array([ CustomBayesianOptimization.round_to_step( x, self.parameter_step_sizes[i]) for i, x in enumerate(continuous_sample) ]) return self._space.array_to_params(discrete_sample) # Sklearn's GP throws a large number of warnings at times, but # we don't really need to see them here. with warnings.catch_warnings(): warnings.simplefilter("ignore") self._gp.fit(self._space.params, self._space.target) try: # Finding argmax of the acquisition function. continuous_suggestion = acq_max(ac=utility_function.utility, gp=self._gp, y_max=self._space.target.max(), bounds=self._space.bounds, random_state=self._random_state) # transform each value in suggestion into the # discrete value closed to the defined step size discrete_suggestion: np.ndarray = np.array([ CustomBayesianOptimization.round_to_step( x, self.parameter_step_sizes[i]) for i, x in enumerate(continuous_suggestion) ]) if discrete_suggestion in self._space: raise KeyError("Already probed suggestion.") return self._space.array_to_params(discrete_suggestion) except: number_retries = 0 max_number_retries = 20 while (number_retries < max_number_retries): try: continuous_sample = self._space.random_sample() discrete_sample = np.array([ CustomBayesianOptimization.round_to_step( x, self.parameter_step_sizes[i]) for i, x in enumerate(continuous_sample) ]) if discrete_sample in self._space: raise KeyError("Already probed suggestion.") return self._space.array_to_params(discrete_sample) except: number_retries += 1 raise KeyError( "Even with retries no unique sample could be probed.")
def test_acq_with_poi(): util = UtilityFunction(kind="poi", kappa=1.0, xi=1e-4) episilon = 1e-2 y_max = 2.0 max_arg = acq_max( util.utility, GP, y_max, bounds=np.array([[0, 1], [0, 1]]), random_state=ensure_rng(0), n_iter=200, ) _, brute_max_arg = brute_force_maximum(MESH, GP, kind='poi', kappa=1.0, xi=1e-4) assert all(abs(brute_max_arg - max_arg) < episilon)
def test_acq_with_ucb(): util = UtilityFunction(kind="ucb", kappa=1.0, xi=1.0) episilon = 1e-2 y_max = 2.0 max_arg = acq_max(util.utility, GP, y_max, bounds=np.array([[0, 1], [0, 1]]), btypes=[float, float], random_state=ensure_rng(0), n_iter=20) _, brute_max_arg = brute_force_maximum(MESH, GP, kind='ucb', kappa=1.0, xi=1.0) assert all(abs(brute_max_arg - max_arg) < episilon)