Como Classificar A Intenção de Compra do Cliente com Machine Learning

Definir qual é a intenção de um cliente ao visitar uma loja, seja ela real ou virtual, pode ajudar uma empresa a oferecer uma experiência personalizada. Por isso é importante utilizar ferramentas que possam ajudar a categorizar e identificar estas visitas.

O Walmart disponibilizou dados anônimos sobre viagens de seus clientes a algumas de suas lojas. Dentre os dados estavam os itens comprados e suas respectivas quantidades, além de informações descritivas sobre os produtos e o dia da semana. A tarefa era utilizar estas informações para categorizar a intenção da visita daquele cliente.

Apesar de não nos dar uma tabela de referência para cada código, os organizadores informaram que alguns exemplos de tipos de visitas são: compra semanal de alimentos, presentes para uma data comemorativa, ou compra de roupas para a nova estação.

Dados

Existiam cerca de 95 mil viagens para treino, e 95 mil para teste. O arquivo disponibilizado continha basicamente uma linha para cada produto comprado durante uma visita, e era responsabilidade do competidor transformá-lo adequadamente para unir os dados de cada viagem.

Para definir os produtos existiam: o código UPC, com mais de 100 mil tipos diferentes; o código Fineline, que é uma categoria refinada criada pelo Walmart, com cerca de 5 mil tipos; e o Departamento, que continha cerca de 60 tipos diferentes.

Além disso, a variável ScanCount definia quantos produtos daquele tipo foram comprados, sendo que, se fosse um número negativo, o cliente estava devolvendo os produtos.

Transformando as Variáveis

Para conseguir treinar um modelo era necessário, no mínimo, fazer o agrupamento das informações básicas por viagem. Vários relatos no fórum falavam de transformações resultando em milhares de variáveis.

Como eu tive apenas 7 dias para trabalhar nesta competição, meu objetivo foi criar um modelo simples e compacto, com o menor número de variáveis possível, mas com um bom desempenho para me posicionar entre os 10% melhores.

Variáveis Básicas

Dentre as variáveis básicas, baseadas em estatísticas de cada visita, alguns exemplos são: a média da quantidade de cada produto comprado na visita, indicação se houve devolução de produto, soma da quantidade de todos os produtos comprados e o departamento com maior quantidade de itens comprados.

Contagens e Proporções

Decidi agregar a quantidade de produtos comprados por departamento, e usar tanto a contagem de cada departamento, quanto a proporção que este departamento ocupava nesta compra. Isso criou cerca de 120 variáveis.

SVD + TF-IDF

Para tentar utilizar o Fineline e o UPC sem aumentar muito o número de variáveis, decidi somar a quantidade de produtos em cada um deles e fazer duas transformações.

Primeiro a TF-IDF, que substitui as quantidade por pesos relativos à proporção de um item naquela viagem, e quão frequente é a presença deste item em outras viagens.

Depois, apliquei o SVD, que tenta encontrar as direções que possuem maior variação nos dados.

Estas transformações normalmente são usada com texto, aplicadas à contagem de palavras em cada documento, e conhecidas como Latent Semantic Analysis.

Além de reduzir a dimensão dos dados, espera-se que ela descarte boa parte do ruído, e encontre categorias estruturais às quais as viagens pertencem.

Na prática isso ajudou bastante com o Fineline, mas não ajudou muito com o UPC.

Regressão Logística L1 e L2

Uma outra maneira de reduzir a dimensão é treinar um modelo mais simples e usar as previsões do mesmo como variável no modelo principal.

Para isso, treinei duas regressões logísticas: uma com penalidade L2 e outra com penalidade L1. Isso gerou cerca de 70 variáveis, 37 para cada regressão, com a probabilidade de um exemplo pertencer a cada classe.

Modelos

Gradient Boosted Trees – XGBoost

A maior parte do meu tempo foi focada em construir um bom modelo com o XGBoost. Este modelo já era bom o bastante para ficar nos 10% melhores.

Redes Neurais

Para complementar o XGBoost, e tentar uma posição melhor, decidi treinar uma rede neural nas mesmas variáveis. Ela possuía 2 camadas ocultas e dropout.

Outros competidores reportaram bons resultados com redes neurais, mas não passei muito tempo mexendo com elas. A intenção era apenas conseguir uma leve melhora sobre o resultado do XGBoost.

Resultado e Melhorias Possíveis

A solução final foi um ensemble simples entre uma rede neural e o XGBoost, que foi o bastante para garantir uma posição entre as 7% melhores. Ela foi obtida em cerca de 8 horas de trabalho.

Utilizando apenas o modelo GBT, sem ensemble, era possível ficar no Top 9%. Este modelo tinha apenas 200 variáveis. A maioria dos modelos melhores tinham mais de 5000 variáveis. Certamente aumentando o número de variáveis este modelo poderia ficar acima do Top 5%, mas ia demorar muito para treinar.

Outras possíveis melhorias seriam: aumentar o ensemble, criar um conjunto de variáveis otimizado para a rede neural, utilizar diretamente as variáveis com contagens do Fineline, tunar melhor os parâmetros das regressões logísticas e das transformações.

Seu time precisa de orientação em um projeto de machine learning? Eu abri alguns slots de consultoria. Se você se interessou, entre em contato através do formulário.
Do you or your team need advice/guidance on a machine learning project? I opened a few consulting slots. If you are interested, reach out via the contact form.