Valores de Shapley e SHAP

Os valores de Shapley respondem a uma pergunta aparentemente simples: dada a previsão de um modelo para uma observação específica, o quanto cada atributo contribuiu para essa previsão? Eles vêm da teoria dos jogos cooperativos e têm uma justificativa matemática única: são o único método de atribuição que satisfaz quatro axiomas naturais de justiça simultaneamente. O SHAP torna os valores de Shapley viáveis para modelos de machine learning.

O problema da atribuição

Um modelo prevê que um solicitante de empréstimo tem 78% de probabilidade de inadimplência, em comparação com a previsão média de 35%. A previsão está 43 pontos percentuais acima da média. Quanto desse excesso cada atributo (renda, idade, histórico de crédito, índice de endividamento) explica?

Essa não é uma pergunta trivial. Os atributos interagem: o efeito da renda depende do índice de endividamento. Uma abordagem ingênua que avalia os atributos um por vez perde essas interações. Os valores de Shapley resolvem isso calculando a média sobre todas as ordens possíveis em que os atributos podem ser “introduzidos” no modelo.

Valores de Shapley: a base na teoria dos jogos

Na teoria dos jogos cooperativos, um conjunto de jogadores \(N = \{1, \ldots, p\}\) joga um jogo e recebe um pagamento conjunto \(v(S)\) para cada coalizão \(S \subseteq N\). O valor de Shapley \(\phi_j\) é a parte justa do jogador \(j\):

\[\phi_j = \sum_{S \subseteq N \setminus \{j\}} \frac{|S|!\,(p-|S|-1)!}{p!} \left[v(S \cup \{j\}) - v(S)\right]\]

Para a interpretabilidade de modelos: jogadores = atributos, pagamento = previsão do modelo, \(v(S)\) = saída esperada do modelo quando apenas os atributos em \(S\) são conhecidos (os demais são marginalizados).

A fórmula calcula a média da contribuição marginal do atributo \(j\) sobre todas as ordens possíveis dos atributos: o quanto adicionar \(j\) à coalizão \(S\) muda a previsão?

Os quatro axiomas de justiça

Os valores de Shapley são a única atribuição que satisfaz os quatro simultaneamente:

Eficiência: os valores de Shapley somam a diferença entre a previsão e a linha de base (previsão média):

\[\sum_{j=1}^p \phi_j = f(\mathbf{x}) - E[f(\mathbf{X})]\]

Todo desvio em relação à linha de base é completamente explicado.

Simetria: se dois atributos \(j\) e \(k\) fazem contribuições idênticas a toda coalizão (\(v(S \cup \{j\}) = v(S \cup \{k\})\) para todo \(S\)), eles recebem o mesmo valor de Shapley.

Variável fictícia (dummy): se um atributo \(j\) não muda a previsão em nenhuma coalizão (\(v(S \cup \{j\}) = v(S)\) para todo \(S\)), seu valor de Shapley é zero.

Aditividade: para modelos que se decompõem como \(f = f_1 + f_2\), os valores de Shapley se somam: \(\phi_j(f) = \phi_j(f_1) + \phi_j(f_2)\).

Nenhum outro método de atribuição satisfaz os quatro. Métodos como atribuição baseada em gradiente, LIME, e importância por permutação violam pelo menos um dos axiomas.

SHAP: aproximação eficiente de Shapley

Calcular os valores de Shapley exatos exige avaliar o modelo em todos os \(2^p\) subconjuntos, o que é exponencial. O SHAP (SHapley Additive exPlanations, Lundberg e Lee, 2017) fornece algoritmos eficientes exatos ou aproximados para classes específicas de modelos:

TreeSHAP: valores de Shapley exatos para modelos baseados em árvores (árvores de decisão, random forests, XGBoost, LightGBM) em tempo \(O(TLD^2)\), em que \(T\) é o número de árvores, \(L\) é o número de folhas, e \(D\) é a profundidade da árvore. Isso é polinomial, tornando-o viável para grandes ensembles.

LinearSHAP: valores de Shapley exatos para modelos lineares. Para um modelo linear \(f(\mathbf{x}) = \boldsymbol{\beta}^T\mathbf{x} + \beta_0\), o valor de Shapley do atributo \(j\) é simplesmente \(\phi_j = \beta_j(x_j - E[x_j])\) quando os atributos são independentes.

KernelSHAP: aproximação agnóstica ao modelo usando regressão linear ponderada sobre coalizões amostradas. Funciona para qualquer modelo de caixa-preta, mas é mais lenta.

Gráfico de cascata SHAP mostrando como cada atributo contribui para uma única previsão partindo da linha de base

O gráfico de cascata começa na linha de base (previsão média = 0,35) e adiciona sequencialmente o valor SHAP de cada atributo. Barras vermelhas empurram a previsão para cima; barras azuis a empurram para baixo. A previsão final (0,58) é igual à linha de base mais todos os valores SHAP, satisfazendo o axioma de eficiência.

Interpretabilidade global: o gráfico de resumo SHAP

Os valores de Shapley individuais explicam uma previsão. Para entender o modelo globalmente, calcule os valores SHAP para todas as observações e visualize a distribuição.

Gráfico de resumo SHAP mostrando a distribuição dos valores SHAP para cada atributo colorido pelo valor do atributo

Cada ponto é uma observação. A posição no eixo x mostra o valor SHAP (direção e magnitude do efeito do atributo). A cor mostra o valor do atributo (azul = baixo, vermelho = alto). O gráfico de resumo revela: índice de endividamento alto (vermelho) empurra as previsões para cima; renda alta (vermelho) empurra as previsões para baixo. Os atributos são ordenados pela média do valor absoluto do SHAP (importância global).

SHAP vs importância de atributos tradicional

Importância por permutação Importância por impureza SHAP
Explica previsões individuais Não Não Sim
Consistente com o modelo Não (pode diferir) Não Sim (axioma de eficiência)
Trata atributos correlacionados Mal Mal Melhor
Mostra a direção do efeito Não Não Sim
Computacionalmente caro Moderado Rápido Rápido (TreeSHAP)

O SHAP supera a importância de atributos tradicional em quase toda dimensão, exceto velocidade (embora o TreeSHAP seja rápido o suficiente para a maioria das aplicações). Para atributos correlacionados, o SHAP distribui o crédito de forma mais justa do que a importância por permutação, que pode atribuir importância zero a um atributo relevante se um atributo correlacionado absorver seu efeito.

⚠️ O SHAP mede associação, não causalidade

Um valor SHAP de +0,18 para “histórico de crédito” significa que conhecer o histórico de crédito deste solicitante empurra a previsão do modelo 18 pontos percentuais acima da linha de base. Não significa que mudar o histórico de crédito mudaria o resultado em 18 pontos percentuais no mundo real.

O SHAP explica o modelo, não o processo gerador de dados. Se o modelo aprendeu uma correlação espúria (por exemplo, CEP como proxy para raça em um conjunto de dados enviesado), o SHAP explicará fielmente essa associação espúria. Ferramentas de interpretabilidade tornam os modelos mais transparentes; elas não corrigem modelos defeituosos.

Além disso: os valores SHAP dependem da distribuição de referência usada para marginalizar os atributos ausentes. Implementações diferentes tratam isso de forma diferente (esperança marginal vs condicional), levando a valores diferentes para o mesmo modelo. Sempre verifique qual linha de base está sendo usada.

💡 SHAP em R

library(shapviz)   # best SHAP visualization in R
library(xgboost)

# Train XGBoost model
dtrain <- xgb.DMatrix(X_train, label=y_train)
fit <- xgb.train(params=list(eta=0.1, max_depth=5,
                              objective="binary:logistic"),
                 data=dtrain, nrounds=100)

# Compute exact SHAP values (TreeSHAP)
shp <- shapviz(fit, X_pred=X_train)

# Waterfall plot for one observation
sv_waterfall(shp, row_id=1)

# Summary (beeswarm) plot
sv_importance(shp, kind="beeswarm")

# Dependence plot: SHAP vs feature value for one feature
sv_dependence(shp, v="income")

# Mean absolute SHAP (global importance bar chart)
sv_importance(shp, kind="bar")

# For any black-box model: KernelSHAP
library(kernelshap)
ks <- kernelshap(fit_rf, X=X_train, bg_X=X_train[1:100,])
sv <- shapviz(ks)
sv_importance(sv, kind="beeswarm")