Detectando Vazamento de Dados com SHAP
Detectar vazamento de dados é uma tarefa importantíssima em qualquer projeto de Machine Learning (ML). O vazamento ocorre quando informações que não deveriam estar disponíveis para o modelo estão presentes nos dados de treinamento. Alguns exemplos de vazamento de dados em modelos de Machine Learning (ML) na saúde são:
- Em um modelo para prever o diagnóstico de Pneumonia, usamos para treinar o modelo uma variável binária com informação sobre a prescrição de antibióticos
- Em um modelo para prever o diagnóstico de Hipertensão, usamos para treinar o modelo uma variável com informações sobre quais medicamentos o paciente está usando, incluindo anti-hipertensivos
Isso pode resultar em um modelo com bom desempenho nos dados de treinamento, mas ruim em dados novos e não vistos. Uma maneira de detectar vazamento de dados é usando SHAP (SHapley Additive exPlanations), uma ferramenta que fornece informações sobre como diferentes variáveis contribuem para o valor de saída (target) do modelo de ML.
se qualquer outra variável cujo valor não estaria realmente disponível na prática no momento em que você deseja usar o modelo para fazer uma predição, é uma variável que pode introduzir vazamento em seu modelo (tradução livre) — Machine Learning Mastery[1]
Neste artigo, mostraremos de forma prática como utilizar o SHAP para detecção de vazamento de dados. Usaremos o Python e a biblioteca scikit-learn para criar um modelo de classificação para a predição do tempo de permanência no hospital quando um paciente for internado e, em seguida, usaremos o SHAP para identificar possíveis fontes de vazamento.
O que é SHAP?
SHAP é uma técnica para explicar a saída (target) de um modelo de ML quantificando a contribuição de cada variável para a predição. Os valores SHAP são um método baseado na teoria dos jogos e usado para aumentar a explicabilidade dos modelos de aprendizado de máquina [2]. O objetivo deste artigo é uma demonstração prática de como detectar vazamento de dados com SHAP. Para um entendimento mais profundo do SHAP, você pode conferir este artigo[3].
Como SHAP é calculado
Para calcular os valores SHAP para um modelo, primeiro precisamos instalar o módulo SHAP e treinar o modelo. Em seguida, criamos um objeto Explainer sobre o conjunto de teste. Assim, para cada amostra, ele calcula a contribuição de cada variável para o target. Isso envolve executar o modelo várias vezes com diferentes subconjuntos de variáveis e comparar a saída com o valor de base (a saída média em todas as amostras) para determinar a contribuição de cada variável.
Construindo o modelo de classificação
Antes de utilizarmos o SHAP para detecção de vazamento de dados, precisamos construir um modelo de classificação. Para este exemplo, usaremos o conjunto de dados AV JanataHack Healthcare Hackathon II [4], que contém informações sobre pacientes internados nos hospitais e o tempo de duração da internação. Este conjunto de dados foi originalmente utilizado para um hackathon e o objetivo era prever o tempo de internação, mas neste exemplo vamos fazer uma classificação binária que prevê longo tempo de permanência no hospital (> 30 dias). Essa previsão é importante para o administrativo dos hospitais organizarem as futuras internações, estoque de materiais, agendamento de cirurgias eletivas, etc.
Os códigos utilizados neste exemplo estão disponíveis aqui:
Pré Processamento
Antes de treinar o modelo, para este conjunto de dados, precisamos fazer algumas alterações de pré-processamento, como:
- Descartar a coluna id
- Lidar com valores ausentes
- Alterar o tipo de colunas
- Modificar o target
- Criar variáveis dummies para colunas categóricas
- Dividir o conjunto de dados em treino e teste (fizemos isso por último porque excluímos os valores ausentes e não inserimos nenhuma nova informação no conjunto de dados)
Treinamento do modelo
# Importando o modelo
import lightgbm as lgbm
# Treino
model_LightGBM = lgbm.LGBMClassifier(random_state=42)
model_LightGBM.fit(X_train, y_train)
# Teste
y_test_pred_LGBM = model_LightGBM.predict(X_test)
Usando SHAP para detecção de vazamento de dados
Agora que temos um modelo de classificação, podemos usar o SHAP para identificar possíveis fontes de vazamento de dados.
Primeiro, precisamos calcular os valores SHAP para o conjunto de teste:
explainer = shap.Explainer(model_LightGBM, X_train)
shap_values = explainer(X_test)
Em seguida, podemos plotar os valores SHAP para cada variável, usando a função summary_plot()
:
shap.summary_plot(shap_values, plot_type='bar', max_display=30)
Isso irá gerar um gráfico de barras mostrando o valor SHAP absoluto médio para cada variável:
Com o SHAP, podemos ver que a variável Visitors with Patient
teve um grande impacto na saída do modelo em comparação com todas as outras variáveis. Quando analisamos profundamente sobre por que isso aconteceu, qual é o objetivo dessa predição e em que momento essa predição irá ocorrer no mundo real, chegamos à conclusão de que se trata de um vazamento de dados.
O objetivo deste modelo de ML é prever o tempo de internação quando o paciente é admitido no hospital. Neste momento é impossível ter a informação de quantas visitas o paciente teve, pois é uma informação futura. Isso pode ser detectado no início, quando estamos realizando a análise exploratória dos dados. Mas mesmo se deixarmos passar, isso pode ser detectado posteriormente usando o SHAP.
Conclusões
Neste artigo, vimos como usar SHAP (SHapley Additive exPlanations) para detecção de vazamento de dados, de forma prática. O SHAP fornece informações sobre como diferentes variáveis contribuem para a saída de um modelo de ML.
O uso do SHAP pode ajudar a identificar possíveis fontes de vazamento que podem ter passado despercebido, como quando temos nos dados de treinamento variáveis que ainda não estão disponíveis no momento em que a predição irá ocorrer. Se observarmos que tais variáveis possuem um valor SHAP muito elevado em comparação com os demais, isso pode indicar que há vazamento de dados. Portanto, é uma ferramenta poderosa para utilizar ao criar um modelo de ML.
Referências
- Jason Brownlee (2020). “Data Leakage in Machine Learning” — (acessado em 03 de Março de 2023)
- Scott M. Lundberg (2017). “A Unified Approach to Interpreting Model Predictions” — (acessado em 03 de Março 2023)
- Christoph Molnar (2023). “9.6 SHAP (SHapley Additive exPlanations)” — (acessado em 03 de Março de 2023)
- Blesson Densil (2020). “AV JanataHack Healthcare Hackathon II”- in Kaggle Datasets (acessado em 23 de Fevereiro de 2023)