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

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

Frequentemente vemos acurácia e interpretabilidade como dois lados de uma moeda: devemos trocar um pelo outro dependendo do que é mais importante para um problema específico. Quando o erro de predição de um modelo tem pequena ou nenhuma consequência negativa, a interpretabilidade é frequentemente ignorada em favor da acurácia. Em outros problemas, entender os motivos da decisão do modelo é essencial para a confiança nos resultados. Existem diversos exemplos disso em aplicações de machine learning na medicina diagnóstica. Os falsos positivos e falsos negativos nesses cenários costumam ter custo muito alto.

Mesmo em problemas em que o custo de um erro é baixo, entender como as variáveis influenciam no resultado do modelo pode ajudar a compreender melhor o problema, ajudando a identificar situações em que o modelo pode falhar. Além disso, ter respostas para as perguntas relacionadas aos motivos de uma predição pode gerar mais confiança no modelo por aqueles que farão uso dele.

No caso de algoritmos que chamamos de interpretáveis (interpretable models) a interpretação é direta. A maioria dos modelos estatísticos se encaixa nessa categoria, como a regressão linear simples ou a regressão logística. Felizmente, existem métodos para estimar e representar visualmente os “porquês” de um determinado modelo, ainda que ele seja do tipo black-box. Esses métodos podem ser aplicáveis a qualquer algoritmo (agnósticos ao modelo, ou model-agnostic) ou específicos para um tipo de algoritmo (model-specific).

Os métodos de interpretabilidade podem ser divididos em três categorias:

  1. Interpretação global: O objetivo é responder como as partes do modelo afetam a predição, ou seja, que variáveis tem mais impacto no resultado final.
  2. Interpretação local em subgrupos: O objetivo é responder como as partes do modelo afetam a predição em observações com características específicas (valores altos ou baixos de uma variável, por exemplo).
  3. Interpretação local de uma observação: O objetivo é responder por quê o modelo fez aquela predição para aquela observação específica, ou seja, que características influenciaram o resultado e em que direção.

O objetivo desse artigo é explicar como é feita a interpretação de um modelo de regressão múltipla e também a interpretação global de modelos do tipo black-box, com exemplos em R. Os outros dois tipos de interpretação serão tratados em mais detalhes em artigos posteriores.

Base de dados

Ao longo desse artigo são utilizados dados sobre anúncios de imóveis para aluguel em cidades do Brasil. Os dados podem ser encontrados no Kaggle através desse link. A versão da base utilizada é a versão 2.

A base de dados contém 10.692 imóveis localizados em 5 cidades (São Paulo, Porto Alegre, Rio de Janeiro, Campinas e Belo Horizonte) e 13 variáveis, com informações sobre o imóvel alugado. A variável resposta utilizada será o custo total do aluguel do imóvel (aluguel + condomínio + IPTU +seguro incêndio).

O notebook utilizado na análise dos dados pode ser encontrado aqui.

Preparação dos dados

Primeiramente a distribuição da variável resposta é avaliada.

library(tidyverse)
library(magrittr)
## dados
df = read_csv('datasets_554905_1035602_houses_to_rent_v2.csv')
# ajusta os nomes
names(df) = c('city', 'area', 'rooms', 'bathrooms', 'parking_spaces', 'floor', 'animal', 'furniture', 'hoa', 'rent_amount', 'property_tax', 'fire_insurance', 'total')
# distribuição do target
ggplot(df) +
geom_histogram(aes(x=total), bins = 100) +
ggtitle(label = 'Valor total do imóvel') +
labs(x = 'R$', y = 'Observações') +
theme_minimal()
Distribuição do valor total do imóvel

Acima podemos ver que o valor total tem distribuição fortemente assimétrica à direita. Muitos algoritmos têm seu desempenho diminuído ao lidar com distribuições muito assimétricas. Aplicando uma transformação logarítmica tem-se uma distribuição mais simétrica e mais fácil de ser trabalhada.

# cria o log do target
df = df %>% mutate(log_total = log(total))
# visualização do novo target
ggplot(df) +
geom_histogram(aes(x=log_total), bins = 100) +
ggtitle(label = 'Log do valor total do imóvel') +
labs(x = 'R$', y = 'Observações') +
theme_minimal()
Distribuição do logaritmo do valor total do imóvel

A respeito das demais variáveis do banco de dados, são relevantes os seguintes pontos:

  • A informação do andar do imóvel é uma variável categórica que contém muitos níveis, então foi transformada em outra variável categórica com apenas 6 níveis.
  • As variáveis que identificam a permissão de animais e a presença de mobília foram transformadas em indicadoras, onde o valor 1 significa que o imóvel permite animais e tem mobília, respectivamente.

Modelos interpretáveis

Podemos chamar de modelos interpretáveis aqueles em que a interpretação é direta, ou seja, apenas com o ajuste do modelo é possível responder sobre o efeito das features na resposta de forma geral, em subgrupos e para uma observação específica.

Exemplo 1

