SHAP: O que é e por que usar

Big Data Brasil
Big Data Blog
Published in
14 min readNov 5, 2020
Photo by StartupStockPhotos at Pixabay

por Marcelo S. Menegol, Cientista de Dados na Big Data.

Introdução

Como comentamos neste artigo, importância de variáveis é um conceito importante para se entender como modelos preditivos funcionam, como eles utilizam a informação para realizar previsões. Entender isto pode revelar dinâmicas sobre o mundo real que até então eram desconhecidas, aprimorando o conhecimento das pessoas que trabalham com o modelo. Além disso, avaliar a importância que o modelo atribui a cada variável pode ser útil para se auditar modelos complexos: se o modelo dá uma importância muito grande a variáveis correlacionadas com raça ou crença da população, por exemplo, pode ser que ele esteja discriminando pessoas indevidamente nas suas previsões.

Porém, como também salientamos no artigo supracitado, às vezes é difícil extrair as importâncias que o modelo dá a cada variável. Modelos mais complexos, como redes neurais ou do tipo CART (random forest, boosted trees, etc), fazem várias operações complexas nos dados (muitas vezes não-lineares) para gerar uma previsão. Logo, é muito mais difícil de quantificar a importância de cada variável para o modelo.

Ainda do mesmo artigo, tentamos deixar claro que existem dois tipos de importância que uma variável pode ter: global e local. A importância global de uma variável nos diz o quão importante aquela variável é quando consideramos todos os exemplos que podem ser considerados pelo modelo. Já a importância local nos diz a importância para um único exemplo, para apenas um local. Em modelos complexos, é comum que as importâncias globais sejam diferentes das locais.

Para se obter valores de importâncias globais, é comum o uso de métricas específicas aos modelos. Em modelos lineares, por exemplo, o próprio coeficiente de cada variável é um representante de sua importância. Já com modelos CART, outras métricas como ganho ou cobertura podem ser usadas. Uma alternativa agnóstica a modelo, porém computacionalmente custosa, para se obter importâncias globais são as importâncias de permutação.

Já para importâncias locais, normalmente não há métodos tão diretos para se extrair importâncias. Alguns exemplos são o LIME e o SHAP. Neste artigo, iremos explorar o SHAP e seus Shapley Values. Como há uma abundância de artigos na internet acerca de como utilizar o pacote SHAP do Python para obter estes valores, não iremos tocar neste assunto aqui. Entraremos mais na parte teórica do SHAP: o que são os Shapley Values, como são calculados e como interpretá-los.

Modelos de explicação

No artigo de introdução ao SHAP, Scott Lundberg escreve que a melhor explicação para um modelo é o próprio modelo. Contanto que se consiga analisar o modelo e seus parâmetros e facilmente entendê-lo, não há nenhum outro artifício que se possa usar que torne esta tarefa mais fácil e precisa. Este é o caso com modelos lineares, por exemplo, que podem ser descritos por uma simples equação. Por outro lado, quando o modelo não pode ser interpretado diretamente, cria-se um modelo de explicação mais simples, facilmente interpretável e que incorpore o comportamento do modelo complexo. Parecido como quando criamos analogias e metáforas com coisas cotidianas para entender conceitos complicados.

Ainda segundo o mesmo artigo, vários métodos diferentes para se encontrar importâncias locais de variáveis se utilizam deste modelo de explicação, que são gerados ainda segundo uma mesma família de métodos: métodos de atribuição aditiva de características. Estes métodos têm um modelo de explicação que são uma função linear de variáveis binárias:

Equação 1

tal que z’ ∈ {0, 1}ᴹ, M é o número de características de entrada simplificadas, e ϕᵢ ∈ R.

Ou seja, estes métodos atribuem um efeito ϕᵢ a cada variável, e a soma de todos os efeitos aproximam a resposta f(x) do modelo original que se pretende explicar.

