TODO:
In [ ]:
import pandas as pd
TODO:
On cherche à générer (apprendre) un arbre de décision à partir de la base d'exemples suivante:
(Tiré de Quinlan 1983)
In [ ]:
data_list = [['soleil', 'chaud', 'haute', 'faux', 'NePasJouer'],
['soleil', 'chaud', 'haute', 'vrai', 'NePasJouer'],
['couvert', 'chaud', 'haute', 'faux', 'Jouer'],
['pluie', 'bon', 'haute', 'faux', 'Jouer'],
['pluie', 'frais', 'normale', 'faux', 'Jouer'],
['pluie', 'frais', 'normale', 'vrai', 'NePasJouer'],
['couvert', 'frais', 'normale', 'vrai', 'Jouer'],
['soleil', 'bon', 'haute', 'faux', 'NePasJouer'],
['soleil', 'frais', 'normale', 'faux', 'Jouer'],
['pluie', 'bon', 'normale', 'faux', 'Jouer'],
['soleil', 'bon', 'normale', 'vrai', 'Jouer'],
['couvert', 'bon', 'haute', 'vrai', 'Jouer'],
['couvert', 'chaud', 'normale', 'faux', 'Jouer'],
['pluie', 'bon', 'haute', 'vrai', 'NePasJouer']]
columns_list = ['ciel', 'temperature', 'humidite', 'vent', 'golf']
df = pd.DataFrame(data_list, columns=columns_list)
df
Quinlan, 1979
TODO...
On construit automatiquement un arbre à partir d'une base d'exemples.
Pourquoi? ...
slide 18:
Meilleur ensemble de questions (code de Huffman)
Nombre moyen de questions:
$$ P(rouge) \times 1 + P(bleu) \times 2 + P(vert) \times 3 + P(marron) \times 3 = \frac12 \times 1 + \frac14 \times 2 + \frac18 \times 3 + \frac18 \times 3 = 1.75 $$Ok, c'est intuitif si on regarde l'arbre des tirages possibles dans le slide d'avant.
Les couleurs représentent les classes de notre problème.
Entropie:
$$ Entropie d'un ensemble d'exemples = - \sum_{i \in \Omega} p_i \log_2 (p_i) $$Avec $\Omega$ l'ensemble des classes du problème.
In [ ]:
# TODO
Tiré de "exemple1.txt" de JG Ganascia
(Tiré de Quinlan 1983)
In [ ]:
data_list = [['soleil', 'chaud', 'haute', 'faux', 'NePasJouer'],
['soleil', 'chaud', 'haute', 'vrai', 'NePasJouer'],
['couvert', 'chaud', 'haute', 'faux', 'Jouer'],
['pluie', 'bon', 'haute', 'faux', 'Jouer'],
['pluie', 'frais', 'normale', 'faux', 'Jouer'],
['pluie', 'frais', 'normale', 'vrai', 'NePasJouer'],
['couvert', 'frais', 'normale', 'vrai', 'Jouer'],
['soleil', 'bon', 'haute', 'faux', 'NePasJouer'],
['soleil', 'frais', 'normale', 'faux', 'Jouer'],
['pluie', 'bon', 'normale', 'faux', 'Jouer'],
['soleil', 'bon', 'normale', 'vrai', 'Jouer'],
['couvert', 'bon', 'haute', 'vrai', 'Jouer'],
['couvert', 'chaud', 'normale', 'faux', 'Jouer'],
['pluie', 'bon', 'haute', 'vrai', 'NePasJouer']]
columns_list = ['ciel', 'temperature', 'humidite', 'vent', 'golf']
df = pd.DataFrame(data_list, columns=columns_list)
df
Tiré de "exemple2.txt" de JG Ganascia.
La seule différence avec l'exemple 1: première colonne de la ligne 6 (du dataframe).
(Tiré de Quinlan 1983)
In [ ]:
data_list = [['soleil', 'chaud', 'haute', 'faux', 'NePasJouer'],
['soleil', 'chaud', 'haute', 'vrai', 'NePasJouer'],
['couvert', 'chaud', 'haute', 'faux', 'Jouer'],
['pluie', 'bon', 'haute', 'faux', 'Jouer'],
['pluie', 'frais', 'normale', 'faux', 'Jouer'],
['pluie', 'frais', 'normale', 'vrai', 'NePasJouer'],
['pluie', 'frais', 'normale', 'vrai', 'Jouer'],
['soleil', 'bon', 'haute', 'faux', 'NePasJouer'],
['soleil', 'frais', 'normale', 'faux', 'Jouer'],
['pluie', 'bon', 'normale', 'faux', 'Jouer'],
['soleil', 'bon', 'normale', 'vrai', 'Jouer'],
['couvert', 'bon', 'haute', 'vrai', 'Jouer'],
['couvert', 'chaud', 'normale', 'faux', 'Jouer'],
['pluie', 'bon', 'haute', 'vrai', 'NePasJouer']]
columns_list = ['ciel', 'temperature', 'humidite', 'vent', 'golf']
df = pd.DataFrame(data_list, columns=columns_list)
df
Tiré de "lentilles.txt" de JG Ganascia
TODO: traduire la base suivante en Français...
In [ ]:
data_list = [['young', 'myope', 'no', 'reduced', 'none'],
['young', 'myope', 'no', 'normal', 'soft'],
['young', 'myope', 'yes', 'reduced', 'none'],
['young', 'myope', 'yes', 'normal', 'hard'],
['young', 'hypermetrope', 'no', 'reduced', 'none'],
['young', 'hypermetrope', 'no', 'normal', 'soft'],
['young', 'hypermetrope', 'yes', 'reduced', 'none'],
['young', 'hypermetrope', 'yes', 'normal', 'hard'],
['pre-presbyopic', 'myope', 'no', 'reduced', 'none'],
['pre-presbyopic', 'myope', 'no', 'normal', 'soft'],
['pre-presbyopic', 'myope', 'yes', 'reduced', 'none'],
['pre-presbyopic', 'myope', 'yes', 'normal', 'hard'],
['pre-presbyopic', 'hypermetrope', 'no', 'reduced', 'none'],
['pre-presbyopic', 'hypermetrope', 'no', 'normal', 'soft'],
['pre-presbyopic', 'hypermetrope', 'yes', 'reduced', 'none'],
['pre-presbyopic', 'hypermetrope', 'yes', 'normal', 'none'],
['presbyopic', 'myope', 'no', 'reduced', 'none'],
['presbyopic', 'myope', 'no', 'normal', 'none'],
['presbyopic', 'myope', 'yes', 'reduced', 'none'],
['presbyopic', 'myope', 'yes', 'normal', 'hard'],
['presbyopic', 'hypermetrope', 'no', 'reduced', 'none'],
['presbyopic', 'hypermetrope', 'no', 'normal', 'soft'],
['presbyopic', 'hypermetrope', 'yes', 'reduced', 'none'],
['presbyopic', 'hypermetrope', 'yes', 'normal', 'none']]
columns_list = ['age', 'prescription', 'astigmatic', 'tear_rate', 'lenses']
df = pd.DataFrame(data_list, columns=columns_list)
df