{ "cells": [ { "cell_type": "markdown", "id": "cell-0", "metadata": {}, "source": [ "# Standard Bayesian Optimization with FCVOpt\n", "\n", "While FCVOpt is designed for hyperparameter optimization via fractional cross-validation, the underlying `BayesOpt` class can be used for **standard Bayesian optimization** of any black-box function—no cross-validation required.\n", "\n", "This notebook demonstrates `BayesOpt` on the classic **Branin function**, a standard benchmark for global optimization. Unlike the CV setting, the observed objective values here are direct evaluations of the true loss function (not fold-level proxies), so we can meaningfully plot the **best observed value so far** and track how the optimizer converges to the global minimum.\n", "\n", "## The Branin Function\n", "\n", "The 2-dimensional Branin function is defined as:\n", "\n", "$$f(x_1, x_2) = a\\left(x_2 - bx_1^2 + cx_1 - r\\right)^2 + s(1-t)\\cos(x_1) + s$$\n", "\n", "with standard constants $a=1$, $b=5.1/(4\\pi^2)$, $c=5/\\pi$, $r=6$, $s=10$, $t=1/(8\\pi)$, over the domain $x_1 \\in [-5, 10]$, $x_2 \\in [0, 15]$.\n", "\n", "It has **three global minima**, all attaining $f^* \\approx 0.3979$:\n", "- $(-\\pi,\\; 12.275)$\n", "- $(\\pi,\\; 2.275)$\n", "- $(9.425,\\; 2.475)$" ] }, { "cell_type": "code", "execution_count": 1, "id": "cell-1", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from fcvopt.optimizers import BayesOpt\n", "from fcvopt.configspace import ConfigurationSpace\n", "from ConfigSpace import Float" ] }, { "cell_type": "markdown", "id": "cell-2", "metadata": {}, "source": [ "## Define the Objective Function\n", "\n", "`BayesOpt` expects an objective that takes a **dict of hyperparameter values** and returns a scalar. We wrap the Branin formula accordingly." ] }, { "cell_type": "code", "execution_count": 2, "id": "cell-3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Branin global minimum: 0.397887\n", "Value at (pi, 2.275): 0.397887\n" ] } ], "source": [ "def branin(params: dict) -> float:\n", " \"\"\"Branin function. Global minimum f* ≈ 0.3979.\"\"\"\n", " x1, x2 = params['x1'], params['x2']\n", " a, b, c = 1.0, 5.1 / (4 * np.pi**2), 5.0 / np.pi\n", " r, s, t = 6.0, 10.0, 1.0 / (8 * np.pi)\n", " return float(a * (x2 - b * x1**2 + c * x1 - r)**2 + s * (1 - t) * np.cos(x1) + s)\n", "\n", "BRANIN_OPTIMUM = 0.397887\n", "print(f\"Branin global minimum: {BRANIN_OPTIMUM:.6f}\")\n", "print(f\"Value at (pi, 2.275): {branin({'x1': np.pi, 'x2': 2.275}):.6f}\")" ] }, { "cell_type": "markdown", "id": "cell-4", "metadata": {}, "source": [ "## Define the Search Space\n", "\n", "We use FCVOpt's `ConfigurationSpace` to declare the two continuous inputs with their standard Branin bounds." ] }, { "cell_type": "code", "execution_count": 3, "id": "cell-5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Configuration space object:\n", " Hyperparameters:\n", " x1, Type: UniformFloat, Range: [-5.0, 10.0], Default: 2.5\n", " x2, Type: UniformFloat, Range: [0.0, 15.0], Default: 7.5\n", "\n" ] } ], "source": [ "config = ConfigurationSpace(seed=42)\n", "config.add([\n", " Float('x1', bounds=(-5.0, 10.0)),\n", " Float('x2', bounds=(0.0, 15.0)),\n", "])\n", "print(config)" ] }, { "cell_type": "markdown", "id": "cell-6", "metadata": {}, "source": [ "## Run Standard Bayesian Optimization\n", "\n", "`BayesOpt` follows the same API as `FCVOpt` but fits a standard (non-hierarchical) GP directly on the observed `(x, y)` pairs.\n", "\n", "Key arguments:\n", "\n", "| Argument | Description |\n", "|---|---|\n", "| `obj` | Black-box function: `dict → float` |\n", "| `config` | Hyperparameter / input search space |\n", "| `acq_function` | `'EI'` (Expected Improvement), `'LCB'`, or `'KG'` |\n", "| `tracking_dir` | Local directory for MLflow experiment logs |\n", "| `experiment` | MLflow experiment name |\n", "| `seed` | Random seed for reproducibility |\n", "\n", "We run **30 total evaluations**: 5 random initializations followed by 25 acquisition-guided steps." ] }, { "cell_type": "code", "execution_count": 4, "id": "cell-7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Number of candidates evaluated.....: 30\n", "Observed obj at incumbent..........: 0.398315\n", "Estimated obj at incumbent.........: 0.423703\n", "\n", " Best Configuration at termination:\n", " Configuration(values={\n", " 'x1': 9.4327962845392,\n", " 'x2': 2.4926768337029,\n", "})\n" ] } ], "source": [ "optimizer = BayesOpt(\n", " obj=branin,\n", " config=config,\n", " acq_function='EI',\n", " tracking_dir='./opt_runs/',\n", " experiment='branin_standard_bo',\n", " seed=123,\n", ")\n", "\n", "best_conf = optimizer.optimize(n_trials=30, n_init=5)\n", "optimizer.end_run()" ] }, { "cell_type": "code", "execution_count": 5, "id": "cell-8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best configuration found:\n", " x1 = 9.4328\n", " x2 = 2.4927\n", " f(x1, x2) = 0.398315\n", " Known global minimum = 0.397887\n", " Optimality gap = 0.000428\n" ] } ], "source": [ "print(f\"Best configuration found:\")\n", "print(f\" x1 = {dict(best_conf)['x1']:.4f}\")\n", "print(f\" x2 = {dict(best_conf)['x2']:.4f}\")\n", "print(f\" f(x1, x2) = {branin(dict(best_conf)):.6f}\")\n", "print(f\" Known global minimum = {BRANIN_OPTIMUM:.6f}\")\n", "print(f\" Optimality gap = {branin(dict(best_conf)) - BRANIN_OPTIMUM:.6f}\")" ] }, { "cell_type": "markdown", "id": "cell-9", "metadata": {}, "source": [ "## Optimization Progress\n", "\n", "Internally, `BayesOpt` selects the incumbent at each step as the training point with the **lowest GP posterior mean**—not necessarily the lowest observed value. This means `f_inc_obs` (the observed value at the GP-based incumbent) can fluctuate non-monotonically as the GP model is updated.\n", "\n", "Because we are optimizing a direct, noise-free function rather than a CV proxy, a cleaner quantity to track is the **best observed value so far**: the running minimum over all evaluations. This is guaranteed to decrease monotonically and directly reflects how much the optimizer has improved the objective.\n", "\n", "The plot below shows this quantity alongside all individual observations, with the known global minimum as a dashed reference line." ] }, { "cell_type": "code", "execution_count": 6, "id": "cell-10", "metadata": {}, "outputs": [ { "data": { "image/png": "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qO6JiLzRyZMnVQPX1atXy4QJE2Tv3r2ydetWGT58uOqCcM2aNZIXIUBCAGePyMhICQ8PF0+BE5CvvvpK+vXrZ5iGNiAIYFNSUmTLli3yzTffqKz0qFGjslxW27ZtVZB69OhRlQU9ceKEPPLII4bnV6xYIb169ZIXX3xR/a5OmzZNJk+eLP/73/8M83zyySdy4cIFww0jZmKbPvroo4Z5nnvuOfntt9/ku+++kwMHDkinTp2kQ4cO8u+//xrm6dKliwp28Zoup5F269YtDZsC95R7bty4oS1evFjdExHlRGJionb48GF170k6d+6slSpVSouLi7P4fEZGhuH/+J1asmSJ4fGff/6ptW3bVgsODtYiIyO1/v37a7GxsYbne/furXXr1k0bM2aMFhUVpYWHh2svvPCClpycbJhnxYoVWvPmzbUCBQqoZdx///3a8ePHDc+fOnVKve7evXutvoeyZctq48aN055++mktLCxMK1OmjPbTTz9ply9f1rp27aqm1a5dW9u5c6fhb2bNmqVeUzd69Gitbt262rfffquWlz9/fu3xxx/XYmJiDPO0bt1aGzRoUI5eV38dY5MnT1bLMt9u48eP14oUKaLWc+zYsVpqaqr22muvaQULFtRKliypff3111pWFi1apBUuXNhk2q+//qr5+vpqFy9eNEybPn26er/G++Vu8D59fHy0lJQU9bhnz57aI488YjLP1KlT1WfL+DNkDJ8lLOP06dPqcUJCgubn56ctW7bMZL769etrb731lsm0Pn36aE899VS2jkdHxlzMxJLLoB7qoYcesrsuiojILslJ1m+pKbbPm5J893ntrJdEBvbll1+WsLAwi/Pgcq8l8fHx0rlzZylYsKC63Lto0SKVtX3llVdM5lu7dq0cOXJEfv/9d5k3b566JD927FiT5QwdOlR27dql5vX19VXfy/ZeKkbWDyUQyCQj04jL3c8884w89dRTsmfPHqlYsaJ6fDsWtwzZRdT8IgON24YNG+S9995z+utasm7dOnW5fuPGjfLxxx/L6NGj5YEHHlDbe/v27Srj+cILL8g///xjdRl//PGHNGjQwGQasuy1a9dWJSM67MeYmBg5dOiQTet2/fp1mTNnjrrUr/eznpycrEoNzLPdWL8zZ85YXA6yxMiyonQAUNKATLGl5WzatMlkWqNGjdT7c7kch8F5ADOx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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "observed_y = optimizer.observed_values\n", "best_so_far = np.minimum.accumulate(observed_y)\n", "n_evals = np.arange(1, len(observed_y) + 1)\n", "\n", "fig, ax = plt.subplots(figsize=(7, 4))\n", "\n", "ax.step(n_evals, best_so_far, where='post', color='steelblue', lw=2, label='Best observed value')\n", "ax.scatter(n_evals, observed_y, color='steelblue', alpha=0.35, s=20, zorder=3, label='All observations')\n", "ax.axhline(BRANIN_OPTIMUM, color='tomato', lw=1.5, ls='--', label=f'Global minimum ({BRANIN_OPTIMUM:.4f})')\n", "ax.axvline(5.5, color='gray', lw=1, ls=':', alpha=0.7)\n", "ax.text(5.7, observed_y.max() * 0.95, 'Init', color='gray', fontsize=9)\n", "\n", "ax.set_xlabel('Number of evaluations')\n", "ax.set_ylabel('Branin function value')\n", "ax.set_title('Bayesian Optimization on the Branin Function')\n", "ax.legend(loc='upper right')\n", "ax.set_xlim(1, len(observed_y))\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "a01bb0f6", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.10.0" } }, "nbformat": 4, "nbformat_minor": 5 }