32 lines
1.3 KiB
Python
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}"
|
|
)
|