.. 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_store-and-load-results.py:
===========================================
Store and load `skopt` optimization results
===========================================
Mikhail Pak, October 2016.
Reformatted by Holger Nahrstaedt 2020
.. currentmodule:: skopt
Problem statement
=================
We often want to store optimization results in a file. This can be useful,
for example,
* if you want to share your results with colleagues;
* if you want to archive and/or document your work;
* or if you want to postprocess your results in a different Python instance or on an another computer.
The process of converting an object into a byte stream that can be stored in
a file is called _serialization_.
Conversely, _deserialization_ means loading an object from a byte stream.
**Warning:** Deserialization is not secure against malicious or erroneous
code. Never load serialized data from untrusted or unauthenticated sources!
.. code-block:: default
print(__doc__)
import numpy as np
import os
import sys
Simple example
==============
We will use the same optimization problem as in the
:ref:`sphx_glr_auto_examples_bayesian-optimization.py` notebook:
.. code-block:: default
from skopt import gp_minimize
noise_level = 0.1
def obj_fun(x, noise_level=noise_level):
return np.sin(5 * x[0]) * (1 - np.tanh(x[0] ** 2)) + np.random.randn() \
* noise_level
res = gp_minimize(obj_fun, # the function to minimize
[(-2.0, 2.0)], # the bounds on each dimension of x
x0=[0.], # the starting point
acq_func="LCB", # the acquisition function (optional)
n_calls=15, # the number of evaluations of f including at x0
n_random_starts=3, # the number of random initial points
random_state=777)
As long as your Python session is active, you can access all the
optimization results via the `res` object.
So how can you store this data in a file? `skopt` conveniently provides
functions :class:`skopt.dump` and :class:`skopt.load` that handle this for you.
These functions are essentially thin wrappers around the
`joblib `_ module's :obj:`joblib.dump` and :obj:`joblib.load`.
We will now show how to use :class:`skopt.dump` and :class:`skopt.load` for storing
and loading results.
Using `skopt.dump()` and `skopt.load()`
=======================================
For storing optimization results into a file, call the :class:`skopt.dump`
function:
.. code-block:: default
from skopt import dump, load
dump(res, 'result.pkl')
And load from file using :class:`skopt.load`:
.. code-block:: default
res_loaded = load('result.pkl')
res_loaded.fun
.. rst-class:: sphx-glr-script-out
Out:
.. code-block:: none
-1.006335272338759
You can fine-tune the serialization and deserialization process by calling
:class:`skopt.dump` and :class:`skopt.load` with additional keyword arguments. See the
`joblib `_ documentation
:obj:`joblib.dump` and
:obj:`joblib.load` for the additional parameters.
For instance, you can specify the compression algorithm and compression
level (highest in this case):
.. code-block:: default
dump(res, 'result.gz', compress=9)
from os.path import getsize
print('Without compression: {} bytes'.format(getsize('result.pkl')))
print('Compressed with gz: {} bytes'.format(getsize('result.gz')))
.. rst-class:: sphx-glr-script-out
Out:
.. code-block:: none
Without compression: 70404 bytes
Compressed with gz: 25545 bytes
Unserializable objective functions
----------------------------------
Notice that if your objective function is non-trivial (e.g. it calls MATLAB
engine from Python), it might be not serializable and :class:`skopt.dump` will
raise an exception when you try to store the optimization results.
In this case you should disable storing the objective function by calling
:class:`skopt.dump` with the keyword argument `store_objective=False`:
.. code-block:: default
dump(res, 'result_without_objective.pkl', store_objective=False)
Notice that the entry `'func'` is absent in the loaded object but is still
present in the local variable:
.. code-block:: default
res_loaded_without_objective = load('result_without_objective.pkl')
print('Loaded object: ', res_loaded_without_objective.specs['args'].keys())
print('Local variable:', res.specs['args'].keys())
.. rst-class:: sphx-glr-script-out
Out:
.. code-block:: none
Loaded object: dict_keys(['dimensions', 'base_estimator', 'n_calls', 'n_random_starts', 'n_initial_points', 'initial_point_generator', 'acq_func', 'acq_optimizer', 'x0', 'y0', 'random_state', 'verbose', 'callback', 'n_points', 'n_restarts_optimizer', 'xi', 'kappa', 'n_jobs', 'model_queue_size'])
Local variable: dict_keys(['func', 'dimensions', 'base_estimator', 'n_calls', 'n_random_starts', 'n_initial_points', 'initial_point_generator', 'acq_func', 'acq_optimizer', 'x0', 'y0', 'random_state', 'verbose', 'callback', 'n_points', 'n_restarts_optimizer', 'xi', 'kappa', 'n_jobs', 'model_queue_size'])
Possible problems
=================
* **Python versions incompatibility:** In general, objects serialized in
Python 2 cannot be deserialized in Python 3 and vice versa.
* **Security issues:** Once again, do not load any files from untrusted
sources.
* **Extremely large results objects:** If your optimization results object
is extremely large, calling :class:`skopt.dump` with `store_objective=False` might
cause performance issues. This is due to creation of a deep copy without the
objective function. If the objective function it is not critical to you, you
can simply delete it before calling :class:`skopt.dump`. In this case, no deep
copy is created:
.. code-block:: default
del res.specs['args']['func']
dump(res, 'result_without_objective_2.pkl')
.. rst-class:: sphx-glr-timing
**Total running time of the script:** ( 0 minutes 2.610 seconds)
**Estimated memory usage:** 14 MB
.. _sphx_glr_download_auto_examples_store-and-load-results.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/store-and-load-results.ipynb
:width: 150 px
.. container:: sphx-glr-download sphx-glr-download-python
:download:`Download Python source code: store-and-load-results.py `
.. container:: sphx-glr-download sphx-glr-download-jupyter
:download:`Download Jupyter notebook: store-and-load-results.ipynb `
.. only:: html
.. rst-class:: sphx-glr-signature
`Gallery generated by Sphinx-Gallery `_