Perceba que esta definição é bem abrangente. Contanto que o somatório dos efeitos aproxime a resposta do modelo, cada efeito pode tomar qualquer valor. E, de fato, diferentes métodos de atribuição de importâncias, baseados em ideias e conceitos diferentes, podem retornar importâncias diferentes para cada variável ao tentar explicar um mesmo modelo. Uma das maiores contribuições do SHAP é propor a sua própria lógica de cômputo destes valores que garantem que eles tenham outras propriedades interessantes além do seu somatório aproximar a resposta do modelo original. E toda esta lógica surge dos Shapley Values.

Shapley Values

Os Shapley Values (ou “valores de Shapley”) foram introduzidos por Lloyd Shapley, economista ganhador do prêmio Nobel em 2012, no contexto da teoria dos jogos. Para um jogo cooperativo qualquer, os Shapley Values distribuem uma quantidade total de contribuição, para cada jogador da equipe de forma justa. Por exemplo, em um jogo de futebol, é natural que se dê o crédito dos gols aos atacantes que os marcaram. Mas e os laterais e centro-avantes que fazem os passes e armam a jogada? E os zagueiros que pegam a bola do time adversário e iniciam a jogada? Não faria sentido atribuir uma fração do gol a cada um deles? Os Shapley Values se propõem a fazer isto.

Shapley em 1980

Para entender melhor as complexidades de se distribuir estas contribuições, imagine que você está montando um time de futebol. Você pode selecionar apenas 1 jogador da liga profissional, e o resto vem da liga infantil (até 15 anos). Inicialmente, com 0 jogadores, você provavelmente não conseguiria marcar nenhum gol na partida. O primeiro jogador que você escolhe é o melhor do mundo. Este indivíduo faz uma diferença tremenda no seu time, ainda mais considerando seu estado inicial, de 0 jogadores. Todos os gols que você fizer no jogo certamente foram responsabilidade dele. Os próximos jogadores, vindo de uma liga menos prestigiada, certamente terão sua contribuição no jogo, mas certamente não serão tão habilidosos quanto a estrela do time. Se o craque vale 1000, talvez cada outro jogador valha apenas 5 ou 10, a depender da habilidade de cada um.

Agora considere a situação inversa: você começa selecionando jogadores da liga infantil. O primeiro jogador adicionado, por mais que não seja muito bom, é muito importante. Ele é a diferença entre fazer 0 gols e ter a chance de marcar algo, talvez até mesmo ganhar o jogo, a depender do time adversário. Conforme você vai adicionando mais jogadores, a contribuição de cada um para o total tende a diminuir. Quando você adiciona o seu último jogador da liga profissional, ele não é nem de perto tão importante quanto no primeiro caso. E agora, qual importância ele deveria ter?

Este exemplo ilustra um problema real que se encontra ao se formar equipes e coalizões. Times esportivos podem estar mais propensos a pagar mais nas primeiras contratações do que nas últimas, quando a equipe já mais bem está formada. Candidatos políticos podem escolher recompensar mais as primeiras pessoas a entrarem na sua coalizão, quando qualquer aliança tende a atrair mais pessoas de alinhamentos políticos distintos, do que os últimos, quando a coalizão já abrange boa parte das posições políticas da população e trazer mais aliados se torna mais redundante.

Quando a importância de cada jogador pode depender largamente da ordem na qual eles são escolhidos, como atribuir importâncias (pagamentos, benefícios, etc) a cada um de forma mais “justa”, depois que a equipe já está fechada? Bem, se pudéssemos refazer em qualquer ordem, quantas vezes quiséssemos, poderíamos testar todas as ordens possíveis e fazer a média dos valores atribuídos para cada jogador. Isto nada mais é do que os Shapley Values. Formalmente, este processo é definido por [Lloyd]:

Equação 2

tal que ϕᵢ é a contribuição do jogador i, N é o conjunto de todos os jogadores, v é a função que calcula a contribuição de uma equipe, n é o número total de jogadores, S é um subconjunto de N, e o somatório itera em todos os subconjuntos de N que não contém o jogador i.

