Une méthode de recommandation qui ignore le contenu des produits et regarde seulement qui a aimé quoi. Deux produits appréciés par les mêmes clients sont jugés proches ; on propose à chacun les voisins de ce qu'il a aimé. C'est le principe du « les clients qui ont aimé ceci ont aussi aimé cela ».
Un libraire se souvient que les lecteurs qui ont aimé tel polar ont aussi adoré tel autre. Il ne les a pas forcément lus : il s'appuie sur les goûts de sa clientèle.
Une ligne par client, une colonne par produit, la note dans la case. La plupart des cases sont vides : chaque client n'a noté qu'une poignée de produits.
Deux produits se ressemblent si les mêmes clients les notent au-dessus ou en dessous de leur moyenne. On calcule une similarité cosinus sur les notes centrées sur chaque client.
Pour un client, chaque produit reçoit la moyenne de ses écarts de note sur les produits ressemblants qu'il a déjà notés, pondérée par la similarité. On propose les meilleurs scores.
600 clients, 120 produits, environ 10 800 notes : chaque client en a donné entre 8 et 29. On garde 20 % des notes de côté pour vérifier les recommandations.
Pour chaque client, les produits qu'il n'a pas encore notés sont classés par score. Les 5 premiers alimentent la page d'accueil ou l'email personnalisé.
Dans l'exemple Python, sur les notes mises de côté, 47 % des produits du quart le mieux scoré ont reçu 4 ou 5, contre 28 % en moyenne. Cette précision parle davantage au métier que l'erreur sur la note.
Noms donnés pour recommenderlab en R ; en Python, l'exemple est écrit avec pandas et scikit-learn.
Comparer les produits entre eux (item-based) ou les clients entre eux (user-based). L'item-based est souvent préféré en e-commerce : il y a moins de produits que de clients et leurs similarités changent peu.
Nombre de produits ressemblants retenus. Trop peu, la recommandation dépend du hasard ; trop, elle se dilue vers la moyenne. recommenderlab en prend 30 par défaut, l'exemple 20.
Cosinus ou corrélation de Pearson, calculés sur des notes centrées sur la moyenne de chaque client. Le centrage corrige les clients qui notent tout haut ou tout bas.
Pour évaluer une liste de recommandations, il faut dire à partir de quelle note un produit est aimé : ici 4 sur 5. Ce seuil change fortement la précision affichée.
# Recommandation produits : filtrage collaboratif (item-based) en R
library(recommenderlab)
notes <- read.csv("notes_produits.csv")
# Matrice creuse clients x produits (colonnes : client, produit, note)
mat <- as(notes, "realRatingMatrix")
set.seed(42)
# 80 % des clients pour apprendre ; pour les autres, 5 notes connues et le reste à retrouver
schema <- evaluationScheme(mat, method = "split", train = 0.8, given = 5, goodRating = 4)
algos <- list(item_based = list(name = "IBCF", param = list(k = 20)),
populaires = list(name = "POPULAR", param = NULL),
hasard = list(name = "RANDOM", param = NULL))
resultats <- evaluate(schema, algos, type = "topNList", n = c(5, 10))
# Précision : part des produits recommandés que le client a réellement aimés (note >= 4)
print(lapply(avg(resultats), function(r) round(r[, c("precision", "recall")], 3)))
# Les 5 produits à mettre en avant pour le client 1
modele <- Recommender(mat, method = "IBCF", parameter = list(k = 20))
print(as(predict(modele, mat["1", ], n = 5), "list"))
# Recommandation produits : filtrage collaboratif (item-based) en Python
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics.pairwise import cosine_similarity
notes = pd.read_csv("notes_produits.csv")
train, test = train_test_split(notes, test_size=0.2, random_state=42)
# Matrice clients x produits, centrée sur la moyenne de chaque client (0 = pas de note)
mat = train.pivot_table(index="id_client", columns="id_produit", values="note")
centre = mat.sub(mat.mean(axis=1), axis=0)
sim = pd.DataFrame(cosine_similarity(centre.fillna(0).T), index=mat.columns, columns=mat.columns)
def score(client, produit, k=20):
deja = centre.loc[client].dropna() # écarts à sa moyenne sur les produits notés
voisins = sim.loc[produit, deja.index].nlargest(k) # les k produits notés les plus ressemblants
voisins = voisins[voisins > 0]
return (voisins * deja[voisins.index]).sum() / voisins.sum() if voisins.sum() > 0 else 0.0
# Test : les produits les mieux scorés sont-ils vraiment aimés (note >= 4) ?
test["score"] = [score(c, p) for c, p in zip(test.id_client, test.id_produit)]
top = test.score >= test.score.quantile(0.75)
print("Part de produits aimés, quart le mieux scoré :", round((test.note[top] >= 4).mean(), 2))
print("Part de produits aimés, ensemble du test :", round((test.note >= 4).mean(), 2))
# Les 5 produits à mettre en avant pour le client 1, parmi ceux qu'il n'a pas notés
candidats = mat.columns[mat.loc[1].isna()]
print(pd.Series([score(1, p) for p in candidats], index=candidats).nlargest(5).round(2))
Le filtrage collaboratif s'appuie uniquement sur les comportements : qui a aimé quoi. La recommandation par contenu s'appuie sur les caractéristiques des produits : description, catégorie, prix. Les systèmes en production combinent souvent les deux (approche hybride).
Un nouveau produit n'a encore reçu aucune note : aucune similarité ne peut être calculée et il n'est jamais recommandé. Même chose pour un nouveau client. On y répond par des recommandations de popularité ou par contenu, en attendant les premières interactions.
Hors ligne, on cache une partie des notes et on mesure la précision (part des recommandations aimées) et le rappel (part des produits aimés retrouvés). En ligne, seul un test A/B mesure l'effet réel sur le panier et le chiffre d'affaires.
Résume les goûts en quelques facteurs cachés. Mieux adaptée aux matrices très clairsemées et aux grands volumes.
Voir la fiche → le complémentRecommande à partir des descriptions produits. Fonctionne pour un produit tout juste mis en ligne.
Voir la fiche → l'analyse du panierCherche les produits achetés ensemble dans un même ticket, sans personnalisation par client.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus