Interpretação de Modelos de Machine Learning no R — Parte 2

Jéssica Ramos
rladiesbh
Published in
13 min readOct 25, 2020
Do livro “Interpretable Machine Learning. A Guide for Making Black Box Models Explainable” de Christoph Molnar

Na primeira parte dessa sequência de artigos (que pode ser encontrada aqui) foram apontadas as razões pelas quais é importante entender o que está acontecendo dentro da “black-box” de um modelo de machine learning, separando os métodos de interpretação em 03 tipos.

A parte 01 descreve métodos de cálculo de importância global, que respondem quais variáveis de entrada têm maior ou menor impacto no resultado final do modelo. Nesta parte serão abordados métodos para avaliar a relação existente entre uma variável de entrada e o valor predito pelo modelo.

Base de dados

O conjunto de dados utilizado nesse artigo é o mesmo da parte anterior: anúncios de imóveis para aluguel em 05 cidades do Brasil. Ele pode ser encontrado no Kaggle através desse link e utilizamos a versão 02 da base.

Os dados são referentes a 10.692 imóveis. A variável resposta utilizada é o logaritmo do custo total do aluguel do imóvel (aluguel + condomínio + IPTU + seguro incêndio).

Foram realizadas as mesmas transformações da parte 01 nas variáveis e ajustado um Gradient Boosting Machine (GBM) com 08 variáveis explicativas:

  • cidade,
  • área do imóvel,
  • número de quartos,
  • número de banheiros,
  • número de vagas de garagem,
  • andar do imóvel,
  • indicadora da permissão de animais e
  • indicadora da mobília no imóvel.

O notebook utilizado para análise pode ser encontrado aqui.

Partial Dependence Plot (PDP)

Definição

O PDP mostra o efeito marginal de uma ou duas variáveis no valor predito de um modelo de machine learning.

Para o caso em que queremos avaliar o efeito de apenas uma variável, suponha que temos um modelo f que tem m variáveis explicativas, dentre elas a variável x. Vamos definir então uma função chamada partial dependence function (PDF), uma função que depende apenas de x, pois marginaliza a saída do modelo de machine learning sobre a distribuição das demais variáveis. A PDF é estimada calculando médias no dado de treino, da seguinte maneira:

Estimativa da Partial Dependence Function (PDF)

Onde z representa os valores reais das demais variáveis do modelo. Resumindo, aplicamos o modelo de machine learning nos dados de treino variando os valores de x no range que queremos avaliar e fixando os valores reais observados para as demais variáveis. Esse método de cálculo é conhecido como método de Monte Carlo.

O PDP nada mais é do que a representação gráfica da função definida acima. Com ele podemos avaliar se o relacionamento entre a variável e a predição do modelo é linear, monotônico ou mais completo.

Quando o modelo em questão é um modelo de classificação, cria-se uma PDF para cada categoria da resposta e o PDP pode ser construído representando todas as funções no mesmo gráfico.

Exemplo

O ajuste do modelo GBM foi feito utilizando o pacote h2o.

## após a leitura dos dados e transformação das colunas #### inicia o h2o
h2o.init()
h2o.no_progress() # remove barras de progresso
## sobe o dataset para o cluster
df_model = df %>%
select(log_total, city, area, rooms, bathrooms,
parking_spaces, floor_cat, ind_animal,
ind_furniture)
df_model_h2o = as.h2o(df_model)
## ajusta o modelo
gbm = h2o.gbm(y = 'log_total', training_frame = df_model_h2o)

Abaixo o gráfico de importância global das variáveis utilizando o método específico do pacote para modelos GBM.

## importância global das variáveis no modelo
library(vip)
vip(gbm, num_features = 8)
Importância global das variáveis no modelo GBM

O gráfico acima mostra que a área do imóvel é a variável de maior impacto na predição do modelo.

O PDP será gerado utilizando o pacote iml do R. O primeiro passo é criar um objeto Predictor com o método new que devolva as predições do modelo.

## cria o preditor
predictor_gbm = Predictor$new(model = gbm, # o modelo
data = df_model, # os dados
y = 'log_total') # a resposta

Com o preditor definido, utilizamos o método new do objeto FeatureEffect para aplicar o método PDP. Primeiramente, vamos criar o PDP da área do imóvel, a variável de maior importância no modelo.

## cria o objeto
pdp = FeatureEffect$new(predictor_gbm,
feature = 'area',
method = 'pdp')
# PDP de área
pdp$plot()
PDP da variável área

