[Cognitives services / Azure] Utiliser l’API de recommandations

Auteur du billet de blog : Nicolas Hilaire - Neotech Solutions

Nicolas Hilaire

Consultant .NET
  Publié le vendredi 27 janvier 2017

Artisan logiciel particulièrement intéressé par les technologies .NET. Polyvalent et curieux, je suis néanmoins à l'écoute des autres technologies du marché. MVP (Microsoft Most Valuable Professional) de 2007 à 2014, je suis également auteur d'un ouvrage pour apprendre le C#, à destination des débutants et de plusieurs MOOCs sur le C#, Windows Phone ou ASP.NET MVC...

L'API de recommandations des cognitives services

Les recommandations personnalisées sont devenues plutôt banales. Rares sont les sites d’e-commerce qui ne proposent pas des achats en plus car « d’autres clients ont acheté des produits similaires ». Il y a aussi ces autres recommandations sur un film à voir car vous en avez aimé un autre (façon Netflix), ...

Oui c’est très banal, par contre quand on y réfléchit, ce sont des algorithmes plutôt complexes à mettre en œuvre. Sauf, si vous utilisez des algorithmes déjà tout fait bien sûr :). Et c’est justement ce que nous propose l'API de recommandation des cognitives services de Microsoft. Si vous ne connaissez pas ces cognitives services, je vous invite à aller faire un tour sur le site web https://www.microsoft.com/cognitive-services/en-us/apis où vous trouverez un ensemble d’API « intelligentes » vous permettant de faire de la reconnaissance vocale, d’images, d’émotions, du traitement automatique de la langue naturelle, etc.
Dans ce billet, nous allons donc voir l'API de recommandation :

 

 

Nous allons voir dans ce billet comment s’en servir très simplement.

 

Le projet


Imaginons que nous ayons un site de vente de bières (à consommer avec modération bien sûr :) ). Il fonctionne - tout va bien - mais nous aimerions l’enrichir et permettre de recommander à nos clients d’autres bières.
Pour ce faire, la première chose est de créer un nouveau Cognitive Services APIs.

Dans le portail Azure, cliquez sur New, Intelligence + analytics et choisissez Cognitive Services APIs (preview).

 

 

(certaines APIs sont encore en preview, dont celle de recommandations).
Nous devons maintenant entrer un nom et le type d’API que nous voulons utiliser, à savoir les API de recommandations :

 

 

Elles ne sont pour l’instant disponibles que sur la région West US.
Vous pouvez ensuite choisir un pricing. Pour les tests je vous conseille le F0 qui est le tier gratuit et qui permet de faire 10000 requêtes par mois (ce qui est déjà bien !) :

 

 

Choisissez un groupe de ressources ou créez-en un nouveau et cliquez sur Create ; le déploiement prend seulement quelques secondes.
Ensuite, passez sur l’interface de recommandations ; vous avez le lien directement depuis la page d’accueil :

 

 

Vous pouvez aussi y accéder directement en utilisant l’url https://recommendations-portal.azurewebsites.net/. Vous devez vous loguer avec votre clé d’API. Pour la connaitre, retournez sur le portail Azure, cherchez votre cognitive service et cliquez sur Keys :

 

 

Copiez la clé 1 par exemple et collez-là dans l’emplacement pour vous loguer :

 

 

Nous allons maintenant créer un nouveau projet, pour ce faire donnez-lui un nom et cliquez sur Add Project :

 

poin 

