.. _part2_chap4: *********************************************************************** Chapitre 4 : Systèmes de recommandation *********************************************************************** Un **système de recommandation** prédit l'intérêt d'un utilisateur pour des items (films, produits…) à partir d'une matrice **utilisateurs × items** de notes, **creuse** (la plupart des notes manquent). But : prédire les notes manquantes et **recommander** les meilleures. Objectifs ========= À la fin de ce chapitre, vous devez pouvoir : - Distinguer recommandation **basée contenu** et **filtrage collaboratif** - Dérouler le **filtrage collaboratif item-item (top-N)** - Comprendre l'approche par **facteurs latents (SVD)** 1. Généralités ============== - **Basé contenu** : recommander des items **similaires à ceux aimés** par l'utilisateur, à partir de leurs **attributs** (profil d'item). Pas besoin des autres utilisateurs, mais nécessite de bons descripteurs. - **Filtrage collaboratif** (*collaborative filtering*, CF) : exploiter les **notes des autres** utilisateurs. Deux variantes : **user-user** (utilisateurs similaires) et **item-item** (items co-notés similairement) — cette dernière est plus stable et plus utilisée. - **Facteurs latents** : factoriser la matrice de notes pour découvrir des **dimensions cachées** (genre, ton…). 2. Filtrage collaboratif item-item (top-N) ========================================== **Idée** : pour prédire la note de l'utilisateur *u* sur l'item *i*, on regarde les items que *u* a déjà notés et qui **ressemblent** à *i*. **Étape 1 — similarité entre items.** On mesure la similarité entre colonnes (items) de la matrice de notes, typiquement par la **similarité cosinus** (de préférence **centrée**, en retranchant la moyenne de chaque ligne → *Pearson* ajusté, pour neutraliser les biais de notation) : .. math:: \text{sim}(i, j) = \frac{\sum_{u} r_{ui}\, r_{uj}}{\sqrt{\sum_u r_{ui}^2}\,\sqrt{\sum_u r_{uj}^2}} **Étape 2 — top-N voisins.** Pour l'item *i*, garder les **N items les plus similaires** que *u* a notés (voisinage :math:`N(i;u)`). **Étape 3 — prédiction** (moyenne pondérée par la similarité) : .. math:: \hat r_{ui} = \frac{\sum_{j \in N(i;u)} \text{sim}(i,j)\, r_{uj}}{\sum_{j \in N(i;u)} |\text{sim}(i,j)|} **Étape 4 — recommander** les items de plus forte note prédite, non encore vus. .. tip:: Les similarités item-item sont **stables** dans le temps : on peut les **pré-calculer** hors-ligne (et en MapReduce), ce qui rend la recommandation très rapide en ligne. C'est l'objet du **TP1**. 3. Facteurs latents & SVD ========================= **Idée** : approcher la matrice de notes :math:`R` (utilisateurs × items) par le **produit de deux matrices** de faible rang :math:`k` : .. math:: R \approx P\, Q^\top, \qquad \hat r_{ui} = p_u \cdot q_i = \sum_{f=1}^{k} p_{uf}\, q_{if} où :math:`p_u` (resp. :math:`q_i`) est le vecteur de l'utilisateur *u* (resp. de l'item *i*) dans un espace de **k facteurs latents**. **Étapes :** 1. Choisir le nombre de facteurs *k*. 2. **Apprendre** *P* et *Q* en minimisant l'erreur **sur les notes connues**, avec régularisation : .. math:: \min_{P,Q} \sum_{(u,i)\,\text{connus}} \big(r_{ui} - p_u\cdot q_i\big)^2 + \lambda\big(\lVert p_u\rVert^2 + \lVert q_i\rVert^2\big) par **descente de gradient** (SGD) ou **ALS** (*Alternating Least Squares*, qui se parallélise très bien) — la **SVD** donne la meilleure approximation de rang *k* au sens des moindres carrés. 3. **Prédire** :math:`\hat r_{ui} = p_u \cdot q_i` ; recommander les meilleures. C'est l'objet du **TP1\*** (facteurs latents). 4. Autres approches (brève description) ======================================= .. list-table:: :header-rows: 1 :widths: 26 74 * - Approche - Idée * - **CF user-user** - Prédire à partir des **utilisateurs** les plus similaires à *u*. * - **Basé contenu** - Profil d'item (attributs/TF-IDF) + profil d'utilisateur ; recommander par similarité de profils. * - **Hybride** - Combiner contenu + collaboratif (atténue le *cold start*). Exercices ========= .. admonition:: Exercice 1 — Prédiction item-item :class: tip *u* a noté A=5 et B=3. On veut prédire sa note sur *i*, avec ``sim(i,A)=0,8`` et ``sim(i,B)=0,2``. Calculez :math:`\hat r_{ui}`. .. raw:: html
▶ Voir la correction :math:`\hat r_{ui} = \dfrac{0{,}8\times 5 + 0{,}2\times 3}{0{,}8 + 0{,}2} = \dfrac{4{,}6}{1{,}0} = 4{,}6`. .. raw:: html
.. admonition:: Exercice 2 — Pourquoi item-item plutôt que user-user ? :class: tip Donnez deux raisons pour lesquelles le CF **item-item** est souvent préféré au **user-user** à grande échelle. .. raw:: html
▶ Voir la correction (1) Les **similarités entre items** sont plus **stables** que celles entre utilisateurs (les goûts d'un user évoluent ; un film reste le même), donc **pré-calculables hors-ligne**. (2) Il y a souvent **moins d'items que d'utilisateurs**, et chaque item a plus de notes → estimations de similarité plus fiables et matrice de similarité plus petite. .. raw:: html