Como desenvolvemos recomendações personalizadas de produtos

imagem
Nossos clientes da loja querem fazer um marketing legal. Para fazer as pessoas comprarem mais, elas enviam e-mails regularmente. E toda vez que eles pensam: "O que escrever na carta?".




Você pode escrever simplesmente: "Compre conosco com mais frequência!", Mas isso não funciona muito bem. Uma idéia melhor é inserir anúncios de produtos em uma carta. É aconselhável anunciar produtos que interessam aos compradores.


Em seguida, falarei sobre como fizemos recomendações pessoais reais do zero.


Escolha o que recomendar


Você pode recomendar qualquer coisa.


Você pode recomendar os produtos mais comprados. Por exemplo, em uma loja de eletrônicos, esses são discos rígidos e telefones celulares. Mas e aqueles que já os têm? Acontece que todo mundo é recomendado a mesma coisa - não é muito legal.


Você pode recomendar algo semelhante ao que a pessoa olhou no site - por exemplo, olhou para os sapatos, recomendamos ... outros sapatos! Por estranho que pareça, é usado na prática e até funciona.


Mas ainda queríamos fazer algo especial, para que todos vissem na carta algo pessoal que ele realmente precisava, para que ele tivesse o desejo de voltar à loja várias vezes. A tarefa foi complicada pelo fato de termos quase 300 lojas de clientes em vários campos. E as recomendações devem funcionar bem para cada uma delas, ajustando-se automaticamente às especificidades de uma loja específica. Então começamos a fazer recomendações pessoais universais.


Fazendo o modelo base


Depois de ler artigos da Amazon , decidimos fazer o modelo mais básico de recomendações pessoais e ver como ele se mostra.


Para começar, faça o download da tabela de compras e expanda-a para uma matriz de produto cliente esparsa.


imagem

Convertendo uma lista de compras em uma matriz cliente-produto


Em seguida, usamos a filtragem colaborativa . A intuição aqui é simples: o cliente número 1 comprou o produto número 1 e dois produtos número 3; o cliente número 2 também comprou o número 1 do produto - é provável que ele queira comprar o número 3 do produto.


A filtragem colaborativa envolve a decomposição de uma grande matriz esparsa em duas matrizes latentes densas e alongadas de tamanho substancialmente menor. Para decomposição, usamos a implementação pronta de AlternatingLeastSquares da biblioteca implícita .


Após o treinamento do modelo, obtemos sintomas latentes para todos os clientes e todos os produtos. Eles são apresentados na forma de matrizes (número de clientes x número de sinais) e (número de produtos x número de sinais), respectivamente.


Sinais latentes são sinais que não estão explicitamente definidos em nenhum lugar, como, por exemplo, a altura de uma pessoa ou a área de um apartamento. Geralmente eles são obtidos como resultado de algumas transformações matemáticas sobre os dados originais.


As matrizes de recursos latentes são organizadas de modo que, se você as multiplicar, obtenha uma matriz do mesmo tamanho que o original. Com um alto grau de convencionalidade, podemos dizer que onde houve um número maior, haverá um número maior - cerca de um. Onde menos é menos. Onde havia zeros, haverá números pequenos, perto de zero, possivelmente negativos. Mas o importante é que, em alguns lugares onde havia zeros, números bastante grandes aparecerão - nossas recomendações futuras.


imagem

As compras que se influenciam fortemente são destacadas na mesma cor. Uma caixa destaca algumas recomendações futuras.


Agora, se pegarmos o vetor de recurso para um cliente específico e o multiplicarmos pela matriz de recursos do produto, obteremos o vetor de pontuação de todos os produtos para esse cliente. Resta apenas escolher vários produtos com a velocidade máxima.


Uma pequena nuance - entre os produtos recomendados com alta probabilidade, haverá aqueles que já foram comprados pelo cliente - eles precisam ser excluídos.


Curiosamente, mas um esquema tão simples acabou funcionando e os clientes ficaram felizes em testar nossas recomendações. Fizemos testes AB, onde comparamos recomendações pessoais com best-sellers. Em alguns casos, não houve diferença, mas em alguns houve um aumento estatisticamente significativo nas conversões em pedidos de até 10%. Tratavam-se principalmente de lojas com alta frequência de compras e, consequentemente, uma grande quantidade de dados.


Nós usamos mais dados.


Ficou claro que apenas as informações sobre compras não eram suficientes para fazer boas recomendações. Se apenas porque muitos clientes não têm compras. Por isso, decidimos melhorar nossas recomendações.


Adicione informações sobre todas as ações


Além das compras, começamos a levar em conta as visualizações do produto, além de incluí-las em várias listas: na cesta, em “favoritos” etc.


