Classificando Visitas de Clientes ao Walmart em 37 Categorias Usando 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.



http://mariofilho.com/classificando-visitas-de-clientes-ao-walmart-em-37-categorias-usando-machine-learning/

Comentários

Postagens mais visitadas deste blog

Rails CanCan

Meus insights mais valiosos sobre criptomoedas para 2018 e além

Como pegar a senha do Whatsapp de um Android ou Iphone