Comment nous développons des recommandations de produits personnalisées

image
Nos clients en magasin veulent faire du marketing cool. Pour inciter les gens à acheter plus, ils leur envoient régulièrement des e-mails. Et chaque fois qu'ils pensent: "Que faut-il écrire dans la lettre?".




Vous pouvez écrire simplement: "Achetez chez nous plus souvent!", Mais cela ne fonctionne pas très bien. Une meilleure idée consiste à insérer des annonces de produits dans une lettre. Il est conseillé d'annoncer des produits qui intéressent les acheteurs.


Ensuite, je vais parler de la façon dont nous avons fait de véritables recommandations personnelles à partir de zéro.


Choisissez quoi recommander


Vous pouvez tout recommander.


Vous pouvez recommander les produits les plus achetés. Par exemple, dans un magasin d'électronique, ce sont des disques durs et des téléphones portables. Mais qu'en est-il de ceux qui en ont déjà? Il s'avère que tout le monde est recommandé la même chose - pas très cool.


Vous pouvez recommander quelque chose de similaire à ce que la personne a regardé sur le site - par exemple, regardé les chaussures, nous recommandons ... d'autres chaussures! Aussi étrange que cela puisse paraître, il est utilisé dans la pratique et fonctionne même.


Mais nous voulions toujours faire quelque chose de spécial pour que tout le monde voie dans la lettre quelque chose de personnel dont il avait vraiment besoin, afin qu'il ait envie de revenir encore et encore au magasin. La tâche a été compliquée par le fait que nous avons près de 300 magasins clients dans divers domaines. Et les recommandations devraient bien fonctionner pour chacune d'entre elles, en s'ajustant automatiquement aux spécificités d'un magasin particulier. Nous avons donc commencé à faire des recommandations personnelles universelles.


Faire le modèle de base


Après avoir lu des articles d'Amazon , nous avons décidé de faire le modèle le plus élémentaire de recommandations personnelles et de voir comment il se présente.


Pour commencer, téléchargez la table d'achat et développez-la dans une matrice client-produit clairsemée.


image

Conversion d'une liste de courses en matrice client-produit


Ensuite, nous utilisons le filtrage collaboratif . L'intuition ici est simple: le client numéro 1 a acheté le produit numéro 1 et deux produits numéro 3; le client numéro 2 a également acheté le produit numéro 1 - il est susceptible de vouloir acheter le produit numéro 3.


Le filtrage collaboratif implique la décomposition d'une grande matrice clairsemée en deux matrices de caractéristiques latentes allongées denses de taille sensiblement plus petite. Pour la décomposition, nous avons utilisé l'implémentation prête à l'emploi d' AlternatingLeastSquares de la bibliothèque implicite .


Après avoir formé le modèle, nous obtenons des symptômes latents pour tous les clients et tous les produits. Ils sont présentés sous forme de matrices (nombre de clients x nombre de signes) et (nombre de produits x nombre de signes), respectivement.


Les signes latents sont des signes qui ne sont explicitement fixés nulle part, comme, par exemple, la hauteur d'une personne ou la superficie d'un appartement. Ils sont généralement obtenus à la suite de certaines transformations mathématiques sur les données d'origine.


Les matrices d'entités latentes sont disposées de sorte que si vous les multipliez, vous obtenez une matrice de la même taille que l'original. Avec un degré élevé de conventionnalité, nous pouvons dire que là où il y avait de plus grands nombres, il y en aura plus - environ un. Où moins c'est moins. Là où il y avait des zéros, il y aura de petits nombres, près de zéro, éventuellement négatifs. Mais l'important est que dans certains endroits où il y avait des zéros, un nombre assez important apparaîtra - nos futures recommandations.


image

Les achats qui s'influencent fortement sont mis en évidence dans la même couleur. Un encadré présente quelques recommandations futures.


