---
myst:
html_meta:
description: "Understand UnifiedIG input shapes, baseline weights, output axes, classification scores, and numerical integration conventions."
---
# UnifiedIG semantics
This document fixes the conventions that every backend must follow. The public
API remains independent of model family:
```python
explanation = unifiedig.Explainer(model, baseline)(data)
```
## Inputs and baselines
For sklearn, `data` is one sample with shape `(features,)` or a batch with shape
`(samples, features)`. PyTorch, JAX, and TensorFlow additionally accept
structured single-array inputs with any shape `(samples, ...)`. A baseline may
be a scalar, one sample, or a baseline distribution with shape
`(baselines, ...)`. Optional `baseline_weights` must align with its rows. A
background object exposing `rows` and `weights`, including a CBaseline
`Background`, may be passed directly. UnifiedIG—not individual backends—
validates and normalizes the distribution.
Every input is attributed from the same baseline distribution. UnifiedIG
averages its Integrated Gradients paths over the distribution; it never infers
row pairing from equal input and baseline counts. Matrix rows receive equal
weight by default. Explicit weights must be finite and nonnegative with a
positive sum; UnifiedIG normalizes them to sum to one.
For normalized weights `w_b`, the explanation averages complete paths:
```text
values = sum_b w_b * IG(data; baseline_b)
base_values = sum_b w_b * model_output(baseline_b)
```
Passing a background object and also supplying `baseline_weights` is rejected
so that there is only one source of weighting semantics.
## Explanation arrays
For a scalar model output:
- `values`: the same shape as `data`
- `base_values`: `(samples,)`
- `data`: `(samples, ...)`
For multiple model outputs, including structured single-array inputs:
- `values`: `data.shape + (outputs,)`
- `base_values`: `(samples, outputs)`
- `data`: `(samples, ...)`
This orientation matches SHAP's current multi-output convention. Output names,
when available, identify the final axis.
## Explained output
**Classification completeness is on the score scale, never the probability
scale.** A decision margin is a logit only when the model defines it as one.
See [classification scores](classification.md) for the rationale and the
distinction from the mathematically different probability-IG question.
Regression backends explain the model prediction. Binary classification
backends explain a decision margin or logit, with the positive class as the
named output. If a model returns two raw binary scores, UnifiedIG explains
their difference, `score[1] - score[0]`.
For multiclass classification, let `z(x)` be the model's vector of `K` raw
class scores. UnifiedIG explains the centered score vector
```text
s(x) = z(x) - mean(z(x) over classes).
```
The `K` labeled coordinates sum to zero and represent a `K - 1` dimensional
decision-score object. This removes the common-score direction without
choosing an arbitrary reference class. Completeness holds separately for every
centered score:
```text
sum_j values[i, j, k] + base_values[i, k] = s_k(data[i]).
```
The stronger zero-sum identities also hold up to floating-point error:
```text
sum_k values[i, j, k] = 0
sum_k base_values[i, k] = 0.
```
`Explanation.contrast(a, b)` subtracts two stored coordinates to recover IG
for the invariant pairwise margin `z_a - z_b`, without recomputing gradients
or paths. Independent target-class attribution is not a separate UnifiedIG
estimand. Probability attribution is intentionally excluded.
Generic differentiable frameworks do not encode whether a vector output is a
class-score vector or a multi-output regression prediction. UnifiedIG treats
vector-valued PyTorch, JAX, and TensorFlow outputs as class scores by default.
Pass `output_kind="regression"` to preserve independent regression outputs
without binary differencing or multiclass centering. Known sklearn and tree
estimators declare their task type and do not use this option.
Keras 3 models use their configured native automatic-gradient backend.
Visible final sigmoid and softmax activations are rejected for classification:
the explained output must be a logit or raw score, not a probability. An
explicit `output_kind="regression"` permits these activations only when the
output is genuinely a bounded regression prediction.
## Completeness
Every explanation targets:
```text
sum(values over features) + base_values = explained model output
```
Closed-form backends satisfy this up to floating-point arithmetic. Numerical
backends approximate the path integral and document their integration method;
their completeness tests use an explicit numerical tolerance.
Supported tree models are delegated to TreeIG, which computes their path
attributions exactly and applies the same shared-distribution semantics.
When explicitly selected with `fallback="tree_numeric"`, TreeIGNumeric instead
searches for discontinuities on a finite path grid. Detected jumps are
allocated locally and averaged over the same weighted baseline distribution.
This route is complete when it recovers all endpoint changes, but its feature
allocation remains approximate when crossings are missed or merged.
For a classifier with probabilities but no native decision score, the
numerical-tree route explains derived scores. With class probabilities `p`,
binary classification uses
```text
score = log(p_1) - log(p_0),
```
and multiclass classification uses
```text
score_k = log(p_k) - mean(log(p) over classes).
```
The multiclass object is therefore centered and pairwise contrasts are log
odds. Because tree probabilities may be exactly zero, UnifiedIG raises when
the logarithm is not finite unless `probability_floor` was supplied explicitly.
When supplied, each probability is floored and the vector is renormalized;
completeness refers to that explicitly smoothed score function.
`Explanation.completeness_error` stores the signed residual between the model
output and the reconstructed output. `max_abs_completeness_error` summarizes
the worst sample/output. Numerical backends emit a `RuntimeWarning` when this
exceeds the configured absolute and relative tolerances. The check can be
configured with `completeness_atol`, `completeness_rtol`, and
`check_completeness` on `Explainer`.
## Numerical integration
Numerical backends use Gauss–Legendre quadrature on the unit path interval.
When `n_steps` is omitted, UnifiedIG starts with 16 nodes and automatically
retries with 32, then 64, if the completeness tolerance is not met. A successful
higher resolution is retained by that explainer for later calls. Supplying
`Explainer(..., n_steps=N)` disables this refinement and uses the requested
number of nodes; disabling completeness checking also disables refinement.
More nodes usually improve accuracy but require proportionally more gradient
evaluations. For a supported degree-`d` polynomial pipeline ending in an affine
estimator, UnifiedIG caps the active resolution at `ceil(d / 2)`, which is
exact for the polynomial gradient along a straight path. An explicitly smaller
value is not raised automatically.
Scalar-output skgrad models batch baseline-observation paths before evaluating
analytic gradients. `gradient_batch_size` bounds the number of path rows in
each call and defaults to 8,192; it does not change the attribution functional
or the quadrature nodes.
For affine prediction functions, averaging IG over a baseline distribution is
exactly equivalent to using its weighted mean baseline. The affine backend
uses this identity to avoid work proportional to the number of baseline rows.
PyTorch, JAX, and TensorFlow evaluate native automatic gradients at the same
Gauss–Legendre quadrature nodes. Prediction
functions must produce samplewise outputs: one scalar or one vector for each
leading input row. By default, two class scores are reduced to their margin
and three or more are centered under the multiclass convention above.
When explicitly enabled with `fallback="finite_difference"`, UnifiedIG uses
central finite differences to approximate gradients for otherwise unsupported
smooth sklearn estimators. The step for coordinate `j` is
`finite_difference_step * max(1, abs(x_j))` at each path point. Perturbed rows
are evaluated in bounded batches.
This fallback requires `predict` for regression or `decision_function` for
classification. Multiclass decision functions must return one score per class;
pairwise-derived SVC scores are rejected. Probability outputs are never
inferred. Known tree and nearest-neighbor estimators are rejected because their
local finite-difference gradients do not represent path discontinuities
reliably. A small completeness residual is an important numerical diagnostic,
but it is not a general proof that a model is smooth or that every individual
attribution is accurate.
The separate numerical-tree control `tree_grid_size` defaults to 1,024 path
intervals. Increasing it improves the chance of separating nearby tree
crossings but increases model evaluations proportionally.
## Attribution feature space
The default explains the inputs of the supplied model object. For fitted
pipelines, `attribute_after="step_name"` selects features after that step while
still accepting original observations and baselines. Data, names, and feature
axes in the Explanation all refer to the selected space; `attribute_after`
records the choice. See [feature-space selection](feature-spaces.md) for path,
weighting, scaling, and nonlinear-transformation conventions.