Explainability in AI is crucial for gaining belief in mannequin predictions and is extremely necessary for enhancing mannequin robustness. Good explainability typically acts as a debugging device, revealing flaws within the mannequin coaching course of. Whereas Shapley Values have change into the trade normal for this activity, we should ask: Do they at all times work? And critically, the place do they fail?
To know the place Shapley values fail, the perfect strategy is to manage the bottom fact. We are going to begin with a easy linear mannequin, after which systematically break down the reason. By observing how Shapley values react to those managed modifications, we are able to exactly establish precisely the place they yield deceptive outcomes and how you can repair them.
The Toy Mannequin
We are going to begin with a mannequin with 100 uniform random variables.
import numpy as np
from sklearn.linear_model import LinearRegression
import shap
def get_shapley_values_linear_independent_variables(
weights: np.ndarray, knowledge: np.ndarray
) -> np.ndarray:
return weights * knowledge
# Prime examine the theoretical outcomes with shap bundle
def get_shap(weights: np.ndarray, knowledge: np.ndarray):
mannequin = LinearRegression()
mannequin.coef_ = weights # Inject your weights
mannequin.intercept_ = 0
background = np.zeros((1, weights.form[0]))
explainer = shap.LinearExplainer(mannequin, background) # Assumes unbiased between all options
outcomes = explainer.shap_values(knowledge)
return outcomes
DIM_SPACE = 100
np.random.seed(42)
# Generate random weights and knowledge
weights = np.random.rand(DIM_SPACE)
knowledge = np.random.rand(1, DIM_SPACE)
# Set particular values to check our instinct
# Function 0: Excessive weight (10), Function 1: Zero weight
weights[0] = 10
weights[1] = 0
# Set maximal worth for the primary two options
knowledge[0, 0:2] = 1
shap_res = get_shapley_values_linear_independent_variables(weights, knowledge)
shap_res_pacakge = get_shap(weights, knowledge)
idx_max = shap_res.argmax()
idx_min = shap_res.argmin()
print(
f"Anticipated: idx_max 0, idx_min 1nActual: idx_max {idx_max}, idx_min: {idx_min}"
)
print(abs(shap_res_pacakge - shap_res).max()) # No distinction
On this easy instance, the place all variables are unbiased, the calculation simplifies dramatically.
Recall that the Shapley method is predicated on the marginal contribution of every characteristic, the distinction within the mannequin’s output when a variable is added to a coalition of identified options versus when it’s absent.
[ V(S∪{i}) – V(S)
]
For the reason that variables are unbiased, the particular mixture of pre-selected options (S) doesn’t affect the contribution of characteristic i. The impact of pre-selected and non-selected options cancel one another out in the course of the subtraction, having no affect on the affect of characteristic i. Thus, the calculation reduces to measuring the marginal impact of characteristic i straight on the mannequin output:
[ W_i · X_i ]
The result’s each intuitive and works as anticipated. As a result of there is no such thing as a interference from different options, the contribution relies upon solely on the characteristic’s weight and its present worth. Consequently, the characteristic with the biggest mixture of weight and worth is essentially the most contributing characteristic. In our case, characteristic index 0 has a weight of 10 and a worth of 1.
Let’s Break Issues
Now, we are going to introduce dependencies to see the place Shapley values begin to fail.
On this situation, we are going to artificially induce excellent correlation by duplicating essentially the most influential characteristic (index 0) 100 occasions. This ends in a brand new mannequin with 200 options, the place 100 options are similar copies of our unique high contributor and unbiased of the remainder of the 99 options. To finish the setup, we assign a zero weight to all these added duplicate options. This ensures the mannequin’s predictions stay unchanged. We’re solely altering the construction of the enter knowledge, not the output. Whereas this setup appears excessive, it mirrors a standard real-world situation: taking a identified necessary sign and creating a number of derived options (reminiscent of rolling averages, lags, or mathematical transformations) to raised seize its info.
Nonetheless, as a result of the unique Function 0 and its new copies are completely dependent, the Shapley calculation modifications.
Primarily based on the Symmetry Axiom: if two options contribute equally to the mannequin (on this case, by carrying the identical info), they have to obtain equal credit score.
Intuitively, realizing the worth of anybody clone reveals the complete info of the group. Consequently, the large contribution we beforehand noticed for the only characteristic is now cut up equally throughout it and its 100 clones. The “sign” will get diluted, making the first driver of the mannequin seem a lot much less necessary than it really is.
Right here is the corresponding code:
import numpy as np
from sklearn.linear_model import LinearRegression
import shap
def get_shapley_values_linear_correlated(
weights: np.ndarray, knowledge: np.ndarray
) -> np.ndarray:
res = weights * knowledge
duplicated_indices = np.array(
[0] + checklist(vary(knowledge.form[1] - DUPLICATE_FACTOR, knowledge.form[1]))
)
# we are going to sum these contributions and cut up contribution amongst them
full_contrib = np.sum(res[:, duplicated_indices], axis=1)
duplicate_feature_factor = np.ones(knowledge.form[1])
duplicate_feature_factor[duplicated_indices] = 1 / (DUPLICATE_FACTOR + 1)
full_contrib = np.tile(full_contrib, (DUPLICATE_FACTOR+1, 1)).T
res[:, duplicated_indices] = full_contrib
res *= duplicate_feature_factor
return res
def get_shap(weights: np.ndarray, knowledge: np.ndarray):
mannequin = LinearRegression()
mannequin.coef_ = weights # Inject your weights
mannequin.intercept_ = 0
explainer = shap.LinearExplainer(mannequin, knowledge, feature_perturbation="correlation_dependent")
outcomes = explainer.shap_values(knowledge)
return outcomes
DIM_SPACE = 100
DUPLICATE_FACTOR = 100
np.random.seed(42)
weights = np.random.rand(DIM_SPACE)
weights[0] = 10
weights[1] = 0
knowledge = np.random.rand(10000, DIM_SPACE)
knowledge[0, 0:2] = 1
# Duplicate copy of characteristic 0, 100 occasions:
dup_data = np.tile(knowledge[:, 0], (DUPLICATE_FACTOR, 1)).T
knowledge = np.concatenate((knowledge, dup_data), axis=1)
# We are going to put zero weight for all these added options:
weights = np.concatenate((weights, np.tile(0, (DUPLICATE_FACTOR))))
shap_res = get_shapley_values_linear_correlated(weights, knowledge)
shap_res = shap_res[0, :] # Take First document to check outcomes
idx_max = shap_res.argmax()
idx_min = shap_res.argmin()
print(f"Anticipated: idx_max 0, idx_min 1nActual: idx_max {idx_max}, idx_min: {idx_min}")
That is clearly not what we supposed and fails to offer clarification to mannequin conduct. Ideally, we wish the reason to mirror the bottom fact: Function 0 is the first driver (with a weight of 10), whereas the duplicated options (indices 101–200) are merely redundant copies with zero weight. As a substitute of diluting the sign throughout all copies, we might clearly favor an attribution that highlights the true supply of the sign.
Word: When you run this utilizing Python shap bundle, you would possibly discover the outcomes are related however not similar to our handbook calculation. It is because calculating Shapley values is computationally infeasible. Subsequently libraries like shap depend on approximation strategies which barely introduce variance.

