Você treinou um XGBoost com AUC 0.91. O gerente de risco pergunta: "por que o modelo negou o crédito deste cliente?". Se sua resposta é "não sei, é uma caixa-preta", você tem um problema — legal, ético e de negócio. Modelos poderosos são frequentemente opacos, e a capacidade de explicá-los deixou de ser luxo acadêmico para virar exigência regulatória (LGPD, GDPR, regras de crédito). Esta aula ensina a abrir a caixa-preta.

Distinguir interpretabilidade de explicabilidade, dominar métodos globais (importância por permutação, PDP, ALE) e locais (LIME, SHAP, contrafactuais), e entender as limitações e armadilhas de cada técnica.

Interpretabilidade vs. explicabilidade

  • Interpretabilidade: o quanto um humano consegue entender intrinsecamente o modelo. Modelos como regressão linear e árvores rasas são interpretáveis por natureza.
  • Explicabilidade: técnicas aplicadas a posteriori (post-hoc) para explicar modelos complexos que não são interpretáveis por si.

Também distinguimos:

  • Global: como o modelo se comporta em geral (quais features importam, como).
  • Local: por que o modelo fez esta predição específica.

A escolha entre um modelo interpretável desde o início e um modelo complexo + explicação post-hoc é uma decisão de projeto — às vezes um modelo simples e transparente vale mais que um ganho marginal de AUC opaco.

Importância por permutação (global)

Mede quanto o desempenho cai quando você embaralha uma feature (quebrando sua relação com o alvo). Se embaralhar uma feature destrói o desempenho, ela era importante. É agnóstica ao modelo e mais confiável que a importância por impureza.

from sklearn.inspection import permutation_importance
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
import numpy as np

X, y = make_classification(n_samples=3000, n_features=15, n_informative=6,
                           random_state=42)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42)

rf = RandomForestClassifier(n_estimators=300, random_state=42).fit(X_tr, y_tr)

# IMPORTANTE: calcule na validação/teste, não no treino
perm = permutation_importance(rf, X_te, y_te, n_repeats=20,
                              random_state=42, scoring="roc_auc")
ordem = perm.importances_mean.argsort()[::-1]
for i in ordem[:6]:
    print(f"feature {i}: {perm.importances_mean[i]:.4f} ± {perm.importances_std[i]:.4f}")

Limitação: com features correlacionadas, a permutação cria combinações irreais e pode subestimar a importância (o modelo compensa pela feature correlacionada não embaralhada). Interprete com cuidado nesses casos.

Partial Dependence Plots (PDP) e ICE (global/local)

PDP mostra o efeito médio de uma feature na predição, marginalizando as demais. ICE mostra uma linha por instância, revelando efeitos heterogêneos que a média do PDP esconde.

from sklearn.inspection import PartialDependenceDisplay
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 4))
PartialDependenceDisplay.from_estimator(
    rf, X_te, features=[0, 1], kind="both",  # "both" = PDP + ICE
    ax=ax,
)
plt.tight_layout()

Armadilha do PDP: assume independência entre features. Se as features são correlacionadas, o PDP avalia combinações impossíveis (ex.: "área da casa = 20m² com 5 quartos"), gerando conclusões enganosas. A alternativa robusta é o ALE (Accumulated Local Effects), que usa diferenças locais dentro de intervalos e não sofre desse problema.

LIME (local)

LIME (Local Interpretable Model-agnostic Explanations) explica uma predição individual ajustando um modelo linear simples na vizinhança daquele ponto: perturba a instância, vê como a predição muda, e aproxima localmente o comportamento do modelo complexo.

# pip install lime
from lime.lime_tabular import LimeTabularExplainer

explainer = LimeTabularExplainer(
    X_tr, mode="classification",
    feature_names=[f"f{i}" for i in range(X.shape[1])],
    discretize_continuous=True,
)
exp = explainer.explain_instance(X_te[0], rf.predict_proba, num_features=6)
print(exp.as_list())   # contribuições locais de cada feature

Limitações do LIME: a explicação depende de como se define "vizinhança" e da amostragem de perturbações, podendo ser instável (rodar duas vezes dá resultados diferentes). É rápido e intuitivo, mas menos rigoroso que o SHAP.

SHAP — o padrão-ouro (local e global)

SHAP (SHapley Additive exPlanations) baseia-se na teoria dos jogos: os valores de Shapley distribuem "de forma justa" a predição entre as features, respondendo quanto cada feature contribuiu para afastar esta predição da média. Tem garantias teóricas (eficiência, simetria, consistência) que o LIME não tem, e unifica explicação local e global.