Nesse exemplo, é feito o ajuste de uma regressão linear. Todas as variáveis, com exceção das variáveis relacionadas a valor financeiro, foram incluídas como variáveis explicativas. A variável resposta utilizada será o logaritmo do valor total do imóvel, devido às premissas de distribuição da regressão linear: odesempenho do modelo cai muito quando a distribuição da resposta é muito assimétrica.

## separa base do modelo
df_model = df %>% select(log_total, city, area, rooms, bathrooms, parking_spaces, floor_cat, ind_animal, ind_furniture)
## ajusta regressão linear
linear = lm(log_total ~ ., data = df_model)
summary(linear)

A saída obtida contém os coeficientes da regressão. Eles são utilizados para interpretar o modelo em vários níveis.

Resultados do modelo linear

No modelo de regressão linear, a importância global da variável é o tamanho absoluto do coeficiente daquela variável. Isso ocorre pois o modelo é uma combinação linear de variáveis, onde o coeficiente representa o peso de cada variável (ou categoria). No exemplo acima, a variável que indica que o imóvel está localizado em Campinas tem a maior importância, pois tem o maior coeficiente em termos absolutos (-0,427, na coluna “Estimate”).

Também podemos interpretar em que direção e o tamanho do impacto da variável explicativa na variável resposta. A variável indicadora de mobília ind_furniture, por exemplo, tem coeficiente 0,3288. Isso significa que, dado que as demais variáveis tenham valores constantes, imóveis com mobília têm o logaritmo do valor total maior em 0,3288 do que imóveis sem mobília, em média.

Assim como na medição da importância, o impacto de uma variável categórica na resposta é avaliada em cada categoria. A variável city, por exemplo, tem 5 categorias e foi transformada em 4 indicadoras, tendo a cidade de São Paulo como a referência. Em Belo Horizonte, o logaritmo do valor total é menor em 0,3693 do que imóveis em São Paulo.

É importante destacar que, dependendo da referência utilizada, os coeficientes serão diferentes. Vale avaliar qual categoria faria mais sentido ser usada como base no problema.

Para avaliar o impacto de cada variável em cada observação, basta calcular as partes da soma que define a combinação linear, aplicando cada coeficiente em cada variável resposta, e analisar a contribuição de cada parte diretamente.

Exemplo 2

Existem vários pontos que precisam ser checados no ajuste de uma regressão linear. Um deles é a multicolinearidade (correlação entre as variáveis do modelo). Variáveis correlacionadas positivamente podem acabar tendo coeficientes opostos para que uma compense a outra, por exemplo, ou então diminuir a importância individual de cada variável.

No nosso exemplo, existe correlação forte entre o número de quartos e o número de banheiros (correlação de Pearson 0,734), e entre o número de quartos e o número de vagas de garagem (correlação de Pearson 0,618). Portanto, foram criadas duas novas variáveis: 1) razão entre o número de banheiros e quartos e 2) razão entre o número de vagas de garagem e quartos.

# calcula número de banheiros/número de vagas por quarto
df_model = df_model %>%
mutate(bathrooms_ratio = bathrooms/rooms,
parking_ratio = parking_spaces/rooms)

Com isso, a correlação entre essas variáveis e o número de quartos não é mais forte. Ajustando um novo modelo, é possível ver a mudança nos coeficientes.

## ajusta novo modelo com novas features e removendo as antigas
linear2 = lm(log_total ~ ., data = df_model %>%
select(-c('bathrooms','parking_spaces')))
Resultados do segundo modelo linear

Depois da modificação, a variável de maior importância é a bathrooms_ratio, o número de banheiros por quarto. A importância do número de quartos também foi maior do que no modelo anterior.

No caso de modelos lineares, é necessário verificar sempre se as premissas do modelo foram satisfeitas pois tanto a interpretação quando a assertividade do modelo podem ser prejudicadas caso contrário.

Modelos Black-Box

Os modelos do tipo black-box não são diretamente interpretáveis, sendo necessário utilizar métodos para compreender como as variáveis se relacionam com a resposta. Existem métodos diferentes de calcular as importâncias de cada variáveis, podendo ser específicos daquele tipo de modelo (model-specific) ou generalista (model-agnostic).

Um método que é agnóstico ao modelo é o Permutation Feature Importance. Esse método mede o aumento no erro do modelo se os valores da variável forem permutados, o que quebra o relacionamento entre a variável e a resposta.

No nosso exemplo, suponha que quero avaliar a importância do número de quartos. Os passos do algortimo são os seguintes:

  1. Estimar o erro na base original. Pode ser o MSE (Mean Squared Error), por exemplo.
  2. Gerar uma nova base de treino, permutando os valores do número de quartos entre as observações. Assim, é quebrado o relacionamento existente entre o preço do imóvel e o número de quartos.
  3. Calcular as predições do modelo para essa nova base e calcular o erro dessas predições, utilizando a mesma métrica do passo 1.
  4. Calcular a importância estimada, que pode ser definida como a diferença entre o erro na base de permutação e o erro na base original. Outra definição comum é a razão entre o erro na base de permutação e o erro da base original.

