.. only:: html
.. note::
:class: sphx-glr-download-link-note
Click :ref:`here ` to download the full example code or to run this example in your browser via Binder
.. rst-class:: sphx-glr-example-title
.. _sphx_glr_auto_examples_optimizer-with-different-base-estimator.py:
==============================================
Use different base estimators for optimization
==============================================
Sigurd Carlen, September 2019.
Reformatted by Holger Nahrstaedt 2020
.. currentmodule:: skopt
To use different base_estimator or create a regressor with different parameters,
we can create a regressor object and set it as kernel.
This example uses :class:`plots.plot_gaussian_process` which is available
since version 0.8.
.. code-block:: default
print(__doc__)
import numpy as np
np.random.seed(1234)
import matplotlib.pyplot as plt
from skopt.plots import plot_gaussian_process
from skopt import Optimizer
Toy example
-----------
Let assume the following noisy function :math:`f`:
.. code-block:: default
noise_level = 0.1
# Our 1D toy problem, this is the function we are trying to
# minimize
def objective(x, noise_level=noise_level):
return np.sin(5 * x[0]) * (1 - np.tanh(x[0] ** 2))\
+ np.random.randn() * noise_level
def objective_wo_noise(x):
return objective(x, noise_level=0)
.. code-block:: default
opt_gp = Optimizer([(-2.0, 2.0)], base_estimator="GP", n_initial_points=5,
acq_optimizer="sampling", random_state=42)
.. code-block:: default
def plot_optimizer(res, n_iter, max_iters=5):
if n_iter == 0:
show_legend = True
else:
show_legend = False
ax = plt.subplot(max_iters, 2, 2 * n_iter + 1)
# Plot GP(x) + contours
ax = plot_gaussian_process(res, ax=ax,
objective=objective_wo_noise,
noise_level=noise_level,
show_legend=show_legend, show_title=True,
show_next_point=False, show_acq_func=False)
ax.set_ylabel("")
ax.set_xlabel("")
if n_iter < max_iters - 1:
ax.get_xaxis().set_ticklabels([])
# Plot EI(x)
ax = plt.subplot(max_iters, 2, 2 * n_iter + 2)
ax = plot_gaussian_process(res, ax=ax,
noise_level=noise_level,
show_legend=show_legend, show_title=False,
show_next_point=True, show_acq_func=True,
show_observations=False,
show_mu=False)
ax.set_ylabel("")
ax.set_xlabel("")
if n_iter < max_iters - 1:
ax.get_xaxis().set_ticklabels([])
GP kernel
---------
.. code-block:: default
fig = plt.figure()
fig.suptitle("Standard GP kernel")
for i in range(10):
next_x = opt_gp.ask()
f_val = objective(next_x)
res = opt_gp.tell(next_x, f_val)
if i >= 5:
plot_optimizer(res, n_iter=i-5, max_iters=5)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.plot()
.. image:: /auto_examples/images/sphx_glr_optimizer-with-different-base-estimator_001.png
:alt: Standard GP kernel, x* = -0.2167, f(x*) = -0.9141, x* = -0.2167, f(x*) = -0.9141, x* = -0.2167, f(x*) = -0.9141, x* = -0.2167, f(x*) = -0.9141, x* = -0.2167, f(x*) = -0.9141
:class: sphx-glr-single-img
.. rst-class:: sphx-glr-script-out
Out:
.. code-block:: none
[]
Test different kernels
----------------------
.. code-block:: default
from skopt.learning import GaussianProcessRegressor
from skopt.learning.gaussian_process.kernels import ConstantKernel, Matern
# Gaussian process with Matérn kernel as surrogate model
from sklearn.gaussian_process.kernels import (RBF, Matern, RationalQuadratic,
ExpSineSquared, DotProduct,
ConstantKernel)
kernels = [1.0 * RBF(length_scale=1.0, length_scale_bounds=(1e-1, 10.0)),
1.0 * RationalQuadratic(length_scale=1.0, alpha=0.1),
1.0 * ExpSineSquared(length_scale=1.0, periodicity=3.0,
length_scale_bounds=(0.1, 10.0),
periodicity_bounds=(1.0, 10.0)),
ConstantKernel(0.1, (0.01, 10.0))
* (DotProduct(sigma_0=1.0, sigma_0_bounds=(0.1, 10.0)) ** 2),
1.0 * Matern(length_scale=1.0, length_scale_bounds=(1e-1, 10.0),
nu=2.5)]
.. code-block:: default
for kernel in kernels:
gpr = GaussianProcessRegressor(kernel=kernel, alpha=noise_level ** 2,
normalize_y=True, noise="gaussian",
n_restarts_optimizer=2
)
opt = Optimizer([(-2.0, 2.0)], base_estimator=gpr, n_initial_points=5,
acq_optimizer="sampling", random_state=42)
fig = plt.figure()
fig.suptitle(repr(kernel))
for i in range(10):
next_x = opt.ask()
f_val = objective(next_x)
res = opt.tell(next_x, f_val)
if i >= 5:
plot_optimizer(res, n_iter=i - 5, max_iters=5)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
.. rst-class:: sphx-glr-horizontal
*
.. image:: /auto_examples/images/sphx_glr_optimizer-with-different-base-estimator_002.png
:alt: 1**2 * RBF(length_scale=1), x* = -0.5018, f(x*) = -0.4236, x* = -0.5018, f(x*) = -0.4236, x* = -0.5018, f(x*) = -0.4236, x* = -0.5018, f(x*) = -0.4236, x* = -0.5018, f(x*) = -0.4236
:class: sphx-glr-multi-img
*
.. image:: /auto_examples/images/sphx_glr_optimizer-with-different-base-estimator_003.png
:alt: 1**2 * RationalQuadratic(alpha=0.1, length_scale=1), x* = -0.5018, f(x*) = -0.4792, x* = -0.5018, f(x*) = -0.4792, x* = -0.5018, f(x*) = -0.4792, x* = -0.5018, f(x*) = -0.4792, x* = -0.3767, f(x*) = -0.8734
:class: sphx-glr-multi-img
*
.. image:: /auto_examples/images/sphx_glr_optimizer-with-different-base-estimator_004.png
:alt: 1**2 * ExpSineSquared(length_scale=1, periodicity=3), x* = -0.5018, f(x*) = -0.4078, x* = -0.5018, f(x*) = -0.4078, x* = -0.5018, f(x*) = -0.4078, x* = -0.2591, f(x*) = -1.0230, x* = -0.2591, f(x*) = -1.0230
:class: sphx-glr-multi-img
*
.. image:: /auto_examples/images/sphx_glr_optimizer-with-different-base-estimator_005.png
:alt: 0.316**2 * DotProduct(sigma_0=1) ** 2, x* = -0.5018, f(x*) = -0.5936, x* = -0.5018, f(x*) = -0.5936, x* = -0.5018, f(x*) = -0.5936, x* = -0.5018, f(x*) = -0.5936, x* = -0.5018, f(x*) = -0.5936
:class: sphx-glr-multi-img
*
.. image:: /auto_examples/images/sphx_glr_optimizer-with-different-base-estimator_006.png
:alt: 1**2 * Matern(length_scale=1, nu=2.5), x* = -0.5018, f(x*) = -0.4247, x* = -0.5018, f(x*) = -0.4247, x* = -0.5018, f(x*) = -0.4247, x* = -0.5018, f(x*) = -0.4247, x* = -0.5009, f(x*) = -0.4400
:class: sphx-glr-multi-img
.. rst-class:: sphx-glr-timing
**Total running time of the script:** ( 0 minutes 8.790 seconds)
**Estimated memory usage:** 12 MB
.. _sphx_glr_download_auto_examples_optimizer-with-different-base-estimator.py:
.. only :: html
.. container:: sphx-glr-footer
:class: sphx-glr-footer-example
.. container:: binder-badge
.. image:: /../../miniconda/envs/testenv/lib/python3.8/site-packages/sphinx_gallery/_static/binder_badge_logo.svg
:target: https://mybinder.org/v2/gh/scikit-optimize/scikit-optimize/master?urlpath=lab/tree/notebooks/auto_examples/optimizer-with-different-base-estimator.ipynb
:width: 150 px
.. container:: sphx-glr-download sphx-glr-download-python
:download:`Download Python source code: optimizer-with-different-base-estimator.py `
.. container:: sphx-glr-download sphx-glr-download-jupyter
:download:`Download Jupyter notebook: optimizer-with-different-base-estimator.ipynb `
.. only:: html
.. rst-class:: sphx-glr-signature
`Gallery generated by Sphinx-Gallery `_