# How to make the best final prediction of the optimum value in a Bayesian optimization process?

I'm trying to understand the process of Bayesian optimization of a black box function and the bit I'm confused about is how to make the very last prediction of the true maximum after you have made all the function evaluations you can afford to make.

I reviewed the code for two Python implementations:

and in both, the final estimate is simply whichever parameter values resulted in the highest previous actual function value.

My question is, would it not be better to find the maximum of the final gaussian process model (the maximum mean prediction) and use that as the best estimate of the peak of the true function?

To illustrate the question, here is the result of Bayesian optimization of a simple 1-D function after 7 steps using the bayes_opt package noted above.

Full code is here if you need to see it.

The best estimate based on the highest actual function evaluation so far is:

sample_max_x = optimizer.max['params']['x']
sample_max_x, function_to_maximize(sample_max_x)
# (2.203, 5.574)


The best estimate based on the peak of the current GP model is:

mu, sigma = posterior(optimizer, x_obs, y_obs, grid=X.reshape(-1, 1))
posterior_max_x = X[mu.argmax()]
posterior_max_x, function_to_maximize(posterior_max_x)
# (2.475, 5.713)


The true maximum is (2.509, 5.714), so obviously, in this case taking the maximum of the GP model is the best estimate but is it always a good idea?

Or is there too much risk given the uncertainty that the maximum of the GP model might be far worse than the best sample so far?

The value of the target function at the maximum of the GP model will not always be larger than the largest observed value.

The posterior at posterior_max_x has quite a bit of uncertainty. Before it was evaluated, there was some chance of the value of the target being larger than function_to_maximize(sample_max_x) and some chance of it being smaller. If you believe the confidence intervals in the plot, you can use them to quantify this risk. But in realistic problems, the confidence intervals in the GP may not reflect the full uncertainties.

There's no technical reason that the library couldn't report posterior_max_x instead of sample_max_x, but it raises the question of how much risk the user wants to take of the answer being wrong. If you only report the best value of those that have actually been evaluated, the user will know function_to_maximize(sample_max_x) precisely rather than having an uncertain answer. That makes using the library much simpler and less confusing the the user.

I realize I read it too quickly and mis-interpreted the question. I think the top answer already addressed the more specific question adequately, but yeah - typically the best observed point is used because there is no surety that the predicted GP maximum is higher than the best current value. It may be, but you know the high performance at the best point you've observed.

Going with somewhere you haven't observed yet runs the risk of the GP being inaccurately high and ended up with poorer performance. If you have the computational time, you could always do one last greedy step - though a new GP conditioned on that as well may have a new predicted maximum. In general I think the reason to not use the predicted max is out of precaution against the GP just being off.