Trouver la bonne association à l’aide du data mining/machine learning

Trouver la bonne association à l’aide du data mining/machine learning

Ce billet vous propose de découvrir l'intérêt des méthodes du data mining et du machine learning dans le contexte des activités d'un webmaster.

Nous allons utiliser une technique d'association sur un dataset spécifique, avec une application très concrète en tête. Les techniques d'association ont pour objectif de déterminer l'affinité entre des objets. La plupart du temps, on peut résumer les résultats d'une association de manière très simple, en annonçant qu'un objet, par exemple un casque, est souvent utilisé de concert avec un autre objet, par exemple ici une moto.

L'intérêt de ce type de méthode est assez vite évident, avec notamment des applications directes en recommandation de produits ("les clients qui ont acheté des bananes ont aussi acheté des petits suisses Malo", la preuve), en recommandation de contenu ("les lecteurs qui ont apprécié cet article ont aussi lu l'article sur les meilleurs sushi bars de Clermond-Ferrand") mais aussi dans des domaines moins connus comme par exemple la médecine (pour prédire le risque de développer certaines maladies).

L'application qui va nous guider ici est très différente. Imaginons que j'ai sous la main un dataset avec des recettes de cuisine. Il y a plusieurs choses que je peux faire assez facilement, comme notamment proposer à une personne les recettes qu'elle peut réaliser avec ce qu'elle a dans sa cuisine, je peux également lui dire ce qu'il faut acheter au minimum pour réaliser une recette. Mais il y a un problème beaucoup plus amusant : que dois-je lui conseiller d'acheter pour compléter le contenu de sa cuisine, en vue de permettre à cette personne d'avoir le plus grand choix de recettes possible. Si je reformule ce problème, ce que je veux c'est la liste des produits que vous avez chez vous, et je vais vous dire d'acheter tel ou tel chose en plus, de telle manière à avoir une cuisine "la plus complète possible".

Coup de bol, j'ai justement sous la main un dataset avec plein de recettes, et les ingrédients qui les composent. Le dataset est composé de 13 000 recettes du site epicurious qui sont classées par type de cuisine (italienne, asiatique, etc.). Il s'agit d'un dataset anonymisé, qui ne contient que les ingrédients qui composent chaque recette. Pour ce billet, j'ai utilisé les 268 recettes de cuisine française qui sont dans le dataset.
Une ligne typique du dataset correspond à une recette, en voici un exemple :

butter coffee wheat starch cocoa cognac egg milk cream

Pour travailler efficacement, j'ai utilisé R. R est un langage de programmation et un environnement de travail utilisé pour un très grand nombre de tâches dont des analyses statistiques de données, ou encore la création de visualisations graphiques. R est open source et possède aujourd'hui une communauté particulièrement dynamique qui contribue à son développement.

Pour installer R, rien de compliqué, il suffit de télécharger l’archive qui convient à votre système d’exploitation. Pour se servir de R, il existe deux modes de fonctionnement : en ligne de commande (mode interactif) ou en écrivant ces commandes dans des fichiers qui seront interprétés ensuite (scripts). R est un système très riche qui possède de nombreuses fonctionnalités, notamment grâce à son système de packages. Un package est tout simplement une bibliothèque de fonctions utiles, créées par l’équipe de développement de R ou par des tiers. Pour installer un package, on peut passer via l’interface graphique ou via la commande install.packages. Vous pourrez ensuite utiliser le package en le chargeant via la commande library().

