Calibrated Bayesian optimization on top of bayesian-gp-cvloss: composable conformal prediction (Weighted + Localized + Adaptive), single- and multi-objective acquisition (cUCB / cEI / cEHVI), q-batch greedy with fantasies, and a one-call BO loop with persistent ACI state.
Project description
calibrated-bo
Calibrated Bayesian optimization with composable conformal prediction, built
on top of bayesian-gp-cvloss.
What's in the box
Calibration
CompositeConformalCalibratorwith three orthogonal switcheslocalized=True— restrict to x*'s k-NN of the calibration setweighted=True— RBF weights against x* on the surviving subsetadaptive=True— Gibbs-Candes ACI controller updates α from rolling coverage
MultiOutputCalibrator— one calibrator per objective with a uniform APIWeightedConformalCalibrator/LocalizedConformalCalibrator/AdaptiveConformalCalibrator— ablation presets that lock specific flagsAdaptiveAlphaController— ACI controller with JSONexport_state/load_statefor cross-restart persistence- Turning all three switches off is numerically identical to standard split CP
Acquisition
CalibratedUCB,CalibratedEI— single-objective, plug calibrated sigma into UCB / EI; minimise via themaximise=FalseflagCalibratedEHVI— MC expected-hypervolume improvement using per-objective calibrated uncertainty; supports any direction per objectivegreedy_q_batch— sequential greedy with kriging-believer fantasies for q-batch acquisition (used by EHVI; available to user code too)
Loop
CalibratedBOLoop— single-call BO withsuggest()/observe()- Single- and multi-objective (
n_objectives,objectives_direction) - Auto-refits GP every
retrain_every, recalibrates everyrecalibrate_every - ACI controllers persist across recalibrations and (via export/load) across process restarts
- q-batch via
batch_size > 1
- Single- and multi-objective (
Diagnostics
CoverageTracker— rolling and cumulative empirical coveragereliability_curve— promised vs empirical coverage across a level gridpit_histogram— PIT diagnostic under the Gaussian-sigma approximation
Install
pip install calibrated-bo
Requires bayesian-gp-cvloss>=0.3.1.
Quickstart — single objective
import numpy as np
from calibrated_bo import CalibratedBOLoop
def f(x):
return float(np.sum((np.asarray(x) - np.array([0.3, 0.7])) ** 2))
bo = CalibratedBOLoop(
bounds=[(0.0, 1.0), (0.0, 1.0)],
objective="minimize",
calibrator_config={
"alpha": 0.1,
"localized": True, "k": 20,
"weighted": True,
"adaptive": True, "gamma": 0.05,
},
acquisition="cUCB", # or "cEI"
acquisition_kwargs={"beta": 2.0},
batch_size=1,
initial_random=5,
gp_max_evals=30,
)
for _ in range(20):
X_next = bo.suggest()
y_next = np.array([f(x) for x in X_next])
bo.observe(X_next, y_next)
print("best so far:", bo.best) # (x, y)
print("diagnostics:", bo.diagnostics())
Quickstart — multi-objective
import numpy as np
from calibrated_bo import CalibratedBOLoop
def f1(x): return float((x[0] - 0.3) ** 2)
def f2(x): return float((x[0] - 0.7) ** 2)
bo = CalibratedBOLoop(
bounds=[(0.0, 1.0)],
n_objectives=2,
objectives_direction=["minimize", "minimize"],
calibrator_config={
"alpha": 0.1,
"localized": True, "k": 12,
"weighted": True,
"adaptive": True, "gamma": 0.05,
},
acquisition="cEHVI",
acquisition_kwargs={"n_samples": 64},
batch_size=1,
initial_random=6,
gp_max_evals=20,
)
for _ in range(20):
X_next = bo.suggest()
Y_next = np.array([[f1(x), f2(x)] for x in X_next])
bo.observe(X_next, Y_next)
diag = bo.diagnostics()
print("|Pareto| =", len(diag["best"]["pareto_Y"]))
print("calibrator 0:", diag["calibrators"][0]) # alpha_current, rolling_coverage_20, ...
Calibrator-only usage
If you only want the calibrator (no BO loop), drop it on top of any fitted
GPCrossValidatedOptimizer:
from bayesian_gp_cvloss import GPCrossValidatedOptimizer
from calibrated_bo import CompositeConformalCalibrator
opt = GPCrossValidatedOptimizer(X_train, y_train, scoring="cv_rmse")
opt.optimize(max_evals=50)
cal = CompositeConformalCalibrator(
alpha=0.1, localized=True, weighted=True, adaptive=False
).fit_cv(opt)
mean, lower, upper = cal.predict_interval(X_new)
ACI persistence across restarts
# Export at shutdown
snapshot = bo.export_aci_state() # plain dict; JSON-serialisable
# At startup, on a fresh CalibratedBOLoop:
bo2.load_aci_state(snapshot) # rolling coverage history is back
Design notes
Three calibration flags (Localized / Weighted / Adaptive) are orthogonal:
| Localized | Weighted | Adaptive | Equivalent to |
|---|---|---|---|
| off | off | off | standard split CP |
| on | off | off | Localized CP |
| off | on | off | Tibshirani 2019 Weighted CP |
| off | off | on | Gibbs-Candes 2021 ACI |
| on | on | off | Localized weighted CP |
| on | on | on | This package's recommended setting |
Sign conventions: multi-objective code lives in a max-oriented space.
The BO loop negates any minimize column at GP-training time so EHVI /
Pareto / hypervolume can stay sign-agnostic. Single-objective cEI / cUCB
handle the sign internally via the maximise flag.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file calibrated_bo-0.2.1.tar.gz.
File metadata
- Download URL: calibrated_bo-0.2.1.tar.gz
- Upload date:
- Size: 36.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c67b460d6350b7f2a0eff6ba8b22f4910ccc77caa921873e565463ed0401e6f9
|
|
| MD5 |
133a18d0d38c76207685e6a4745fe2b9
|
|
| BLAKE2b-256 |
e75de1b0faafb3a19aea3f2c8dd5691ef5377b0ed30c9955d120c54fc8c5f12c
|
File details
Details for the file calibrated_bo-0.2.1-py3-none-any.whl.
File metadata
- Download URL: calibrated_bo-0.2.1-py3-none-any.whl
- Upload date:
- Size: 36.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
045a3a6cce510a6df8d287273760ef6e2753c9ac5ed8426887a775bd3a1b558a
|
|
| MD5 |
4d2829e374643d6f23471edd7e411bd7
|
|
| BLAKE2b-256 |
4c957a6712f6ad7fe9cffa1ffd221098bc044754d4e3cffb9b5eb377b739dcdb
|