No eixo-x temos os valores da variável área que encontramos no nosso banco de dados. No eixo-y temos o valor estimado da PDF. A linha, portanto, representa a relação entre as variáveis resposta e área.

Temos também barras pretas logo acima do eixo-x. Elas representam os valores que aparecem no banco de dados. Daí já podemos tirar a primeira conclusão: a variável área é fortemente assimétrica. Existem vários pontos em valores baixos de área, e apenas alguns valores maiores. Quando se tem poucas observações numa faixa de valores a interpretação do PDP pode levar a conclusões errôneas.

O que fazer? Uma opção é usar o método apenas em um subset do banco de dados, excluindo os valores extremos, para tentar enxergar melhor a relação entre a variável e a resposta. Sabendo que 99,9% das observações da variável área têm valor menor ou igual a 1.000, vamos gerar um novo gráfico apenas nesse intervalo.

# novo objeto PDP para area
predictor_gbm2 = Predictor$new(model = gbm,
data = df_model %>%
filter(area <= 1000),
y = 'log_total')
pdp2 = FeatureEffect$new(predictor_gbm2,
feature = 'area',
method = 'pdp')
# plot 2 para área
pdp2$plot()
PDP da variável área excluindo valores extremos

Com esse gráfico podemos ver mais claramente a relação entre área e o valor predito. A relação é predominantemente positiva, ou seja, quanto maior a área do imóvel, maior o logaritmo do valor total. Porém a relação é não linear. Dois imóveis com áreas: 700 m² e 750 m² têm predições parecidas, mas dois imóveis com áreas: 100 m² e 150 m² têm predições bem diferentes.

Posso também visualizar o PDP para variáveis categóricas. Nesse caso ele será representado por um gráfico de barras.

# PDP de cidade
pdp$set.feature('city')
pdp$plot()
PDP da variável cidade

Existe variação entre os valores, sendo São Paulo a cidade com o maior valor da PDF e Campinas a cidade de menor valor. A variação não é grande e a escala do gráfico reforça essa percepção, mas é possível notar diferença clara entre os valores para São Paulo e Rio de Janeiro e as demais cidades.

Vantagens e Desvantagens

A principal vantagem é que o cálculo é intuitivo: a PDF num ponto específico x é a média dos valores preditos para cada linha do banco de dados, caso se force a variável avaliada a ter aquele valor x. Eles também são fáceis de implementar e de interpretar.

No caso em que a variável resposta é categórica e tem mais de 2 categorias, poderíamos criar um PDP de forma que cada curva seja a predição de uma das categorias. Essa é uma vantagem interessante nesse tipo de modelo, pois a visualização continua simples.

A principal desvantagem é que, no cálculo da PDF, assumimos que não existe correlação entre as variáveis do modelo, o que muitas vezes não é verdade para o banco de dados trabalhado.

Individual Condition Expectances (ICE)

Definição

A ideia do ICE é muito similar á ideia do PDP. A diferença é que ao invés de calcular médias no dado de treino usamos os valores calculados para cada observação no banco de dados. Ou seja, cada observação do banco de dados dará origem a uma curva.

Suponha que quero construir um ICE plot para a variável x. Para cada observação i no banco de dados de treino serão calculados os valores preditos pelo modelo variando os valores de entrada de x. Dessa forma, cada observação gera diversos pares (x, y) que serão plotados no gráfico.

Quando o modelo avaliado é um modelo de classificação, a saída do modelo é uma probabilidade. No caso de mais de uma classe na variável resposta é necessário montar gráficos ICE para cada classe.

Exemplo

Já que a área é a variável de maior importância, vamos criar o ICE plot da área do imóvel, já removendo os outliers (valores maiores do que 1000 m²).

## cria o objeto
ice2 = FeatureEffect$new(predictor_gbm2,
feature = 'area',
method = 'ice')
# ICE plot da variável área
ice2$plot()
ICE plot da variável área excluindo valores extremos

A ideia do ICE plot é que seja possível ver a tendência geral, bem como a variabilidade das observações e possíveis comportamentos diferentes. Por exemplo, seria possível notar observações que fogem da tendência geral e a partir daí identificá-las e avaliar individualmente, para tentar identificar o motivo dessa diferença. No exemplo, como a base de dados tem muitos pontos fica difícil observar comportamentos individuais, porém a noção de variabilidade é clara.

Uma possibilidade do ICE plot é também inserir a curva do PDP para que a noção de tendência geral seja mais facilmente percebida junto com a variabilidade.