Ver uma equação deste tamanho de uma vez só pode ser um pouco intimidador. Deduzir esta equação está além do escopo deste artigo, mas podemos ao menos quebrá-las em partes para entendê-la melhor:

v é uma função que, dado uma equipe, calcula um resultado ou contribuição. Em um exemplo concreto, v depende muito do jogo no qual a equipe participa.

ϕᵢ é a contribuição do jogador i, dado v (dado o jogo).

Vamos pular o somatório por enquanto. N é o conjunto de todos os jogadores da equipe. Considere uma equipe S, subconjunto de N, que não contém o jogador i. S pode não conter outros jogadores além de i. Inclusive, S pode não conter nenhum jogador (S = Ø).

v(S∪{i}) é a contribuição da equipe S com o jogador i incluso. Alternativamente, v(S) é a contribuição de S, que não contém o jogador i. Logo, v(S∪{i}) − v(S) é a contribuição marginal de i: qual valor ele acrescenta quando está dentro da equipe.

Binom(n-1, |S|) é formalmente definido como o número de permutações de |S| elementos que podem ser feitos de n-1 elementos. Isto representa o número de permutações de todos os jogadores em S que podem ser feitas no universo de todos os jogadores disponíveis para S, que são n-1 (visto que S, por definição, não contém i). A contribuição marginal é dividida por este número de permutações. Por fim, divide-se todo o resultado pelo número de jogadores.

Como n é uma constante e:

Equação 3

Podemos colocar 1 / n dentro do somatório e simplificar a equação para:

Equação 4

De forma mais intuitiva, a contribuição de cada jogador é a média de sua contribuição em relação a todas as permutações de times que não o incluem.

Shapley Values e importância de variáveis

Voltando ao nosso problema de encontrar importâncias locais para variáveis, podemos interpretar o problema como um jogo, no qual cada variável com determinado valor é um jogador e o valor de contribuição da equipe é a resposta de um modelo que contém apenas aqueles atributos como entrada. Neste cenário, a contribuição de uma variável, que pode ser interpretada como sua importância, poderia ser facilmente obtida pela equação que vimos anteriormente.

Para cada subconjunto S de atributos possível que não contém a variável de interesse i, re-treinamos o modelo duas vezes: uma vez contendo i, e uma vez sem i, e aplicamos o modelo ao exemplo de interesse. Isto nos dá o v(S∪{i}) e v(S), respectivamente, para cada S. Colocamos os valores na equação acima para cada S e somamos tudo e pronto, este é o Shapley Value da variável, que é a sua contribuição ou importância.

No seu artigo, Lundberg mostra que este método de atribuição de importância também é um método de atribuição aditiva de características, e o único que apresenta as seguintes características simultaneamente:

1 — Precisão local: o modelo de explicação apresenta o mesmo resultado do modelo original quando aplicados ao mesmo ponto.

2 — Ausência: se o atributo estiver faltando, ele não pode ter impacto ou contribuição.

3 — Consistência: se o modelo original muda de forma que a contribuição de um atributo aumenta ou permanece a mesma em relação aos outros, a importância daquele tributo não deveria diminuir.

Aproximação dos Shapley Values

Como o leitor já deve ter percebido, o custo computacional de se gerar os Shapley Values para um determinado atributo é alto: vários treinamentos de modelo para várias combinações diferentes de atributos. Se levarmos em conta que normalmente queremos a importância de todos os atributos, e não apenas de um, e para vários exemplos (ou locais) diferentes, o método apresentado se torna proibitivamente custoso.

Com esta limitação em vista, Lundberg apresenta vários métodos diferentes para se aproximar os Shapley Values, obtendo assim os quase homônimos SHAP Values. Uma das grandes contribuições do artigo, aliás, é que ele mostra como outros métodos podem ser adaptados para, ao invés de produzirem seus valores de importância, produzirem os SHAP Values. Vamos explorar a seguir um destes métodos:

Em outro artigo, Erik Štrumbelj apresenta um dos métodos que, na data de publicação desta postagem, estava presente no pacote SHAP: o sampling SHAP. Para entender o método, ajuda entender a seguinte equação de cômputo de Shapley Values, que é equivalente à equação apresentada anteriormente:

Equação 5

Dado atributos com índices de 1 a |N|, π(N) são todas as permutações dos índices destes atributos. Preⁱ(O)é o conjunto de todos os índices que precedem i na permutação O. Δₛ é a contribuição de todos os atributos contidos no conjunto S.

Dada uma amostra x, podemos calcular todos os Δ da equação acima para uma a amostra substituindo os valores dos atributos dos índices ausentes em Preⁱ(O) pelos valores presentes em outras amostras.

Por exemplo, digamos que temos 3 atributos, e cada exemplo é representado por um vetor de 3 posições. O valor em cada posição é o valor da variável para aquele exemplo. Considere um exemplo de interesse x = [1, 2, 3], e outra amostra w = [4, 5, 6]. Se a variável 2 está ausente em Preⁱ(O), podemos substituir o valor de x na posição 2 pelo de w, e obteríamos o vetor [1, 5, 3]. Esta operação está representada na notação:

Equação 6

Para uma determinada permutação O dos atributos e uma amostra aleatória w, utilizando nosso modelo treinado, podemos calcular o seguinte valor V:

Equação 7

tal que f(w[wⱼ = xⱼ , j ∈ Preⁱ(O)]) é a resposta do modelo para a nossa amostra alterada. Como você pode perceber, V para uma permutação O e uma amostra w nada mais é do que a diferença de duas respostas do modelo com a nossa amostra alterada, a primeira considerando a variável i, e a segunda com i ausente. Perceba que este valor V é muito semelhante à contribuição marginal que vimos na equação 2.

Por fim, se amostrarmos aleatoriamente várias permutações O e exemplos w diferentes, podemos gerar vários valores V. A aproximação da contribuição da variável i é apenas:

Equação 8

Tal que m é apenas o número de amostras sorteadas. Em outras palavras, a média dos valores V amostrados. Um algoritmo que executa este método é:

Algoritmo retirado diretamente do artigo de Štrumbelj.

Apesar deste algoritmo depender de um processo de sorteio de várias amostras diferentes, ele tem a vantagem de não requerer o re-treinamento de qualquer modelo. Portanto, ele apresenta uma vantagem em custo computacional relevante em relação ao método tradicional apresentado anteriormente, e demonstradamente aproxima os SHAP values reais conforme o número de amostras aumenta.

Significado das importâncias

Agora que temos uma ideia melhor de como essas importâncias são geradas pelo SHAP, podemos tentar interpretar melhor seus valores, bem como algumas visualizações que a ferramenta disponibiliza. Comecemos pelo gráfico mais simples, o gráfico de forças (ou “force plot”). O exemplo a seguinte foi gerado a partir da famigerada base de dados “boston housing”, que lida com a previsão de preços de moradias em Boston-MA, nos EUA.

Force plot para um exemplo do dataset Boston Housing

O que este gráfico nos diz no eixo cinza é que, para um exemplo tirado da base (uma residência, um ponto), a resposta do modelo para o preço é de 24,41. Se este valor estiver em milhares de dólares, então isto corresponde a $24.410,00. Abaixo, para cada variável usada na predição, temos uma barra, acompanhada do nome da variável e um número. A barra indica o tamanho do efeito, e a cor o seu sinal. A barra da variável LSTAT, por exemplo, indica que o fato de, para este exemplo, esta variável assumir o valor 4,98, fez com que o modelo atribuísse uma contribuição positiva de aproximadamente 5,57 (comprimento da barra) à resposta do modelo. Este é o SHAP Value desta variável. Ou seja, a importância local da variável LSTAT neste exemplo é de +5,57. Se a variável resposta corresponde a milhares de dólares, isto equivale a +$5.570,00.

