Interpretabilidade (Machine Learning Clássico)
Por que a interpretabilidade importa em ML clássico
“ML clássico” normalmente se refere a modelos não neurais, como regressão linear/logística, árvores de decisão, florestas aleatórias, árvores com gradient boosting (gradient-boosted trees) e máquinas de vetores de suporte (support vector machines). Esses modelos são amplamente usados em produção porque são fortes em dados tabulares, rápidos de treinar e relativamente robustos — mas ainda assim podem ser difíceis de entender.
A interpretabilidade ajuda você a responder perguntas como:
- Entendimento global: Em quais features (features) o modelo se apoia no geral? Quais padrões ele aprendeu?
- Entendimento local: Por que o modelo fez esta predição para este caso?
- Depuração: O modelo está usando vazamento de dados (leakage) ou proxies? Ele está sobreajustando (overfitting) a correlações espúrias?
- Confiança e governança: As partes interessadas (risco, conformidade, especialistas de domínio) conseguem validar o comportamento do modelo?
- Ação prática: Quais mudanças melhorariam mais um resultado?
Interpretabilidade não é o mesmo que causalidade. A maioria das ferramentas explica associações dentro de um modelo ajustado, não “o que aconteceria se intervíssemos”. Essa distinção se torna crítica quando explicações são usadas para tomada de decisão.
Este artigo foca em técnicas de interpretabilidade para modelos clássicos — especialmente importância de features, dependência parcial e ideias do tipo SHAP (SHAP-like ideas) — e como usá-las com responsabilidade.
Distinções-chave: que tipo de “interpretação” você precisa?
Interpretabilidade intrínseca vs pós-hoc
- Interpretabilidade intrínseca: O próprio modelo é compreensível (por exemplo, modelo linear esparso, árvore de decisão pequena).
- Interpretabilidade pós-hoc: Você ajusta um modelo (possivelmente complexo) e então aplica ferramentas para explicá-lo (por exemplo, importância por permutação, PDP, SHAP).
Explicações globais vs locais
- Explicações globais resumem o comportamento do modelo em um conjunto de dados (por exemplo, importância global de features, PDP).
- Explicações locais explicam uma única predição (por exemplo, valores SHAP para uma instância, modelos substitutos locais).
Métodos específicos de modelo vs agnósticos ao modelo
- Específicos de modelo aproveitam a estrutura interna (por exemplo, “ganho” de divisão em árvores).
- Agnósticos ao modelo tratam o modelo como uma caixa-preta e o investigam via entradas/saídas (por exemplo, importância por permutação, KernelSHAP).
Escolher a ferramenta certa depende do seu objetivo, do tipo de modelo e das propriedades dos dados. Isso normalmente anda junto com uma boa Avaliação e uma Seleção de Modelo disciplinada.
Modelos clássicos intrinsecamente interpretáveis
Regressão linear e regressão logística
Modelos lineares estão entre os mais interpretáveis porque as predições são uma soma ponderada de features.
Para regressão linear: [ \hat{y} = \beta_0 + \sum_{j=1}^{p}\beta_j x_j ]
Para regressão logística: [ \Pr(y=1\mid x)=\sigma\Big(\beta_0+\sum_j \beta_j x_j\Big) ] onde (\sigma) é a sigmoide. Coeficientes podem ser interpretados como mudanças em log-odds por aumento de uma unidade em uma feature (mantendo as demais constantes).
Notas práticas:
- A escala importa: Uma mudança de “1 unidade” não significa nada se as features têm unidades diferentes. Padronize features contínuas antes de comparar magnitudes.
- Features correlacionadas: Com multicolinearidade, coeficientes podem ser instáveis ou contraintuitivos (inversões de sinal).
- Regularização muda a interpretação: L1 (Lasso) incentiva esparsidade; L2 (Ridge) reduz coeficientes; ambas podem melhorar a estabilidade, mas complicam a inferência estatística clássica.
- Interações e não linearidade: Você pode precisar de termos de interação ou transformações não lineares (splines, faixas/bins) de Engenharia de Features para refletir a realidade do domínio.
Exemplo (razão de chances na regressão logística):
- Se (\beta_j = 0.7), então uma mudança de +1 unidade multiplica as chances por (e^{0.7}\approx 2.01), se todo o resto permanecer fixo.
Árvores de decisão e modelos baseados em regras
Uma árvore de decisão pequena pode ser lida como um conjunto de regras do tipo “se-então”:
- Fácil de explicar e validar
- Captura não linearidade e interações
Mas:
- Árvores podem ficar grandes rapidamente e perder interpretabilidade.
- Árvores pequenas podem subajustar (underfit).
Listas de regras/conjuntos de regras (aprendidos ou extraídos) são frequentemente usados em ambientes regulados porque se assemelham à lógica de decisão humana.
Modelos aditivos (tipo GAM)
Modelos Aditivos Generalizados (GAMs) e abordagens relacionadas modelam: [ \hat{y} = \beta_0 + \sum_j f_j(x_j) ] onde cada (f_j) é uma função 1D aprendida. Isso mantém a interpretabilidade (“funções de forma por feature”) ao mesmo tempo que permite não linearidade. Modelos no estilo GAM são especialmente úteis quando você quer efeitos monótonos ou suaves.
Importância de features (global): o que importa para o modelo?
Importância de features tenta quantificar o quanto cada feature influencia as predições. Existem várias versões — cada uma responde a uma pergunta ligeiramente diferente.
1) Importância baseada em coeficientes (modelos lineares)
Para features padronizadas, (|\beta_j|) é uma medida grosseira de importância. Para regressão logística, você pode comparar (|\beta_j|) ou (|e^{\beta_j}|) (razões de chances), mas atenção:
- features correlacionadas distribuem a importância de forma imprevisível
- categóricas codificadas com one-hot produzem múltiplos coeficientes (considere agrupar)
2) Importância por “impureza” / “ganho” em árvores (específica de modelo)
Bibliotecas de árvores frequentemente reportam importância com base na melhora do critério de divisão (Gini, entropia, MSE) ao longo de todas as divisões que usam uma feature.
Prós:
- Rápida e embutida
- Funciona para florestas aleatórias e gradient boosting
Contras (importante):
- Tende a favorecer features contínuas ou com alta cardinalidade, que têm mais pontos potenciais de corte
- Pode inflar a importância de variáveis contínuas ruidosas vs categóricas de baixa cardinalidade
- Não necessariamente reflete dependência preditiva sob mudança de distribuição (distribution shift)
Use como diagnóstico rápido, não como resposta final.
3) Importância por permutação (agnóstica ao modelo)
A importância por permutação mede a queda de desempenho quando você embaralha aleatoriamente uma coluna de feature — quebrando sua relação com o alvo enquanto mantém as outras colunas intactas.
Algoritmo:
- Calcule a métrica de base (por exemplo, acurácia, AUC, RMSE) em um conjunto de validação.
- Embaralhe uma coluna de feature (x_j) entre as linhas.
- Recalcule a métrica.
- Importância ≈ score de base − score permutado (ou permutado − base para perda).
Pontos fortes:
- Agnóstica ao modelo
- Diretamente ligada a uma métrica escolhida (conecta com Avaliação)
Pontos fracos:
- Com features correlacionadas, embaralhar uma feature pode não prejudicar muito porque o modelo pode usar suas correlacionadas → a importância fica subestimada.
- Com correlações fortes, você pode precisar de importância por permutação agrupada (embaralhar um conjunto de colunas correlacionadas juntas).
4) Importância por remoção de coluna (baseada em retreinamento)
A importância por remoção de coluna retreina o modelo sem uma feature (ou grupo de features) e mede a mudança de desempenho.
Prós:
- Muitas vezes mais fiel do que permutação sob correlação
Contras:
- Cara (exige re-ajuste)
- Confundida por mudanças de hiperparâmetros e variância de retreinamento (use Seleção de Modelo consistente)
Gráficos de Dependência Parcial (PDP): efeito médio de uma feature
Um Gráfico de Dependência Parcial mostra o resultado previsto médio em função de uma feature, fazendo a média sobre a distribuição conjunta de todas as demais features.
Para um modelo (\hat{f}) e uma feature (x_s), a dependência parcial é: [ \mathrm{PDP}(x_s) = \mathbb{E}{X{\setminus s}}[\hat{f}(x_s, X_{\setminus s})] ]
Interpretação:
- Relação global, “em média”, entre uma feature e a predição.
- Útil para verificar monotonicidade, limiares, efeitos de saturação e não linearidade grosseira.
Gráficos ICE: curvas no nível individual
Gráficos de Expectativa Condicional Individual (ICE) mostram a curva por instância em vez de fazer a média. PDP é essencialmente a média das curvas ICE.
- Se as curvas ICE são semelhantes, a feature tem um efeito consistente.
- Se as curvas ICE variam muito, a feature interage com outras features.
Exemplo prático: PDP com scikit-learn
Abaixo está um fluxo típico usando um pipeline e um modelo de árvore. (Usar um pipeline é crítico para que a interpretabilidade reflita o sistema completo de pré-processamento + modelo.)
import numpy as np
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.inspection import PartialDependenceDisplay, permutation_importance
from sklearn.metrics import mean_squared_error
# Example schema
numeric = ["sqft", "age", "distance_to_center"]
categorical = ["neighborhood", "style"]
preprocess = ColumnTransformer(
transformers=[
("num", Pipeline([
("imputer", SimpleImputer(strategy="median")),
]), numeric),
("cat", Pipeline([
("imputer", SimpleImputer(strategy="most_frequent")),
("ohe", OneHotEncoder(handle_unknown="ignore")),
]), categorical),
],
remainder="drop"
)
model = RandomForestRegressor(
n_estimators=400,
random_state=0,
n_jobs=-1
)
pipe = Pipeline([
("prep", preprocess),
("model", model),
])
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=0)
pipe.fit(X_train, y_train)
pred = pipe.predict(X_val)
rmse = mean_squared_error(y_val, pred, squared=False)
print("RMSE:", rmse)
# Permutation importance on validation set
pi = permutation_importance(pipe, X_val, y_val, n_repeats=10, random_state=0, n_jobs=-1)
sorted_idx = np.argsort(pi.importances_mean)[::-1]
print("Top features (by column order):", sorted_idx[:5])
Para PDP, o scikit-learn pode plotar dependência parcial para features originais ao usar certos estimadores e pré-processamento; caso contrário, você pode precisar calcular PDP na matriz transformada e mapear de volta com cuidado.
PartialDependenceDisplay.from_estimator(
pipe, X_val, features=["sqft", "distance_to_center"], kind="average"
)
Limitações do PDP (muito importante)
PDP assume que você consegue variar uma feature independentemente enquanto faz média sobre as demais. Isso pode criar combinações irrealistas quando features são correlacionadas.
Exemplo:
- Se “renda” e “educação” são correlacionadas, o PDP pode avaliar alta renda com valores muito baixos de educação que quase nunca ocorrem.
- As predições do modelo nessas regiões podem ser pouco confiáveis, e o PDP pode enganar.
Mitigações:
- Use ICE para ver heterogeneidade.
- Use variantes de PDP condicional (mais difícil; requer modelar dependência entre features).
- Prefira ALE (próxima seção) quando correlações forem fortes.
Efeitos Locais Acumulados (ALE): alternativa ao PDP para features correlacionadas
Os gráficos de Efeitos Locais Acumulados (ALE) estimam o efeito de uma feature observando mudanças locais nas predições dentro de pequenos intervalos, e então acumulando essas mudanças.
Por que ALE frequentemente é preferido:
- Evita avaliar o modelo em combinações irrealistas de features de forma tão agressiva quanto o PDP.
- Tende a se comportar melhor com features correlacionadas.
Trade-offs:
- Um pouco mais complexo conceitualmente.
- Requer densidade de dados suficiente ao longo das faixas de features para estimativas estáveis.
Use ALE quando:
- Você suspeita de forte correlação entre preditores (comum em domínios tabulares).
- O PDP parece mostrar comportamento estranho em regiões esparsas.
Ideias do tipo SHAP: atribuições locais com teoria dos jogos
A ideia central: valores de Shapley
SHAP é baseado em valores de Shapley da teoria dos jogos cooperativos. Pense nas features como “jogadores” que contribuem para uma predição. O valor de Shapley para uma feature é sua contribuição marginal média em todas as ordens possíveis de adicionar features.
Para uma instância (x), SHAP produz atribuições (\phi_j) tais que: [ \hat{f}(x) = \phi_0 + \sum_{j=1}^{p}\phi_j ] onde (\phi_0) é a linha de base (saída esperada do modelo sob uma distribuição de referência).
Por que isso é atraente:
- Explicações locais que somam exatamente até a predição (aditividade)
- Propriedades axiomáticas fortes (eficiência, simetria, etc.)
SHAP na prática: diferentes estimadores
Computar valores de Shapley exatos é caro. Implementações práticas de SHAP os aproximam de maneiras diferentes:
- TreeSHAP: computação exata/quase exata eficiente para ensembles de árvores (florestas aleatórias, gradient boosting) usando a estrutura do modelo.
- KernelSHAP: aproximação agnóstica ao modelo usando regressão linear ponderada sobre coalizões de features (mais lenta, baseada em amostragem).
- LinearSHAP: rápido para modelos lineares.
Como ler saídas do SHAP
Visualizações comuns:
- Explicação local (waterfall/bar): quais features empurraram a predição acima/abaixo da linha de base.
- Resumo global (beeswarm): distribuição dos valores SHAP por feature em um conjunto de dados (importância + direção).
- Gráfico de dependência: valor SHAP vs valor da feature (frequentemente revela interações).
O que “importância” em SHAP significa:
- Frequentemente reportada como média(|valor SHAP|) entre amostras.
- Isso mede o quanto a feature contribui em magnitude para as predições, não se ela é “boa” ou “causal”.
Exemplo prático: TreeSHAP para uma árvore com gradient boosting
Conceitualmente (a API varia um pouco por biblioteca/versão):
import shap
# Suppose `pipe` ends with a tree model and preprocessing.
# SHAP typically needs access to the model and the transformed matrix.
X_val_trans = pipe.named_steps["prep"].transform(X_val)
tree_model = pipe.named_steps["model"]
explainer = shap.TreeExplainer(tree_model)
shap_values = explainer.shap_values(X_val_trans)
# Global summary (feature names require mapping from preprocessing)
shap.summary_plot(shap_values, X_val_trans)
Nota prática: com codificação one-hot, valores SHAP são por coluna codificada. Para comunicação com partes interessadas, você frequentemente precisa agregar as atribuições de volta para a feature original (por exemplo, somar SHAP em todas as colunas one-hot de “neighborhood”).
A distribuição de referência importa
Explicações SHAP dependem da expectativa de linha de base sobre um conjunto de dados de “referência”:
- Use uma amostra representativa dos dados de treino (ou uma população de referência bem justificada).
- Para entradas fora da distribuição (out-of-distribution), explicações podem ficar instáveis.
Explicações locais com modelos substitutos (ideias no estilo LIME)
Uma família diferente de métodos de interpretabilidade local ajusta um modelo simples (como uma regressão linear esparsa) ao redor da vizinhança de uma instância:
- Amostre pontos perturbados ao redor da instância.
- Consulte o modelo caixa-preta para rotular essas amostras.
- Ajuste um modelo substituto interpretável ponderado por proximidade.
- Use os coeficientes do substituto como explicação local.
Prós:
- Funciona com qualquer modelo
- Fornece explicação local linear intuitiva
Contras:
- Explicações podem ser instáveis (sensíveis à amostragem e à largura do kernel)
- “Vizinhança” pode ser mal definida em alta dimensionalidade ou com tipos de dados mistos
Substitutos são melhor tratados como ferramentas de depuração do que como explicações definitivas.
Um fluxo de trabalho prático de interpretabilidade (o que realmente funciona)
Uma abordagem repetível:
Esclareça a pergunta
- Global (o que dirige as predições no geral?) vs local (por que esta decisão?)
- Depuração vs explicação para partes interessadas vs seleção de features
Escolha o conjunto de dados certo para explicações
- Use um conjunto de validação separado para evitar explicações excessivamente otimistas.
- Garanta que ele corresponda à distribuição de implantação (conecta com IA centrada em dados).
Explique o pipeline completo
- A interpretabilidade deve refletir pré-processamento, codificação e tratamento de valores ausentes.
- Mantenha transformações consistentes com o treino (use pipelines).
Use múltiplos métodos complementares
- Comece com importância por permutação (ligada à métrica).
- Use PDP/ICE (forma dos efeitos) ou ALE (robusto à correlação).
- Use SHAP para explicações locais e resumos globais de atribuição.
Verifique estabilidade
- Reajuste o modelo com diferentes sementes aleatórias / folds e compare importâncias.
- Se a importância de features oscila muito, sua explicação não é robusta.
Valide com conhecimento de domínio
- As direções e limiares fazem sentido?
- Há proxies suspeitos (por exemplo, CEP atuando como proxy para atributos protegidos)?
Armadilhas comuns e modos de falha
Features correlacionadas podem quebrar interpretações ingênuas
- Importância por permutação pode subestimar importância quando existem alternativas correlacionadas.
- PDP pode avaliar combinações irrealistas e inventar artefatos.
- Coeficientes podem ser instáveis e enganosos.
Mitigação: agrupe features correlacionadas, use ALE, use agrupamento de features guiado por domínio e verifique estabilidade entre folds.
Vazamento e proxies do alvo
Uma feature pode ser “importante” porque vaza o rótulo (direta ou indiretamente), por exemplo:
- “Dias desde a conta foi encerrada” prevendo churn
- Timestamps pós-evento incluídos no momento do treino
Interpretabilidade ajuda a detectar vazamento, mas você também precisa desenhar os dados corretamente (veja IA centrada em dados).
Efeitos de interação podem ficar escondidos em resumos globais
Uma feature pode ser importante apenas para um segmento de usuários. A importância global de features faz média e apaga isso.
Mitigação: gráficos ICE, gráficos de dependência do SHAP, análises por subgrupos (por exemplo, por tipo de cliente) e PDP de interação (2D).
Importância não é causalidade
Importância de features responde: “O que o modelo usa?” e não “O que devemos mudar para afetar resultados?”
Se você precisa de intervenções e “e se mudássemos X”, você está no campo de inferência causal e raciocínio contrafactual, que requer suposições mais fortes do que a interpretabilidade padrão fornece.
A codificação pode distorcer a importância aparente
Codificação one-hot produz muitas colunas por feature. Uma única variável categórica pode parecer excessivamente importante ou fragmentada.
Mitigação: agregue importâncias/valores SHAP entre colunas derivadas de volta para a feature original.
Aplicações práticas
Risco de crédito / concessão
- Global: identificar principais fatores (dívida/renda, utilização).
- PDP/ALE: verificar monotonicidade (o risco deve aumentar com a utilização).
- Local: justificar motivos de ação adversa (principais contribuintes positivos de risco para um solicitante).
- Governança: verificar ausência de proxies proibidos.
Predição de churn
- Global: quais comportamentos se correlacionam com churn.
- Local: por que um cliente específico foi sinalizado.
- ICE: detectar segmentos em que certas features importam (por exemplo, tickets de suporte importam apenas para clientes corporativos).
Modelos de risco em saúde (tabular)
- PDP/ALE: validar direcionalidade clinicamente plausível.
- SHAP: fornecer racionalizações por caso a clínicos, enfatizando limitações e natureza não causal.
Em todos os domínios, explicações devem ser acompanhadas de Avaliação rigorosa, incluindo verificações de robustez e validação cuidadosa contra restrições do mundo real.
Resumo
Interpretabilidade em ML clássico combina:
- Atribuição global (importância de features) para entender no que o modelo se apoia
- Gráficos de efeito funcional (PDP/ICE, ALE) para entender como features se relacionam com predições
- Atribuições locais (métodos do tipo SHAP, substitutos locais) para explicar predições individuais
Nenhum método isolado é universalmente correto. Interpretabilidade confiável vem de:
- combinar o método com a pergunta,
- respeitar dependências dos dados e pré-processamento,
- usar múltiplas visões do modelo,
- e validar explicações quanto à estabilidade e plausibilidade.
Quando bem feita, interpretabilidade é uma ferramenta prática de engenharia: melhora a depuração, a confiança das partes interessadas e as chances de seu modelo se comportar de forma sensata após a implantação.