## cria o objeto
ice_pdp2 = FeatureEffect$new(predictor_gbm2,
feature = 'area',
method = 'pdp+ice')
# ICE plot e pdp da variavel área
ice_pdp2$plot()
ICE plot + PDP

A linha amarela no gráfico acima é exatamente a mesma curva retratada no PDP mostrado no exemplo anterior. Essa visão dos dois métodos juntos pode ser muito interessante para a análise do relacionamento entre a variável e o valor predito.

O método ICE em variáveis categóricas gera um gráfico diferente no pacote iml.

Método ICE aplicado à variável andar

Gera-se um boxplot para cada categoria, utilizando os valores gerados por cada observação. Daí é possível verificar característica de variabilidade e também tendência. Lembrando que a barra no centro da caixa do boxplot é a mediana, e não a média. Dessa forma as barras não apresentam o dado do PDP.

Vantagens e Desvantagens

As vantagens do ICE plot em relação ao PDP são:

  • A possibilidade de se observar a variabilidade das predições e
  • Também o fato de que as relações heterogêneas podem ser identificadas mais facilmente.

Entre as desvantagens podemos listar:

  • Só é possível avaliar uma variável por vez e
  • Com o aumento do número de observações o gráfico fica muito poluído.
  • Além disso, o ICE também assume que não existe forte relação entre a variável avaliada e as demais.

Accumulated Local Effects (ALE)

Definição

De maneira semelhante ao PDP, ALE plots descrevem como as variáveis influenciam a predição de um modelo de machine learning na média. A principal diferença é que ALE plots são mais rápidos de calcular e são uma alternativa para quando existe correlação entre as variáveis explicativas do modelo.

Vimos que, quando duas variáveis explicativas num modelo de machine learning são correlacionadas, podemos criar observações muito improváveis no método de cálculo das curvas no ICE plot e no PDP. Isso cria vieses muito fortes no efeito estimado da variável.

Pensando nas observações improváveis podemos, por exemplo, substituir o valor da variável apenas nas observações que têm valores similares. Ou seja, se quero saber o efeito da variável área no ponto 100 m², eu vou aplicar esse valor apenas nas observações de imóveis com áreas próximas a esse valor e calcular a média com essas observações. Fazendo o mesmo com mais pontos ao longo do range de pontos eu terei uma curva de efeito que é chamada de Marginal Plot ou M-plot.

O principal problema dessa abordagem é: suponha que a área de um imóvel não tenha nenhum efeito no valor final do imóvel, mas o número de quartos sim. Essas variáveis são correlacionadas e, portanto, eu veria no M-plot que o valor do imóvel aumenta com o aumento da área, porque o número de quartos também aumenta. Estamos na verdade estimando o efeito combinado da área e do número de quartos.

Em resumo, o M-plot resolve o problema de usar pontos improváveis no cálculo, mas ainda temos o problema da correlação entre variáveis. E aqui não queremos falar dos M-plots e sim dos ALE plots, certo? Certo. A proposta do ALE plot é pegar a mesma lógica de cálculo mas, ao invés de calcular a média das predições, calcular a diferença entre predições.

De uma maneira simplificada, para pegar o efeito de uma área de imóvel de 100 m² o ALE vai usar todos os imóveis que tenham áreas próximas a 100 m². Então, calcula a média das predições com a área um pouquinho maior do que 100 m² (digamos 101 m²) menos a média das predições com a área um pouquinho menor do que 100 m² (digamos 99 m²). Isso nos dá o efeito puro da área do imóvel pois a diferença elimina o efeito das variáveis correlacionadas (no nosso caso, o número de quartos).

A definição formal da curva desenhada no ALE plot é um pouco mais complicada e, se você está familiarizado com os conceitos de cálculo, já notou que a estimação é baseada na derivada da função f dada pelo modelo em relação à variável avaliada. Caso seja do seu interesse, todo o racional por trás do ALE plot está muitíssimo bem explicado na seção 5.3 do livro do Christoph Molnar, que está nas referências.

Exemplo

O pacote iml tem algumas ferramentas muito interessantes para que possamos medir a interação entre variáveis no modelo. O gráfico abaixo mostra o nível de interação global entre as variáveis do nosso modelo.

# interações globais
interacao = Interaction$new(predictor_gbm)
plot(interacao)
Interação global entre as variáveis do modelo

No gráfico acima temos no eixo y as variáveis do modelo e no eixo x a força da interação global daquela variável com as demais variáveis no modelo. A força da interação global é calculada usando a Friedman’s H-statistic e o que ela mostra é a proporção da variabilidade total do modelo que é explicada pela interação entre a variável e as demais. Você pode encontrar mais informações sobre essa medida aqui.

