{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Construire un classificateur par arbre de décision\n",
        "\n",
        "CSI 4506 — Introduction à l’intelligence artificielle\n",
        "\n",
        "Marcel Turcotte  \n",
        "2026-09-15\n",
        "\n",
        "# Introduction\n",
        "\n",
        "Ce cahier construit un petit classificateur par arbre de décision à\n",
        "partir des principes fondamentaux. L’objectif n’est pas de concurrencer\n",
        "scikit-learn, mais de rendre visibles les opérations centrales de\n",
        "l’algorithme d’apprentissage :\n",
        "\n",
        "1.  mesurer à quel point les classes d’un nœud sont mélangées;\n",
        "2.  évaluer les divisions candidates;\n",
        "3.  conserver la meilleure division;\n",
        "4.  répéter le processus récursivement.\n",
        "\n",
        "L’implémentation accepte des attributs numériques, des divisions\n",
        "binaires par seuil, plusieurs classes, des prédictions de probabilités\n",
        "et quelques conditions d’arrêt. Elle omet volontairement les valeurs\n",
        "manquantes, les attributs catégoriels, les poids d’exemples, la\n",
        "recherche optimisée des divisions et l’élagage.\n",
        "\n",
        "# Préparation\n",
        "\n",
        "La seule dépendance non standard est `palmerpenguins`. L’installation ne\n",
        "s’exécute que si ce paquet est absent, ce qui permet d’utiliser le\n",
        "cahier dans une nouvelle session Google Colab."
      ],
      "id": "501a7a0e-7612-4651-9bca-266d76c4388e"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "import subprocess\n",
        "import sys\n",
        "from dataclasses import dataclass\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "\n",
        "try:\n",
        "    from palmerpenguins import load_penguins\n",
        "except ImportError:\n",
        "    subprocess.check_call([\n",
        "        sys.executable, \"-m\", \"pip\", \"install\", \"-q\", \"palmerpenguins\"\n",
        "    ])\n",
        "    from palmerpenguins import load_penguins\n",
        "\n",
        "from sklearn.model_selection import train_test_split"
      ],
      "id": "imports"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Manchots de Palmer\n",
        "\n",
        "Nous conservons deux attributs numériques et formulons une tâche de\n",
        "classification binaire : **Gentoo** ou **pas Gentoo**. Avec seulement\n",
        "deux attributs, nous pouvons représenter les régions de décision\n",
        "apprises."
      ],
      "id": "1455a163-f699-461b-92e0-dcff5ac24fba"
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Exemples d'entraînement : 273\n",
            "Exemples de test : 69"
          ]
        }
      ],
      "source": [
        "feature_names = [\"bill_depth_mm\", \"body_mass_g\"]\n",
        "\n",
        "penguins = load_penguins()\n",
        "penguins = penguins[feature_names + [\"species\"]].dropna().copy()\n",
        "\n",
        "X = penguins[feature_names].to_numpy()\n",
        "y = np.where(\n",
        "    penguins[\"species\"].to_numpy() == \"Gentoo\",\n",
        "    \"Gentoo\",\n",
        "    \"Pas Gentoo\",\n",
        ")\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(\n",
        "    X, y, test_size=0.2, random_state=42, stratify=y\n",
        ")\n",
        "\n",
        "print(f\"Exemples d'entraînement : {len(X_train)}\")\n",
        "print(f\"Exemples de test : {len(X_test)}\")"
      ],
      "id": "penguins-data"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Entropie\n",
        "\n",
        "Pour un nœud dont les proportions des classes sont $p_1,\\ldots,p_K$,\n",
        "l’entropie est\n",
        "\n",
        "$$\n",
        "H=-\\sum_{k=1}^{K}p_k\\log_2p_k.\n",
        "$$\n",
        "\n",
        "Un nœud pur a une entropie nulle. L’entropie augmente lorsque les\n",
        "proportions des classes deviennent plus équilibrées."
      ],
      "id": "10a2bf03-2acf-46e2-ae83-f9f79936f820"
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {},
      "outputs": [],
      "source": [
        "def class_probabilities(y, classes):\n",
        "    \"\"\"Retourner la proportion d'exemples de chaque classe.\"\"\"\n",
        "    return np.array([np.mean(y == label) for label in classes])\n",
        "\n",
        "\n",
        "def entropy(y, classes):\n",
        "    \"\"\"Mesurer le mélange des classes; zéro correspond à un nœud pur.\"\"\"\n",
        "    probabilities = class_probabilities(y, classes)\n",
        "    probabilities = probabilities[probabilities > 0]\n",
        "    if len(probabilities) == 1:\n",
        "        return 0.0\n",
        "    return float(-np.sum(probabilities * np.log2(probabilities)))"
      ],
      "id": "entropy"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Cette petite vérification retrouve les valeurs binaires familières : un\n",
        "nœud équilibré possède un bit d’entropie, tandis qu’un nœud pur n’en\n",
        "possède aucun."
      ],
      "id": "f7f8b2f8-f412-4dc9-a3d6-d5d3745c233d"
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Nœud équilibré : 1.000 bit\n",
            "Nœud pur : 0.000 bit"
          ]
        }
      ],
      "source": [
        "binary_classes = np.array([\"Gentoo\", \"Pas Gentoo\"])\n",
        "\n",
        "balanced = np.array([\"Gentoo\", \"Pas Gentoo\"])\n",
        "pure = np.array([\"Gentoo\", \"Gentoo\"])\n",
        "\n",
        "print(f\"Nœud équilibré : {entropy(balanced, binary_classes):.3f} bit\")\n",
        "print(f\"Nœud pur : {entropy(pure, binary_classes):.3f} bit\")"
      ],
      "id": "entropy-check"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Évaluation d’une division\n",
        "\n",
        "Une division candidate crée un enfant gauche et un enfant droit. Nous\n",
        "l’évaluons au moyen de leur entropie pondérée :\n",
        "\n",
        "$$\n",
        "J=\n",
        "\\frac{N_{\\mathrm{left}}}{N_{\\mathrm{parent}}}H_{\\mathrm{left}}\n",
        "+\n",
        "\\frac{N_{\\mathrm{right}}}{N_{\\mathrm{parent}}}H_{\\mathrm{right}}.\n",
        "$$\n",
        "\n",
        "La pondération empêche un minuscule enfant pur d’avoir autant\n",
        "d’influence qu’un enfant beaucoup plus grand dont les classes sont\n",
        "mélangées."
      ],
      "id": "9a9e7c54-8b93-49a4-aa2e-13b8152edb43"
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {},
      "outputs": [],
      "source": [
        "def weighted_entropy(y_left, y_right, classes):\n",
        "    \"\"\"Retourner l'entropie pondérée produite par une division.\"\"\"\n",
        "    n_left = len(y_left)\n",
        "    n_right = len(y_right)\n",
        "    n_parent = n_left + n_right\n",
        "\n",
        "    return (\n",
        "        n_left / n_parent * entropy(y_left, classes)\n",
        "        + n_right / n_parent * entropy(y_right, classes)\n",
        "    )\n",
        "\n",
        "\n",
        "def candidate_thresholds(values):\n",
        "    \"\"\"Retourner les milieux entre les valeurs distinctes consécutives.\"\"\"\n",
        "    values = np.unique(values)\n",
        "    return (values[:-1] + values[1:]) / 2"
      ],
      "id": "split-score"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Trois divisions candidates\n",
        "\n",
        "L’exemple suivant compare les cas présentés en classe. Sans pondération,\n",
        "isoler un seul exemple pur semble artificiellement avantageux."
      ],
      "id": "a99bc4e3-4dd5-47e5-8bbf-dd5d4231cade"
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "désordonnée : non pondérée=0.971, pondérée=0.971\n",
            "   isole un : non pondérée=0.496, pondérée=0.892\n",
            "      utile : non pondérée=0.722, pondérée=0.722"
          ]
        }
      ],
      "source": [
        "split_examples = {\n",
        "    \"désordonnée\": (\n",
        "        np.array([\"Gentoo\"] * 3 + [\"Pas Gentoo\"] * 2),\n",
        "        np.array([\"Gentoo\"] * 2 + [\"Pas Gentoo\"] * 3),\n",
        "    ),\n",
        "    \"isole un\": (\n",
        "        np.array([\"Gentoo\"]),\n",
        "        np.array([\"Gentoo\"] * 4 + [\"Pas Gentoo\"] * 5),\n",
        "    ),\n",
        "    \"utile\": (\n",
        "        np.array([\"Gentoo\"] * 4 + [\"Pas Gentoo\"]),\n",
        "        np.array([\"Gentoo\"] + [\"Pas Gentoo\"] * 4),\n",
        "    ),\n",
        "}\n",
        "\n",
        "for name, (left, right) in split_examples.items():\n",
        "    unweighted = (\n",
        "        entropy(left, binary_classes) + entropy(right, binary_classes)\n",
        "    ) / 2\n",
        "    weighted = weighted_entropy(left, right, binary_classes)\n",
        "    print(f\"{name:>11} : non pondérée={unweighted:.3f}, pondérée={weighted:.3f}\")"
      ],
      "id": "split-score-check"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Recherche gloutonne d’une division\n",
        "\n",
        "Pour chaque attribut, nous examinons les milieux entre les valeurs\n",
        "distinctes consécutives. La fonction conserve la division candidate dont\n",
        "l’entropie pondérée est la plus faible."
      ],
      "id": "1859a8d2-570b-48b3-82c4-7b6edc4e8a33"
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {},
      "outputs": [],
      "source": [
        "def find_best_split(X, y, classes, min_samples_leaf):\n",
        "    \"\"\"Retourner la meilleure division et le nombre de candidates évaluées.\"\"\"\n",
        "    best_split = None\n",
        "    best_score = entropy(y, classes)\n",
        "    n_candidates = 0\n",
        "\n",
        "    for feature in range(X.shape[1]):\n",
        "        for threshold in candidate_thresholds(X[:, feature]):\n",
        "            go_left = X[:, feature] <= threshold\n",
        "            n_left = np.sum(go_left)\n",
        "            n_right = len(y) - n_left\n",
        "\n",
        "            if min(n_left, n_right) < min_samples_leaf:\n",
        "                continue\n",
        "\n",
        "            n_candidates += 1\n",
        "            score = weighted_entropy(y[go_left], y[~go_left], classes)\n",
        "            if score < best_score:\n",
        "                best_score = score\n",
        "                best_split = (feature, float(threshold), go_left)\n",
        "\n",
        "    return best_split, n_candidates"
      ],
      "id": "best-split"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Cette recherche est gloutonne : elle choisit la meilleure division\n",
        "immédiate sans réexaminer les décisions précédentes. Elle ne garantit\n",
        "donc pas de construire l’arbre le plus petit ni un arbre globalement\n",
        "optimal.\n",
        "\n",
        "# Représentation de l’arbre\n",
        "\n",
        "Chaque nœud conserve les proportions des classes parmi les exemples qui\n",
        "l’atteignent. Une feuille utilise ces proportions pour effectuer des\n",
        "prédictions. Un nœud interne conserve en plus un attribut, un seuil et\n",
        "deux enfants."
      ],
      "id": "c655c1b9-6dd6-46be-aeba-6d373cce514d"
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {},
      "outputs": [],
      "source": [
        "@dataclass\n",
        "class Node:\n",
        "    probabilities: np.ndarray\n",
        "    n_samples: int\n",
        "    loss: float\n",
        "    feature: int | None = None\n",
        "    threshold: float | None = None\n",
        "    left: \"Node | None\" = None\n",
        "    right: \"Node | None\" = None\n",
        "\n",
        "    @property\n",
        "    def is_leaf(self):\n",
        "        return self.feature is None"
      ],
      "id": "node"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Classificateur\n",
        "\n",
        "La méthode récursive `_grow_tree` est au cœur de l’apprentissage. Elle\n",
        "crée un nœud, vérifie les conditions d’arrêt, trouve une division, puis\n",
        "construit récursivement ses enfants.\n",
        "\n",
        "Les méthodes de validation et de mise en forme du texte facilitent\n",
        "l’utilisation du classificateur. Il s’agit de code auxiliaire et non de\n",
        "nouveaux concepts d’apprentissage automatique."
      ],
      "id": "5442c2e4-2802-43f2-863d-20fcca32fbb1"
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {},
      "outputs": [],
      "source": [
        "class SimpleDecisionTreeClassifier:\n",
        "    \"\"\"Un classificateur didactique avec une petite interface de type scikit-learn.\"\"\"\n",
        "\n",
        "    def __init__(\n",
        "        self,\n",
        "        max_depth=None,\n",
        "        min_samples_split=2,\n",
        "        min_samples_leaf=1,\n",
        "    ):\n",
        "        self.max_depth = max_depth\n",
        "        self.min_samples_split = min_samples_split\n",
        "        self.min_samples_leaf = min_samples_leaf\n",
        "\n",
        "    def fit(self, X, y):\n",
        "        X = np.asarray(X, dtype=float)\n",
        "        y = np.asarray(y)\n",
        "        self._validate_training_data(X, y)\n",
        "\n",
        "        self.classes_ = np.unique(y)\n",
        "        self.n_features_in_ = X.shape[1]\n",
        "        self.n_candidate_splits_ = 0\n",
        "        self.tree_ = self._grow_tree(X, y, depth=0)\n",
        "        return self\n",
        "\n",
        "    def _grow_tree(self, X, y, depth):\n",
        "        probabilities = class_probabilities(y, self.classes_)\n",
        "        node = Node(\n",
        "            probabilities=probabilities,\n",
        "            n_samples=len(y),\n",
        "            loss=entropy(y, self.classes_),\n",
        "        )\n",
        "\n",
        "        depth_limit = self.max_depth is not None and depth >= self.max_depth\n",
        "        pure_node = np.count_nonzero(probabilities) == 1\n",
        "        too_small = len(y) < self.min_samples_split\n",
        "\n",
        "        if pure_node or depth_limit or too_small:\n",
        "            return node\n",
        "\n",
        "        split, n_candidates = find_best_split(\n",
        "            X, y, self.classes_, self.min_samples_leaf\n",
        "        )\n",
        "        self.n_candidate_splits_ += n_candidates\n",
        "        if split is None:\n",
        "            return node\n",
        "\n",
        "        node.feature, node.threshold, go_left = split\n",
        "        node.left = self._grow_tree(X[go_left], y[go_left], depth + 1)\n",
        "        node.right = self._grow_tree(X[~go_left], y[~go_left], depth + 1)\n",
        "        return node\n",
        "\n",
        "    def _find_leaf(self, x):\n",
        "        node = self.tree_\n",
        "        while not node.is_leaf:\n",
        "            if x[node.feature] <= node.threshold:\n",
        "                node = node.left\n",
        "            else:\n",
        "                node = node.right\n",
        "        return node\n",
        "\n",
        "    def predict_proba(self, X):\n",
        "        X = self._validate_prediction_data(X)\n",
        "        return np.vstack([self._find_leaf(x).probabilities for x in X])\n",
        "\n",
        "    def predict(self, X):\n",
        "        probabilities = self.predict_proba(X)\n",
        "        return self.classes_[np.argmax(probabilities, axis=1)]\n",
        "\n",
        "    def score(self, X, y):\n",
        "        return float(np.mean(self.predict(X) == np.asarray(y)))\n",
        "\n",
        "    def export_text(self, feature_names=None):\n",
        "        if feature_names is None:\n",
        "            feature_names = [f\"x[{j}]\" for j in range(self.n_features_in_)]\n",
        "        if len(feature_names) != self.n_features_in_:\n",
        "            raise ValueError(\"feature_names doit correspondre au nombre d'attributs\")\n",
        "\n",
        "        lines = []\n",
        "\n",
        "        def visit(node, indent):\n",
        "            if node.is_leaf:\n",
        "                prediction = self.classes_[np.argmax(node.probabilities)]\n",
        "                if isinstance(prediction, np.generic):\n",
        "                    prediction = prediction.item()\n",
        "                probabilities = np.round(node.probabilities, 3)\n",
        "                lines.append(\n",
        "                    f\"{indent}prédire {prediction!r} \"\n",
        "                    f\"(p={probabilities}, n={node.n_samples})\"\n",
        "                )\n",
        "                return\n",
        "\n",
        "            name = feature_names[node.feature]\n",
        "            lines.append(f\"{indent}si {name} <= {node.threshold:.3f} :\")\n",
        "            visit(node.left, indent + \"    \")\n",
        "            lines.append(f\"{indent}sinon :\")\n",
        "            visit(node.right, indent + \"    \")\n",
        "\n",
        "        visit(self.tree_, \"\")\n",
        "        return \"\\n\".join(lines)\n",
        "\n",
        "    def _validate_training_data(self, X, y):\n",
        "        if X.ndim != 2 or y.ndim != 1 or len(X) != len(y):\n",
        "            raise ValueError(\n",
        "                \"X doit être 2D et y doit être 1D, avec le même nombre de lignes\"\n",
        "            )\n",
        "        if len(y) == 0:\n",
        "            raise ValueError(\"le jeu d'entraînement ne peut pas être vide\")\n",
        "        if not np.isfinite(X).all():\n",
        "            raise ValueError(\n",
        "                \"les valeurs manquantes ou non finies ne sont pas prises en charge\"\n",
        "            )\n",
        "        if self.max_depth is not None and self.max_depth < 0:\n",
        "            raise ValueError(\"max_depth doit être positif ou nul, ou None\")\n",
        "        if self.min_samples_split < 2:\n",
        "            raise ValueError(\"min_samples_split doit être au moins 2\")\n",
        "        if self.min_samples_leaf < 1:\n",
        "            raise ValueError(\"min_samples_leaf doit être au moins 1\")\n",
        "\n",
        "    def _validate_prediction_data(self, X):\n",
        "        if not hasattr(self, \"tree_\"):\n",
        "            raise ValueError(\"appelez fit avant d'effectuer des prédictions\")\n",
        "        X = np.asarray(X, dtype=float)\n",
        "        if X.ndim == 1:\n",
        "            X = X.reshape(1, -1)\n",
        "        if X.ndim != 2 or X.shape[1] != self.n_features_in_:\n",
        "            raise ValueError(\"X n'a pas le bon nombre d'attributs\")\n",
        "        if not np.isfinite(X).all():\n",
        "            raise ValueError(\n",
        "                \"les valeurs manquantes ou non finies ne sont pas prises en charge\"\n",
        "            )\n",
        "        return X"
      ],
      "id": "classifier"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Entraînement\n",
        "\n",
        "Nous limitons l’arbre à deux décisions sur tout chemin et exigeons que\n",
        "chaque feuille contienne au moins cinq exemples d’entraînement."
      ],
      "id": "5e58f657-9024-4cbf-8c45-91cdd1b8f81b"
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Exactitude sur le jeu de test : 1.000\n",
            "Divisions candidates évaluées : 312\n",
            "Ordre des classes : ['Gentoo' 'Pas Gentoo']\n",
            "\n",
            "Règles apprises :\n",
            "\n",
            "si bill_depth_mm <= 16.450 :\n",
            "    si body_mass_g <= 3750.000 :\n",
            "        prédire 'Pas Gentoo' (p=[0. 1.], n=5)\n",
            "    sinon :\n",
            "        prédire 'Gentoo' (p=[1. 0.], n=92)\n",
            "sinon :\n",
            "    si body_mass_g <= 5100.000 :\n",
            "        prédire 'Pas Gentoo' (p=[0. 1.], n=170)\n",
            "    sinon :\n",
            "        prédire 'Gentoo' (p=[1. 0.], n=6)"
          ]
        }
      ],
      "source": [
        "tree_model = SimpleDecisionTreeClassifier(max_depth=2, min_samples_leaf=5)\n",
        "tree_model.fit(X_train, y_train)\n",
        "\n",
        "print(f\"Exactitude sur le jeu de test : {tree_model.score(X_test, y_test):.3f}\")\n",
        "print(f\"Divisions candidates évaluées : {tree_model.n_candidate_splits_}\")\n",
        "print(f\"Ordre des classes : {tree_model.classes_}\")\n",
        "print(\"\\nRègles apprises :\\n\")\n",
        "print(tree_model.export_text(feature_names))"
      ],
      "id": "training"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Régions de décision\n",
        "\n",
        "Chaque test de cet arbre compare un attribut à un seuil. En deux\n",
        "dimensions, les régions obtenues sont donc délimitées par des frontières\n",
        "horizontales et verticales."
      ],
      "id": "5df8808b-605d-4cd4-8f11-c3fca7b82187"
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "fig-height": 5,
        "fig-width": 9
      },
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "image/png": "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\nasFs4nD48GFVWOE5Zq53nHkcM5JjZnPb692td5SQkKB+nKGoKluuXIB7SkRERERE4c7TECHXnQQN\ndsMNN8jXX38tx48fV8937twpP/zwg3Tt2lU9nz17tuTn59v7NU6fPl31a2zdurVahq6C8+bNkxMn\nTqjn7777rnp9v379vFpPRERERESkl5C1WN19990qoQ8tSM2bN5fNmzfL3//+d9UlEBAegRQ/hE5k\nZWWp4goJf7Zwi4cfflhWr16tWqYQw75r1y6ZM2eOVK1a1av1REREREREETFBMKB73sGDB1WBhUmC\nHeXk5KiCC6mAmDhYq7veli1bVPdBtGThdb6u15Kbm6smEt50cA+7AhIRERERRbG83FxpW6eBymEo\n52aYUMgLKzNiYUVEREREznDbbC0q5oGJMDFxcRITGxNwYRWyroBEREREROHCUlQsBUeOSwybJCKy\nYI4tX04SKpUPaA5bFlZERERERB5uvAtPnJayCWWkZu1aEhvAzTeZcPLf3Dw5cuSIFGLKpsoV/P4s\nFlZERERERO5YrGItKJJqdWt6nMuIwk+Zv87pocOHxFqxvNtugaaMWyciIiIiCgdWi0Vwqx2vEaRG\nkaFsubKqG6C12P8xdCysiIiIiIi8wA6AkStGh+6dLKyIiIiIiIgCxMKKiIiIiIgoQAyvICIiIiKK\nwLS7zxYulM8Xfib79++XypUrS4tLW8gdd94plzRooMvvwOd/nZ4hb/57li6fF+7YYkVEYePUyZOy\ne8dO9UhERBRuTpw4Idu3bVOPRrJYLHLLTTfJ/ffcK61T28j4Z56Wu+7+u1SrXl0GXXut7N2zR5ff\nk30kW7Zt26bLZ0UCtlgRkent271Hpk2YIt+kZ4iluFhi4+KkZ/9+8sjE8VK/oT7fuhERERll186d\n8tST4+XLRV/Y/z927cBBMvX/pkijxo11/31z57wj6V8tlg2bNkrDRo3sy6/p21fuf+ABVXjZoNB7\ndforsmPHDrn44ovloUcelktbtlTrPpk/X7775lvp1qO7+jPme7rxphvllttukx/W/yDTXnpJThw/\nLl07dVav/8/7/1O/L/P7TJn15pty8OBBufTSS+XRJx6XunXr2n+np/Xhii1WRGT6ompYrwGyev1v\nktL3Aak9eoZ6XLVus1qO9URERGYuqq7o2k2WZm4s8f+xJd//pJZjvd4WfPKJDLruuhJFlU18fLwk\nJiaqP2/+9Vfp2jlNLq5/sTw7cYJc2qqlXNW9h+zbt8/eIvWf995T3f3uu/9+uX7oULnn73erwqh5\ni+aqyGrYsKHMeP119VOnbl1ZvWqV9L/mGtVS9tTT4+XcuXOq8Dr5V28TT+vDGQsrIjK1lydOlYKE\nilL9lmlSvlVPSazRUD3iOZZjPRERkVmNf+ppyU+oINVuLvn/MTzHcqzX24ED+6Vho4YllqFgQgGD\nn0VffKGW/d/UqTJi1Ch5/Mkn5Ypu3eShhx+WgYMGyexZF8ZM1ahZU96e+470uPJKGTVmtPTs1UtW\nr1opFSpUkHr1Lpbk8uXlsssvUz+YPHn6P/8pI0aOlIcfeUSuvOoqeWv2v6VS5Ury7tx56vM8rQ9n\n7ApIRKaFsVTLF6erb/ZiE8uVWIfnyR0Gy/LFM9XrKlWuHLLtJCIi0oKxVIu++Nzl/8eSLh8sX34x\nU70uJSVFt4NYPrm8HD9echzXv155RXUBHDpkiBzNPqqWbfn9d9nw4wZZ+/339tdlHTokHTt1tD9v\n0KCBxMZeaIupVKmSnDp1yuXv3rFjhwy6bvCF/YyNlbbt2snOHTu8Wh/OWFgRkWkdyz6q+qIn1tAe\nR5VYvYFYiovU61hYERGR2WQfOeLx/2PFxUXqdXoWVl2uuEKWL1sqRUVFqusftGvf7vzv/KsbIKSk\nVJG+/TrL0GHDSry/cuVKfk+qW6VKVTl67HzhZnPs6DG55JJLvFofztgVkIhMq2r1amqAb8ER7XFU\nBdl7JDYuXr2OiIjIbKrXqOHx/2NxcfHqdXr6x0PjVKvUPXf9vcTYJbSM5efl2Z8PGz5cMtIXS63a\ntezd+XJyzsquXbu8+j2VUyrL0aPZJZb1H9Bf3nl7jhw5ckQ9X7N6jaz47jvp13+AV+vDGQsrIjIt\ntEIh/S/nh4ViKcgtsQ7Psbxn/75srSIiIlNCKxTS/879qP3/MSz/28CBurZWQb169WT5d9/KH3/8\nIRfXqSstm7eQ1Fat5NKmzaT/gAHSp+816nV/v+duFXLRrnUbadu6tXrtC//3vDT2Mqnw6p49paCg\nUFo0babGbu3etUse+Mc/pGPHjup3tWnZUgb97W/y/IsvSue088mBntaHsxgrZg+jEnJzcyUpKUk2\nHdwjZcuV7A9LRKFJBURQBcZUodsEvuFDUZVYeFrmL/uKketERGQoS2GRFB45obqrJZYp41cqIIIq\nMKbK9v8xFFVlCs/I6jWrDIlct0GL1R8HDkjFSpXkoosuKjFeyqagoEDNbYV5rqpUqWJfnp2dreLU\nmzZrZl+G1yUkJtrj0QsLC9Wy06fPSMtWLVWABZw+fVqyDh5UkxGX0ThmntYHW0F+vuzdu1cSaqRI\nbELJ0VJ5ubnStk4DlWBYzk1twMJKAwsrIvMVV0j/Q5DF+fk/4lVLFeexIiIisxdWtuIK6X8IssD/\nx9D9Dy1VRs1jRb5jYWUQFlZE5oT0PwRVYEwVwyqIiChcCivHMU4IqsCYKr27/1HoCyumAhJR2EAx\nxYKKiIjCFYopFlSRi+EVREREREREAWJhRUREREREFCAWVkRERERERAFiYUVERERERBQgFlZERERE\nREQBYmFFREREREQUIBZWREREREREAWJhRUREREREFCAWVkREREREEeTLRYukVrXq6ueiWrUlrUNH\nmfnqDLFarYb8vhXffSfDhw6Vpo0aS8P6l0ivq66WV6ZPl5ycHN1+B/Zl65YtYmYsrIiIiIiIguDE\niROyfds29WikgoICKSoqkq07d8imzb/Ko088Lk8/9ZS8O3ee7r9r1ptvyeCBgyQ1NVXmL/hEVmd+\nL5MmT5bsI0fk5Zde0u33nDp1SoqLi8XMWFgRERERERlo186dctOwYVKvdm1JbdVaPd48fLhabqTK\nlStLtWrVZMj118vA6wbJV18uUsvbtGypWoDq1a4jV3brLl9nZNjfg1at5yZOVK9p1riJ/P2OO+X4\n8eOan3/kyBF54rHH5P9eeEHGP/OMpLZtK3Xq1JGuV3SVqc8/L89OnGh/7dGjR+Xev9+tPhc/Tz3x\nhOTl5al1KJiwPf/7z3/kml69pdElDWTQ366VfXv3qvVocYOruvdQr8N7Ye+ePXLTDTeolrJOl10u\n0//1L7FYLPbf6Wm93lhYEREREREZBMXTlV27yM616fLOtYmy6a5k9bgjc7FabnRxZVMmsYwUFhap\nP6/OzFStWRt+3iT33Hev3HbzLbJ71y617tMFC+Tdee/K3Hffk29WfCfduneTd+bM0fzM5cuWSX5+\nvowaM1pzfUxMjHpE61m/3n3U48LPP5f5CxbIhh83yBOPPW4v5tAi9cbrb8jzL74o365cIfHxcfLI\nQw+p9Uu+Wa4ev/jqK7Xdz0yYILm5udKnV2+pklJFlixbKtP+9U95bcZM+dc//6le62m9EVhYERFR\n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\nIqJoEB/qDSAiovDmOBnvO9cmSmrNOPlZTca7VPr3Xc15o4iIKCqwxYqIiAIyZfJzqqjKHF1GRqQm\nSmqtOPWI51iO9URERJGOhRUREfkNY6kWp6fLo51jpXxiTIl1eI7l6ekZHHNFREQRj4UVERH57ejR\no1JcbFHd/7S0qRknRcXF6nVERESRjIUVERH5rVq1ahIXF6vGVGn55XCxxMfFqdcRERFFMhZWRETk\nt8qVK0v/fv1k2lqLnC2wlliH51jer19f9ToiIqJIxsKKiIgC8vQzz0pWfjlJm5sv7/1cIJsOFatH\nPMdyrCciIop0LKyIiCggDRs2VJHqDS7vLWMWFUi7WTkydlGheo7lWE9ERBTpYqxWa8m+GyS5ubmS\nlJQk+/fvl3LlyvGIEBH5kBKIoAqMqWL3PyIiipTa4OKLL5Zz5865rQ04QTAREekGxRQLKiIiikbs\nCkhERERERBQgFlZEREREREQBYmFFREREREQUIBZWREREREREAWJhRUREREREFCAWVkRERERERAFi\nYUVERERERBQgFlZEREREREQBCtkEwfn5+TJv3jz59ttvJS4uTq6++moZOXKkxMef36T58+fLrFmz\nSrznuuuuk/vuu8/+fP369fLGG2/I0aNHJS0tTcaNGydJSUleryciIiIiIgrrFqt+/frJzz//LEOG\nDFFF1cSJE+Wuu+6yr9+3b5+cOnVKnnjiCftP79697es3bNggPXr0kDp16sitt94qCxculKFDh3q9\nnoiIiIiISC8xVqvVKiFw4sQJSUlJsT//5JNP5JZbbpGcnBzVavXyyy/LsmXLJCMjQ/P9KJLQ0vXR\nRx/ZC7EGDRpIZmamdOrUyeN6d3Jzc1XL1v79+6VcuXK67jcREREREYUP1AYXX3yxnDt3zm1tELKu\ngI5FFWRlZalltq6A8Pvvv8vAgQOlUqVK9q6CsbHnG9nWrFkjU6ZMsb+2fv360rRpU7UchZOn9Y4K\nCwulqKjI/hwHDfLy8gzYcyIiIiIiChe2msBTe1TICitHu3fvlsmTJ8ukSZPsy4YPHy5t27YVi8Ui\nO3bskAkTJsjSpUvl/fffV+uzs7OlevXqJT4Hz7Hcm/WOpk6dWuJ326AQIyIiIiIiysvLc5vXEG+G\noqpnz54yduxYufvuu+3L0dyGH+jTp49qZerQoYNqhWrYsKEkJiaWalHC8zJlyqg/e1rvaPz48fL4\n44/bn6OYO3v2rFSoUEFiYmJ032eK3GbiqlWryrFjx9iFlHhNkSnx3yniNUVml2vC+ym0VKGOqFy5\nstvXhbSw2rp1q/Tq1UvuvPNOefbZZ92+tkmTJurx8OHDqrDC8+3bt9vXFxcXy549e6Rx48b217tb\n7yghIUH9OEpOTg54/yg64R8Bs/xDQJGB1xTxmiKz479TFOnXlDfJ4iFLBdy0aZNK7XvooYc0i6rZ\ns2erSHZblTh9+nRVJbZu3dreVRBx7QjBgHfffVe9HmmD3qwnIiIiIiLSS8harBCzjkJn8eLF6sfm\nww8/lGrVqqmueEjxQ+gEgi1QXCHhr3z58up1Dz/8sKxevVq1TNWrV0927dolc+bMUU2H3qwnIiIi\nIiIK+8LK1oLkDOOaAJP5oovg5s2bVSpgo0aNSnTXK1u2rKSnp8uWLVtUH0y0ZOF13q4n0hsSLRGy\n4phsScRrisyE/04Rrykyu/gwvp8K2TxWREREREREkSJkY6yIiIiIiIgiBQsrIiIiIiKiALGwIiIi\nIiIiClD4jQojCrG1a9fK3r171Z8x4fTgwYNdvvbHH3+UnTt3yrXXXsu50cil7777Tg4dOqT+jGkl\n+vbtq/k6hPHs2LFDUlNTVWIqkSsZGRly8uRJ9edatWrJlVdeWeo1Bw4ckF9++UWFPV1++eUMeCKP\nfv/9d5WyjNTmVq1alVqPFOf169erf8e6du0aluEDFDxWq1X9G7R//35p2rSpNGvWzKf1ZsQrnshH\nGzZskFWrVsm+ffvUTa6rwgo3Lf3795fs7Gw1OTUnnSZX1qxZI7/++qts27ZNCgsLSxVW586dk1tv\nvVVNIdGhQwd17d13333y97//nQeVNC1fvlz9G4Q5Iy+66KJShdWLL74ozz33nJpPEgUYivb58+dL\nr169eESpFBRTI0eOVNcKiip8wdi+fXv5/PPPVWFumy7njjvukI4dO6obYfw/D9chp7khLSiYxowZ\nI8XFxerfKPz/rXfv3vL++++rgtzTetNCKiAR+e4///mPtWrVqprrLBaLtVevXtaJEyciddO6Z88e\nHmLyaNq0adaWLVuWWn733XdbO3XqZD158qR6XlRUZP366695RMmjhx9+2NqzZ88Sy86ePWuNi4uz\nLliwwL7swQcftF5++eU8oqRp06ZN1szMTPvzo0ePWmvUqGGdOXOmen7q1ClrhQoVrLNnz1bP8/Pz\nrR06dLDed999PKKk6fvvv1fXlc3+/futycnJ1g8++MCr9WbFMVZEBnjjjTfUnGw33HADjy8FJCcn\nR01uPnHiRNWqgAnVDx8+LH369OGRJb+gVRRdbBy7k15yySVSUFDAI0qa0P24c+fO9udohapbt64c\nPXpUPUfLlMVikREjRqjniYmJMnbsWFm4cCGPKGlKS0tT15VNvXr11HVlu6Y8rTcrE7elEYVvlwl0\ns0E/c9sYByJ/oZjCDe+MGTPkyJEj6n8s6BLxz3/+k10ByS8Y/zJlyhR1/aDr1unTp2XWrFny+uuv\n84iSV/Bv0ObNm9WXPrB7925VaKGgskGXwT///FP9++W4nEjLF198of4fhyEU/qw3CxZWRDrCN3aj\nRo1SNy0YMM7CigKVn5+vHtHHHK1V8PHHH8ttt90mQ4YMkRo1avAgk89QoJ85c0bdrJw9e1YFV5Qr\nV45HkjxCQYWxxf/617+kXbt2allRUVGp4gnhTq7WETnKzMxUrZ0o1Bs2bOjzejNhYUWkIwzeRbAA\n/ieCPx88eFAtX7RokfTs2VMuvfRSHm/ySc2aNdXj3/72N/sy/BnfAqM1i4UV+eqHH35QrVVbt25V\nSVuAG5ZBgwapdEreBJO78CaE66Br8r333lvi3yl0UXaEawld4pOSknhAyW0qLgp1DKG4+eabfV5v\nNiysiHRUrVo16dKli3z22WfqOb4RhiVLlqgWBxZW5KtGjRqpvuVIoLSx/Rldb4h8hUjshIQEdV3Z\nNG7cWLWw5+XlsbAil93/Bg4cqLohjx49usS67t27qwRcdIFHKiB8+eWXajmRK+iFgWJp7ty5mgnL\nntabEQsrIh8hEnvjxo0qbhatBmiZAgRVIFDAMVQA3wjjH4aZM2eqweFEWhCJjWsFj6dOnVLXlG2O\ntJiYGDVmDy0MuOmtUqWKvPLKK3LLLbeom2Eid/Pt4d8rtCTgmrLNkYaI9Tp16qixCriOEOf/6quv\nynXXXScVK1bkASXNORmvueYa6devn+oyavv/HsZRderUSXXPuvPOO9X/Bx9++GH15c8nn3yipiYh\n0oLAE/ybg6lE0OXddk01b95c2rZt63G9WcUgGjDUG0EUTvAt3H//+99SyzG3QmxsyaBNdAV86KGH\nVGFVvXr1IG4lhZP//e9/qruoI9zg/vvf/7Y/X7lypXz00UdqvMIVV1yhboidrzciGwRRON/UooVq\n2rRp6s/Hjh1T3wKjoEfXP9wc45thtGQROfv2229VwIkzFOl33323fYzxvHnz1L9VKOIxB1GbNm14\nMEkTxnfivsnZtddeq/7/5mm9WbGwIiIiIiIiChC/7iQiIiIiIgoQCysiIiIiIqIAsbAiIiIiIiIK\nEAsrIiIiIiKiALGwIiIiIiIiChALKyIiIiIiogCxsCIiIiIiIgoQCysiIjLU448/XmKyY0+effZZ\nee2111w+91X37t1l8+bNYpb9IyKiyBQf6g0gIqLItmvXLilXrpzL9SicatSoIffdd596vnv3biko\nKLCvd37uq59++knOnj0rodo/IiKKDiysiIgopEaPHi2JiYlhcRbGjx8vF110kdx9992h3hQiIjIZ\nFlZERBRSDRo0CJszgNapmJiYUG8GERGZEAsrIiIyHLryTZgwQdasWSO1atWSp556Si699FLNroCB\nsFqtajzWokWLpEqVKpotS+np6fLee+/JoUOHpF27dvLMM89ISkqKfbxUvXr1JDs7u9S2vvnmm7Jk\nyRJZuXKlZGRkSOXKlWXZsmXqfYWFhTJ16lT57rvvpEKFCupzOnXq5HF78Tr8juPHj0tmZqZUqlRJ\nJk2apD7vxRdflKysLOnTp4888cQTEhcX5/d7iIjIeAyvICIiw/3zn/+U/Px81ZUORVRaWpoqAGxj\nqP744w9dfs9zzz0nL7/8stx5551y6623yrhx4yQ3N9e+fvbs2TJ27FhVeEycOFFOnjwpV155pRQX\nF9tbpB5++GHNbR00aJB06NBB+vXrJ2+99ZbaJ5tXXnlFtWShSGvYsKH079/fq3Fd+H34PSjG8F50\niezbt6/cc889ctNNN8mjjz4qb7zxhsydOzeg9xARkfHYYkVERIbr1q2bvPDCC+rPV111laxfv14l\n6aEVSy9orUKx8/7778vf/vY3tQzjodAqZYOCZNasWTJ48GD7djVu3FiWLl2qihNP24qWrdq1a8vl\nl19e4nfj89CyZXs/Xv/rr7+qosyT66+/Xh577DH79mJ7PvroI+natataNmLECPn222/l9ttvD+g9\nRERkLLZYERGR4S677LJSz7dv367r70DXvjNnzpT4XampqRIff/47xCNHjqgufuh6iMIIPx07dpSj\nR4/Kjh07AtpWFDY2aLmqWLGinDp1yqvtbtSokf3P6Nantcz5s/x5DxERGYstVkREZLhjx46VeI5i\npmrVqrr+DrQmoajB70KrEqCrX1FRkb3YwJgjtFo5FkKAcVXebCuDK4iIyBW2WBERkeE++eQTe6vQ\nli1b5PPPP5cBAwbo+jvKli0rPXv2VAEOFotFLXv++eft68uUKSPXXXed+t0Io0CLFboJbty4scQ4\nLHfbiuINrV5ERETOWFgREZHhrrjiCundu7c0b95cFTP333+/XHPNNbr/HiT3bdiwQerUqaNaoRA6\n4Th5L0In0IKFVL2WLVuqlii8vnr16l5tK8IhPvzwQ2ndurX06tVL9+0nIqLwFWPFaF8iIiKDIPUP\nrUkoZvBnFDG2cUGwZ88elWxXt25dr557gv+t4fcgbh0tTGiRatq0qSQnJ9tfg8S+AwcOyCWXXFKi\n8Bo6dKi0atVKjcPS2lbbe/fu3auSBDGGy7Z/KOZsfvnlF/XZGGvlzbGxvRdF36ZNm6Rt27b2sWEY\nO4bfaeu+6M97iIjIeCysiIiInAorRLETERH5guEVREQUNjp37mwPo3CE1pq3335bzCbctpeIiPzH\nFisiIgobGA+l1YMdk+U2a9Ys4M/X6tZn5u0lIiLzYGFFREREREQUIKYCEhERERERBYiFFRERERER\nUYBYWBEREREREQWIhRUREREREVGAWFgREREREREFiIUVERERERFRgFhYERERERERBYiFFRERERER\nkQTm/wEwu4JW74DfGAAAAABJRU5ErkJggg==\n"
          }
        }
      ],
      "source": [
        "def plot_decision_boundary(X, y, model, feature_names):\n",
        "    x0 = np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 300)\n",
        "    x1 = np.linspace(X[:, 1].min() - 200, X[:, 1].max() + 200, 300)\n",
        "    xx0, xx1 = np.meshgrid(x0, x1)\n",
        "\n",
        "    grid = np.column_stack([xx0.ravel(), xx1.ravel()])\n",
        "    regions = np.argmax(\n",
        "        model.predict_proba(grid), axis=1\n",
        "    ).reshape(xx0.shape)\n",
        "\n",
        "    plt.figure(figsize=(9, 5))\n",
        "    plt.contourf(xx0, xx1, regions, alpha=0.25, cmap=\"Set2\")\n",
        "    for label in model.classes_:\n",
        "        selected = y == label\n",
        "        plt.scatter(\n",
        "            X[selected, 0],\n",
        "            X[selected, 1],\n",
        "            edgecolor=\"black\",\n",
        "            label=label,\n",
        "        )\n",
        "    plt.xlabel(feature_names[0])\n",
        "    plt.ylabel(feature_names[1])\n",
        "    plt.title(\"Régions de classification de l'arbre de décision\")\n",
        "    plt.legend()\n",
        "    plt.tight_layout()\n",
        "\n",
        "\n",
        "plot_decision_boundary(X_train, y_train, tree_model, feature_names)\n",
        "plt.show()"
      ],
      "id": "cell-decision-regions"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Complexité et limites\n",
        "\n",
        "Dans un nœud contenant $n$ exemples et $D$ attributs, cette\n",
        "implémentation évalue jusqu’à $D(n-1)$ seuils. Chaque évaluation\n",
        "parcourt de nouveau les exemples; la recherche d’une division demande\n",
        "donc approximativement $\\mathcal{O}(Dn^2)$ opérations. Les\n",
        "implémentations de production réutilisent les valeurs triées et des\n",
        "statistiques suffisantes pour éviter une grande partie de ce travail.\n",
        "\n",
        "Parmi les autres limites importantes :\n",
        "\n",
        "- seuls les attributs numériques et les divisions binaires par seuil\n",
        "  sont pris en charge;\n",
        "- la recherche gloutonne ne garantit pas un arbre globalement optimal;\n",
        "- aucune stratégie pour les valeurs manquantes, aucune pondération des\n",
        "  exemples et aucun élagage ne sont implémentés;\n",
        "- de petites modifications du jeu d’entraînement peuvent produire un\n",
        "  arbre différent.\n",
        "\n",
        "# Expériences suggérées\n",
        "\n",
        "1.  Modifiez `max_depth`, puis examinez les règles apprises et les\n",
        "    régions de décision.\n",
        "2.  Modifiez `min_samples_leaf` et observez quelles petites régions\n",
        "    disparaissent.\n",
        "3.  Utilisez les trois espèces plutôt que la cible binaire.\n",
        "4.  Ajoutez un autre attribut numérique. Le classificateur fonctionnera\n",
        "    encore, mais les régions de décision ne pourront plus être\n",
        "    représentées dans une figure bidimensionnelle.\n",
        "5.  Comparez les prédictions avec celles du `DecisionTreeClassifier` de\n",
        "    scikit-learn en utilisant `criterion=\"entropy\"`."
      ],
      "id": "b74a12e5-8cf3-4a59-8209-04fb21153aba"
    }
  ],
  "nbformat": 4,
  "nbformat_minor": 5,
  "metadata": {
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3 (ipykernel)",
      "language": "python",
      "path": "/Users/turcotte/.virtualenvs/csi4106/share/jupyter/kernels/python3"
    }
  }
}