,

Booster ses ventes avec Apache Mahout (2/2)

Apache Mahout : extension du moteur et usages détournés

Dans le billet précédent je vous avais présenté rapidement les fonctionnalités de la librairie Java Apache Mahout et plus particulièrement ce qu’il était possible de faire avec le package Taste : de la recommandation personnalisée de produits sur une plateforme e-commerce.

Nous allons voir maintenant les possibilités qui s’offrent à nous pour répondre aux exigences marketing et exploiter les données des réseaux sociaux.

L’interface IDRescorer pour jouer avec les résultats

Sans surprise, l’utilisateur d’une solution de recommandations a pour objectif d’augmenter son volume de ventes. L’ajout de recommandations personnalisées (et j’insiste bien sur ce mot) y participe, mais c’est parfois insuffisant : quid des offres promotionnelles saisonnières, quid des effets de bord indésirables (recommandations non appropriées en fonction du contexte) et quid de la volonté de vendre, par exemple, surtout des produits à forte marge ?

Présentation d’IDRescorer

Heureusement pour nous, Mahout Taste n’est pas une boîte noire, il propose divers points d’inflexion assez simples à mettre en place sur l’algorithme… et si ce n’est pas suffisant, on peut toujours surclasser les objets !

Ce qui nous intéresse ici est l’interface IDRescorer
(org.apache.mahout.cf.taste.recommender.IDRescorer pour les intimes) qui est une toute petite interface avec seulement deux méthodes :

public interface IDRescorer {
    double rescore(long id, double originalScore);
    boolean isFiltered(long id);
}

Une implémentation de IDRescorer est fournie à un Recommender au moment de la recommandation, en plus de l’identifiant utilisateur et du nombre de résultats désirés :

List<RecommendedItem> recommendations = recommender.recommend(USER_ID, 
5, customRescorer);

Quand un Recommender se voit fournir un rescorer, la méthode rescore() sera appelée pour chaque objet recommandé, après le calcul du score et avant le tri des résultats. Cela permet donc, selon une logique personnalisée, de modifier le score de certains produits.

La méthode isFiltered() permet quant à elle de totalement exclure un résultat (c’est également possible en retournant un Double.NaN dans rescore).

On voit bien que les données fournies au rescorer sont limitées, on ne sait même pas quel utilisateur demande une recommandation, il faudra donc prévoir dans notre implémentation de pouvoir récupérer cette info, en plus bien sûr, des nouveaux scores que l’on veut renvoyer.

Constitution des scores

Parlons-en de ces nouveaux scores, comment les définir ? N’oublions pas que l’intérêt de cette solution par rapport à ce que l’on peut déjà trouver dans Magento et autres hybris est le peu de configuration nécessaire pour avoir un système fonctionnel : hors de question donc d’imposer au client de configurer manuellement pour chaque produit un multiplicateur de score !

Une idée intéressante est celle des filtres de produits, basés sur les métadonnées de ces derniers et en appliquant le même multiplicateur pour tous les produits correspondants. On peut alors créer des règles plus ou moins complexes telles que :

  • recommander en priorité les produits avec une marge de plus de 30%,
  • moins recommander les produits ayant moins de 10 unités en stock,
  • recommander pendant les vacances d’été les produits qui se trouvent dans les catégories “Plage” et “Family packs”,
  • ne jamais recommander les films d’horreurs sur la page d’accueil.

Pour créer de telles règles dans une optique d’interface web conviviale on peut trouver des plugins jQuery tels que jui_filter_rules ou jQuery QueryBuilder, tous deux sous licence OpenSource.

On peut ainsi choisir finement les règles de rescoring à appliquer au système de recommandation, qui pourront par la suite être organisées dans des campagnes pour qu’elles ne soient actives que sur une période définie.

La vague sociale

Les réseaux sociaux sont merveilleux. A condition que l’utilisateur nous en donne l’autorisation, on peut connaître certains détails personnels, ses centres d’intérêts, ses amis et sa famille, tout ceci à travers des WebServices très simples à utiliser. Par exemple pour Twitter et Facebook.

Deux utilisations de ces données peuvent être imaginées : connaître les liens entre plusieurs utilisateurs ou identifier des produits correspondants aux centres d’intérêt.

Identification de groupes d’utilisateurs

Petit rappel du premier article : Mahout utilise des objets UserNeighborhood pour générer ses recommandations. De base, ils sont construits automatiquement en constituant des groupes d’utilisateurs qui consultent ou achètent les mêmes produits. Mais on peut aussi lui fournir des objets pré-construits avec des données bien à nous.

Quoi de plus simple alors que de récupérer les amis Facebook et les followers Twitter de notre utilisateur, voir lesquels sont déjà inscrits sur la plateforme de vente et demander à Mahout de créer un nouvel espace de recommandation avec ces données. L’avantage est double :

  • les recommandations personnalisées seront encore plus précises puisque basées sur des proches ayant potentiellement les mêmes centres d’intérêts,
  • la possibilité de fournir des recommandations dès l’inscription de l’utilisateur sur le site alors même qu’il n’a encore consulté aucun produit.

Analyse des centres d’intérêt

Je vais ici m’éloigner un peu de Mahout tout en restant dans la recommandation de produits.

Le second gros jeu de données extractibles des réseaux sociaux est l’ensemble des “Like” et des “Follow” d’un utilisateur. En filtrant ces données pour ne conserver que les entrées à propos de marques, produits, genres de films, activités sportives, etc. il est possible de constituer un ensemble de mots-clés susceptibles de correspondre à des produits que nous vendons et qui pourront être recommandés à l’utilisateur.

Ce type de recommandations peut s’appuyer sur un autre des projets de la fondation Apache : Lucene, ou sur son “héritier” ElasticSearch, tous deux des moteurs de recherche distribués.

Alors pourquoi ne pas injecter ces données dans un DataModel Mahout ?

Il semblerait logique par exemple d’attribuer une préférence de 10 à tous les produits électroménagers de cette célèbre marque dont l’utilisateur vient juste de “liker” la page, puis de laisser Mahout faire le difficile travail de clustering et classification. Le problème est que Mahout ne recommande pas les objets directement liés à l’utilisateur, ce qui semble logique sinon on se verrait recommander les produits qu’on vient de visiter. Il faut donc faire ces calculs “manuellement” en trouvant des règles de classification pertinentes (nombre d’occurrences, âge du “Like”, etc).

En conclusion

Au cours de ces deux articles j’ai pu vous présenter rapidement comment s’utilisait Apache Mahout Taste et quelques pistes étudiées pour étendre ses fonctionnalités. L’algorithme en lui-même n’est bien sûr pas réservé qu’aux seules applications e-commerce, la puissance des recommandations personnalisées peut être utilisée pour des choses aussi diverses que les suggestions de comptes Twitter ou de chaînes YouTube. Pourquoi ne pas imaginer l’utiliser pour suggérer des actions ou des activités sur les très lourds logiciels de CRM et gestion d’actifs ?

Les applications sont presque infinies !

Ingénieur Java

0 commentaires

votre commentaire

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Inscription newsletter

Ne manquez plus nos derniers articles !