# pip install shap
import shap

explainer = shap.TreeExplainer(rf)      # rápido e exato para árvores
shap_values = explainer.shap_values(X_te)

# Explicação LOCAL de uma predição
shap.force_plot(explainer.expected_value[1], shap_values[1][0], X_te[0])

# Explicação GLOBAL: importância = média do |valor SHAP| por feature
shap.summary_plot(shap_values[1], X_te)

# Dependência de uma feature (com interações coloridas)
shap.dependence_plot(0, shap_values[1], X_te)

Propriedades que tornam o SHAP poderoso:

  • Aditividade: a soma dos valores SHAP + valor base = predição exata. Nada "sobra".
  • Consistência: se um modelo passa a depender mais de uma feature, seu valor SHAP não diminui.
  • Local → global: agregar valores SHAP (média do módulo) dá importância global coerente com as explicações locais.

Use TreeExplainer para modelos de árvore (exato e rápido), LinearExplainer para lineares, e KernelExplainer/PermutationExplainer (mais lentos) como fallback agnóstico. Cuidado com features correlacionadas — a atribuição pode se distribuir entre elas.

Contrafactuais — "o que teria que mudar?"

Explicações contrafactuais respondem à pergunta mais acionável de todas: "o que este cliente precisaria mudar para o modelo aprovar o crédito?". Elas encontram a menor alteração nas features que muda a decisão.

# Exemplo conceitual com a biblioteca DiCE (pip install dice-ml)
# import dice_ml
# d = dice_ml.Data(dataframe=df, continuous_features=[...], outcome_name="aprovado")
# m = dice_ml.Model(model=modelo, backend="sklearn")
# dice = dice_ml.Dice(d, m)
# cf = dice.generate_counterfactuals(instancia, total_CFs=3, desired_class="opposite")

Contrafactuais são especialmente valiosos para o usuário final (não o cientista de dados): são concretos, acionáveis ("aumente sua renda em X" ou "reduza sua dívida em Y") e não exigem entender o modelo. São a base do "direito à explicação" em muitas regulações.

Escolhendo o método certo

Pergunta Método
Quais features importam no geral?Permutation importance, SHAP global
Como uma feature afeta a predição?PDP/ICE, ALE (se correlação), SHAP dependence
Por que esta predição?SHAP local, LIME
O que mudar para inverter a decisão?Contrafactuais
Preciso de rigor teórico?SHAP
Preciso de velocidade/prototipagem?LIME, permutation

Armadilhas gerais da explicabilidade

  • Correlação entre features distorce quase todos os métodos (permutação, PDP, SHAP). Sempre considere a estrutura de correlação.
  • Explicação ≠ causalidade. SHAP e afins explicam o modelo, não o mundo. Uma feature com alto SHAP não é necessariamente uma causa — pode ser um proxy ou refletir viés nos dados.
  • Explicações podem ser manipuladas e dar falsa sensação de segurança. Valide-as contra conhecimento de domínio.
  • Interpretável desde o início às vezes é melhor: um modelo aditivo (GAM, EBM) ou uma árvore rasa pode entregar transparência real sem depender de aproximações post-hoc.

Em R

library(DALEX)   # framework unificado de explicabilidade em R
library(iml)     # interpretable machine learning

# DALEX: explainer agnóstico
explainer <- DALEX::explain(modelo, data = X_teste, y = y_teste)
DALEX::model_parts(explainer)     # importância por permutação (global)
DALEX::predict_parts(explainer, new_observation = X_teste[1, ])  # local (SHAP/Break Down)
DALEX::model_profile(explainer)   # PDP / ALE

Os pacotes DALEX e iml trazem permutation importance, PDP/ALE, SHAP e Break Down com uma API unificada — o equivalente em R ao ecossistema SHAP/LIME do Python.

