Files
2026-07-13 13:22:52 +08:00

32 lines
1.3 KiB
Python

import numpy as np
def _check_additivity(explainer, model_output_values, output_phis):
TOLERANCE = 1e-2
assert len(explainer.expected_value) == model_output_values.shape[1], (
"Length of expected values and model outputs does not match."
)
for t in range(len(explainer.expected_value)):
if not explainer.multi_input:
diffs = (
model_output_values[:, t]
- explainer.expected_value[t]
- output_phis[t].sum(axis=tuple(range(1, output_phis[t].ndim)))
)
else:
diffs = model_output_values[:, t] - explainer.expected_value[t]
for i in range(len(output_phis[t])):
diffs -= output_phis[t][i].sum(axis=tuple(range(1, output_phis[t][i].ndim)))
maxdiff = np.abs(diffs).max()
assert maxdiff < TOLERANCE, (
"The SHAP explanations do not sum up to the model's output! This is either because of a "
"rounding error or because an operator in your computation graph was not fully supported. If "
"the sum difference of %f is significant compared to the scale of your model outputs, please post "
f"as a github issue, with a reproducible example so we can debug it. Used framework: {explainer.framework} - Max. diff: {maxdiff} - Tolerance: {TOLERANCE}"
)