Maintenant, si nous prenons le vecteur de caractéristiques pour un client particulier et le multiplions par la matrice de caractéristiques du produit, nous obtenons le vecteur de score de tous les produits pour ce client. Il ne reste plus qu'à en choisir plusieurs produits à la vitesse maximale.


Une petite nuance - parmi les produits recommandés avec une forte probabilité, il y en aura qui ont déjà été achetés par le client - ils doivent être exclus.


Curieusement, mais un schéma aussi simple s'est avéré efficace et les clients étaient heureux de tester nos recommandations. Nous avons fait des tests AB, où nous avons comparé des recommandations personnelles avec des best-sellers. Dans certains cas, il n'y avait pas de différence, mais dans certains, ils ont vu une augmentation statistiquement significative des conversions de l'ordre de 10%. Il s'agissait principalement de magasins avec une fréquence élevée d'achats et, par conséquent, une grande quantité de données.


Nous utilisons plus de données.


Il était clair que les informations sur les achats à elles seules n'étaient pas suffisantes pour faire de bonnes recommandations. Ne serait-ce que parce que de nombreux clients n'ont pas du tout d'achats. Nous avons donc décidé d'améliorer nos recommandations.


Ajouter des informations sur toutes les actions


En plus des achats, nous avons commencé à prendre en compte les vues des produits, ainsi qu'à les ajouter à différentes listes: dans le panier, dans les «favoris», etc.


Pour chaque type d'action, nous avons sélectionné un poids et l'avons ajouté à notre matrice clairsemée avec ce poids.


Nous prenons en compte le temps d'action


Nous pensions que l'achat d'hier et celui d'il y a un an ne devraient pas avoir le même effet sur les recommandations. Par conséquent, nous avons introduit un coefficient d'oubli exponentiel pour toutes les actions.


De plus, pour certains magasins, par exemple, les vêtements, la saisonnalité est importante: si c'est l'été, vous devez faire plus attention à ce qu'une personne a acheté en été il y a un an que ce qu'elle a acheté il y a six mois en hiver.


Nous prenons en compte les signes évidents


Notre base de données contient une grande variété d'informations. Nous avons décidé que tout devait être utilisé.


Pour les produits, nous avons commencé à utiliser le prix, le fabricant, la catégorie de produits et divers champs supplémentaires que le magasin indique (taille des vêtements, couleur des meubles, présence d'OGM dans les aliments pour chiens, etc.).


Pour les clients, ils ont pris le sexe, l'âge, le domaine de la boîte aux lettres, le système d'exploitation lors de la dernière session et le canal par lequel il est entré dans la base de données (en ligne, hors ligne, réseau social, etc.).
Pour attacher tout cela au modèle, nous:


  1. Nous fabriquons des matrices de fonctionnalités (séparément pour les clients et les produits), les ayant préalablement traitées à l'aide de méthodes standard: mise à l'échelle, codage à chaud.
  2. Sur la base des caractéristiques des produits et de la matrice client-produit existante, nous restaurons des fonctionnalités supplémentaires jumelées pour les clients. La restauration est effectuée de manière à ce que le produit des attributs de produit soit associé aux attributs du client pour rapprocher le plus possible la matrice source. Collez ces signes supplémentaires aux signes latents existants.
  3. De même, nous faisons avec des signes de clients.

image

Développer les signes latents


Maintenant, nous avons plus de signes et nous pouvons faire des recommandations plus précises. À partir de ce moment, le nombre de tests qui ont montré un résultat statistiquement significatif en faveur des recommandations personnelles a commencé à augmenter. En plus des tests, l'évaluation subjective par des experts s'est également améliorée.


Configurer les hyperparamètres


Les métriques d'abord


Bien sûr, nous avons testé nos recommandations tout le temps. Nous avons effectué des tests hors ligne et en ligne.


Bien sûr, les tests AB en ligne sont un moyen plus fiable de vérifier la qualité des recommandations. Et ces tests ont montré de bons résultats.


Cependant, les tests en ligne sont terriblement gênants:


  • Vous devez trouver un magasin qui souhaite prendre des risques avec ses clients et tester la nouvelle version de l'algorithme.


  • Ensuite, vous devez attendre un jour / semaine / deux pour obtenir des résultats statistiquement significatifs.


  • Vous devez répéter cette opération 100 fois pour tester 100 options différentes.



Par conséquent, les tests hors ligne sont indispensables. Et ici, il ne sera pas inutile de mentionner comment nous les avons réalisées.


En tant que mesure hors ligne, ils ont choisi le populaire et simple - nDCG @ K (gain cumulatif actualisé normalisé à K) , ou plutôt sa moyenne pour plusieurs milliers de clients.


Cette métrique est la qualité du classement . Il prend des valeurs de 0 à 1 et montre la qualité des recommandations.


Pour calculer la valeur de la métrique, vous avez besoin d'un standard - des recommandations idéales. Nous n'avons pas une telle norme. Mais nous avons trouvé une issue: nous avons examiné les recommandations à un moment donné dans le passé - il y a un mois - et regardé ce qu'une personne avait acheté pour ce mois-ci - c'était notre norme.


Il y a une petite astuce ici: si nous avions recommandé quelque chose au client il y a un mois, il aurait pu l'acheter, mais il ne l'avait pas acheté. Mais nous ne le saurons jamais.


Autre point: nous pourrions recommander un chapeau bleu avec un pompon, et un client a acheté un chapeau bleu sans pompon. Les marchandises semblent être similaires, mais différentes - les affaissements métriques. Par conséquent, lors du calcul de la métrique, nous avons commencé à prendre en compte la similitude des produits.


Et maintenant sur les hyperparamètres


Étant donné que nous avons une mesure hors ligne, nous pouvons tester en toute sécurité une variété d'options pour nos recommandations et ne pas craindre que quelqu'un souffre.


Pendant une semaine, nous avons éprouvé de l'imagination, nous avons essayé 2 à 3 dizaines de modifications différentes de notre algorithme, parmi lesquelles elles étaient simples, telles que différents facteurs d'oubli, et plus complexes, comme l'utilisation d'un autre algorithme pour coller des signes évidents de clients et de produits.


Certaines modifications n'ont aucun effet nulle part. Certains ont montré des améliorations sur tous les projets - nous les avons corrigés. Et certains sur un certain nombre de projets ont amélioré la métrique, tandis que sur d'autres, ils ont empiré. Nous avons donc obtenu le paramètre d'hyperparamètre .


Nous avons maintenant 11 hyperparamètres. Il a fallu plusieurs jours pour trouver les valeurs optimales de chacun d'entre eux pour tous les projets.


Après réglage, il s'est avéré qu'en moyenne, la métrique pour tous les projets a augmenté 6 fois, et la croissance la plus forte - 35 fois!


Amélioration des fonctionnalités


Nous pouvons faire de bonnes recommandations personnalisées. Cool.


Mais comment fonctionnent-ils? Quelque chose comme ça: chaque nuit la nuit, lorsque la charge sur les serveurs diminue, nous commençons à recompter les recommandations pour tous les projets. La consommation de RAM et de CPU décolle, plusieurs heures s'écoulent et les recommandations sont prêtes. Ils se rendent dans un entrepôt spécial et attendent d'être retirés de là.


Pourquoi le prendre? Par exemple, pour envoyer une lettre. Ça sonne bien.


Ou à montrer sur le site. Imaginez que vous allez sur le site, choisissez un téléphone portable, et il y a des recommandations personnelles dans la fenêtre, et vous offrez ... une bouilloire! Pourquoi une bouilloire? Oui, car vous avez acheté un micro-ondes il y a un mois et l'algorithme a calculé que ceux qui ont acheté un micro-ondes ont souvent besoin d'une bouilloire.


Mais vous avez besoin d'un téléphone portable! Comment être?


Le moment est venu de faire des recommandations qui fonctionnent en temps réel.


Du point de vue des mathématiques, rien de nouveau: nous avons simplement divisé l'étape de la formation des modèles et celle de la formulation des recommandations.


Nous formons toujours le modèle une fois par jour.


Et maintenant, nous pouvons émettre des recommandations en ligne. Dès qu'une personne effectue une action sur le site, par exemple, visualise le produit ou l'ajoute au panier, une demande est générée. La demande indique qui a fait quoi, avec quel produit. L'algorithme de recommandation traite cette demande et, en réponse, génère une liste de recommandations pour ce client.


Pour rendre cela possible, nous avions besoin de:


  1. Créez un référentiel où les modèles sont ajoutés après la formation.
  2. Organisez un stockage de valeurs-clés pour stocker les actions précédemment effectuées par le client, car leur chargement depuis la base de données prend beaucoup de temps.
  3. Accélérez considérablement nos recommandations. Le principal point d'accélération a été l'utilisation de la bibliothèque nmslib pour trouver les voisins les plus proches afin de sélectionner les produits les plus pertinents pour une personne. Les gars rusés de Microsoft ont trouvé comment réduire le problème de la multiplication matricielle et choisir le haut des éléments avec la valeur la plus élevée pour trouver les voisins les plus proches.
  4. Faites un microservice qui suit les actions d'une personne sur le site, envoie une demande de recommandations, prend ces recommandations et les montre à la personne.

Et cette machine infernale a gagné. Et gagné rapidement. Dès que vous regardez votre téléphone mobile, les recommandations sont recomptées en une fraction de seconde, et les téléphones portables, les étuis, les lunettes et autres vous sont déjà recommandés.
Pour rendre plus clair ce qui est rapide: nous supportons une charge de 7000 tr / min (requêtes par minute) en utilisant seulement 3 cœurs de CPU Intel Xeon 2,6 GHz. Cette charge est donnée en pic d'activité des 2 plus grands de nos clients.


Et ensuite


Il semble que du modèle actuel nous avons pressé tout ce qui est possible.


De nouvelles améliorations nécessiteront des changements majeurs.


L'une des options d'amélioration est la segmentation préliminaire des clients en groupes.


Les gens se comportent différemment: quelqu'un achète souvent et peu à peu, quelqu'un rarement, mais en grande quantité, quelqu'un des produits chers, quelqu'un bon marché. En fait, le modèle lui-même doit trouver de tels groupes et leur recommander ce dont ils ont besoin.


Mais cela peut être difficile, par exemple, si les groupes sont petits. Par exemple, un petit groupe d'entités juridiques. Ou un groupe d'hommes dans un magasin pour femmes. Ils ne peuvent pas toujours être déterminés par l'attribut formel «sexe», car la femme peut utiliser une carte de fidélité délivrée pour son mari, et vice versa.


Vous pouvez essayer d'aider le modèle, si vous sélectionnez d'abord ces groupes, puis créez un modèle pour chacun d'eux séparément.


Une autre approche plus sérieuse de l'amélioration peut être de tenir compte de l'historique des actions.


Maintenant, nous ne prenons en compte que la prescription de l'action, ce qui ne nous permet pas d'identifier des schémas de comportement. Par exemple, le modèle ne peut pas comprendre que si vous avez d'abord acheté des vêtements pour femmes enceintes, puis des couches, il est temps de recommander des aliments pour bébés.


En général, les travaux visant à améliorer les recommandations, à notre avis, peuvent durer presque indéfiniment. Avec chaque nouveau client qui les utilise, de nouveaux cas et de nouvelles hypothèses d'amélioration apparaissent.


Nous continuons donc à nous améliorer et nous essaierons d'écrire sur ce que nous faisons. Ne dites pas au revoir :)

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


All Articles