> **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
1. Quel film sera recommandé à quelqu'un qui aime l'action mais pas la SF ?
2. Combien de questions faut-il poser au maximum pour recommander un film ?
3. 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
```python
classNoeudDecision:
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
defest_feuille(self):
"""Retourne True si ce nœud est une feuille (recommandation)."""
# À compléter
pass
def__str__(self):
"""Représentation textuelle du nœud."""
ifself.est_feuille():
returnf"Film: {self.film}"
else:
returnf"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.
```python
defconstruire_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
```python
# 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 :
```python
defrecommander(noeud):
"""
Parcourt l'arbre de décision en posant des questions à l'utilisateur.
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International</a>.