Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Système de recommandation : filtrage collaboratif

Après cette leçon: Je peux recommander un article à partir de ce qu’ont aimé des utilisateurs semblables.

Leçon de 60 min2 commandesLab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Comment recommande-t-on un livre ?

Un système de recommandation propose à une personne des articles qu’elle n’a pas encore vus, comme un livre à emprunter. Il s’appuie sur ce que des personnes semblables ont aimé : c’est le filtrage collaboratif.

Vous allez mesurer la ressemblance entre deux lecteurs, puis calculer un score pour chaque livre.

À la fin de cette leçon

Remarque

Je peux recommander un article à partir de ce qu’ont aimé des utilisateurs semblables.

Mots clés

MotCe que ça veut direExemple
Filtrage collaboratifrecommander d’après ce qu’ont aimé des personnes semblables
Similaritéun nombre de 0 à 1 qui dit à quel point deux goûts se ressemblent
Score de recommandationla somme des similarités des personnes qui ont aimé l’article
Démarrage à froidle manque d’historique pour un nouvel utilisateur ou article
Articletout ce qu’on peut recommanderun livre

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Des lecteurs semblables aiment les mêmes livres

Une médiathèque garde la liste des livres que chaque lecteur a aimés. Pour mesurer la ressemblance, on compte les livres en commun.

On divise ce nombre par le total des livres différents que les deux ont aimés. Le résultat, la similarité, va de 0 (rien en commun) à 1 (les mêmes goûts).

Exemple travaillé : cinq lecteurs

LecteurLivres aimésEn commun avec AwaLivres différentsSimilarité
Awagerminal, candide, zadig
Bastiencandide, zadig, nana, carmen250,4
Camillegerminal, nana, bel-ami150,2
Dinacarmen, nana, bel-ami060
Émilegerminal, zadig, nana240,5

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Calculer la similarité avec chaque lecteur

Code: python
aimes = {
    "awa": ["germinal", "candide", "zadig"],
    "bastien": ["candide", "zadig", "nana", "carmen"],
    "camille": ["germinal", "nana", "bel-ami"],
    "dina": ["carmen", "nana", "bel-ami"],
    "emile": ["germinal", "zadig", "nana"],
}

def similarite(a, b):
    communs = 0
    for livre in a:
        if livre in b:
            communs = communs + 1
    return communs / (len(a) + len(b) - communs)

utilisateur = "awa"
for autre in aimes:
    if autre != utilisateur:
        print(autre, round(similarite(aimes[utilisateur], aimes[autre]), 2))
# Changez utilisateur en "dina" et relancez.

Le score d’un livre additionne les ressemblances

Pour recommander à Awa, on regarde les livres qu’elle n’a pas lus. Chaque lecteur qui a aimé un de ces livres « vote » avec sa similarité.

Le score de recommandation d’un livre est la somme de ces votes. On propose le livre au plus grand score.

Exemple travaillé : les scores pour Awa

LivreAimé parCalculScore
nanaBastien, Camille, Dina, Émile0,4 + 0,2 + 0 + 0,51,1
carmenBastien, Dina0,4 + 00,4
bel-amiCamille, Dina0,2 + 00,2

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Dans le labo, deux commandes de calcul

Le labo ne contient pas de lecteurs : il sert ici de calculatrice. Chaque commande porte ses données dans la ligne et n’écrit aucun fichier.

La première affiche trois nombres pour Awa et Bastien : les livres en commun, les livres différents, puis la similarité. La seconde affiche le score de trois livres pour Awa.

Mesurer Awa et Bastien

Commande
docker exec jupyter python3 -c "a = ['germinal', 'candide', 'zadig']; b = ['candide', 'zadig', 'nana', 'carmen']; s = len([x for x in a if x in b]); print(s, len(a) + len(b) - s, round(s / (len(a) + len(b) - s), 2))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Calculer les scores pour Awa

Commande
docker exec jupyter python3 -c "U = {'awa': ['germinal', 'candide', 'zadig'], 'bastien': ['candide', 'zadig', 'nana', 'carmen'], 'camille': ['germinal', 'nana', 'bel-ami'], 'dina': ['carmen', 'nana', 'bel-ami'], 'emile': ['germinal', 'zadig', 'nana']}; sim = lambda a, b: len([x for x in a if x in b]) / (len(a) + len(b) - len([x for x in a if x in b])); print({l: round(sum(sim(U['awa'], U[u]) for u in U if u != 'awa' and l in U[u]), 2) for l in ('nana', 'carmen', 'bel-ami')})"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Un système de recommandation a des limites

On peut aussi comparer les livres entre eux : deux livres se ressemblent si les mêmes lecteurs les ont aimés. Le calcul est le même, avec les rôles échangés.

Mais un nouveau lecteur n’a pas d’historique, donc personne de semblable. C’est le démarrage à froid. Un livre que personne n’a encore lu n’est jamais proposé.

Une erreur fréquente

Attention

Beaucoup pensent qu’un système de recommandation comprend les goûts d’une personne. Il ne fait que compter ce qu’ont fait des personnes semblables. Sans historique, il n’a rien à compter, et il propose surtout ce qui est déjà populaire.

Pour aller plus loin

Ajoutez un sixième lecteur dont la liste n’a aucun livre en commun avec les autres. Recalculez les scores pour Awa.

Dites si ce lecteur change la recommandation, puis expliquez pourquoi il ne peut rien apporter à un nouveau lecteur qui n’a rien lu.

À propos de ce labo et de sa source: Lab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.