Dado Ruim = Algoritmo Pior Ainda

📊 Vamos aplicar um algoritmo de machine learning (XGBoost) e obter péssimas projeções.

🚮 No final, concluiremos que, mesmo após aplicar técnicas como engenharia de features, balanceamento dos dados e normalização, não foi possível melhorar significativamente o desempenho do modelo. Isso reforça um princípio importante na ciência de dados: dados de baixa qualidade levam a modelos de baixa qualidade. Se os dados não forem bons, não há técnica que consiga salvar o resultado.

1 - Base de dados

Selecionei um conjunto de dados com o objetivo de prever a potabilidade da água (Variável: Potability) com base em diversas características, como: 'ph', 'Hardness', 'Solids', 'Chloramines', 'Sulfate', 'Conductivity', 'Organic_carbon', 'Trihalomethanes' e 'Turbidity'. Essas variáveis representam propriedades físicas e químicas da água, que serão usadas para treinar um modelo de machine learning capaz de classificar se a água é potável ou não.

Disponível em: https://www.kaggle.com/datasets/adityakadiwal/water-potability

2 - Analisando o data frame

Verifiquei se havia dados faltantes na base. Identifiquei valores ausentes nas colunas de pH, sulfato e trihalometanos. Para resolver isso, substituí esses valores faltantes pela média de cada coluna, uma técnica comum para manter a consistência dos dados sem perder informações relevantes.

Figura 1 - Verificando valores ausentes

Figura 2 - Tratando valores ausentes

A Figura 3 mostra que a maioria das amostras são classificadas como "Não potável" (valores iguais a 0), o que indica um desbalanceamento nos dados. Para corrigir isso, mais pra frente utilizaremos o SMOTE, uma técnica que gera novas amostras da classe minoritária (neste caso, "Potável") a partir dos dados existentes, equilibrando assim a distribuição das classes, evitando que o modelo fique enviesado para a classe majoritária.

Figura 3 - Verificando a distribuição da variável alvo

A Figura 4 mostra que as variáveis têm uma correlação muito baixa com a variável alvo, ou seja, elas não ajudam a explicar bem o comportamento da variável que queremos prever. Isso pode dificultar a aplicação de algoritmos de machine learning, já que, sem uma relação clara entre as features e o alvo, o modelo pode ter problemas para aprender padrões e fazer previsões precisas. Em alguns casos, pode até ser impossível prever a variável alvo com base nas demais características disponíveis.

Figura 4 - Verificando a correlação entre as variáveis

A Figura 5 mostra a distribuição de algumas variáveis em relação à potabilidade da água, com sobreposição significativa entre as classes em todas elas. Esse padrão indica que as variáveis podem não ser suficientemente discriminativas para separar água potável de não potável. Além disso, o desequilíbrio entre as classes reforça a complexidade da análise. Com base nesses indícios, é provável que os algoritmos enfrentem dificuldades para alcançar bons resultados preditivos, mesmo após ajustes e transformações nos dados.

Figura 5 - Verificando a distribuição do alvo entre algumas variáveis

3 - Engenharia de Features

Em seguida, tentei melhorar a capacidade preditiva dos dados por meio da criação de novas features, combinando variáveis existentes de forma não linear e explorando interações entre elas, a partir de métricas como razão, soma, subtração, multiplicação e transformações logarítmicas e quadráticas.

Os resultados mostraram que as novas features não tiveram impacto significativo na correlação com o alvo, sugerindo que a qualidade dos dados originais é um fator limitante. Isso reforça a hipótese de que, mesmo com técnicas avançadas de engenharia de features, os resultados preditivos podem ser insatisfatórios devido à baixa representatividade dos dados.

Figura 6 - Criando novas variáveis

4 - Projetando a potabilidade com o algoritmo XGBoost

Para o algoritmo XGBoost, segui algumas etapas:

  1. Pré-processamento dos dados: Dados normalizados com StandardScaler.

  2. Balanceamento da classe alvo: Aplicado o SMOTE para lidar com o desbalanceamento, gerando novas amostras na classe minoritária.

  3. Treinamento do modelo: Treinamento do modelo com XGBoost ajustado nos dados balanceados.

  4. Avaliação: Modelo foi avaliado com base no conjunto de teste, gerando métricas como matriz de confusão, relatório de classificação e ROC-AUC.

Figura 7 - Modelando o XGBoost | Parte 1

Figura 8 - Modelando o XGBoost | Parte 2

Apesar de balancearmos as classes com SMOTE e realizarmos uma validação cruzada, o modelo apresentou resultados limitados, com uma AUC média de 0,67 na validação cruzada e um ROC-AUC de 0,56 no teste. O desempenho geral (accuracy de 56% e F1-score desequilibrado entre as classes) indica que o modelo tem dificuldades em separar adequadamente as classes. Acurácia próxima da aleatoriedade.

Figura 9 - Resultados do XGBoost.

5 - Conclusão

Mesmo após aplicar diversas técnicas, como imputação, engenharia de features, balanceamento de classes e normalização, os resultados obtidos pelo modelo XGBoost permaneceram insatisfatórios. Destacando que a qualidade e relevância das variáveis disponíveis foram insuficientes para melhorar significativamente a classificação.

Isso reforça um princípio fundamental da ciência de dados: a qualidade dos dados é determinante para o sucesso de um modelo. Sem informações mais representativas ou variáveis que capturem melhor a relação com a variável alvo, nenhuma técnica ou algoritmo será capaz de produzir resultados expressivos.

0
Subscribe to my newsletter

Read articles from Bernardo Ribeiro de Moura directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Bernardo Ribeiro de Moura
Bernardo Ribeiro de Moura

Analista de dados sênior na Unimed Rio Preto, explorando modelos preditivos, otimização de custos e tomadas de decisão baseadas em dados. Bacharel em Química (UNESP), em transição para Ciência de Dados (UNIVESP), combinando ciência e tecnologia para resolver problemas do mundo real. Especializações em Google Data Analytics e Data Science pela HarvardX. Escrevo sobre análises preditivas, visualização de dados e modelagem estatística. Vamos trocar ideias sobre Python, SQL e o impacto dos dados no dia a dia?