Para cada tipo de ação, selecionamos um peso e o adicionamos à nossa matriz esparsa com esse peso.


Levamos em consideração o tempo de ação


Achamos que a compra de ontem e a compra de um ano atrás não deveriam ter o mesmo efeito nas recomendações. Portanto, introduzimos um coeficiente de esquecimento exponencial para todas as ações.


Além disso, para algumas lojas, por exemplo, roupas, a sazonalidade é importante: se for verão, você precisará prestar mais atenção ao que uma pessoa comprou no verão há um ano do que no ano que comprou seis meses atrás.


Levamos em conta os sinais óbvios


Nosso banco de dados possui uma grande variedade de informações. Decidimos que tudo deveria ser usado.


Para os produtos, começamos a usar o preço, fabricante, categoria do produto e vários campos adicionais que a loja indica (tamanho da roupa, cor da mobília, presença de OGM em alimentos para cães, etc.).


Para os clientes, eles usaram sexo, idade, domínio da caixa de correio, sistema operacional na última sessão e o canal pelo qual ele acessou o banco de dados (online, offline, rede social etc.).
Para anexar tudo isso ao modelo, nós:


  1. Criamos matrizes de recursos (separadamente para clientes e produtos), processando-as anteriormente usando métodos padrão: dimensionamento, codificação one-hot.
  2. Com base nos recursos dos produtos e na matriz cliente-produto existente, restauramos recursos adicionais emparelhados para os clientes. A restauração é feita de maneira que o produto do produto atribua emparelhamento com o cliente para trazer a matriz de origem o mais próximo possível. Cole esses sinais adicionais nos sinais latentes existentes.
  3. Da mesma forma, fazemos com os sinais dos clientes.

imagem

Expandir sinais latentes


Agora temos mais sinais e podemos fazer recomendações mais precisas. A partir desse momento, o número de testes que mostraram um resultado estatisticamente significativo em favor de recomendações pessoais começou a crescer. Além dos testes, a avaliação subjetiva por especialistas também melhorou.


Configurar hiperparâmetros


Métricas primeiro


Obviamente, testamos nossas recomendações o tempo todo. Realizamos testes offline e online.


Obviamente, os testes AB online são uma maneira mais confiável de verificar como são boas recomendações. E esses testes mostraram bons resultados.


No entanto, os testes online são terrivelmente inconvenientes:


  • Você precisa encontrar uma loja que queira correr riscos com seus clientes e testar a nova versão do algoritmo.


  • Então você precisa esperar um dia / semana / dois para obter alguns resultados estatisticamente significativos.


  • Você precisa repetir isso 100 vezes para testar 100 opções diferentes.



Portanto, testes offline são indispensáveis. E aqui não será errado mencionar como os realizamos.


Como métrica offline, eles escolheram o popular e simples - nDCG @ K (ganho cumulativo com desconto normalizado em K) , ou melhor, sua média para vários milhares de clientes.


Essa métrica está classificando a qualidade. Ele usa valores de 0 a 1 e mostra como as recomendações são boas.


Para calcular o valor da métrica, você precisa de um padrão - recomendações ideais. Nós não temos esse padrão. Mas descobrimos uma saída: consideramos as recomendações em um ponto no passado - um mês atrás - e analisamos o que uma pessoa comprou para este mês - esse era o nosso padrão.


Há um pequeno truque aqui: se tivéssemos recomendado algo ao cliente há um mês, ele poderia ter comprado, mas não o comprou. Mas nunca saberemos sobre isso.


Outro ponto: poderíamos recomendar um chapéu azul com pompom, e um cliente comprou um chapéu azul sem pompom. Os produtos parecem ser semelhantes, mas diferentes - as quedas métricas. Portanto, ao calcular a métrica, começamos a levar em consideração a semelhança de mercadorias.


E agora sobre hiperparâmetros


Como temos uma métrica offline, podemos testar com segurança uma variedade de opções para nossas recomendações e não nos preocuparmos que alguém possa sofrer.


Por uma semana sobrecarregando nossa imaginação, tentamos 2-3 dezenas de modificações diferentes de nosso algoritmo, entre as quais simples, como diferentes fatores de esquecimento, e mais complexas, como usar outro algoritmo para colar sinais óbvios de clientes e produtos.


Algumas modificações não têm efeito em lugar algum. Alguns mostraram melhorias em todos os projetos - nós os corrigimos. E alguns em vários projetos melhoraram a métrica, enquanto outros pioraram. Portanto, obtivemos a configuração do hiperparâmetro .


Agora temos 11 hiperparâmetros. Levou vários dias para encontrar os valores ideais de cada um deles para todos os projetos.


