Formation ML / Supervised Classification

Arbre de Decision

Debutant 30 min 14 sections

Decouvrez les arbres de decision, un algorithme intuitif et interpretable pour la classification et la regression.

Objectifs d'apprentissage

  • Comprendre le fonctionnement des arbres de decision
  • Implementer un classificateur avec scikit-learn
  • Interpreter l'importance des features
  • Visualiser la structure de l'arbre

Prerequis

Module Regression Logistique recommande

Theorie

Comment fonctionne un arbre de decision?

Un arbre de decision prend des decisions en posant une serie 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 donnees
  2. Creer un noeud avec cette question
  3. Repeter recursivement pour chaque branche
  4. Arreter quand un critere est atteint (profondeur max, purete...)

Critere de division:

  • Gini Impurity: mesure l'impurete d'un noeud
  • Entropy: mesure le desordre

Un bon split reduit l'impurete dans les noeuds enfants.

Theorie

Schema: Structure d'un arbre de decision

Structure de l'arbre:

flowchart TD A{"petal_length <= 2.5?
(Noeud 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]"] style B fill:#F7E64D,color:#1A1A1A style D fill:#FFF9D9,color:#1A1A1A style E fill:#E5D7F5,color:#1A1A1A

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["Resultat:
VERSICOLOR"] style R fill:#F7E64D,color:#1A1A1A

Exemple concret avec code couleur:

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

Etape 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}}$$

Etape 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}}$$

Resultat: $\textcolor{#27ae60}{\mathbf{VERSICOLOR}}$

Legende des couleurs:

  • $\textcolor{#3498db}{Bleu}$ : longueur du petale ($\textcolor{#3498db}{4.5}$ cm)
  • $\textcolor{#e67e22}{Orange}$ : largeur du petale ($\textcolor{#e67e22}{1.5}$ cm)
  • $\textcolor{#e74c3c}{Rouge}$ : reponse NON (aller a droite)
  • $\textcolor{#27ae60}{Vert}$ : reponse OUI (aller a gauche) + resultat final

Interpretation: La fleur a un petale trop long pour etre Setosa, mais pas assez large pour etre Virginica β†’ Versicolor.

Comment l'algorithme choisit les questions:

flowchart TD Init["Donnees initiales (150 fleurs)
Setosa: 50 | Versicolor: 50 | Virginica: 50
Impurete = HAUTE"] Init -->|"Split sur petal_length <= 2.5"| Left["Setosa: 50
Versicolor: 0
Virginica: 0
Impurete = 0 (PURE!)"] Init -->|"Split sur petal_length <= 2.5"| Right["Setosa: 0
Versicolor: 50
Virginica: 50
Impurete = 0.5 (mixte)"] style Init fill:#C09CF0,color:#1A1A1A style Left fill:#F7E64D,color:#1A1A1A style Right fill:#FFF9D9,color:#1A1A1A

L'algorithme choisit le split qui reduit le plus l'impurete!

Terminologie:

  • Noeud racine : Premier noeud (premiere question)
  • Noeud interne : Noeud avec une question
  • Feuille : Noeud terminal (prediction finale)
  • Profondeur : Nombre de niveaux de l'arbre
  • Split : Division d'un noeud en deux branches
Avance Exercice manuel: A vous de calculer!

Objectif: Maitriser les calculs d'un arbre de decision a la main (Gini, gain d'information, split).

Prenez une feuille et un stylo. Resolvez chaque partie AVANT de regarder la solution !

CONTEXTE

Vous devez construire un arbre de decision pour predire 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

Resume : 5 SPAM, 5 HAM

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

PARTIE 1 : Gini du noeud racine

1.1) Calculez les proportions de chaque classe (SPAM et HAM)

1.2) Calculez l'indice de Gini du noeud racine

1.3) Que signifie cette valeur ? (0 = pur, 0.5 = maximum d'impurete)

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 pondere apres 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 pondere apres ce split

PARTIE 4 : Choix du meilleur split

4.1) Quel split reduit le plus l'impurete ?

4.2) Calculez le gain d'information pour chaque split

4.3) Quel feature l'algorithme choisira pour le noeud racine ?

PARTIE 5 : Prediction

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

5.1) Si on utilise le split optimal, quelle sera la prediction ?

5.2) Avec quelle confiance (proportion de la classe majoritaire) ?

Avance Solution de l'exercice manuel

SOLUTION DETAILLEE

Prenez le temps de comparer avec vos reponses. Verifiez chaque etape !

RAPPEL : Formule de Gini

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

PARTIE 1 : Gini du noeud 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 noeud 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) Interpretation :

$Gini = 0.5$ est le maximum d'impurete possible pour 2 classes. Le noeud 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 pondere :

$$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 pondere :

$$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 apres split :

SplitGini apres splitReduction
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 reduit le plus l'impurete.

PARTIE 5 : Prediction

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

5.1) Prediction :

  • On suit le split "Mots majuscules"
  • "Beaucoup" β†’ branche gauche
  • Cette branche contient 4 SPAM, 0 HAM
  • Prediction : $\textcolor{#e74c3c}{\mathbf{SPAM}}$

5.2) Confiance :

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

$\boxed{\text{Prediction : SPAM avec 100\% de confiance}}$

RESUME DES RESULTATS

MetriqueMots majusculesContient gratuit
Gini branche 10.000 (pur)0.375
Gini branche 20.2780.444
Gini pondere0.1670.417
Gain0.3330.083

Legende 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 intermediaires
  • $\textcolor{#3498db}{Bleu}$ : Gini final du meilleur split
  • $\textcolor{#F7E64D}{Jaune}$ : Gini du split moins performant
Code

Explorer le dataset Iris

Cliquez sur "Executer" pour voir le resultat
Code

Visualiser les features

Cliquez sur "Executer" pour voir le resultat
Contenu verrouille section restante
6 / 14

Continuez votre apprentissage

Vous avez explore 6 sections de ce module. Connectez-vous pour debloquer le reste du cours, incluant les exercices pratiques et les solutions.

Console Python

Raccourcis clavier
Ctrl/Cmd+Enter Executer
Ctrl/Cmd+Shift+/ Commenter
Tab Indenter
Shift+Tab Desindenter
Ctrl/Cmd+Z Annuler
Ctrl/Cmd+Y Retablir
Ctrl+Enter pour executer
Cliquez sur "Executer" pour voir le resultat