Pour proposer des ingrédients "utiles" je vais donc utiliser une technique d'association, que vous pouvez trouver dans le package arules. Je vais donc tout d'abord charger les packages arules et arulesViz (qui permet de visualiser les règles d'association).

> library(arules)
> library(arulesViz)

Deuxième opération, charger le dataset:

> datarec <- read.transactions("recipes.csv", format="basket", sep = ";")

Pour vérifier que tout est OK, je peux rapidement tracer un histogramme montrant les fréquences d'utilisation des ingrédients dans les recettes.

toto

Sans trop de surprise, l'ingrédient star de la cuisine à la française est le beurre^^ puis les oeufs, le blé (en fait la farine de blé), les oignons, etc. Il faut savoir que sur epicurious, les recettes "française" sont assez étonnantes...

Une fois que j'en suis là, et bien le travail est presque fini car pour utiliser l'algorithme d'association, une seule ligne de R suffit:

> rules <- apriori(datarec, parameter = list(supp = 0.01, conf = 0.5,minlen=3))

Ici je viens de créer les associations d'au moins 3 ingrédients. Je peux afficher les associations avec la commande inspect().

                                   lhs                                                                  rhs               support  confidence  lift
31    {cinnamon,ginger}                                                  => {pumpkin}           0.011   0.75          67.00
32    {ginger,pumpkin}                                                   => {cream}                 0.011   1.00          3.44
532   {olive_oil,saffron}                                                 => {tomato}                0.015   0.80         8.58
533   {saffron,tomato}                                                    => {pepper}                0.011   0.75          3.35
9551  {black_pepper,mushroom,olive_oil,onion}   => {garlic}                   0.011   1.00          4.25
9552  {garlic,mushroom,olive_oil,onion}                  => {black_pepper}    0.011   0.60         2.98
9553  {black_pepper,garlic,mushroom,onion}         => {olive_oil}             0.011   0.75          4.37

Au dessus on voit un extrait du résultat, avec quelques règles d'association divers. On voit ainsi (ligne 533) qu'au couple safran + tomate est associé le poivre, avec un support de 0,011, une confiance de 0,75 et un lift de 3,35. Le support, c'est la proportion de recettes qui utilisent les trois ingrédients. La confiance c'est la proportion de recettes qui utilisent du poivre parmi celles qui utilisent safran et tomate. Enfin, le lift est une quantité plus complexe : c'est l'amélioration du résultat apportée par le choix du poivre par rapport au choix d'un troisième ingrédient au hasard quand on a déjà du safran et des tomates.

On peut également représenter graphiquement les règles, par exemple ici j'ai tracé les 19 premières règles d'association à 4 ingrédients.

> rules <- apriori(datarec, parameter = list(supp = 0.01, conf = 0.2,minlen=4))
> plot (rules[1:19],method="graph",shading="confidence")

toto

Mais la lecture graphique est plus compliquée au final que la lecture sur le format texte.

Une fois tout ceci posé, comment faire une proposition de choix d'ingrédients concrète pour un internaute ? Première chose, on lui demande de nous dire ce qu'il a chez lui. Par exemple, j'ai chez moi en ce moment du poulet, du poivre et de l'ail. En utilisant intensivement les commandes vues plus haut avec des opérations de sélection des règles, du type qui suit :

> rules <- apriori (datarec, parameter=list (supp=0.01,conf = 0.15,maxlen=4))
> rules.sub <- subset(rules, subset = lhs %in% c("garlic", "pepper","chicken") & !rhs %in% c("garlic", "pepper","chicken") & lift > 2)
> rules.sub <- sort (rules.sub, decreasing=TRUE,by="lift")

On va obtenir des règles concernant uniquement les ingrédients que l'on possèdent :

      lhs                        rhs            support confidence lift
11117 {chicken,garlic,pepper} => {white_wine}   0.011   0.75       4.9
11176 {chicken,garlic,pepper} => {black_pepper} 0.011   0.75       3.7
11191 {chicken,garlic,pepper} => {cream}        0.011   0.75       2.6
463   {chicken}                            => {ham}             0.045   0.36        5.73
670   {pepper}                             => {lemon_juice}     0.034   0.15        2.01
681   {chicken}                            => {chicken_broth}   0.022   0.18        2.56
692   {pepper}                             => {chicken_broth}   0.034   0.15        2.12
723   {chicken}                            => {swiss_cheese}    0.041   0.33        3.31
768   {chicken}                            => {mushroom}        0.022   0.18        2.12
782   {garlic}                             => {mushroom}        0.056   0.24        2.77
849   {garlic}                             => {bay}             0.041   0.17        2.13
1649  {garlic,pepper}                      => {mussel}          0.015   0.17        7.77

Il faut ensuite choisir ce que l'on va proposer. La métrique clé est ici la confiance, car la confiance va indiquer si on peut faire beaucoup de nouvelles recettes avec le nouvel ingrédient. En arbitrage à confiance égale on utilisera le lift, qui nous donnera l'amélioration. Ici on va donc proposer en priorité à la personne d'acheter du vin blanc, du poivre noir puis de la crème. Il faut bien sûr vérifier à chaque étape que cela permet de faire réellement une recette, sinon il faut refaire le calcul avec le nouvel ingrédient potentiel, pour proposer des achats de groupes d'ingrédients. On pourrait faire directement les calculs sur des groupes, mais cela deviendrait compliqué en terme d'explications pour un simple billet de blog 😉

Voilà, vous savez maintenant comment réaliser un outil qui permet de vous proposer les meilleurs ingrédients pour votre cuisine 😉

Si vous pensez que ces méthodes ont du potentiel, si vous voulez mettre le même type de chose en place, n'hésitez pas à venir à notre formation "Webmarketing, comprendre et utiliser le machine learning" pour comprendre les enjeux du machine learning pour le webmarketing, et pour être capable de mettre en place des outils similaires.

 

Comments ( 6 )

  • Pascal_ccbb

    Salut Sylvain, article interessant mais un poil complexe pour les non dev tel que moi. Je vois que tu regle un support de 0.1. Pourquoi ? Cest un chiffre compris entre quoi et quoi ?
    Idem pour la confiance comment l interpréter? Je suppose que c est un pourcentage 0.75 = 75 %.

    Enfin le lift. Peut tu nous ajouter une interpretation du resultat et ce qu on peut en faire?

    Enfin pour completer ce billet ca serait top de faire un tuto sur une mise en place R de ta fonction sur un site avec la connexion bdd etc.

    Voir un cas pratique avec du scrapping pour un cas d automatisation de content et linking interne par association

    En tout cas super intéressant merci !

  • @Pascal J’ai réglé un support de 0,01 (pas 0,1 ;)) : cela veut dire que je m’intéresse aux groupes d’ingrédients qui sont présents dans au moins 1% des recettes (0,01 = 1%). En dessous il y a peu d’intérêt car cela fait moins de 2 recettes vu la taille du dataset, et le calcul serait beaucoup plus long (et nécessiterait plus de mémoire).
    La confiance est la donnée importante : quand elle vaut 1 cela veut dire que sans l’ingrédient proposé, on ne peut pas faire de recettes avec les ingrédients qui sont à gauche de la flèche. On ne fera donc que rajouter des nouvelles recettes, c’est ce qu’on veut. Quand c’est moins, cela veut dire qu’il faudra d’autres ingrédients en plus si on veut maximiser le nombre de nouvelles recettes. C’est le lift qui permet de voir à quel point le choix d’un ingrédient plutôt qu’un autre amène une grosse amélioration. Plus le lift est haut, mieux c’est.

    Pour les questions techniques, je pose le joker^^ déjà ce n’est pas ma partie mais plutôt celle de Guillaume, et c’est du domaine du facile pour un dev 😉 Mais en plus cela dépend tellement du type de choix d’infrastructure qu’un exemple est rarement pertinent. Comme je dis, pour en savoir plus direction les formations ou nous contacter ^^

  • Vincent Terrasi

    Bonjour Sylvain,

    Merci pour cet article sur l’algorithme Apriori

    Par contre, j’ai deux questions :
    – Le dataset sur la cuisine Française contient 996 éléments, tu as pris les 268 premiers ?

    – Pour l’histogramme, tu ne donnes pas la ligne pour le générer, utilises-tu aussi « itemFrequencyPlot » :
    > itemFrequencyPlot(datarec,topN=20,type= »absolute »)

    Sinon, j’ajouterai juste la visualisation en « balloon plot » qui reste plus facile à interpréter que la visualisation Graph
    > plot (rules[1:19],method= »grouped »,shading= »confidence »)

    Sinon, petite astuce pour le mode Graph, ajoutez le paramètre interactive=TRUE et vous pouvez bouger tous les éléments.
    > plot (rules[1:19],method= »graph »,shading= »confidence »,interactive=TRUE)

    J’espère que tu feras d’autres articles en R, c’est rare d’avoir un contenu aussi détaillé et d’une grande qualité.

  • @Vincent J’ai pris une partie du dataset au hasard 😉 C’était juste pour faire l’article donc je n’ai pas fait trop de zèle.
    Pour l’histogramme j’ai fait exactement ça, pour le balloon plot très bonne idée, j’ n’avais pas pensé à m’en servir pour ça.

    Le mode interactif c’est très bien, en revanche je pense que cela ne fonctionne que si vous avez tcl/tk installé (à vérifier).

    J’ai prévu de parler de R plus souvent maintenant que ça commence à prendre dans la communauté web, avant je gardais tout pour moi. Ce sera sans doute souvent sur mon autre blog (http://une-belle-etoile.fr/) plutôt que sur celui-là, mais il y en aura.

  • Pierre

    Merci Sylvain pour cet article qui me donne envie de me mettre au R !! 😀

    Pierre

  • Py

    Merci Sylvain pour cette article tres interessant.
    Question: pourquoi te baser sur le critere confiance plutot que support?