Previsão com python para o Dataset Telecom Churn – Parte 2

Written by:

Agora vamos introduzir algumas técnicas que melhoram a análise de Churn, criando um notebook um pouco mais próximo do ideal.

Na parte 1 deste post, criamos uma lista de possíveis melhorias:

1- Identificar possíveis Outliers em cada atributo.

2- Identificar correlações entre as variáveis.

3- Usar um método de seleção de atributos para facilitar o aprendizado do modelo.

4- Usar modelos mais robustos que o KNN.

5- Usar uma métrica mais indicada para problemas de bases desbalanceadas.

Esse dataset tem duas características bem complexas para tratarmos. A primeira é a alta quantidade de valores ausentes ou não preenchidos. Isso mostra que a qualidade dos dados não está boa, talvez porque no momento da coleta não deixamos um campo importante como obrigatório ou porque ocorreu um erro na importação desses dados. De qualquer forma precisamos tratar isso. Por que?

A resposta padrão é que modelos de machine learning não lidam bem ou não trabalham com valores nulos. Outro ponto é que valores nulos podem estragar sua análise estatística. Faz sentido!

Dito isto, devemos preencher estes campos nulos ou remover o atributo (uma coluna de característica). Se um registro tiver muitos atributos com valores nulos, podemos pensar em remover este registro (uma linha de instância). Mas, tentamos evitar perder instâncias inteiras.

No exemplo do curso, os valores ausentes foram preenchidos com o valor médio do atributo, por fins didáticos. Essa é uma boa abordagem apenas em distribuições normais. Melhor seria preencher valores numéricos ausentes com a mediana (o valor central) , evitando problemas de outliers. Analogamente, para atributos categóricos ausentes faz sentido preencher com a moda (o valor mais frequente). Essas são questões estatísticas importantes relacionadas com a distribuição da amostra.

Existem diversas opções para preencher os valores ausentes, eu posso citar algumas:

  • Usar os demais atributos em um modelo de ML para prever o valor ausente.
  • Usar os valores estatísticos (moda e mediana).
  • Preencher com um valores do vizinho mais próximo (KNN-Imputer) .

Veja no final do post o link para o meu notebook “avançado” que está disponível no Kaggle. Nele eu trato os valores ausentes preenchendo com valores estatísticos apenas.

A segunda característica complexa deste dataset é que ele é desbalanceado. Na verdade, a natureza dos dados mostra que em problemas de Churn, a maioria dos clientes tende a não cancelar o serviço, o que gera um desequilíbrio entre as classes. Tal como um problema de análise de fraudes de cartão de crédito onde a grande maioria das transações não são fraudulentas – mas queremos identificar as que são fraudulentas!

No notebook do Colab não tratamos esse problema mas no curso foi feita uma introdução ao assunto: se temos uma base onde 90% dos dados são de uma classe negativa (não cancela), então se o modelo chutar sempre a classe predominante ele vai ter uma elevada acurácia (DummyClassifier), mas não vai acertar nenhum caso real da classe positiva (cancelamento de serviço). Por isso, indica-se usar outra métrica para prever Churn.

No notebook do Kaggle analisei a matriz de confusão com o resultado do modelo. Usamos as métricas Recall e Precision para avaliar o quão bom nosso modelo ficou.

Matriz de Confusão no Kaggle

Uma opção para tratar esse problema de ter uma base com poucos exemplos de uma das duas classes, é avisar ao seu algoritmo, através de algum parâmetro, que a sua base é desbalanceada. Usando a biblioteca Sci-Kit Learn, devemos setar o parâmetro desta forma: class_weight como balanced. Assim, quando você rodar o seu modelo ele tentará regularizar a classe minoritária e acertar a sua classificação. Alguns autores chamam isso de penalização: “Erros na classe menor devem ser penalizados mais do que erros na classe maior”.

Novamente, podemos citar outras soluções:

  • Fazer upsampling da classe minoritária
  • Fazer downsampling da classe majoritária
  • Usar modelos baseados em árvores de decisão

No meu notebook do Kaggle eu tratei o problema de bases desbalanceadas passando o parâmetro Class Weight para nosso algoritmo de classificação Random Forest. Concluímos que ele melhorou nossa métrica de interesse, no caso Recall, melhorando nosso “indicador de churn”. Depois ainda mostrei como podemos visualizar um tradeoff de Recall e Precision: tudo bem, melhoramos a identificação de Churn mas será que estamos pegando muitos clientes que não iriam cancelar ?! 🙂

Esse segundo notebook é melhor que o nosso primeiro exemplo de cunho didático. No entanto, ele não se propõe a ser completo.

  • Nos próximos posts eu vou continuar revisando os cursos que fiz e falar de outros temas. Esse conhecimento vai nos municiar para evoluir na prática de resolução de problemas de Machine Learning.
  • Como esse problema de Churn é bem explorado em diversos cursos, diversas variações deste dataset estão disponíveis em algumas competições do Kaggle, e também em publicações do Medium.

Aqui é um bom momento para indicar um livro que fala de todos esses temas. Machine Learning, guia de referência rápida de Matt Harrison. Se você é iniciante, esse livro vai te dar uma visão do processo completo, falando de assuntos diversos, para você ter uma compreensão do todo. Quem já tem experiência, vai gostar do livro como um grande resumo de vários tópicos importantes. Claro, o livro se propõe a ser um guia rápido, então muitas vezes alguns temas não são abordados com tanta profundidade. Mas, tendo essa visão completa, sabendo como as coisas funcionam, fica muito mais fácil você se aprofundar depois usando outros materiais.

Por hoje é isso. Até o próximo post!

Links do post:

Notebook do Kaggle – https://www.kaggle.com/code/cesarayres/telecom-customer-churn-analysis

Link sobre a métrica Recall – https://scikit-learn.org/stable/auto_examples/model_selection/plot_precision_recall.html

Leave a comment