Esta constatação nos leva a uma conclusão muito relevante do SHAP: os SHAP values tem uma unidade, que é a mesma da variável resposta que o modelo tenta prever. Diferente de outros métodos, a importância da variável não corresponde a uma taxa de crescimento ou qualquer outra medida abstrata, e sim a uma quantidade da variável resposta. No nosso caso, milhares de dólares.

É importante ressaltar também o que isso não significa. O fato desta variável ter tido um efeito positivo neste exemplo não significa que ele sempre será positivo em outros exemplos ou valores que a variável assume. Nem ao menos significa que aumentar esta variável faria com que este efeito também aumentasse. Tudo o que aprendemos com este SHAP value é que, quando todas as variáveis assumem os valores que assumiram no exemplo escolhido, o fato da variável LSTAT ter assumido o valor de 4,98 fez com que o modelo somasse 5,57 a sua resposta, e entendemos que esta é a importância da variável naquele local.

O SHAP Value também não nos diz como mexer nas variáveis para fazer a variável resposta aumentar ou diminuir. De fato, se o modelo analisado é preditivo, ele possivelmente não deveria ser usado para se extrair este tipo de informação. Modelos explicativos são mais apropriados para isso.

Se queremos extrair alguma informação global a partir das importâncias locais, podemos usar o gráfico resumo (“summary plot”) do SHAP. Para o mesmo dataset, o seguinte gráfico pode ser obtido:

Summary plot para o dataset Boston Housing

No gráfico acima, em cada linha onde se encontra cada uma das variáveis, cada ponto representa um exemplo do dataset. Se o ponto está azul, significa que para aquele ponto, aquela variável tem um valor baixo (quando considerando todos os valores que aquela variável assume no dataset). Quanto mais vermelho o ponto é, mais alto é o valor. A posição do ponto no eixo horizontal indica o efeito, o SHAP Value, daquele ponto. Quanto mais a direita, mais positiva é a contribuição daquela variável naquele ponto.

Como podemos observar, a variável LSTAT assume contribuições muito diferentes dependendo do seu valor. E, de fato, quanto mais positivo o valor que esta variável assume (mais vermelho), mais negativa é a sua contribuição para a resposta do modelo. No geral, é seguro assumir que variáveis com uma dispersão maior de contribuições no eixo horizontal tendem a ser mais importantes. Se queremos quantificar esta importância global a partir de importâncias locais, podemos tirar a média dos valores absolutos das contribuições, que é o que podemos ver no gráfico resumo em barra, que o SHAP também nos fornece:

Summary plot em barra para o dataset Boston Housing

Outra visualização interessante que o SHAP nos disponibiliza são os gráficos de dependência (“dependence plot”). Este gráfico nos mostra como as contribuições de variáveis se comportam conforme a variável assume valores diferentes. Além disso, o SHAP permite que uma outra variável seja indicada como variável de interação. Neste caso, uma escala de cor irá indicar como uma segunda variável afeta a contribuição da primeira.

Dependence plot para o dataset Boston Housing

No gráfico de dependência acima, cada ponto representa um exemplo do dataset. O eixo horizontal indica o valor da variável RM que o ponto assume, e o eixo vertical indica a contribuição atribuída àquele ponto. A escala de cor indica o valor que o ponto assume em uma variável de interação. No caso, a variável de interação é RAD. Podemos ver que quando RM tem valores superiores a 7, sua contribuição aumenta vertiginosamente, exceto nos casos em que a variável RAD é alta.

Conclusão

O SHAP é uma ferramenta muito útil para se obter importâncias de variáveis, independente do modelo utilizado. O método para a geração de suas importâncias, ou contribuições, empresta conceitos provenientes da teoria dos jogos, o que concede propriedades únicas aos valores obtidos.

Uma das vantagens de usar os SHAP values como importâncias é que suas unidades são as mesmas da variável alvo do modelo, o que facilita o entendimento. Por outro lado, suas peculiaridades fazem com que sua interpretação não seja completamente trivial. Felizmente, o pacote que implementa os métodos nos confere algumas ferramentas de visualização que nos ajudam a entender melhor os nossos modelos e extrair mais informações deles.

--

--