Can We Repair This?
Since correlation and dependencies between options are extraordinarily widespread, we can’t ignore this concern.
On the one hand, Shapley values do account for these dependencies. A characteristic with a coefficient of 0 in a linear mannequin and no direct impact on the output receives a non-zero contribution as a result of it incorporates info shared with different options. Nonetheless, this conduct, pushed by the Symmetry Axiom, will not be at all times what we wish for sensible explainability. Whereas “pretty” splitting the credit score amongst correlated options is mathematically sound, it typically hides the true drivers of the mannequin.
A number of methods can deal with this, and we are going to discover them.
Grouping Options
This strategy is especially essential for high-dimensional characteristic area fashions, the place characteristic correlation is inevitable. In these settings, making an attempt to attribute particular contributions to each single variable is commonly noisy and computationally unstable. As a substitute, we are able to mixture related options that characterize the identical idea right into a single group. A useful analogy is from picture classification: if we wish to clarify why a mannequin predicts “cat” as a substitute of a “canine”, analyzing particular person pixels will not be significant. Nonetheless, if we group pixels into “patches” (e.g., ears, tail), the reason turns into instantly interpretable. By making use of this similar logic to tabular knowledge, we are able to calculate the contribution of the group quite than splitting it arbitrarily amongst its elements.
This may be achieved in two methods: by merely summing the Shapley values inside every group or by straight calculating the group’s contribution. Within the direct technique, we deal with the group as a single entity. As a substitute of toggling particular person options, we deal with the presence and absence of the group as simultaneous presence or absence of all options inside it. This reduces the dimensionality of the issue, making the estimation sooner, extra correct, and extra secure.

