TP : L'algorithme de recommandation — Comment TikTok/YouTube vous connaît
Thème : Arbres de décision et algorithmes de recommandation
Contexte
En 2026, les algorithmes de recommandation sont omniprésents : TikTok, YouTube, Spotify, Netflix... Ces plateformes utilisent des arbres de décision pour prédire vos goûts et vous proposer du contenu personnalisé.
Dans ce TP, vous allez construire un mini-système de recommandation de films basé sur un arbre binaire de décision.
Partie 1 : Comprendre l'arbre de décision
Un arbre de décision pose des questions binaires (oui/non) pour classifier des données.
Exemple
Aimes-tu l'action ?
/ \
OUI NON
| |
Aimes-tu la SF ? Aimes-tu la romance ?
/ \ / \
OUI NON OUI NON
| | | |
"Matrix" "Die Hard" "Titanic" "Le Parrain"
Questions préliminaires
-
Quel film sera recommandé à quelqu'un qui aime l'action mais pas la SF ?
-
Combien de questions faut-il poser au maximum pour recommander un film ?
-
Si on veut recommander 16 films différents, combien de questions faudra-t-il poser au maximum ? (Indice : pensez à la hauteur de l'arbre)
Partie 2 : Modélisation avec une classe
Nous allons créer une classe NoeudDecision pour représenter notre arbre.
Structure d'un nœud
Un nœud peut être : - Un nœud interne : il contient une question et deux sous-arbres (oui/non) - Une feuille : elle contient une recommandation (un film)
Exercice 1 : Compléter la classe
class NoeudDecision:
def __init__(self, question=None, film=None):
"""
Crée un nœud de l'arbre de décision.
Si film is not None : c'est une feuille (recommandation)
Sinon : c'est un nœud interne avec une question
Paramètres:
question (str): La question à poser (None si feuille)
film (str): Le film à recommander (None si nœud interne)
"""
self.question = question
self.film = film
self.oui = None # Sous-arbre si réponse = oui
self.non = None # Sous-arbre si réponse = non
def est_feuille(self):
"""Retourne True si ce nœud est une feuille (recommandation)."""
# À compléter
pass
def __str__(self):
"""Représentation textuelle du nœud."""
if self.est_feuille():
return f"Film: {self.film}"
else:
return f"Question: {self.question}"
Partie 3 : Construction de l'arbre
Exercice 2 : Construire l'arbre d'exemple
Complétez la fonction suivante pour construire l'arbre de décision présenté en partie 1.
def construire_arbre_films():
"""Construit et retourne l'arbre de recommandation de films."""
# Création des feuilles (recommandations)
matrix = NoeudDecision(film="Matrix")
die_hard = NoeudDecision(film="Die Hard")
titanic = NoeudDecision(film="Titanic")
parrain = NoeudDecision(film="Le Parrain")
# Création des nœuds internes (questions)
# À compléter...
# Retourner la racine de l'arbre
pass
Exercice 3 : Tester la construction
# Créer l'arbre
arbre = construire_arbre_films()
# Vérifier la structure
print(arbre) # Doit afficher la question racine
print(arbre.oui) # Doit afficher la question sur la SF
print(arbre.oui.oui) # Doit afficher "Film: Matrix"
Partie 4 : Parcours et recommandation
Exercice 4 : Fonction de recommandation interactive
Complétez la fonction suivante qui parcourt l'arbre en posant les questions à l'utilisateur :
def recommander(noeud):
"""
Parcourt l'arbre de décision en posant des questions à l'utilisateur.
Retourne le film recommandé.
"""
# Cas de base : on est sur une feuille
if noeud.est_feuille():
return noeud.film
# Afficher la question et récupérer la réponse
print(noeud.question)
reponse = input("Votre réponse (oui/non) : ").lower().strip()
# Suivre la branche correspondante
# À compléter...
pass
Exercice 5 : Programme principal
def main():
print("=== Système de recommandation de films ===\n")
arbre = construire_arbre_films()
film = recommander(arbre)
print(f"\n>>> Je vous recommande : {film}")
# Lancer le programme
main()
Partie 5 : Enrichir l'arbre
Exercice 6 : Ajouter des films
Modifiez la fonction construire_arbre_films() pour ajouter au moins 4 films supplémentaires en créant de nouvelles questions.
Suggestions de questions : - "Préférez-vous les films récents (après 2010) ?" - "Aimez-vous les films avec beaucoup d'humour ?" - "Préférez-vous les films européens ?"
Exercice 7 : Affichage de l'arbre
Écrivez une fonction qui affiche l'arbre de manière indentée :
def afficher_arbre(noeud, niveau=0):
"""
Affiche l'arbre de décision de manière indentée.
Exemple de sortie attendue:
Aimes-tu l'action ?
├── OUI: Aimes-tu la SF ?
│ ├── OUI: Matrix
│ └── NON: Die Hard
└── NON: Aimes-tu la romance ?
├── OUI: Titanic
└── NON: Le Parrain
"""
# À compléter
pass
Partie 6 : Statistiques sur l'arbre
Exercice 8 : Hauteur de l'arbre
Écrivez une fonction récursive qui calcule la hauteur de l'arbre de décision.
Exercice 9 : Nombre de films
Écrivez une fonction qui compte le nombre de films (feuilles) dans l'arbre.
def nombre_films(noeud):
"""Retourne le nombre de films (feuilles) dans l'arbre."""
# À compléter
pass
Exercice 10 : Liste de tous les films
Écrivez une fonction qui retourne la liste de tous les films de l'arbre.
Partie 7 : Pour aller plus loin (Bonus)
Réflexion : vers le Machine Learning
En réalité, les algorithmes de recommandation modernes apprennent automatiquement l'arbre à partir de données.
Question de réflexion :
Imaginez que vous avez une base de données de 1000 utilisateurs avec : - Leurs réponses aux questions (oui/non) - Le film qu'ils ont finalement aimé
Comment pourriez-vous automatiquement construire le "meilleur" arbre de décision ?
Indice : Il faudrait choisir à chaque nœud la question qui "sépare" le mieux les utilisateurs selon leurs préférences.
Recherche
L'algorithme ID3 (Iterative Dichotomiser 3) est un algorithme classique pour construire des arbres de décision.
- Faites une recherche sur cet algorithme.
- Qu'est-ce que l'entropie dans ce contexte ?
- Comment ID3 choisit-il la meilleure question à poser à chaque nœud ?
Résumé des notions travaillées
| Notion | Application dans ce TP |
|---|---|
| Arbre binaire | Structure de l'arbre de décision |
| Nœud / Feuille | Questions / Recommandations |
| Parcours d'arbre | Fonction recommander() |
| Récursivité | Hauteur, comptage, affichage |
| POO | Classe NoeudDecision |
Auteur : Florian Mathieu
Licence CC BY NC
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.