--- myst: html_meta: description: "Choose calibrated, equal-weight, or kernel CBaseline backgrounds and understand tuning, feasibility, and neutrality guarantees." --- # Background constructions and tuning All modes use observed rows and the prediction metric. Choose a construction according to the attribution engine's support for observation weights. | Mode | What it returns | Neutrality | Main tuning parameter | | --- | --- | --- | --- | | `calibrated` | Localized rows with calibrated weights | Enforced to configured numerical tolerances; failure raises | `bandwidth`, optionally `quantile` | | `equal` | A deterministic fixed-size subset with uniform weights | Approximate; residual reported | `size` (default 100) | | `kernel` | Localized rows with uncalibrated kernel weights | Not enforced | `bandwidth`, optionally `quantile` | ## Calibrated weights Assume `predictions`, `f0`, and `X_reference` are aligned as in [getting started](getting-started.md): ```python wb = background(predictions, f0, X_reference, weighting="calibrated") X_bg, weights = wb.rows, wb.weights ``` Kernel weights first favor outputs near `f0`. Exponential calibration adjusts those weights under a relative-entropy criterion while enforcing their mean output. The method is developed in [Hentschel (2026a), Section 3](references.md). Calibration is limited by the convex hull of predictions with positive kernel weight. A target in its relative interior is the usual feasible case; a boundary target can require concentrated or limiting weights. Use the public aligned `rows` and `weights` for attribution. The underlying result retains `wb.result.kernel_weights` and `wb.result.calibrated_weights` for comparison. ### Bandwidth The default uses a shrinking Silverman-type rule. To choose a bandwidth in the fitted prediction metric's units, pass `bandwidth=0.25`. Alternatively, `quantile=0.10` initializes it from a distance quantile. A fixed quantile is a finite-sample choice, not the shrinking-bandwidth regime in the paper. Choose one initialization option; an explicit bandwidth takes precedence. Supported kernels are `"gaussian"`, `"epanechnikov"`, and `"uniform"`. Gaussian localization uses a finite cutoff in this implementation. The `candidate_size` cap controls the weighted candidate pool, not an exact number of output rows. Adaptive widening can expand the neighborhood to reach calibration tolerances; inspect `final_bandwidth`, `widening_steps`, `candidate_cap_binding`, and `kernel_mass_retained`. Direct `weighting="kernel"` skips calibration. Its mean can differ from `f0`, even if a diagnostic field named `calibration_success` is true; check `calibration_requested` and the actual kernel residual. ## Equal-weight selection ```python bg = background( predictions, f0, X_reference, weighting="equal", size=100, tolerance=1e-3, ) ``` The fixed-size construction searches a shifted prediction-space neighborhood to improve its mean neutrality. It is not simply the 100 nearest predictions to the original target, nor a guarantee of the globally best subset. It returns exactly `size` distinct observed rows; the size must not exceed the reference sample. No kernel bandwidth is used in this mode. `tolerance` checks the achieved whitened mean-gap norm. Failure to meet it does **not** raise: the best searched set is returned with `tolerance_met=False`. Without a tolerance, that field is `None`. Try several sizes to assess residual, localization, and downstream cost. More rows can help but do not guarantee a monotonically smaller residual. `max_pool_size` is a safety limit: if the certified candidate pool exceeds it, the implementation raises rather than silently approximating the search. ## Resampling and computation `wb.resampled(500, random_state=0)` is available when an unweighted Monte Carlo approximation to the weighted distribution is specifically needed. It may repeat rows and only matches the weighted distribution in expectation. Prefer `weighting="equal"` for the standard SHAP workflow. Construction scans reference predictions before working on candidate pools. Cost depends on output dimension, support, and search settings; equal-weight pools are not universally bounded. Downstream attribution cost also grows with the retained baseline count. Reuse a metric when comparing constructions on the same prediction sample: ```python from cbaseline import fit_prediction_metric metric = fit_prediction_metric(predictions) for size in (50, 100, 200): bg = background( predictions, f0, X_reference, weighting="equal", size=size, metric=metric, ) print(size, bg.diagnostics["selected_neutrality_norm"]) ``` See the [API reference](api.md) for advanced search and calibration options.