Após o ajuste, verificou-se que, em média, a métrica para todos os projetos cresceu 6 vezes e o crescimento mais forte - 35 vezes!


Melhorando a funcionalidade


Podemos fazer boas recomendações personalizadas. Legal.


Mas como eles funcionam? Algo assim: todas as noites à noite, quando a carga nos servidores diminui, começamos a recontar recomendações para todos os projetos. O consumo de RAM e CPU decola, várias horas passam e as recomendações estão prontas. Eles vão para um armazenamento especial e esperam até serem retirados de lá.


Por que pegar? Por exemplo, para enviar uma carta. Isso parece bom.


Ou para mostrar no site. Imagine que você vá ao site, escolha um telefone celular e há recomendações pessoais na janela e ofereça ... uma chaleira! Por que uma chaleira? Sim, porque você comprou um microondas há um mês, e o algoritmo calculou que aqueles que compraram um microondas geralmente precisam de uma chaleira.


Mas você precisa de um telefone celular! Como ser


Chegou a hora de fazer recomendações que funcionem em tempo real.


Do ponto de vista da matemática, nada de novo: simplesmente dividimos o estágio de treinamento do modelo e o estágio de emissão de recomendações.


Ainda treinamos o modelo uma vez por dia.


E agora podemos emitir recomendações online. Assim que uma pessoa executa alguma ação no site, por exemplo, visualiza o produto ou o adiciona à cesta, uma solicitação é gerada. A solicitação indica quem fez o quê, com qual produto. O algoritmo de recomendação processa essa solicitação e, em resposta, gera uma lista de recomendações para este cliente.


Para tornar isso possível, precisávamos de:


  1. Faça um repositório onde os modelos são adicionados após o treinamento.
  2. Organize um armazenamento de valor-chave para armazenar ações executadas anteriormente pelo cliente, pois leva muito tempo para carregá-las no banco de dados.
  3. Acelere significativamente nossas recomendações. O principal ponto de aceleração foi o uso da biblioteca nmslib para encontrar os vizinhos mais próximos e selecionar os produtos mais relevantes para uma pessoa. Caras espertos da Microsoft descobriram como reduzir o problema da multiplicação de matrizes e escolher o topo dos elementos com o maior valor para a tarefa de encontrar os vizinhos mais próximos.
  4. Faça um microsserviço que rastreie as ações de uma pessoa no site, envie uma solicitação de recomendações, aceite essas recomendações e as mostre à pessoa.

E esta máquina infernal ganhou. E ganhou rapidamente. Assim que você olha para o seu celular, as recomendações são recontadas em uma fração de segundo, e os telefones celulares, estojos, óculos e similares já são recomendados.
Para deixar mais claro o que é rápido: suportamos uma carga de 7000 rpm (solicitações por minuto) usando apenas 3 núcleos da CPU Intel Xeon 2.6 GHz. Essa carga é dada no pico de atividade dos 2 maiores de nossos clientes.


O que vem a seguir


Parece que, a partir do modelo atual, esprememos tudo o que é possível.


Melhorias adicionais exigirão grandes mudanças.


Uma das opções de melhoria é a segmentação preliminar de clientes em grupos.


As pessoas se comportam de maneira diferente: alguém compra com frequência e pouco a pouco, alguém raramente, mas em grandes quantidades, alguém com produtos caros, alguém barato. De fato, o próprio modelo deve encontrar esses grupos e recomendar o que eles precisam.


Mas pode ser difícil, por exemplo, se os grupos são pequenos. Por exemplo, um pequeno grupo de entidades legais. Ou um grupo de homens em uma loja feminina. Nem sempre eles podem ser determinados pelo atributo formal “gênero”, porque a esposa pode usar um cartão de fidelidade emitido para o marido e vice-versa.


Você pode tentar ajudar o modelo, se primeiro selecionar esses grupos e criar um modelo para cada um deles separadamente.


Outra abordagem mais séria à melhoria pode ser levar em consideração o histórico de ações.


Agora, levamos em conta apenas a prescrição da ação, e isso não nos permite identificar padrões de comportamento. Por exemplo, o modelo não consegue entender que, se você comprou roupas para mulheres grávidas e depois fraldas, é hora de recomendar comida para bebê.


Em geral, o trabalho para melhorar as recomendações, em nossa opinião, pode durar quase indefinidamente. Com cada novo cliente usando-os, novos casos e novas hipóteses de melhoria aparecem.


Então, continuamos a melhorar e tentaremos escrever sobre o que estamos fazendo. Não diga adeus :)

Source: https://habr.com/ru/post/pt456082/


All Articles