Seguindo essa lógica, se o número de quartos tem pouco impacto na predição final, os erros serão parecidos e a importância será pequena. Caso contrário, os erro da base permutada será muito maior do que o erro da base original e a importância será grande. Esses passos são realizados para cada variável na base de dados.

Exemplo

Nesse exemplo, vamos ajustar um Gradient Boosting Machine (GBM). Esse é um algoritmo do tipo ensemble, que combina modelos de forma sequencial. No caso do exemplo, são sequências de árvores de decisão. Ele será ajustado usando o pacote h2o. Documentação sobre o pacote pode ser encontrada aqui.

## inicia o h2o
library(h2o)
h2o.init()
## sobe o dataset para o cluster
df_model2 = df %>% select(log_total, city, area, rooms, bathrooms, parking_spaces, floor_cat, ind_animal, ind_furniture)
df_model_h2o = as.h2o(df_model2)
## ajusta o modelo
gbm = h2o.gbm(y = 'log_total', training_frame = df_model_h2o)
gbm

O modelo GBM ajustado contém 50 árvores de decisão combinadas. Para obter a importância de cada variável utilizando o método de permutação, utilizaremos o pacote vip. A documentação dele pode ser encontrada aqui.

Utilizando então o Permutation Feature Importance como método de cálculo das importâncias, o MSE como medida de erro e a diferença como método de cálculo da importância, temos os seguintes resultados:

library(vip)# função de predição
pred_gbm = function(object, newdata) {
result = as.vector(h2o.predict(object, as.h2o(newdata)))
return(result)
}
# gráfico
vip(gbm, num_features = 8, method = 'permute', pred_wrapper = pred_gbm, train = df_model2, target = 'log_total', metric = 'mse', type = 'difference')
Importância global das variáveis no GBM — Método da permutação

Podemos ver no gráfico que a área do imóvel é a variável de maior importância no GBM. O erro na base permutada foi maior do que o erro original em aproximadamente 0,3. O resultado é diferente do que foi obtido no modelo de regressão linear. Uma explicação para isso é o fato de que o GBM consegue identificar relações não-lineares entre as variáveis explicativas e a resposta.

Para a implementação desse algoritmo no H2O existe também uma forma de calcular a importância que é específica desse tipo de modelo. Nesse método as importâncias são determinadas calculando a influência relativa de cada variável: se a variável foi utilizada em algum nodo durante o processo de construção da árvore e o quanto o erro (MSE) de todas as árvores diminuiu quando a variável é considerada. Nessa página da documentação existe mais detalhamento de como o cálculo é feito.

O pacote vip tem suporte para métodos específicos dos principais pacotes de machine learning no R, inclusive h2o,caret e randomForest.

## importância das features pelo vip
vip(gbm, num_features = 8)
Importância global das variáveis no GBM — Método específico do algoritmo

Nesse resultado a área do imóvel tem a maior importância, bem maior do que a importância das demais variáveis. O resultado é semelhante ao obtido no método de permutação, porém não serão iguais, pois as metodologias de cálculo são diferentes.

Uma vantagem do pacote vip é a possibilidade de modificação dos aspectos do gráfico, já que o gráfico é construído com o pacote ggplot2. Isso pode ser feito pelos parâmetros geom, mapping e aesthetics, entre outros. Também pode ser feito apenas adicionando funções do ggplot2, como aplicar um tema.

## modificando a aparência do gráfico
vip(gbm2, num_features = 8) +
labs(y = 'Importância') +
ggtitle('Importância das Features',
subtitle = 'GBM') +
theme_minimal()
Personalização do gráfico de importância das variáveis

Também é possível obter os valores das importâncias por meio de tabelas no h2o, e partir daí construir os próprios gráficos. Isso pode ser feito pela função h2o::h2o.varimp().

Conclusão

A importância da interpretação de um modelo de machine learning pode vir da necessidade de se justificar um resultado ou mesmo compreender melhor o problema estudado. Como cientistas de dados, quanto melhor entendermos um problema, melhor poderemos elaborar maneiras de abordá-lo.

No caso de modelos estatísticos tradicionais, existem maneiras específicas de interpretar cada algoritmo. Nesse artigo abordamos a interpretação de um modelo de regressão linear múltipla, cuja interpretação é baseada no valor dos coeficientes do modelo.

No caso de modelos black-box, existem metodologias específicas para cada tipo de algoritmo que ajudam a entender o impacto de cada variável da resposta. Também existem métodos que são agnósticos ao modelo e podem ser aplicados em qualquer algoritmo, inclusive em algoritmos interpretáveis, como o Permutation Feature Importance.

Em artigos posteriores, serão tratados também a interpretação em subgrupos e de observações específicas em modelos black-box, também com aplicações em R.

Caso tenha ficado alguma dúvida, sinta-se a vontade para me mandar uma mensagem pelo LinkedIn! Seguem também algumas referências interessantes para aprender mais sobre o assunto:

Livros/Palestras:

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

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

Practical Tips for Interpreting Machine Learning Models — Patrick Hall, H2O.ai: https://www.youtube.com/watch?v=vUqC8UPw9SU

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.