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:
Pré-processamento dos dados: Dados normalizados com StandardScaler.
Balanceamento da classe alvo: Aplicado o SMOTE para lidar com o desbalanceamento, gerando novas amostras na classe minoritária.
Treinamento do modelo: Treinamento do modelo com XGBoost ajustado nos dados balanceados.
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.
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?