{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Building a Decision Tree Classifier\n",
        "\n",
        "CSI 4106 — Introduction to Artificial Intelligence\n",
        "\n",
        "Marcel Turcotte  \n",
        "2026-09-15\n",
        "\n",
        "# Introduction\n",
        "\n",
        "This notebook develops a small decision-tree classifier from first\n",
        "principles. The objective is not to compete with scikit-learn, but to\n",
        "expose the central operations of the learning algorithm:\n",
        "\n",
        "1.  measure how mixed the classes are;\n",
        "2.  evaluate candidate splits;\n",
        "3.  retain the best split; and\n",
        "4.  repeat recursively.\n",
        "\n",
        "The implementation supports numerical features, binary threshold splits,\n",
        "multiclass labels, class-probability predictions, and a few stopping\n",
        "conditions. It deliberately omits missing values, categorical features,\n",
        "sample weights, optimized split search, and pruning.\n",
        "\n",
        "# Preparation\n",
        "\n",
        "The only non-standard dataset dependency is `palmerpenguins`. The\n",
        "installation step runs only when that package is unavailable, which\n",
        "makes the notebook suitable for a fresh Google Colab session."
      ],
      "id": "018b5c9f-f6ab-43fd-9ff6-3f71a3b7cbf9"
    },
    {
      "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": [
        "# Palmer Penguins\n",
        "\n",
        "We retain two numerical features and formulate a binary classification\n",
        "task: **Gentoo** versus **not Gentoo**. Limiting the example to two\n",
        "features lets us draw the learned decision regions."
      ],
      "id": "7e7f53d8-94f9-4abe-a4ff-1b2c674c311b"
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Training examples: 273\n",
            "Test examples: 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",
        "    \"Not 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\"Training examples: {len(X_train)}\")\n",
        "print(f\"Test examples: {len(X_test)}\")"
      ],
      "id": "penguins-data"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Entropy\n",
        "\n",
        "For a node containing class proportions $p_1,\\ldots,p_K$, entropy is\n",
        "\n",
        "$$\n",
        "H=-\\sum_{k=1}^{K}p_k\\log_2p_k.\n",
        "$$\n",
        "\n",
        "A pure node has entropy zero. Entropy increases as the class proportions\n",
        "become more evenly balanced."
      ],
      "id": "52a8bd77-a0e0-4ac1-bf2c-7f88dcd67491"
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {},
      "outputs": [],
      "source": [
        "def class_probabilities(y, classes):\n",
        "    \"\"\"Return the fraction of examples belonging to each class.\"\"\"\n",
        "    return np.array([np.mean(y == label) for label in classes])\n",
        "\n",
        "\n",
        "def entropy(y, classes):\n",
        "    \"\"\"Measure how mixed the classes are; zero means a pure node.\"\"\"\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": [
        "The following small check recovers the familiar binary values: a\n",
        "balanced node has one bit of entropy, whereas a pure node has none."
      ],
      "id": "a8e696eb-be96-4e3f-9d5e-5447e7960aaf"
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Balanced node: 1.000 bits\n",
            "Pure node: 0.000 bits"
          ]
        }
      ],
      "source": [
        "binary_classes = np.array([\"Gentoo\", \"Not Gentoo\"])\n",
        "\n",
        "balanced = np.array([\"Gentoo\", \"Not Gentoo\"])\n",
        "pure = np.array([\"Gentoo\", \"Gentoo\"])\n",
        "\n",
        "print(f\"Balanced node: {entropy(balanced, binary_classes):.3f} bits\")\n",
        "print(f\"Pure node: {entropy(pure, binary_classes):.3f} bits\")"
      ],
      "id": "entropy-check"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Evaluating a Split\n",
        "\n",
        "A candidate split creates left and right children. We score it using\n",
        "their weighted entropy:\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",
        "The weights prevent a tiny pure child from having the same influence as\n",
        "a much larger mixed child."
      ],
      "id": "510486db-9879-4768-8558-aff94fcf5b7e"
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {},
      "outputs": [],
      "source": [
        "def weighted_entropy(y_left, y_right, classes):\n",
        "    \"\"\"Return the weighted entropy produced by a split.\"\"\"\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",
        "    \"\"\"Return midpoints between consecutive distinct feature values.\"\"\"\n",
        "    values = np.unique(values)\n",
        "    return (values[:-1] + values[1:]) / 2"
      ],
      "id": "split-score"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Three candidate splits\n",
        "\n",
        "The following example compares the cases discussed in the lecture.\n",
        "Without weights, isolating a single pure example appears deceptively\n",
        "attractive."
      ],
      "id": "a0f79dd3-0408-4abb-8147-a68d6c48b6f0"
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "      messy: unweighted=0.971, weighted=0.971\n",
            "isolate one: unweighted=0.496, weighted=0.892\n",
            "     useful: unweighted=0.722, weighted=0.722"
          ]
        }
      ],
      "source": [
        "split_examples = {\n",
        "    \"messy\": (\n",
        "        np.array([\"Gentoo\"] * 3 + [\"Not Gentoo\"] * 2),\n",
        "        np.array([\"Gentoo\"] * 2 + [\"Not Gentoo\"] * 3),\n",
        "    ),\n",
        "    \"isolate one\": (\n",
        "        np.array([\"Gentoo\"]),\n",
        "        np.array([\"Gentoo\"] * 4 + [\"Not Gentoo\"] * 5),\n",
        "    ),\n",
        "    \"useful\": (\n",
        "        np.array([\"Gentoo\"] * 4 + [\"Not Gentoo\"]),\n",
        "        np.array([\"Gentoo\"] + [\"Not 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}: unweighted={unweighted:.3f}, weighted={weighted:.3f}\")"
      ],
      "id": "split-score-check"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Greedy Split Search\n",
        "\n",
        "For every feature, we examine the midpoints between consecutive distinct\n",
        "values. The function retains the candidate with the smallest weighted\n",
        "entropy."
      ],
      "id": "a66fcecb-280f-4d1e-bfb7-f1f396aacd20"
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {},
      "outputs": [],
      "source": [
        "def find_best_split(X, y, classes, min_samples_leaf):\n",
        "    \"\"\"Return the best split and the number of candidates evaluated.\"\"\"\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": [
        "This is a greedy search: it chooses the best immediate split and does\n",
        "not reconsider earlier decisions. It is therefore not guaranteed to\n",
        "construct the smallest or globally optimal tree.\n",
        "\n",
        "# Tree Representation\n",
        "\n",
        "Each node stores the class proportions of the examples that reached it.\n",
        "A leaf uses those proportions to make predictions. An internal node\n",
        "additionally stores a feature, a threshold, and two children."
      ],
      "id": "9ec2b3bd-8ab5-49d5-a2a2-1a2ea91e4cae"
    },
    {
      "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": [
        "# Classifier\n",
        "\n",
        "The recursive `_grow_tree` method is the heart of learning. It creates a\n",
        "node, checks the stopping conditions, finds a split, and recursively\n",
        "constructs its children.\n",
        "\n",
        "The validation and text-formatting methods are included for usability.\n",
        "They are supporting code rather than new machine-learning ideas."
      ],
      "id": "3d8c5f63-e5ee-4284-9a60-4421f9810579"
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {},
      "outputs": [],
      "source": [
        "class SimpleDecisionTreeClassifier:\n",
        "    \"\"\"A didactic classifier with a small scikit-learn-like interface.\"\"\"\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 must match the number of features\")\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}predict {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}if {name} <= {node.threshold:.3f}:\")\n",
        "            visit(node.left, indent + \"    \")\n",
        "            lines.append(f\"{indent}else:\")\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 must be 2-D and y must be 1-D with matching rows\"\n",
        "            )\n",
        "        if len(y) == 0:\n",
        "            raise ValueError(\"the training set cannot be empty\")\n",
        "        if not np.isfinite(X).all():\n",
        "            raise ValueError(\n",
        "                \"missing and non-finite feature values are unsupported\"\n",
        "            )\n",
        "        if self.max_depth is not None and self.max_depth < 0:\n",
        "            raise ValueError(\"max_depth must be non-negative or None\")\n",
        "        if self.min_samples_split < 2:\n",
        "            raise ValueError(\"min_samples_split must be at least 2\")\n",
        "        if self.min_samples_leaf < 1:\n",
        "            raise ValueError(\"min_samples_leaf must be at least 1\")\n",
        "\n",
        "    def _validate_prediction_data(self, X):\n",
        "        if not hasattr(self, \"tree_\"):\n",
        "            raise ValueError(\"call fit before making predictions\")\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 has the wrong number of features\")\n",
        "        if not np.isfinite(X).all():\n",
        "            raise ValueError(\n",
        "                \"missing and non-finite feature values are unsupported\"\n",
        "            )\n",
        "        return X"
      ],
      "id": "classifier"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Training\n",
        "\n",
        "We limit the tree to two decisions along any path and require each leaf\n",
        "to contain at least five training examples."
      ],
      "id": "18f998b1-695a-4184-82ec-7b5a30ab35ed"
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Test accuracy: 1.000\n",
            "Candidate splits evaluated: 312\n",
            "Class order: ['Gentoo' 'Not Gentoo']\n",
            "\n",
            "Learned rules:\n",
            "\n",
            "if bill_depth_mm <= 16.450:\n",
            "    if body_mass_g <= 3750.000:\n",
            "        predict 'Not Gentoo' (p=[0. 1.], n=5)\n",
            "    else:\n",
            "        predict 'Gentoo' (p=[1. 0.], n=92)\n",
            "else:\n",
            "    if body_mass_g <= 5100.000:\n",
            "        predict 'Not Gentoo' (p=[0. 1.], n=170)\n",
            "    else:\n",
            "        predict '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\"Test accuracy: {tree_model.score(X_test, y_test):.3f}\")\n",
        "print(f\"Candidate splits evaluated: {tree_model.n_candidate_splits_}\")\n",
        "print(f\"Class order: {tree_model.classes_}\")\n",
        "print(\"\\nLearned rules:\\n\")\n",
        "print(tree_model.export_text(feature_names))"
      ],
      "id": "training"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Decision Regions\n",
        "\n",
        "Every test in this tree compares one feature with one threshold. In two\n",
        "dimensions, the resulting regions are therefore assembled from\n",
        "horizontal and vertical boundaries."
      ],
      "id": "7aab018b-f854-4ae7-9785-3d0dcb9cd186"
    },
    {
      "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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\nOXrkiAy99TZ5bcpUzb7n448+4v+TXbDFiogMb8e27fLSU8/Kd5lZYisqEovVKj3795MHJ4yXWnVq\nR3vziIiIfNq6ZYs8/th4+XrObOf/x64ecI1M+uezUrdePU2P3tmzZ+XmwYOld58+8ta77xQLZXhm\n0iTZuXNnsdd/PWeOLFm8RP35qquvkq7duqk/22w2GTV8hDw2/nGZO3eubN28RZo0bSqj77hdEhMT\n5dGHH1Gve/If/5By5cpLr9695NYhQ6SoqEg+/O//ZPWqVVIhvYJcf8MN0qx5c+f3+VtvZmyxIiLD\nF1WDel0pS1f8Jul9x0n1EVPU45Ll69VyrCciIjJyUdWlc1eZn72m2P/H5v30s1qO9Vr6buFC2bVz\npzw96dkSSXd4XqtWLefzv425U8Y/9pjqyoeWLbRo/ef9D5yFFVqkrr/uOjmVmytNmzWTKa++Ko8/\n+pha37lLZ/XYsVMn6XNFH2nY6FwXwxuvv15eeflf0qBhQ8nLOyuXde0m8+fNc36nv/VmxhYrIjK0\nyRMmSX5SOal860tiSU5Vy5Kr1JHSDTrJwf89pNZP/eDdaG8mERGRR+Mf/4ecTSorF9xS8v9jhz58\nSK3/+NOPNTt6WzZvkYoVK0q1atWcyz763/9k3rfnipfadWrLkxMmyMoVK+WTjz+WPzZvkipVqqh1\nTZo0kTvvGCNDhg11vvfx8ePl5ltvVX+udEEleeqJJ+XFyS/J1QMGqGX9+/dXLVmweNEi+W7hd+oz\nHd+fmpoiT47/h2pB87fe7NhiRUSGhbFUC+dmSlq765z/M3LAcyxfODeL/buJiMiQMJZqzuyvpHRb\nz/8fw/KvZ8/WdMxVUlKSnDlzRux2u3MZWpPQqlRYVCjfZmapZT+vXi2lSpWSRx58SIVQ4Gf6e+9J\nzt69xbanZatWzj9Xr15Djhw+7PW71/+6Xho3blysqLusRw/57bffVBdAf+vNji1WRGRYhw8eUn3R\nk6t4HkeVXLm22IoK1evKV6gQ8e0jIiLy5eCBA37/P1ZUVKhel56ersnBbN2mjSqs1q5ZK61anyuK\nWrdprX5279kj27ZsVctQVJUpW1YVXK4GDBig1jlYLMXbYVwLNnepqalyJu9MsWXYlpSUFLFarX7X\nmx1brIjIsCpVvkAN8M0/4HkcVf7B7WKxJqrXERERGU3lKlX8/n/Mak1Ur9NK+w7tpcfll8s9d98t\nu3fvLrausKDA+eful3VXSYH16jdQXf3wM2jwYElJTZXSpUsH9F1ly5aVkydznc87de4kmzdtluyf\nsp3jtNAK1rVb14DWmx1brIjIsNAKhfS/Jctnqb7ort0obPln5NTKWdKzf1+2VhERkSGhFQrpf/N+\n8vz/sdOrZslVAwZo1lrl8L+PP5K/3XmntGzaTFq0bKmCKXL25sj2bdvk4UcfVa+pXaeOTPn3a3Ld\ngAEqmKJMmTT59df1MnTYULlu4MCAvqdP3yvkjtGjpHXrNtK7T2+VCjjx2Wfkmquuki5du6oQjbyz\nefLl7Nnq9Q0bNfK53uwS7L7a8+IUmiRRqa/du11V7UQU/VRABFhgTBW6TeA3fCiqkgtOyMwF3zBy\nnYiIdGMrKJSCA0flkksukWSXLnLBpgIiwAJjqhz/H0NRVargpCz9cYnmkesOu3btkl/WrZOCggKp\nVesSubTxparbnatjx47JurVr5dSpU6oboWP8E0qEjz/8UK68+mopV66cWnbw4EFZ9MMPcsOgQeo5\nxkX9uHSp7N27V+rVqy9t27VVyxHpju+tkJ4ubdu2LfGd/tZHQ/7Zs/Lnn39KUpV0sSQVb3vKO3NG\nWtaoLadPn1bdGb1hYeUBCysi4xVXSP9DkMW5+T8SVUsV57EiIiKjF1aO4grpfwiywP/H0P0PLVV6\nzGNFoWFhpRMWVkTGTQlEUAXGVDGsgoiIzFJYOSBtD0EVGFOldfc/in5hxTFWRGQaKKZYUBERkVmh\nmGJBFbuYCkhERERERBQmFlZERERERERhYmFFREREREQUJhZWREREREREYWJhRUREREREFCYWVkRE\nRERERGFiYUVERERERBQmFlZERERERERhYmFFRERERBRDBlx5lfTt3Udyc3OLLe/WuYus+XlNwJ+D\n12/fts3v6/CaJ8aPl6v7Xyn9+lwhd995l2TOnRvStoe7LdHEwoqIiIiIKAKOHj0qmzZuVI96+nn1\nasn+6Sf51+TJxZavXLFCTp48EfDn4PWnT5/2+RoUUG1btZYdO3bIkGFD5ZHHHpW27drJe+++K09P\nmBDyPoSyLdHGwoqIiIiISEdbt2yRmwcNkprVq0uLps3U4y033qiW6+Wuu++WV19+Rfbs2eP1NSdP\nnpQJTz6pWpqG3HqrzP3mG+e6W266ST2OGDpMtRa98vLLJd5/4sQJGTV8hIwdd4988N//yo2DB8tl\n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\nQ0CxgdcU8Zoio+O/UxTr11QgyeJRSwVcu3atSu27//77PRZV77zzjopkd1SJL7/8sqoSmzVr5uwq\niLh2hGDA+++/r16PtMFA1hMREREREWklai1WiFlHoTN37lz14/Dxxx/LBRdcoLriIcUPoRMItkBx\nhYS/MmXKqNc98MADsnTpUtUyVbNmTdm6datMmzZNNR0Gsp6IiIiIiMj0hZWjBckdxjUBJvNFF8H1\n69erVMC6desW666XkpIimZmZ8scff6g+mGjJwusCXU+kNSRaImTFNdmSiNcUGQn/nSJeU2R0iSa+\nn4raPFZERERERESxImpjrIiIiIiIiGIFCysiIiIiIqIwsbAiIiIiIiIKk/lGhRFF2bJly+TPP/9U\nf8aE09ddd53X165atUq2bNkiV199NedGI69++OEH2bdvn/ozppXo27evx9chjGfz5s3SokULlZhK\n5E1WVpYcO3ZM/blatWpy2WWXlXjNrl275JdfflFhT23btmXAE/n1+++/q5RlpDY3bdq0xHqkOK9Y\nsUL9O9a5c2dThg9Q5NjtdvVv0M6dO6VBgwbSsGHDoNYbEa94oiCtXr1alixZIjt27FA3ud4KK9y0\n9O/fXw4ePKgmp+ak0+TNjz/+KL/++qts3LhRCgoKShRWp0+flttuu01NIdGuXTt17Y0dO1buvPNO\nHlTyaOHCherfIMwZedFFF5UorF544QV5+umn1XySKMBQtM+cOVN69erFI0oloJgaNmyYulZQVOEX\njK1bt5avvvpKFeaO6XJuv/12ad++vboRxv/zcB1ymhvyBAXTyJEjpaioSP0bhf+/9e7dWz788ENV\nkPtbb1hIBSSi4P3nP/+xV6pUyeM6m81m79Wrl33ChAlI3bRv376dh5j8eumll+xNmjQpsfyuu+6y\nd+jQwX7s2DH1vLCw0P7tt9/yiJJfDzzwgL1nz57FluXm5tqtVqv9888/dy6799577W3btuURJY/W\nrl1rz87Odj4/dOiQvUqVKvapU6eq58ePH7eXLVvW/s4776jnZ8+etbdr184+duxYHlHy6KefflLX\nlcPOnTvtaWlp9o8++iig9UbFMVZEOnj99dfVnGyDBw/m8aWwnDp1Sk1uPmHCBNWqgAnV9+/fL336\n9OGRpZCgVRRdbFy7k15yySWSn5/PI0oeoftxx44dnc/RCnXhhRfKoUOH1HO0TNlsNhk6dKh6npyc\n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\nSUVORK5CYII=\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(\"Decision Tree Classification Regions\")\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": [
        "# Complexity and Limitations\n",
        "\n",
        "At a node containing $n$ examples and $D$ features, this implementation\n",
        "tests up to $D(n-1)$ thresholds. Each test scans the examples again, so\n",
        "finding one split is approximately $\\mathcal{O}(Dn^2)$. Production\n",
        "implementations reuse sorted values and sufficient statistics to avoid\n",
        "much of this work.\n",
        "\n",
        "Other important limitations include:\n",
        "\n",
        "- only numerical features and binary threshold splits are supported;\n",
        "- the greedy search does not guarantee a globally optimal tree;\n",
        "- no missing-value strategy, sample weights, or pruning are implemented;\n",
        "  and\n",
        "- small changes to the training data can produce a different tree.\n",
        "\n",
        "# Suggested Experiments\n",
        "\n",
        "1.  Change `max_depth` and inspect the learned rules and decision\n",
        "    regions.\n",
        "2.  Change `min_samples_leaf` and observe which small regions disappear.\n",
        "3.  Use all three species instead of the binary target.\n",
        "4.  Add another numerical feature. The classifier will still work,\n",
        "    although the decision regions can no longer be displayed in a\n",
        "    two-dimensional plot.\n",
        "5.  Compare the predictions with scikit-learn’s `DecisionTreeClassifier`\n",
        "    using `criterion=\"entropy\"`."
      ],
      "id": "53711fea-e055-4c7e-a86f-85529ef5c2c7"
    }
  ],
  "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"
    }
  }
}