Um problema de learning to rank
Com utilização do modelo da solução via Google Sheets
Conceitos abordados e exemplificados ao longo deste artigo
- Learning to rank;
- Curva de ganhos cumulativos (cumulative gains curve);
- Curva de desempenho (lift curve);
- Precision@k;
- Recall@k;
- Publicação do modelo em produção no Heroku e acessando usando Google Sheets.
Introdução
Este artigo é para quem está buscando como criar uma solução para um problema de learning to rank e também para quem está buscando entender, na prática, as métricas precision@k, recall@k e as curvas de ganhos cumulativos (cumulative gains curve) e desempenho (lift curve)
Listarei todos os passos desenvolvidos ao longo do projeto. Se desejar aprofundar em algo escrito aqui, recomendo visitar o repositório deste projeto no GitHub. Também fique à vontade para comentar ou perguntar algo diretamente pelo meu Linkedin.
Importante mencionar que é um projeto fictício, inspirado em um desafio do Kaggle.
O cliente contratante do projeto
Corretora de seguros, que negocia seguros saúde e veicular.
O cenário de negócio
A empresa está interessada em vender seguro veicular para os clientes que contrataram seguro saúde no ano anterior (portanto, realizar uma venda cruzada ou cross-sell).
A venda de novos planos de seguro para veículos para os portadores de seguro saúde é algo antigo na corretora, embora seus funcionários, até então, utilizam o feeling para saber quem abordar neste segundo momento de venda.
Os anos de experiência da empresa apontam que 12% dos clientes que adquirem o seguro saúde no ano anterior irão adquirir o seguro veicular no ano vigente.
Considerando que a empresa preza por uma campanha de vendas que propicie uma experiência única - que inclui convites para uma conversa pessoalmente ou calls dedicados - e que há alguns anos, são muitos os novos clientes, o gerente de marketing avisou que, neste ano, apenas 40% dos novos clientes de seguro saúde poderão ser contactados para oferecerem o seguro veicular.
Portanto, a corretora de seguros deseja obter uma ferramenta que retorne uma lista ordenada dos clientes mais propensos a fecharem um novo negócio e assim poderem contactar todos — ou quase todos — os clientes que compõem os 12% que irão adquirir o novo seguro ao contactar apenas os primeiros 40% da lista ordenada.
Os dados
Justamente pensando que um dia irão ofertar novos planos de seguros, eles aproveitam a oportunidade no momento da venda de seguro saúde (seu produto mais conhecido e vendido) e solicitam aos clientes para preencherem alguns campos, por exemplo:
- Qual foi o canal de comunicação que você conheceu nossa corretora?
- Possui habilitação para dirigir?
- Possui veículo próprio? Se sim, qual o ano?
- Possui seguro veicular?
- Seu veículo já sofreu danos no passado?
O sistema da corretora também adiciona automaticamente informações extras para cada um dos clientes, como por exemplo a região da residência e o valor do seguro saúde contratado.
Os dados de experiências passadas foram disponibilizados. Estes dados já possuem a resposta se o cliente, posteriormente, adquiriu ou não o segundo seguro com a corretora; estes dados (amostra abaixo) foram utilizados na construção do modelo de machine learning.
A estratégia
A linguagem de programação utilizada foi Python; e a estratégia da solução, que pode ser conferida diretamente no repositório do projeto, passou pelas etapas:
- Coleta e descrição dos dados (disponíveis em um banco de dados postgreSQL);
- Separação de 20% dos dados para teste do modelo final (para simular o ambiente de produção com dados inéditos);
- Feature engineering;
- Filtragem dos dados;
- Análise exploratória de dados;
- Preparação dos dados;
- Seleção de features;
- Modelagem de machine learning, onde foram avaliados 5 algoritmos: balanced random forest classifier, knn classifier, logistic regression, random forest classifier e xgboost classifier utilizando-se validação cruzada;
- Publicação do modelo no Heroku e vínculo com o Google Sheets da corretora.
As métricas de avaliação e resultados
As métricas para avaliar o desempenho dos modelos foram:
- Curva de ganhos cumulativos (cumulative gains curve): plota a porcentagem de amostras positivas classificadas corretamente como uma função da porcentagem de amostras consideradas.
- Curva de desempenho (lift curve): mostra quantas vezes o desempenho de um modelo é melhor comparado a um modelo aleatório para uma dada fatia da amostra considerada.
As curvas de ganhos cumulativos e desempenho, para os diferentes algoritmos de machine learning treinados, são mostradas a seguir.
O modelo perfeito é aquele hipotético que ordenaria com perfeição todos os clientes que fecharão o novo negócio no topo da lista; portanto, ao chegar na quantidade limite de clientes que irão adquirir o seguro veicular (em torno de 12%), a curva de ganhos já atinge o valor máximo e a de desempenho começa a cair na medida que mais clientes (que não irão adquirir um novo produto) são contactados.
Outras métricas utilizadas na avaliação dos modelos foram:
- Precision@k: proporção das amostras relevantes em relação às k amostras consideradas.
- Recall@k: proporção das amostras relevantes encontradas até k amostras consideradas em relação à todas as amostras relevantes existentes na base.
Nota-se que os melhores modelos foram o balanced random forest classifier e o xgboost classifier. Por uma questão do tamanho do modelo para publicar em produção, foi considerado o xgboost classifier para a solução final.
O desempenho do modelo na simulação de dados de produção
Conforme mencionado anteriormente, foram separados 20% dos dados para teste; após estes dados passarem pelo mesmo pipeline que os dados de treino, tem-se curvas de ganhos cumulativos e de desempenho comparáveis com àquelas obtidas para os dados de treino.
Esta compatibilidade de desempenho é evidenciada quando comparamos o precision@k e recall@k dos modelos obtidos com os dados de treino e de teste.
Conclusão
Podemos observar que, com a aplicação do modelo obtido, aproximadamente 93% dos potenciais clientes interessados também no seguro veicular serão convertidos após contactar 40% do total de clientes atualmente apenas com seguro saúde.
Modelo em produção
O modelo foi publicado no Heroku e disponível por meio de uma planilha no Google Sheets.
Qualquer funcionário da seguradora pode utilizar a planilha e estabelecer um ranking dos clientes com maior probabilidade de adquirir seguro de veículos, utilizando-se dados diretos do sistema da empresa.
Como pode ser verificado na demonstração abaixo, existe um botão que, uma vez acionado, após alguns segundos, retorna a lista já ordenada pelos clientes com maior probabilidade de adquirir o novo produto.
A comunicação entre o Google Sheets e o Heroku foi realizada por meio de AppScript, que é uma plataforma JavaScript baseada em nuvem que permite a integração e a automação de tarefas nos produtos do Google. Os códigos utilizamos podem ser vistos aqui.
Sinta-se à vontade para solicitar uma permissão de edição da planilha (envie-me uma mensagem pelo meu Linkedin) e então realizar a classificação dos clientes você mesmo. Tente alterar alguns valores de atributo e veja o impacto na pontuação (campo Score) do cliente.
Agradecimentos
Agradeço aos membros da Comunidade DS e ao Meigarom Lopes que propiciaram horas de frutíferas conversas essenciais para o desenrolar deste trabalho.
Muito obrigado pela leitura!