Systèmes de Recommandation : de Netflix à Spotify
Découvrez comment Netflix, Spotify et Amazon construisent leurs moteurs de recommandation. De la factorisation matricielle aux two-tower models, maîtrisez les algorithmes et les métriques.
Les systèmes de recommandation
80% des contenus regardés sur Netflix proviennent des recommandations. Ces systèmes sont parmi les applications ML les plus impactantes.
| Approche | Principe | Exemple réel |
|---|---|---|
| Collaboratif | Utilisateurs similaires → mêmes goûts | Netflix "ceux qui ont regardé X ont aimé Y" |
| Basé contenu | Items similaires à ce qu'on a aimé | Spotify : BPM, tonalité, énergie similaires |
| Hybride | Combine les deux | Amazon : collaboratif + contenu + contexte |
1. Collaborative Filtering : user-based vs item-based
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# Matrice utilisateur-film (0 = pas vu, 1-5 = note)
ratings = np.array([
[5, 4, 0, 0, 1],
[4, 0, 0, 1, 2],
[0, 0, 5, 4, 0],
[0, 1, 4, 5, 0],
[1, 0, 0, 0, 5],
])
# Similarité entre utilisateurs
user_sim = cosine_similarity(ratings)
print("Similarité User 0 vs tous :", user_sim[0].round(3))
L'item-based est souvent préféré en production : la matrice items est plus stable dans le temps (moins de nouveaux items que de nouveaux utilisateurs).
2. Matrix Factorization : facteurs latents
La matrice utilisateur-item est creuse (sparse) : un utilisateur typique note 0.1% des films. SVD décompose la matrice R en facteurs latents :
R ≈ U × Σ × Vᵀ
- U : profils utilisateurs (goûts implicites)
- Vᵀ : profils films (caractéristiques latentes)
Les facteurs capturent des concepts comme "films d'action des années 80" sans jamais les définir explicitement.
3. Micro-exercice : recommandation de films avec SVD
import numpy as np
from sklearn.decomposition import TruncatedSVD
ratings = np.array([
[5, 4, 0, 0, 1],
[4, 0, 0, 1, 2],
[0, 0, 5, 4, 0],
[0, 1, 4, 5, 0],
[1, 0, 0, 0, 5],
], dtype=float)
# SVD avec k=2 facteurs latents
svd = TruncatedSVD(n_components=2, random_state=42)
user_factors = svd.fit_transform(ratings)
item_factors = svd.components_.T
# Reconstruction complète : prédit les cases vides
predicted = user_factors @ item_factors.T
films = ["Inception", "La La Land", "The Revenant", "Interstellar", "Parasite"]
print("Scores prédits pour l'utilisateur 0 :")
for film, score in zip(films, predicted[0]):
seen = "✓ déjà vu" if ratings[0, films.index(film)] > 0 else "→ à recommander"
print(f" {film:15s} : {score:.2f} {seen}")
4. Content-based Filtering
import numpy as np
# Features de films (genre one-hot + durée normalisée)
item_features = np.array([
[1, 0, 0, 1, 0.7], # Action + Sci-Fi, long
[0, 1, 0, 0, 0.4], # Comédie, court
[1, 0, 1, 0, 0.8], # Action + Drame, long
])
user_ratings = np.array([5, 0, 4]) # 0 = pas vu
mask = user_ratings > 0
user_profile = np.average(item_features[mask], weights=user_ratings[mask], axis=0)
scores = item_features @ user_profile
print("Scores de recommandation :", scores.round(3))
5. Le Cold Start Problem
Le problème du démarrage à froid est l'un des défis majeurs en production.
| Type | Problème | Solutions |
|---|---|---|
| Nouvel utilisateur | Aucun historique | Onboarding (sélection initiale), popularité |
| Nouvel item | Aucune note | Content-based sur features, early adopters |
6. Two-Tower Models : l'architecture industrielle
Les embeddings items sont précalculés une fois et indexés avec FAISS. Au moment de la requête, seul le user embedding est calculé → recherche ANN en millisecondes sur des millions d'items.
YouTube sert des recommandations en < 100ms sur un catalogue de 800 millions de vidéos grâce à cette architecture.
7. Métriques d'évaluation
def precision_at_k(recommended, relevant, k):
hits = len(set(recommended[:k]) & set(relevant))
return hits / k
def ndcg_at_k(recommended, relevant, k):
import numpy as np
dcg = sum(1/np.log2(i+2) for i, item in enumerate(recommended[:k]) if item in relevant)
idcg = sum(1/np.log2(i+2) for i in range(min(len(relevant), k)))
return dcg / idcg if idcg > 0 else 0
recommended = ["Inception", "La La Land", "Interstellar", "Parasite", "Dune"]
relevant = ["Inception", "Interstellar", "Blade Runner 2049"]
print(f"Precision@3 : {precision_at_k(recommended, relevant, 3):.2f}")
print(f"NDCG@5 : {ndcg_at_k(recommended, relevant, 5):.3f}")
| Métrique | Ce qu'elle mesure |
|---|---|
| Precision@K | Qualité des K résultats |
| Recall@K | Couverture du catalogue pertinent |
| NDCG@K | Qualité + ordre des résultats |
| Hit Rate | Au moins 1 bon résultat dans @K |
8. LLM as Recommender : tendance 2026
Les LLMs fine-tunés sur des historiques d'interactions dépassent les two-tower models sur les datasets cold-start (méta, Google, Baidu 2025).
Avantages : compréhension sémantique, zero-shot sur nouveaux items, explicabilité. Limites : coût d'inférence prohibitif à l'échelle, hallucinations, latence incompatible avec le temps réel.
Architecture hybride pragmatique : LLM pour l'encodage sémantique + two-tower pour le retrieval à grande échelle.
Specialiste IA — Master Intelligence Artificielle
Diplome d'un Master en Intelligence Artificielle, je travaille au quotidien sur des projets IA en entreprise. J'ai cree IwanttolearnAI pour rendre l'apprentissage de l'IA accessible a tous, gratuitement.
Continuer a apprendre
Séries Temporelles et Prévision avec Python
Apprenez à modéliser et prévoir des séries temporelles avec ARIMA, Prophet et XGBoost. Maîtrisez la validation temporelle correcte et les métriques adaptées.
SVM, Arbres de Décision et Random Forest en Profondeur
Maîtrisez les algorithmes classiques les plus puissants du ML : SVM avec kernel trick, arbres de décision et Random Forest. Comprendre quand ces modèles battent le Deep Learning.
Machine Learning vidéo explicative
Vidéo d'introduction au Machine Learning posant les bases du fonctionnement.