Nous arrivons sur une interface où nous allons avoir la possibilité d’envoyer des données qui serviront à l’apprentissage de l’algorithme.
Première chose : le catalogue des données. Il s’agit d’un simple fichier CSV à uploader, contenant votre catalogue de produits à recommander. En général, ce sont des données que vous possédez déjà ; et vous allez commencer à écrire du SQL pour préparer les données qui vont bien. La description des données à envoyer est disponible ici (lien Schema dans l'interface) mais grosso modo il faut fournir des informations sous cette forme :

Id, Item Name, Item Category, [Description], Features list

  • Id est l’identifiant unique de la bière (obligatoire)
  • Item name, le nom bien sûr (obligatoire)
  • La catégorie de la bière (obligatoire)
  • La description (facultatif)
  • Et des caractérisques (facultatif aussi)
    • Les caractéristiques sont à envoyer de la forme
    • carac1=valeur1, carac2=valeur2

Pour mon catalogue de bières, j’ai déjà toutes ces infos et je me suis créé une petite requête pour extraire ces données :

 

 

 

A noter que j’ai considéré que la catégorie de mes produits était le type de bière, j’aurais pû peut-être choisir la couleur mais là c’est comme vous voulez. Me voici donc avec un fichier CSV, dont le séparateur est le point-virgule ( ; ). Il me reste à l’uploader dans l’interface :

 

 

 

Maintenant, il faut faire pareil pour les usages. Il s’agit ici d’un fichier où on va mettre en relation des identifiants d’utilisateurs avec un identifiant produit et une action (en l’occurrence un achat !). Vous trouverez la description du format ici (lien Schema dans l'interface) et nous devons fournir le format suivant :
User Id, Item Id, Time , [Event type]

  • User id, l’identifiant de l’utilisateur bien sûr (obligatoire)
  • Item id, l’identifiant de la bière (obligatoire)
  • La date de l’événement sous la forme YYYY-MM-DDTHH:MM:SS (obligatoire)
  • Le type de l’événement (facultatif), qui est à choisir parmi les valeurs suivantes
    o Click
    o RecommendationClick
    o AddShopCart
    o RemoveShopCart
    o Purchase

Pour ma part, comme il s’agit d’achats uniquement, je lie un utilisateur à une bière via un événement Purchase. Voici la requête SQL que j’ai écrite :

 

 

Voici mon nouveau fichier, qui lui doit être séparé par des virgules ( , ), ne me demandez pas pourquoi, mais quand je l’envoie avec des points-virgules cela échoue :

 

 

Il n’y a plus qu’à cliquer sur New Build. Il faut choisir le type de recommandations que vous souhaitez, à savoir :

 

 

Note : Vous ne pouvez pas utiliser Rank en mode gratuit.

Entre FBT (Frequently Bought Together) et recommendation, il s’agit juste d’une différence d’algorithmes, chacun avec ses forces et ses faiblesses. Pour en savoir plus : https://docs.microsoft.com/en-us/azure/cognitive-services/cognitive-services-recommendations-buildtypes.

Je choisis Recommendation pour ma part, puis je clique sur Build. Là, ça va prendre un petit peu de temps car il entraîne le modèle.

Quelques minutes plus tard, la construction est terminée.

 

 

Vous pouvez cliquer sur Score pour vérifier ce que la recommandation propose. Je mets dans mon panier deux bières par exemple, il m’en propose quelques-unes en recommandation :

 

Recommandations par code


Bon, tout ça c’est très bien, mais pour que ça soit utile dans nos applications, il faut écrire du code maintenant et interroger ce résultat de manière automatique.
En fait, sur cet algorithme, il y a deux types de recommandations possible. Le item-to-item (c’est ça que l’on voit dans l’exemple de l’interface) et le user-recommendation. Celle qui m’intéresse, c’est celle qui permet d’avoir des recommandations en fonction de ce que les autres utilisateurs ont acheté.
Pour interroger ce résultat de manière automatique, nous avons une API à notre disposition. Vous allez avoir besoin de votre clé d’API (que vous passerez dans le header de la requête), du numéro de build que nous venons de construire (pour mon exemple 1605133) et de l’id du modèle (ici 900968a7-6fe3-47c4-8e81-0c29c1e28e7c) :

 

 

L’url de l’API à appeler sera :

 

 

et voici le code complet permettant d’obtenir des recommandations pour mon userId :

 

 

Avec les POCO suivants qui nous permettent de désérialiser la réponse :

 

 

Nous obtenons :

 

 

Entrainer le modèle automatiquement


Alors, la construction du modèle via l’interface web, c’est très bien pour démarrer, mais on ne peut raisonnablement pas utiliser ça pour entraîner régulièrement son modèle. Il faut un moyen automatisé pour le faire. Et ça tombe bien, car il y a d’autres APIs disponibles pour ce faire. Il y a d’ailleurs un excellent bout de code qui permet de faire ça à cet emplacement : https://github.com/microsoft/Cognitive-Recommendations-Windows.


Il montre quelles APIs il faut utiliser pour uploader le catalog et les usages afin obtenir l’id du modèle et le numéro du build. Je vous encourage à y jeter un coup d’œil et à vous en servir allègrement pour entrainer de manière automatique votre modèle.
On pourrait envisager judicieusement d’entraîner notre modèle une fois par jour, avec une Azure function par exemple ou un web job.


Limitations


Vous avez pu constater comme c’était facile pour faire de la recommandation. Je pense par contre qu’en l’état, le produit est encore incomplet. Dans mon cas, je souhaiterais aussi pouvoir me baser sur des évaluations des produits. En effet, on ne peut pas fournir de « note » au produit que l’on a acheté. L’algorithme considère que si le produit a été acheté alors c’est qu’il a de l’intérêt. Pour des bières, on peut ne pas avoir aimé telle sorte de bière et dans ce cas l’algorithme devrait pouvoir recommander des bières qui ne sont pas comme celles que je n’ai pas aimé.


Conclusion


L’API de recommandation, malgré cette limitation, constitue quand même un moyen très simple d’ajouter des recommandations à ses utilisateurs et augmenter ainsi les ventes liées à un produit. Les algorithmes de recommandations peuvent être compliqués à implémenter from scratch ; aussi avec une API qui fait l’apprentissage toute seule et réalise de manière automatique la prise de décision, cela devient très facile pour un coût réduit. Et à part si vous souhaitez faire plus de 50 millions d’appels par mois, le prix peut s’avérer raisonnable pour un coût d’implémentation proche de zéro.
Si vous avez besoin de plus de contrôle sur l’algorithme, n’hésitez pas à aller faire un tour du côté du studio de machine learning d’Azure (https://studio.azureml.net/).

 

Commentaires

Ecrit par DURIEUX, vendredi 26 mai 2017

Bonjour, Tout d\'abord merci pour ce petit tutoriel, très facile à mettre en place grâce à vos explications ! J\'ai donc créé un modèle de recommandation produits, avec environ 120 000 clients, 575 000 commandes pour 15 000 produits distincts. Cependant, une fois le modèle créé, et que j\'essaye le "score" pour le tester, peu importe quel produit je met dans le panier, il me propose toujours les mêmes produits ! Je me demandais si vous aviez une explication de ce résultat étrange ? Merci ! J.D