The Winner Takes It All
Whereas grouping is efficient, it has limitations. It requires defining the teams beforehand and infrequently ignores correlations between these teams.
This results in “clarification redundancy”. Returning to our instance, if the 101 cloned options usually are not pre-grouped, the output will repeat these 101 options with the identical contribution 101 occasions. That is overwhelming, repetitive, and functionally ineffective. Efficient explainability ought to scale back the redundancy and present one thing new to the person every time.
To attain this, we are able to create a grasping iterative course of. As a substitute of calculating all values directly, we are able to choose options step-by-step:
- Choose the “Winner”: Establish the only characteristic (or group) with the best particular person contribution
- Situation the Subsequent Step: Re-evaluate the remaining options, assuming the options from the earlier step are already identified. We are going to incorporate them within the subset of pre-selected options S within the shapley worth every time.
- Repeat: Ask the mannequin: “Provided that the person already is aware of about Function A, B, C, which remaining characteristic contributes essentially the most info?”
By recalculating Shapley values (or marginal contributions) conditioned on the pre-selected options, we make sure that redundant options successfully drop to zero. If Function A and Function B are similar and Function A is chosen first, Function B not supplies new info. It’s mechanically filtered out, leaving a clear, concise checklist of distinct drivers.

Word: You could find an implementation of this direct group and grasping iterative calculation in our Python bundle medpython.
Full disclosure: I’m a co-author of this open-source bundle.
Actual World Validation
Whereas this toy mannequin demonstrates mathematical flaws in shapley values technique, how does it work in real-life eventualities?
We utilized these strategies of Grouped Shapley with Winner takes all of it, moreover with extra strategies (which are out of scope for this put up, possibly subsequent time), in complicated medical settings utilized in healthcare. Our fashions make the most of lots of of options with sturdy correlation that had been grouped into dozens of ideas.
This technique was validated throughout a number of fashions in a blinded setting when our clinicians weren’t conscious which technique they had been inspecting, and outperformed the vanilla Shapley values by their rankings. Every approach contributed above the earlier experiment in a multi-step experiment. Moreover, our workforce utilized these explainability enhancements as a part of our submission to the CMS Well being AI Problem, the place we had been chosen as award winners.

Conclusion
Shapley values are the gold normal for mannequin explainability, offering a mathematically rigorous method to attribute credit score.
Nonetheless, as we’ve got seen, mathematical “correctness” doesn’t at all times translate into efficient explainability.
When options are extremely correlated, the sign could be diluted, hiding the true drivers of your mannequin behind a wall of redundancy.
We explored two methods to repair this:
- Grouping: Combination options right into a single idea
- Iterative Choice: conditioning on already offered ideas to squeeze out solely new info, successfully stripping away redundancy.
By acknowledging these limitations, we are able to guarantee our explanations are significant and useful.
When you discovered this convenient, let’s join on LinkedIn
