O pacote também nos permite explorar a interação de cada variável com cada uma das demais. Abaixo fazemos isso para o número de banheiros.

interacao_bathrooms = Interaction$new(predictor_gbm,
feature = 'bathrooms')
plot(interacao_bathrooms)
Interação do número de banheiros com as demais variáveis

Acima vemos que a variável do número de banheiros tem forte interação com o número de vagas de garagem e o número de quartos. Outra forte interação que aparece é com a cidade. Isso pode ser uma característica que você queira investigar, para entender melhor se é uma correlação real ou um viés do seu banco de dados, por exemplo.

O código para fazer o ALE plot é muito similar ao código para os demais gráficos. O ALE é o método default do método new. Vou especificá-lo explicitamente apenas por razões didáticas.

# ALE plot da área
ale = FeatureEffect$new(predictor_gbm2,
feature = 'area',
method = 'ale')
ale$plot()
ALE plot da variável área

O comportamento da curva é essencialmente o mesmo do PDP, mas o eixo y tem referências diferentes. A conclusão final é a mesma: a área tem correlação positiva com o logaritmo do valor total, mas a relação é longe de ser linear. Porém, com o ALE temos certeza de que o efeito das demais variáveis foi removido.

O ALE também pode ser feito para variáveis categóricas. Nesse caso, o método precisa que as categorias tenham uma ordem. Ou seja, a variável não pode ser categórica nomial. Por isso é importante que as variáveis categóricas sejam transformadas em fatores, na preparação do banco de dados. Caso não exista ordem, o método vai ordenar as categorias considerando a similaridade das categorias em relação às demais variáveis no modelo.

# ALE do andar
ale$set.feature('floor_cat')
ale$plot()
ALE plot do andar

Aqui podemos ver que o modelo tem predições menores para imóveis no 1º andar e que a categoria que tem o maior efeito positivo na predição é “16 ao 20 andar”.

Vantagens e Desvantagens

A principal vantagem do ALE plot é que no cálculo eliminamos o efeito de demais variáveis que estejam correlacionadas com a variável avaliada. Isso é importante pois podem existir fortes correlações entre variáveis explicativas em diversos problemas do dia a dia.

Uma desvantagem é que o eixo y no gráfico perde a sua interpretação direta, por se tratar de uma diferença de predições.

Conclusão

Vimos nesse artigo a intuição por trás dos principais métodos para a interpretação do efeito de features na predição de um modelo de machine learning. Todos os métodos que vimos são agnósticos ao modelo, ou seja, podem ser aplicados a qualquer algoritmo.

Com esses gráficos, é possível entender melhor como cada variável afeta as predições do modelo black-box para que possamos avaliar se elas fazem sentido ou não. Esse tipo de compreensão do modelo dá mais profundidade à análise e pode nos ajudar a corrigir possíveis erros ou identificar pontos de vulnerabilidade nas predições.

Espero que esse artigo tenha sido interessante! A minha intenção aqui foi principalmente passar a intuição dos métodos, para que a ideia por trás deles estivesse bem clara para você leitor, e também mostrar como fazer uso desses métodos no R.
Eu recomendo que antes de utilizar esses métodos, você entenda com maior profundidade a teoria por trás. Essa teoria está muito bem explicada no livro do Christoph Molnar, minha principal referência para esse tipo de conteúdo.

Caso tenha ficado alguma dúvida, sinta-se a vontade para me contatar no LinkedIn. Deixo aqui também algumas referências sobre o assunto.

Livros:

Molnar, Christoph. “Interpretable machine learning. A Guide for Making Black Box Models Explainable”, 2019. https://christophm.github.io/interpretable-ml-book/.

Uso do pacote IML para interpretação de modelos de machine learning: http://uc-r.github.io/iml-pkg

An Introduction to Machine Learning Interpretability — Patrick Hall & Navdeep Gill: https://www.h2o.ai/wp-content/uploads/2019/08/An-Introduction-to-Machine-Learning-Interpretability-Second-Edition.pdf

Pacotes utilizados:

Tidyverse: https://www.tidyverse.org/

H2O: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/index.html

vip: https://cran.r-project.org/web/packages/vip/vip.pdf

--

--

Jéssica Ramos
rladiesbh

Statistician & Data Scientist interested in data visualization, machine learning, artificial intelligence, and computer vision.