Formation ML / Apprentissage supervisé - Classification

Arbre de décision

Débutant 30 min 14 sections

Des questions oui/non en cascade, choisies pour faire baisser l'impureté, et qui se lisent sans décoder de coefficients.

Objectifs d'apprentissage

  • Comprendre le fonctionnement des arbres de décision
  • Implémenter un classificateur avec scikit-learn
  • Interpréter l'importance des features
  • Visualiser la structure de l'arbre

Prérequis

Module Régression logistique recommandé

Théorie

Comment fonctionne un arbre de décision?

Un arbre de décision prend des décisions en posant une série de questions sur les features.

Exemple intuitif:

  • Est-ce que petal_length > 2.5?
  • Si OUI: probablement pas setosa
  • Si NON: c'est setosa

Construction de l'arbre:

  1. Choisir la meilleure feature pour diviser les données
  2. Créer un nœud avec cette question
  3. Répéter récursivement pour chaque branche
  4. Arrêter quand un critère est atteint (profondeur max, pureté...)

Critère de division:

  • Gini Impurity: mesure l'impureté d'un nœud
  • Entropy: mesure le désordre

Un bon split réduit l'impureté dans les nœuds enfants.

Théorie

Schéma: Structure d'un arbre de décision

Structure de l'arbre:

flowchart TD A{"petal_length <= 2.5?
(Nœud racine)"} A -->|OUI| B["SETOSA
50 fleurs
[FEUILLE]"] A -->|NON| C{"petal_width <= 1.8?"} C -->|OUI| D["VERSICOLOR
47 fleurs
[FEUILLE]"] C -->|NON| E["VIRGINICA
46 fleurs
[FEUILLE]"] class B ml-node-main class D ml-node-brand class E ml-node-secondary

Comment classifier une nouvelle fleur:

Nouvelle fleur: petal_length=4.5, petal_width=1.5

flowchart LR Q1["Question 1:
petal_length <= 2.5?
4.5 <= 2.5?"] Q1 -->|NON| Q2["Question 2:
petal_width <= 1.8?
1.5 <= 1.8?"] Q2 -->|OUI| R["Résultat:
VERSICOLOR"] class R ml-node-accent

Exemple concret avec code couleur:

Nouvelle fleur: $\textcolor{#3498db}{petal\_length = 4.5}$ cm, $\textcolor{#e67e22}{petal\_width = 1.5}$ cm

Étape 1 - Question racine:

$$\textcolor{#3498db}{petal\_length} \leq 2.5 \text{ ?} \quad \Rightarrow \quad \textcolor{#3498db}{4.5} \leq 2.5 \text{ ?} \quad \Rightarrow \quad \textcolor{#e74c3c}{\mathbf{NON}}$$

Étape 2 - Branche droite:

$$\textcolor{#e67e22}{petal\_width} \leq 1.8 \text{ ?} \quad \Rightarrow \quad \textcolor{#e67e22}{1.5} \leq 1.8 \text{ ?} \quad \Rightarrow \quad \textcolor{#27ae60}{\mathbf{OUI}}$$

Résultat: $\textcolor{#27ae60}{\mathbf{VERSICOLOR}}$

Légende des couleurs:

  • $\textcolor{#3498db}{Bleu}$ : longueur du pétale ($\textcolor{#3498db}{4.5}$ cm)
  • $\textcolor{#e67e22}{Orange}$ : largeur du pétale ($\textcolor{#e67e22}{1.5}$ cm)
  • $\textcolor{#e74c3c}{Rouge}$ : réponse NON (aller à droite)
  • $\textcolor{#27ae60}{Vert}$ : réponse OUI (aller à gauche) + résultat final

Interprétation: La fleur a un pétale trop long pour être Setosa, mais pas assez large pour être Virginica → Versicolor.

Comment l'algorithme choisit les questions:

flowchart TD Init["Données initiales (150 fleurs)
Setosa: 50 | Versicolor: 50 | Virginica: 50
Impureté = HAUTE"] Init -->|"Split sur petal_length <= 2.5"| Left["Setosa: 50
Versicolor: 0
Virginica: 0
Impureté = 0 (PURE!)"] Init -->|"Split sur petal_length <= 2.5"| Right["Setosa: 0
Versicolor: 50
Virginica: 50
Impureté = 0.5 (mixte)"] class Init ml-node-brand class Left ml-node-success class Right ml-node-warning

L'algorithme choisit le split qui réduit le plus l'impureté!

Terminologie:

  • Nœud racine : Premier nœud (première question)
  • Nœud interne : Nœud avec une question
  • Feuille : Nœud terminal (prédiction finale)
  • Profondeur : Nombre de niveaux de l'arbre
  • Split : Division d'un nœud en deux branches
Avancé Exercice manuel: À vous de calculer!

Objectif: Maîtriser les calculs d'un arbre de décision à la main (Gini, gain d'information, split).

Prenez une feuille et un stylo. Résolvez chaque partie AVANT de regarder la solution !

CONTEXTE

Vous devez construire un arbre de décision pour prédire si un email est SPAM ou HAM. Vous avez 10 emails avec 2 features :

EmailMots majusculesContient "gratuit"Classe
1BeaucoupOuiSPAM
2BeaucoupOuiSPAM
3BeaucoupNonSPAM
4PeuOuiSPAM
5PeuNonHAM
6PeuNonHAM
7PeuNonHAM
8PeuNonHAM
9BeaucoupNonSPAM
10PeuOuiHAM

Résumé : 5 SPAM, 5 HAM

Formule de l'indice de Gini : $Gini = 1 - \sum_{i} p_i^2$

PARTIE 1 : Gini du nœud racine

1.1) Calculez les proportions de chaque classe (SPAM et HAM) 1.2) Calculez l'indice de Gini du nœud racine 1.3) Que signifie cette valeur ? (0 = pur, 0.5 = maximum d'impureté)

PARTIE 2 : Split sur "Mots majuscules"

Si on split sur "Mots majuscules" :

  • Branche "Beaucoup" : emails 1, 2, 3, 9 (4 emails)
  • Branche "Peu" : emails 4, 5, 6, 7, 8, 10 (6 emails)

2.1) Combien de SPAM et HAM dans chaque branche ? 2.2) Calculez le Gini de la branche "Beaucoup" 2.3) Calculez le Gini de la branche "Peu" 2.4) Calculez le Gini pondéré après ce split

PARTIE 3 : Split sur "Contient gratuit"

Si on split sur "Contient gratuit" :

  • Branche "Oui" : emails 1, 2, 4, 10 (4 emails)
  • Branche "Non" : emails 3, 5, 6, 7, 8, 9 (6 emails)

3.1) Combien de SPAM et HAM dans chaque branche ? 3.2) Calculez le Gini de la branche "Oui" 3.3) Calculez le Gini de la branche "Non" 3.4) Calculez le Gini pondéré après ce split