Interpretabilidade é propriedade intrínseca do modelo; explicabilidade é o que se constrói depois, por fora. Os métodos se dividem entre globais, que descrevem o comportamento geral, e locais, que explicam uma predição. A permutation importance, medida em validação, é global, agnóstica ao modelo e mais confiável que a importância por impureza. O PDP mostra o efeito médio de uma feature, o ICE mostra instância a instância, e o ALE corrige o problema que o PDP tem quando as features são correlacionadas. O LIME explica localmente ajustando um modelo linear na vizinhança do ponto, com a ressalva de que pode ser instável entre execuções. O SHAP, baseado nos valores de Shapley, é o padrão-ouro: aditivo, consistente, e unifica a leitura local com a global — para árvores, use o TreeExplainer. Os contrafactuais dizem o que precisaria mudar para a decisão se inverter, e é a forma mais acionável de explicação para quem recebe o resultado. Duas ressalvas atravessam tudo: correlação distorce esses métodos, e explicação não é causalidade.

Exercícios

  1. Qual a diferença entre interpretabilidade e explicabilidade, e entre métodos globais e locais?

    ✓ Resposta:

    Interpretabilidade é a propriedade de um modelo ser compreensível por si mesmo, pela sua estrutura (ex.: regressão linear, árvore rasa) — você lê o modelo e entende como ele decide. Explicabilidade refere-se a técnicas aplicadas após o treino (post-hoc) para explicar modelos complexos e opacos (ex.: SHAP sobre um XGBoost). Quanto ao escopo: métodos globais descrevem o comportamento do modelo como um todo (quais features importam em geral, como uma feature afeta as predições na média); métodos locais explicam uma predição individual (por que este cliente específico foi classificado assim). SHAP faz os dois; LIME é essencialmente local; permutation importance é global.

  2. Por que a importância por permutação deve ser calculada sobre dados de validação/teste e não sobre o treino?

    ✓ Resposta:

    Calculada no treino, a importância por permutação reflete o quanto o modelo se apoiou naquela feature para memorizar os dados de treino, o que pode incluir overfitting — uma feature que só ajuda a decorar ruído pareceria importante. Calculada em dados não vistos (validação/teste), ela mede quanto a feature contribui para a generalização real: se embaralhá-la piora o desempenho em dados novos, ela carrega sinal genuíno útil. Assim, a versão em validação/teste responde à pergunta certa ("esta feature ajuda a prever dados futuros?") e evita superestimar features que só contribuem para overfitting.

  3. Qual é a principal limitação do PDP quando as features são correlacionadas, e qual método a contorna?

    ✓ Resposta:

    O PDP calcula o efeito médio de uma feature fixando-a em vários valores e marginalizando as outras, o que pressupõe independência entre features. Quando há correlação, esse procedimento avalia o modelo em combinações irrealistas ou impossíveis (ex.: fixar "número de quartos = 8" mantendo "área = 30m²"), pois gera pontos fora da distribuição real dos dados. O resultado pode ser uma curva de dependência enganosa. O método que contorna isso é o ALE (Accumulated Local Effects), que calcula os efeitos usando diferenças locais dentro de pequenos intervalos da feature, considerando apenas dados realmente presentes naquela região — evitando extrapolações impossíveis e sendo robusto à correlação.

  4. Cite duas vantagens do SHAP sobre o LIME.

    ✓ Resposta:

    (1) Fundamento teórico e garantias: o SHAP baseia-se nos valores de Shapley da teoria dos jogos, com propriedades matemáticas como aditividade (a soma das contribuições mais o valor base reconstrói exatamente a predição) e consistência (se o modelo passa a depender mais de uma feature, seu valor SHAP não cai). O LIME não oferece essas garantias. (2) Estabilidade e coerência local-global: o LIME depende de amostragem aleatória de perturbações e da definição de vizinhança, podendo produzir explicações instáveis (diferentes a cada execução); o SHAP é mais estável e permite agregar as explicações locais em uma importância global coerente. Além disso, o TreeExplainer calcula SHAP de forma exata e eficiente para modelos de árvore.

  5. O que é uma explicação contrafactual e por que ela costuma ser mais útil para o usuário final do que uma atribuição de importância de features?

    ✓ Resposta:

    Uma explicação contrafactual descreve a menor mudança nas features que faria o modelo tomar uma decisão diferente — por exemplo, "se sua renda mensal fosse R$500 maior, o crédito seria aprovado". Ela é mais útil para o usuário final porque é acionável e concreta: diz exatamente o que fazer para mudar o resultado, sem exigir que a pessoa entenda o funcionamento interno do modelo ou o significado de valores SHAP. Atribuições de importância dizem quais features pesaram e quanto, mas não traduzem isso em uma ação prática. Por isso, contrafactuais são a base do "direito à explicação" em regulações como GDPR/LGPD, focadas no impacto sobre o indivíduo.

Fontes e leituras recomendadas