DATA LEAKAGE: COMO DETECTAR E REMOVER A VARIÁVEL VAZADA NOS MODELOS DE MACHINE LEARNING
Uma abordagem prática de como identificar e corrigir esse problema
Um assunto que “tira o sono” dos cientistas de dados é o desenvolvimento de modelos de Machine Learning que não desempenham bem quando aplicados em produção.
A frase em inglês at crunch time (tradução livre: na hora do “vamos ver”) nunca fez tanto sentido em projetos de Ciência de Dados: um modelo que deveria performar bem ao receber como input um novo dado, nunca “visto” durante a etapa de treinamento, mas que, infelizmente, não responde como o desejado.
Deve-se ter em mente que o “leque” de técnicas para validação de um modelo de aprendizado de máquina é numeroso, desde a comparação entre métricas de Treino-Teste(*), passando pela Matriz de Confusão, e até mesmo a aplicação do método de Cross-validation (Validação cruzada).
Por que o modelo performa mal em produção? Qual poderia ser o motivo dele não funcionar?
A resposta a tais perguntas é o objetivo principal desse post.
Ressalva: É importante esclarecer que existem diversas causas que podem proporcionar um fraco desempenho do modelo em produção, como por exemplo a baixa qualidade da base de dados, features preditoras (X) que não conseguem explicar a variabilidade de y (variável resposta), entre outros.
A idéia aqui é trazer à tona UM dos porquês do modelo não performar e, desta maneira, explicar através de um exemplo prático como o leitor pode identificar e remover este problema : a presença de variável vazada (em inglês: data leakage) no modelo.
Após a leitura deste post, você será capaz de:
- Compreender o que é variável vazada;
- Entender o motivo da variável vazada ser um problema;
- Perceber os sinais de sua presença;
- Aplicar um método prático de detecção e remoção do modelo.
AFINAL…O QUE É VARIÁVEL VAZADA?
Uma definição simples sobre variável vazada é dada pelo autor Daniel Gutierrez, Ask a Data Scientist: Data Leakage:
“…when the data you are using to train a machine learning algorithm happens to have the information you are trying to predict.”
“…quando os dados usados para treinar um algoritmo de aprendizado de máquina contém a própria informação (ou resposta) que estamos tentando prever (ou predizer).”
Em outras palavras, a variável vazada é aquela que apresenta uma correlação tão alta com a variável resposta (y) que ela “se comporta” como se fosse a própria variável resposta (y), acarretando em uma métrica de avaliação do modelo com alto valor de desempenho, dando a falsa impressão de que ele performa muito bem com novos dados.
SINAIS DA PRESENÇA DA VARIÁVEL VAZADA
A variável vazada causa sérios problemas ao modelo de aprendizado de máquina, propiciando uma performance EXCEPCIONAL na predição que, dificilmente, seriam alcançados no mundo real.
Se fôssemos mais além, imaginando um cenário pior, como por exemplo este modelo em produção, o que aconteceria com o seu desempenho? O modelo apresentaria um desempenho bastante ruim, queda de sua performance em um curto espaço de tempo, tornando-o inaproveitável: um modelo que não serve para nada.
É importante alertar que a não identificação da variável vazada, ou a sua detecção em um estágio mais avançado do projeto, pode custar caro para a empresa: perda de tempo, confiança e dinheiro. Obviamente não queremos que isso aconteça!
Em geral, quando comparamos as métricas de Treino-Teste e observamos valores muito altos de performance, bem como quando verificamos a importância das variáveis preditoras (X) e notamos um “peso” muito excessivo, tais cenários levantam indícios da presença de variável vazada no modelo. Quando avançarmos para o exemplo prático, esse ponto ficará bem mais claro.
POR QUE A VARIÁVEL VAZADA É RUIM?
Eis aqui alguns malefícios da variável vazada:
- Capacidade preditiva extraordinária que não seria possível em um projeto real;
- Modelo que não performa em produção no curto prazo;
- Empresas tomando decisões ruins com base nas predições do modelo com variável vazada;
- Perda de dinheiro, tempo e confiança dos stakeholders.
MÉTODO DE DETECÇÃO
Partimos agora para o exemplo prático de como podemos descobrir e retirar a variável vazada do modelo. It’s time to have fun!
Utilizaremos o algoritmo de machine learning Catboost para o desenvolvimento deste método, em conjunto com a biblioteca SHAP (SHapley Additive exPlanations).
Para maiores informações sobre o modelo de boosting e também sobre a biblioteca do SHAP, visite o blog da Datarisk (https://medium.com/datarisk-io) e separe alguns minutos para leitura dos nossos artigos:
- Gradient Boosting Parte 3: XGBoost vs LightGBM vs CatBoost, do autor Guilherme Duarte, Data Scientist na Datarisk; e
- Como interpretar modelos de machine learning complexos?, do autor Carlos Relvas, Co-Founder e Chief Data Scientist na Datarisk.
Mas como realmente funciona a análise da variável vazada?
Apenas para simplificarmos o método de detecção da variável vazada, utilizaremos um modelo de classificação e uma métrica de avaliação denominada ROC-AUC.
Para contextualizarmos de forma breve, criaremos um modelo de Machine Learning capaz de prever se o dado pertence à amostra de Treino ou se o dado pertence à amostra de Teste.
Para tanto, separaremos a base de dados em duas amostras (Treino e Teste), adicionando uma variável resposta “fictícia” (y) do tipo binária, 0 e 1, em cada uma.
Desta forma, a amostra de Treino receberá os valores zeros desta target inventada (y) e a amostra de Teste os valores unitários da mesma (y).
Antes da predição, as amostras de Treino e de Teste são unificadas novamente, embaralhadas e divididas mais uma vez em amostras de Treino e Teste. Partiremos, então, para a predição deste modelo e para o estudo da variável vazada.
Bora lá iniciar os 10 passos!
Passo 1: Importar bibliotecas e carregar a base de dados
Passo 2: Separar a base em amostras: X_train, y_train, X_test e y_test
Passo 3: Criar nova coluna contendo uma variável target binária fictícia
Nessa etapa, sugerimos a criação de uma nova coluna chamada ‘Target’ que receberá um dos valores binários; adotamos para a amostra de Treino uma coluna de 0s e para a amostra de Teste uma coluna de 1s (tanto faz definir o inverso, contanto que cada amostra receba um único número).
Passo 4: Unir as amostras em uma base única e embaralhar os dados
Passo 5: Separar NOVAMENTE a base em X_train, y_train, X_test e y_test
Por conveniência, manteremos os mesmos nomes das variáveis originais, mas qualquer nome pode ser utilizado. Antes de aplicar a função train_test_split (scikit-learn) separe as variáveis independente (X) e dependente (y).
Passo 6: Separar bases conforme tipo de dado: numérico ou categórico
Uma particularidade do modelo Catboost é a necessidade de declarar uma lista de índices com as posições das variáveis categóricas; esta informação entrará como um parâmetro do modelo (cat_features).
Outra demanda é o preenchimento de valores faltantes (missing values); para “cobrir” esse ponto os substituiremos por ‘NA’.
Passo 7: Instanciar o modelo e aplicar o .fit()
Passo 8: Aplicar o .predict()
Esta etapa é bem interessante para perceber a presença da variável vazada no modelo. Basta aplicar a função .predict(), “printar” os resultados da métrica AUC e comparar as saídas (outputs).
AUC TRAIN: 0.9652
AUC TEST: 0.9391
O que nos chama bastante atenção nos resultados da AUC de Treino e de Teste são os valores da métrica terem sido muito altos (superior a 0.90), representando um modelo com capacidade preditiva quase que perfeita.
Sugerimos então a plotagem do gráfico SHAP, do tipo barras, para entender melhor a importância das variáveis preditoras (X) no modelo. Nesta etapa ficará nítido perceber a presença, de forma visual, da variável vazada.
Passo 9: Plotar gráfico SHAP
Observamos, através da ilustração acima, um comportamento peculiar da variável preditora (X) intitulada como var_48. Ela é a mais importante do modelo e seu “peso” na predição (vide o tamanho da barra horizontal) é bem discrepante em relação às outras variáveis preditoras (X).
Essa “combinação” de métricas de AUC muito altas e gráfico de barras com discrepância entre as features (X), caracterizam a presença de variável vazada no modelo; neste caso a variável preditora (X) var_48.
Passo 10: Reiniciar as etapas de 1 até 9
Uma vez detectada a variável vazada, basta removê-la do modelo e reiniciar o processo de modelagem. Repita os passos de 1 até 9.
Assim que plotarmos o gráfico SHAP, no formato de barras, e recalcularmos as métricas, perceberemos a diferença dos resultados: métricas mais coerentes e importância das features (X) bem distribuídas.
AUC TRAIN: 0.7197
AUC TEST: 0.6722
NOTA: Se continuar suspeitando da presença de mais variáveis vazadas, basta retirá-las do modelo e recalcular os resultados, até que se chegue na versão final do modelo.
Espero que tenha gostado do artigo! Em caso de dúvida estou a disposição no LinkedIn.
Quer saber mais sobre Ciência de Dados ou como a Datarisk pode ajudar a sua empresa, acesse nosso site e confira também nossos outros posts aqui no Medium.
Até a próxima!
REFERÊNCIAS BIBLIOGRÁFICAS
- Chapter 13: Lessons Learned from Data Competitions: Data Leakage and Model Evaluation, from Doing Data Science: Straight Talk from the Frontline, 2013.
- Leakage in Data Mining: Formulation, Detection, and Avoidance [pdf], 2011.
- https://medium.com/spikelab/machine-learning-plumbery-data-leakage-6537bf287f2f
- https://www.sas.com/pt_br/insights/articles/analytics/machine-learning-mitos-verdades.html
- https://en.wikipedia.org/wiki/Leakage_(machine_learning)
- https://machinelearningmastery.com/data-leakage-machine-learning/
- https://insidebigdata.com/2014/11/26/ask-data-scientist-data-leakage/
- https://squarkai.com/2-feature-leakage-causes-and-remedies/
- https://www.analyticsvidhya.com/blog/2021/10/mlops-and-the-importance-of-data-drift-detection/
- https://medium.com/@AiSmartz/understanding-what-is-data-leakage-in-machine-learning-and-how-it-can-be-detected-bcab73a20f5e
- https://www.analyticsvidhya.com/blog/2021/07/data-leakage-and-its-effect-on-the-performance-of-an-ml-model/
- https://www.leap.expert/data-leakage-the-risk-the-reality-and-messaging-channels/