PARTIE 4 : Choix du meilleur split

4.1) Quel split réduit le plus l'impureté ? 4.2) Calculez le gain d'information pour chaque split 4.3) Quel feature l'algorithme choisira pour le nœud racine ?

PARTIE 5 : Prédiction

Un nouvel email a : Mots majuscules = "Beaucoup", Contient "gratuit" = "Non"

5.1) Si on utilise le split optimal, quelle sera la prédiction ? 5.2) Avec quelle confiance (proportion de la classe majoritaire) ?

Avancé Solution de l'exercice manuel

SOLUTION DÉTAILLÉE

Prenez le temps de comparer avec vos réponses. Vérifiez chaque étape !

RAPPEL : Formule de Gini

$$Gini = 1 - \sum_{i} p_i^2 = 1 - p_{SPAM}^2 - p_{HAM}^2$$

PARTIE 1 : Gini du nœud racine

1.1) Proportions :

  • Total : 10 emails
  • SPAM : 5 → $p_{SPAM} = \frac{5}{10} = \textcolor{#e74c3c}{0.5}$
  • HAM : 5 → $p_{HAM} = \frac{5}{10} = \textcolor{#27ae60}{0.5}$

1.2) Gini du nœud racine :

$$Gini_{racine} = 1 - \textcolor{#e74c3c}{0.5}^2 - \textcolor{#27ae60}{0.5}^2 = 1 - 0.25 - 0.25$$

$\boxed{Gini_{racine} = \textcolor{#9B7AC4}{0.5}}$

1.3) Interprétation :

$Gini = 0.5$ est le maximum d'impureté possible pour 2 classes. Le nœud est parfaitement mixte (50/50).

PARTIE 2 : Split sur "Mots majuscules"

2.1) Composition des branches :

  • Branche "Beaucoup" (4 emails) : emails 1, 2, 3, 9 → $\textcolor{#e74c3c}{4\ SPAM}$, $\textcolor{#27ae60}{0\ HAM}$
  • Branche "Peu" (6 emails) : emails 4, 5, 6, 7, 8, 10 → $\textcolor{#e74c3c}{1\ SPAM}$, $\textcolor{#27ae60}{5\ HAM}$

2.2) Gini "Beaucoup" :

$$Gini_{Beaucoup} = 1 - \left(\frac{4}{4}\right)^2 - \left(\frac{0}{4}\right)^2 = 1 - 1 - 0$$

$\boxed{Gini_{Beaucoup} = \textcolor{#27ae60}{0} \text{ (pur !)}}$

2.3) Gini "Peu" :

$$Gini_{Peu} = 1 - \left(\frac{1}{6}\right)^2 - \left(\frac{5}{6}\right)^2 = 1 - 0.028 - 0.694$$

$\boxed{Gini_{Peu} = \textcolor{#e67e22}{0.278}}$

2.4) Gini pondéré :

$$Gini_{split} = \frac{4}{10} \times \textcolor{#27ae60}{0} + \frac{6}{10} \times \textcolor{#e67e22}{0.278}$$

$$Gini_{split} = 0 + 0.167$$

$\boxed{Gini_{majuscules} = \textcolor{#3498db}{0.167}}$

PARTIE 3 : Split sur "Contient gratuit"

3.1) Composition des branches :

  • Branche "Oui" (4 emails) : emails 1, 2, 4, 10 → $\textcolor{#e74c3c}{3\ SPAM}$, $\textcolor{#27ae60}{1\ HAM}$
  • Branche "Non" (6 emails) : emails 3, 5, 6, 7, 8, 9 → $\textcolor{#e74c3c}{2\ SPAM}$, $\textcolor{#27ae60}{4\ HAM}$

3.2) Gini "Oui" :

$$Gini_{Oui} = 1 - \left(\frac{3}{4}\right)^2 - \left(\frac{1}{4}\right)^2 = 1 - 0.5625 - 0.0625$$

$\boxed{Gini_{Oui} = \textcolor{#e67e22}{0.375}}$

3.3) Gini "Non" :

$$Gini_{Non} = 1 - \left(\frac{2}{6}\right)^2 - \left(\frac{4}{6}\right)^2 = 1 - 0.111 - 0.444$$

$\boxed{Gini_{Non} = \textcolor{#e67e22}{0.444}}$

3.4) Gini pondéré :

$$Gini_{split} = \frac{4}{10} \times \textcolor{#e67e22}{0.375} + \frac{6}{10} \times \textcolor{#e67e22}{0.444}$$

$$Gini_{split} = 0.15 + 0.267$$

$\boxed{Gini_{gratuit} = \textcolor{#F7E64D}{0.417}}$

PARTIE 4 : Choix du meilleur split

4.1) Comparaison des Gini après split :

SplitGini après splitRéduction
Mots majuscules0.167Meilleur
Contient gratuit0.417Moins bon

4.2) Gain d'information :

$$Gain = Gini_{avant} - Gini_{apres}$$

  • Gain (majuscules) = $0.5 - 0.167 = \textcolor{#27ae60}{\mathbf{0.333}}$
  • Gain (gratuit) = $0.5 - 0.417 = \textcolor{#e67e22}{0.083}$

4.3) Choix de l'algorithme :

$\boxed{\text{L'algorithme choisira "Mots majuscules" (gain = 0.333)}}$

Car ce split réduit le plus l'impureté.

PARTIE 5 : Prédiction

Nouvel email : Mots majuscules = "Beaucoup", Contient "gratuit" = "Non"

5.1) Prédiction :

  • On suit le split "Mots majuscules"
  • "Beaucoup" → branche gauche
  • Cette branche contient 4 SPAM, 0 HAM
  • Prédiction : $\textcolor{#e74c3c}{\mathbf{SPAM}}$

5.2) Confiance :

$$Confiance = \frac{4}{4} = 100\%$$

$\boxed{\text{Prédiction : SPAM avec 100\% de confiance}}$

RÉSUMÉ DES RÉSULTATS

MétriqueMots majusculesContient gratuit
Gini branche 10.000 (pur)0.375
Gini branche 20.2780.444
Gini pondéré0.1670.417
Gain0.3330.083

Légende des couleurs :

  • $\textcolor{#e74c3c}{Rouge}$ : classe SPAM et proportions
  • $\textcolor{#27ae60}{Vert}$ : classe HAM, Gini pur (0), meilleur gain
  • $\textcolor{#9B7AC4}{Violet}$ : Gini racine (0.5)
  • $\textcolor{#e67e22}{Orange}$ : Gini intermédiaires
  • $\textcolor{#3498db}{Bleu}$ : Gini final du meilleur split
  • $\textcolor{#F7E64D}{Jaune}$ : Gini du split moins performant
Code

Explorer le dataset Iris

Ctrl+Entrée
Cliquez sur "Exécuter" pour voir le résultat
Code

Visualiser les features

Ctrl+Entrée
Cliquez sur "Exécuter" pour voir le résultat
Contenu verrouillé
6 / 14

Continuez votre apprentissage

Vous avez exploré 6 sections de ce module. Connectez-vous pour débloquer le reste du cours, incluant les exercices pratiques et les solutions.

Console Python

Raccourcis clavier
Ctrl/Cmd+Enter Exécuter
Ctrl/Cmd+Shift+/ Commenter
Tab Indenter
Shift+Tab Désindenter
Ctrl/Cmd+Z Annuler
Ctrl/Cmd+Y Rétablir
Ctrl+Entrée pour exécuter
Cliquez sur "Exécuter" pour voir le résultat