{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## DMML Lecture 05, 22 Jan 2026 – Decision Trees"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This project requires Python 3.7 or above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "\n",
    "assert sys.version_info >= (3, 7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It also requires Scikit-Learn ≥ 1.0.1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from packaging import version\n",
    "import sklearn\n",
    "\n",
    "assert version.parse(sklearn.__version__) >= version.parse(\"1.0.1\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we did in previous chapters, let's define the default font sizes to make the figures prettier:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.rc('font', size=14)\n",
    "plt.rc('axes', labelsize=14, titlesize=14)\n",
    "plt.rc('legend', fontsize=14)\n",
    "plt.rc('xtick', labelsize=10)\n",
    "plt.rc('ytick', labelsize=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And let's create the `images/decision_trees` folder (if it doesn't already exist), and define the `save_fig()` function which is used through this notebook to save the figures in high-res for the book:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "\n",
    "IMAGES_PATH = Path() / \"images\" / \"decision_trees\"\n",
    "IMAGES_PATH.mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n",
    "    path = IMAGES_PATH / f\"{fig_id}.{fig_extension}\"\n",
    "    if tight_layout:\n",
    "        plt.tight_layout()\n",
    "    plt.savefig(path, format=fig_extension, dpi=resolution)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training and Visualizing a Decision Tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "}\n",
       "\n",
       "#sk-container-id-1.light {\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: black;\n",
       "  --sklearn-color-background: white;\n",
       "  --sklearn-color-border-box: black;\n",
       "  --sklearn-color-icon: #696969;\n",
       "}\n",
       "\n",
       "#sk-container-id-1.dark {\n",
       "  --sklearn-color-text-on-default-background: white;\n",
       "  --sklearn-color-background: #111;\n",
       "  --sklearn-color-border-box: white;\n",
       "  --sklearn-color-icon: #878787;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: center;\n",
       "  justify-content: center;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table {\n",
       "    font-family: monospace;\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table summary::marker {\n",
       "    font-size: 0.7rem;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       "/*\n",
       "    `table td`is set in notebook with right text-align.\n",
       "    We need to overwrite it.\n",
       "*/\n",
       ".estimator-table table td.param {\n",
       "    text-align: left;\n",
       "    position: relative;\n",
       "    padding: 0;\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td.value {\n",
       "    color:rgb(255, 94, 0);\n",
       "    background-color: transparent;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       "/*\n",
       "    Styles for parameter documentation links\n",
       "    We need styling for visited so jupyter doesn't overwrite it\n",
       "*/\n",
       "a.param-doc-link,\n",
       "a.param-doc-link:link,\n",
       "a.param-doc-link:visited {\n",
       "    text-decoration: underline dashed;\n",
       "    text-underline-offset: .3em;\n",
       "    color: inherit;\n",
       "    display: block;\n",
       "    padding: .5em;\n",
       "}\n",
       "\n",
       "/* \"hack\" to make the entire area of the cell containing the link clickable */\n",
       "a.param-doc-link::before {\n",
       "    position: absolute;\n",
       "    content: \"\";\n",
       "    inset: 0;\n",
       "}\n",
       "\n",
       ".param-doc-description {\n",
       "    display: none;\n",
       "    position: absolute;\n",
       "    z-index: 9999;\n",
       "    left: 0;\n",
       "    padding: .5ex;\n",
       "    margin-left: 1.5em;\n",
       "    color: var(--sklearn-color-text);\n",
       "    box-shadow: .3em .3em .4em #999;\n",
       "    width: max-content;\n",
       "    text-align: left;\n",
       "    max-height: 10em;\n",
       "    overflow-y: auto;\n",
       "\n",
       "    /* unfitted */\n",
       "    background: var(--sklearn-color-unfitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       "/* Fitted state for parameter tooltips */\n",
       ".fitted .param-doc-description {\n",
       "    /* fitted */\n",
       "    background: var(--sklearn-color-fitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".param-doc-link:hover .param-doc-description {\n",
       "    display: block;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(max_depth=2, random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('criterion',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=criterion,-%7B%22gini%22%2C%20%22entropy%22%2C%20%22log_loss%22%7D%2C%20default%3D%22gini%22\">\n",
       "            criterion\n",
       "            <span class=\"param-doc-description\">criterion: {\"gini\", \"entropy\", \"log_loss\"}, default=\"gini\"<br><br>The function to measure the quality of a split. Supported criteria are<br>\"gini\" for the Gini impurity and \"log_loss\" and \"entropy\" both for the<br>Shannon information gain, see :ref:`tree_mathematical_formulation`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;gini&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('splitter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=splitter,-%7B%22best%22%2C%20%22random%22%7D%2C%20default%3D%22best%22\">\n",
       "            splitter\n",
       "            <span class=\"param-doc-description\">splitter: {\"best\", \"random\"}, default=\"best\"<br><br>The strategy used to choose the split at each node. Supported<br>strategies are \"best\" to choose the best split and \"random\" to choose<br>the best random split.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;best&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_depth',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_depth,-int%2C%20default%3DNone\">\n",
       "            max_depth\n",
       "            <span class=\"param-doc-description\">max_depth: int, default=None<br><br>The maximum depth of the tree. If None, then nodes are expanded until<br>all leaves are pure or until all leaves contain less than<br>min_samples_split samples.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_split',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_split,-int%20or%20float%2C%20default%3D2\">\n",
       "            min_samples_split\n",
       "            <span class=\"param-doc-description\">min_samples_split: int or float, default=2<br><br>The minimum number of samples required to split an internal node:<br><br>- If int, then consider `min_samples_split` as the minimum number.<br>- If float, then `min_samples_split` is a fraction and<br>  `ceil(min_samples_split * n_samples)` are the minimum<br>  number of samples for each split.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_leaf,-int%20or%20float%2C%20default%3D1\">\n",
       "            min_samples_leaf\n",
       "            <span class=\"param-doc-description\">min_samples_leaf: int or float, default=1<br><br>The minimum number of samples required to be at a leaf node.<br>A split point at any depth will only be considered if it leaves at<br>least ``min_samples_leaf`` training samples in each of the left and<br>right branches.  This may have the effect of smoothing the model,<br>especially in regression.<br><br>- If int, then consider `min_samples_leaf` as the minimum number.<br>- If float, then `min_samples_leaf` is a fraction and<br>  `ceil(min_samples_leaf * n_samples)` are the minimum<br>  number of samples for each node.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_weight_fraction_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_weight_fraction_leaf,-float%2C%20default%3D0.0\">\n",
       "            min_weight_fraction_leaf\n",
       "            <span class=\"param-doc-description\">min_weight_fraction_leaf: float, default=0.0<br><br>The minimum weighted fraction of the sum total of weights (of all<br>the input samples) required to be at a leaf node. Samples have<br>equal weight when sample_weight is not provided.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_features',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_features,-int%2C%20float%20or%20%7B%22sqrt%22%2C%20%22log2%22%7D%2C%20default%3DNone\">\n",
       "            max_features\n",
       "            <span class=\"param-doc-description\">max_features: int, float or {\"sqrt\", \"log2\"}, default=None<br><br>The number of features to consider when looking for the best split:<br><br>- If int, then consider `max_features` features at each split.<br>- If float, then `max_features` is a fraction and<br>  `max(1, int(max_features * n_features_in_))` features are considered at<br>  each split.<br>- If \"sqrt\", then `max_features=sqrt(n_features)`.<br>- If \"log2\", then `max_features=log2(n_features)`.<br>- If None, then `max_features=n_features`.<br><br>.. note::<br><br>    The search for a split does not stop until at least one<br>    valid partition of the node samples is found, even if it requires to<br>    effectively inspect more than ``max_features`` features.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=random_state,-int%2C%20RandomState%20instance%20or%20None%2C%20default%3DNone\">\n",
       "            random_state\n",
       "            <span class=\"param-doc-description\">random_state: int, RandomState instance or None, default=None<br><br>Controls the randomness of the estimator. The features are always<br>randomly permuted at each split, even if ``splitter`` is set to<br>``\"best\"``. When ``max_features < n_features``, the algorithm will<br>select ``max_features`` at random at each split before finding the best<br>split among them. But the best found split may vary across different<br>runs, even if ``max_features=n_features``. That is the case, if the<br>improvement of the criterion is identical for several splits and one<br>split has to be selected at random. To obtain a deterministic behaviour<br>during fitting, ``random_state`` has to be fixed to an integer.<br>See :term:`Glossary <random_state>` for details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">42</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_leaf_nodes',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_leaf_nodes,-int%2C%20default%3DNone\">\n",
       "            max_leaf_nodes\n",
       "            <span class=\"param-doc-description\">max_leaf_nodes: int, default=None<br><br>Grow a tree with ``max_leaf_nodes`` in best-first fashion.<br>Best nodes are defined as relative reduction in impurity.<br>If None then unlimited number of leaf nodes.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_impurity_decrease',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_impurity_decrease,-float%2C%20default%3D0.0\">\n",
       "            min_impurity_decrease\n",
       "            <span class=\"param-doc-description\">min_impurity_decrease: float, default=0.0<br><br>A node will be split if this split induces a decrease of the impurity<br>greater than or equal to this value.<br><br>The weighted impurity decrease equation is the following::<br><br>    N_t / N * (impurity - N_t_R / N_t * right_impurity<br>                        - N_t_L / N_t * left_impurity)<br><br>where ``N`` is the total number of samples, ``N_t`` is the number of<br>samples at the current node, ``N_t_L`` is the number of samples in the<br>left child, and ``N_t_R`` is the number of samples in the right child.<br><br>``N``, ``N_t``, ``N_t_R`` and ``N_t_L`` all refer to the weighted sum,<br>if ``sample_weight`` is passed.<br><br>.. versionadded:: 0.19</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('class_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=class_weight,-dict%2C%20list%20of%20dict%20or%20%22balanced%22%2C%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\">class_weight: dict, list of dict or \"balanced\", default=None<br><br>Weights associated with classes in the form ``{class_label: weight}``.<br>If None, all classes are supposed to have weight one. For<br>multi-output problems, a list of dicts can be provided in the same<br>order as the columns of y.<br><br>Note that for multioutput (including multilabel) weights should be<br>defined for each class of every column in its own dict. For example,<br>for four-class multilabel classification weights should be<br>[{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] instead of<br>[{1:1}, {2:5}, {3:1}, {4:1}].<br><br>The \"balanced\" mode uses the values of y to automatically adjust<br>weights inversely proportional to class frequencies in the input data<br>as ``n_samples / (n_classes * np.bincount(y))``<br><br>For multi-output, the weights of each column of y will be multiplied.<br><br>Note that these weights will be multiplied with sample_weight (passed<br>through the fit method) if sample_weight is specified.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('ccp_alpha',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=ccp_alpha,-non-negative%20float%2C%20default%3D0.0\">\n",
       "            ccp_alpha\n",
       "            <span class=\"param-doc-description\">ccp_alpha: non-negative float, default=0.0<br><br>Complexity parameter used for Minimal Cost-Complexity Pruning. The<br>subtree with the largest cost complexity that is smaller than<br>``ccp_alpha`` will be chosen. By default, no pruning is performed. See<br>:ref:`minimal_cost_complexity_pruning` for details. See<br>:ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py`<br>for an example of such pruning.<br><br>.. versionadded:: 0.22</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('monotonic_cst',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=monotonic_cst,-array-like%20of%20int%20of%20shape%20%28n_features%29%2C%20default%3DNone\">\n",
       "            monotonic_cst\n",
       "            <span class=\"param-doc-description\">monotonic_cst: array-like of int of shape (n_features), default=None<br><br>Indicates the monotonicity constraint to enforce on each feature.<br>  - 1: monotonic increase<br>  - 0: no constraint<br>  - -1: monotonic decrease<br><br>If monotonic_cst is None, no constraints are applied.<br><br>Monotonicity constraints are not supported for:<br>  - multiclass classifications (i.e. when `n_classes > 2`),<br>  - multioutput classifications (i.e. when `n_outputs_ > 1`),<br>  - classifications trained on data with missing values.<br><br>The constraints hold over the probability of the positive class.<br><br>Read more in the :ref:`User Guide <monotonic_cst_gbdt>`.<br><br>.. versionadded:: 1.4</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.copy-paste-icon').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling\n",
       "        .textContent.trim().split(' ')[0];\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "\n",
       "\n",
       "/**\n",
       " * Adapted from Skrub\n",
       " * https://github.com/skrub-data/skrub/blob/403466d1d5d4dc76a7ef569b3f8228db59a31dc3/skrub/_reporting/_data/templates/report.js#L789\n",
       " * @returns \"light\" or \"dark\"\n",
       " */\n",
       "function detectTheme(element) {\n",
       "    const body = document.querySelector('body');\n",
       "\n",
       "    // Check VSCode theme\n",
       "    const themeKindAttr = body.getAttribute('data-vscode-theme-kind');\n",
       "    const themeNameAttr = body.getAttribute('data-vscode-theme-name');\n",
       "\n",
       "    if (themeKindAttr && themeNameAttr) {\n",
       "        const themeKind = themeKindAttr.toLowerCase();\n",
       "        const themeName = themeNameAttr.toLowerCase();\n",
       "\n",
       "        if (themeKind.includes(\"dark\") || themeName.includes(\"dark\")) {\n",
       "            return \"dark\";\n",
       "        }\n",
       "        if (themeKind.includes(\"light\") || themeName.includes(\"light\")) {\n",
       "            return \"light\";\n",
       "        }\n",
       "    }\n",
       "\n",
       "    // Check Jupyter theme\n",
       "    if (body.getAttribute('data-jp-theme-light') === 'false') {\n",
       "        return 'dark';\n",
       "    } else if (body.getAttribute('data-jp-theme-light') === 'true') {\n",
       "        return 'light';\n",
       "    }\n",
       "\n",
       "    // Guess based on a parent element's color\n",
       "    const color = window.getComputedStyle(element.parentNode, null).getPropertyValue('color');\n",
       "    const match = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/i);\n",
       "    if (match) {\n",
       "        const [r, g, b] = [\n",
       "            parseFloat(match[1]),\n",
       "            parseFloat(match[2]),\n",
       "            parseFloat(match[3])\n",
       "        ];\n",
       "\n",
       "        // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness\n",
       "        const luma = 0.299 * r + 0.587 * g + 0.114 * b;\n",
       "\n",
       "        if (luma > 180) {\n",
       "            // If the text is very bright we have a dark theme\n",
       "            return 'dark';\n",
       "        }\n",
       "        if (luma < 75) {\n",
       "            // If the text is very dark we have a light theme\n",
       "            return 'light';\n",
       "        }\n",
       "        // Otherwise fall back to the next heuristic.\n",
       "    }\n",
       "\n",
       "    // Fallback to system preference\n",
       "    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n",
       "}\n",
       "\n",
       "\n",
       "function forceTheme(elementId) {\n",
       "    const estimatorElement = document.querySelector(`#${elementId}`);\n",
       "    if (estimatorElement === null) {\n",
       "        console.error(`Element with id ${elementId} not found.`);\n",
       "    } else {\n",
       "        const theme = detectTheme(estimatorElement);\n",
       "        estimatorElement.classList.add(theme);\n",
       "    }\n",
       "}\n",
       "\n",
       "forceTheme('sk-container-id-1');</script></body>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(max_depth=2, random_state=42)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "iris = load_iris(as_frame=True)\n",
    "X_iris = iris.data[[\"petal length (cm)\", \"petal width (cm)\"]].values\n",
    "y_iris = iris.target\n",
    "\n",
    "tree_clf = DecisionTreeClassifier(max_depth=2,random_state=42)\n",
    "tree_clf.fit(X_iris, y_iris)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Examine `iris` data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'data':      sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)\n",
       " 0                  5.1               3.5                1.4               0.2\n",
       " 1                  4.9               3.0                1.4               0.2\n",
       " 2                  4.7               3.2                1.3               0.2\n",
       " 3                  4.6               3.1                1.5               0.2\n",
       " 4                  5.0               3.6                1.4               0.2\n",
       " ..                 ...               ...                ...               ...\n",
       " 145                6.7               3.0                5.2               2.3\n",
       " 146                6.3               2.5                5.0               1.9\n",
       " 147                6.5               3.0                5.2               2.0\n",
       " 148                6.2               3.4                5.4               2.3\n",
       " 149                5.9               3.0                5.1               1.8\n",
       " \n",
       " [150 rows x 4 columns],\n",
       " 'target': 0      0\n",
       " 1      0\n",
       " 2      0\n",
       " 3      0\n",
       " 4      0\n",
       "       ..\n",
       " 145    2\n",
       " 146    2\n",
       " 147    2\n",
       " 148    2\n",
       " 149    2\n",
       " Name: target, Length: 150, dtype: int64,\n",
       " 'frame':      sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
       " 0                  5.1               3.5                1.4               0.2   \n",
       " 1                  4.9               3.0                1.4               0.2   \n",
       " 2                  4.7               3.2                1.3               0.2   \n",
       " 3                  4.6               3.1                1.5               0.2   \n",
       " 4                  5.0               3.6                1.4               0.2   \n",
       " ..                 ...               ...                ...               ...   \n",
       " 145                6.7               3.0                5.2               2.3   \n",
       " 146                6.3               2.5                5.0               1.9   \n",
       " 147                6.5               3.0                5.2               2.0   \n",
       " 148                6.2               3.4                5.4               2.3   \n",
       " 149                5.9               3.0                5.1               1.8   \n",
       " \n",
       "      target  \n",
       " 0         0  \n",
       " 1         0  \n",
       " 2         0  \n",
       " 3         0  \n",
       " 4         0  \n",
       " ..      ...  \n",
       " 145       2  \n",
       " 146       2  \n",
       " 147       2  \n",
       " 148       2  \n",
       " 149       2  \n",
       " \n",
       " [150 rows x 5 columns],\n",
       " 'target_names': array(['setosa', 'versicolor', 'virginica'], dtype='<U10'),\n",
       " 'DESCR': '.. _iris_dataset:\\n\\nIris plants dataset\\n--------------------\\n\\n**Data Set Characteristics:**\\n\\n:Number of Instances: 150 (50 in each of three classes)\\n:Number of Attributes: 4 numeric, predictive attributes and the class\\n:Attribute Information:\\n    - sepal length in cm\\n    - sepal width in cm\\n    - petal length in cm\\n    - petal width in cm\\n    - class:\\n            - Iris-Setosa\\n            - Iris-Versicolour\\n            - Iris-Virginica\\n\\n:Summary Statistics:\\n\\n============== ==== ==== ======= ===== ====================\\n                Min  Max   Mean    SD   Class Correlation\\n============== ==== ==== ======= ===== ====================\\nsepal length:   4.3  7.9   5.84   0.83    0.7826\\nsepal width:    2.0  4.4   3.05   0.43   -0.4194\\npetal length:   1.0  6.9   3.76   1.76    0.9490  (high!)\\npetal width:    0.1  2.5   1.20   0.76    0.9565  (high!)\\n============== ==== ==== ======= ===== ====================\\n\\n:Missing Attribute Values: None\\n:Class Distribution: 33.3% for each of 3 classes.\\n:Creator: R.A. Fisher\\n:Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\\n:Date: July, 1988\\n\\nThe famous Iris database, first used by Sir R.A. Fisher. The dataset is taken\\nfrom Fisher\\'s paper. Note that it\\'s the same as in R, but not as in the UCI\\nMachine Learning Repository, which has two wrong data points.\\n\\nThis is perhaps the best known database to be found in the\\npattern recognition literature.  Fisher\\'s paper is a classic in the field and\\nis referenced frequently to this day.  (See Duda & Hart, for example.)  The\\ndata set contains 3 classes of 50 instances each, where each class refers to a\\ntype of iris plant.  One class is linearly separable from the other 2; the\\nlatter are NOT linearly separable from each other.\\n\\n.. dropdown:: References\\n\\n  - Fisher, R.A. \"The use of multiple measurements in taxonomic problems\"\\n    Annual Eugenics, 7, Part II, 179-188 (1936); also in \"Contributions to\\n    Mathematical Statistics\" (John Wiley, NY, 1950).\\n  - Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.\\n    (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.\\n  - Dasarathy, B.V. (1980) \"Nosing Around the Neighborhood: A New System\\n    Structure and Classification Rule for Recognition in Partially Exposed\\n    Environments\".  IEEE Transactions on Pattern Analysis and Machine\\n    Intelligence, Vol. PAMI-2, No. 1, 67-71.\\n  - Gates, G.W. (1972) \"The Reduced Nearest Neighbor Rule\".  IEEE Transactions\\n    on Information Theory, May 1972, 431-433.\\n  - See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al\"s AUTOCLASS II\\n    conceptual clustering system finds 3 classes in the data.\\n  - Many, many more ...\\n',\n",
       " 'feature_names': ['sepal length (cm)',\n",
       "  'sepal width (cm)',\n",
       "  'petal length (cm)',\n",
       "  'petal width (cm)'],\n",
       " 'filename': 'iris.csv',\n",
       " 'data_module': 'sklearn.datasets.data'}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**This code example generates Figure 6–1. Iris Decision Tree:**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.tree import export_graphviz\n",
    "\n",
    "export_graphviz(\n",
    "        tree_clf,\n",
    "        out_file=str(IMAGES_PATH / \"iris_tree.dot\"),  # path differs in the book\n",
    "        feature_names=[\"petal length (cm)\", \"petal width (cm)\"],\n",
    "        class_names=iris.target_names,\n",
    "        rounded=True,\n",
    "        filled=True\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.42.4 (0)\n",
       " -->\n",
       "<!-- Title: Tree Pages: 1 -->\n",
       "<svg width=\"412pt\" height=\"314pt\"\n",
       " viewBox=\"0.00 0.00 412.00 314.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 310)\">\n",
       "<title>Tree</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-310 408,-310 408,4 -4,4\"/>\n",
       "<!-- 0 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"#ffffff\" stroke=\"black\" d=\"M250,-306C250,-306 74,-306 74,-306 68,-306 62,-300 62,-294 62,-294 62,-235 62,-235 62,-229 68,-223 74,-223 74,-223 250,-223 250,-223 256,-223 262,-229 262,-235 262,-235 262,-294 262,-294 262,-300 256,-306 250,-306\"/>\n",
       "<text text-anchor=\"middle\" x=\"162\" y=\"-290.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 2.45</text>\n",
       "<text text-anchor=\"middle\" x=\"162\" y=\"-275.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.667</text>\n",
       "<text text-anchor=\"middle\" x=\"162\" y=\"-260.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 150</text>\n",
       "<text text-anchor=\"middle\" x=\"162\" y=\"-245.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 50, 50]</text>\n",
       "<text text-anchor=\"middle\" x=\"162\" y=\"-230.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = setosa</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"#e58139\" stroke=\"black\" d=\"M128,-179.5C128,-179.5 12,-179.5 12,-179.5 6,-179.5 0,-173.5 0,-167.5 0,-167.5 0,-123.5 0,-123.5 0,-117.5 6,-111.5 12,-111.5 12,-111.5 128,-111.5 128,-111.5 134,-111.5 140,-117.5 140,-123.5 140,-123.5 140,-167.5 140,-167.5 140,-173.5 134,-179.5 128,-179.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-164.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-149.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 50</text>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-134.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 0, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-119.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = setosa</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;1 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>0&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M130.08,-222.91C121.14,-211.54 111.42,-199.18 102.45,-187.77\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"105.01,-185.36 96.08,-179.67 99.51,-189.69 105.01,-185.36\"/>\n",
       "<text text-anchor=\"middle\" x=\"93.11\" y=\"-200.79\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">True</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"#ffffff\" stroke=\"black\" d=\"M340,-187C340,-187 170,-187 170,-187 164,-187 158,-181 158,-175 158,-175 158,-116 158,-116 158,-110 164,-104 170,-104 170,-104 340,-104 340,-104 346,-104 352,-110 352,-116 352,-116 352,-175 352,-175 352,-181 346,-187 340,-187\"/>\n",
       "<text text-anchor=\"middle\" x=\"255\" y=\"-171.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal width (cm) &lt;= 1.75</text>\n",
       "<text text-anchor=\"middle\" x=\"255\" y=\"-156.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.5</text>\n",
       "<text text-anchor=\"middle\" x=\"255\" y=\"-141.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 100</text>\n",
       "<text text-anchor=\"middle\" x=\"255\" y=\"-126.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 50, 50]</text>\n",
       "<text text-anchor=\"middle\" x=\"255\" y=\"-111.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>0&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M194.27,-222.91C201.41,-213.92 209.04,-204.32 216.41,-195.05\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"219.31,-197.03 222.79,-187.02 213.83,-192.67 219.31,-197.03\"/>\n",
       "<text text-anchor=\"middle\" x=\"225.63\" y=\"-208.16\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">False</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>3</title>\n",
       "<path fill=\"#4de88e\" stroke=\"black\" d=\"M234,-68C234,-68 118,-68 118,-68 112,-68 106,-62 106,-56 106,-56 106,-12 106,-12 106,-6 112,0 118,0 118,0 234,0 234,0 240,0 246,-6 246,-12 246,-12 246,-56 246,-56 246,-62 240,-68 234,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"176\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.168</text>\n",
       "<text text-anchor=\"middle\" x=\"176\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 54</text>\n",
       "<text text-anchor=\"middle\" x=\"176\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 49, 5]</text>\n",
       "<text text-anchor=\"middle\" x=\"176\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>2&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M225.58,-103.73C219.2,-94.88 212.44,-85.51 206.03,-76.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"208.71,-74.36 200.02,-68.3 203.04,-78.46 208.71,-74.36\"/>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>4</title>\n",
       "<path fill=\"#843de6\" stroke=\"black\" d=\"M392,-68C392,-68 276,-68 276,-68 270,-68 264,-62 264,-56 264,-56 264,-12 264,-12 264,-6 270,0 276,0 276,0 392,0 392,0 398,0 404,-6 404,-12 404,-12 404,-56 404,-56 404,-62 398,-68 392,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"334\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.043</text>\n",
       "<text text-anchor=\"middle\" x=\"334\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 46</text>\n",
       "<text text-anchor=\"middle\" x=\"334\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 1, 45]</text>\n",
       "<text text-anchor=\"middle\" x=\"334\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;4 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>2&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M284.42,-103.73C290.8,-94.88 297.56,-85.51 303.97,-76.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"306.96,-78.46 309.98,-68.3 301.29,-74.36 306.96,-78.46\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.sources.Source at 0x7f84cb9ef8c0>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from graphviz import Source\n",
    "\n",
    "Source.from_file(IMAGES_PATH / \"iris_tree.dot\")  # path differs in the book"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Graphviz also provides the `dot` command line tool to convert `.dot` files to a variety of formats. The following command converts the dot file to a png image:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# extra code\n",
    "!dot -Tpng {IMAGES_PATH / \"iris_tree.dot\"} -o {IMAGES_PATH / \"iris_tree.png\"}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Expand the tree to depth 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "}\n",
       "\n",
       "#sk-container-id-2.light {\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: black;\n",
       "  --sklearn-color-background: white;\n",
       "  --sklearn-color-border-box: black;\n",
       "  --sklearn-color-icon: #696969;\n",
       "}\n",
       "\n",
       "#sk-container-id-2.dark {\n",
       "  --sklearn-color-text-on-default-background: white;\n",
       "  --sklearn-color-background: #111;\n",
       "  --sklearn-color-border-box: white;\n",
       "  --sklearn-color-icon: #878787;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: center;\n",
       "  justify-content: center;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table {\n",
       "    font-family: monospace;\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table summary::marker {\n",
       "    font-size: 0.7rem;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       "/*\n",
       "    `table td`is set in notebook with right text-align.\n",
       "    We need to overwrite it.\n",
       "*/\n",
       ".estimator-table table td.param {\n",
       "    text-align: left;\n",
       "    position: relative;\n",
       "    padding: 0;\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td.value {\n",
       "    color:rgb(255, 94, 0);\n",
       "    background-color: transparent;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       "/*\n",
       "    Styles for parameter documentation links\n",
       "    We need styling for visited so jupyter doesn't overwrite it\n",
       "*/\n",
       "a.param-doc-link,\n",
       "a.param-doc-link:link,\n",
       "a.param-doc-link:visited {\n",
       "    text-decoration: underline dashed;\n",
       "    text-underline-offset: .3em;\n",
       "    color: inherit;\n",
       "    display: block;\n",
       "    padding: .5em;\n",
       "}\n",
       "\n",
       "/* \"hack\" to make the entire area of the cell containing the link clickable */\n",
       "a.param-doc-link::before {\n",
       "    position: absolute;\n",
       "    content: \"\";\n",
       "    inset: 0;\n",
       "}\n",
       "\n",
       ".param-doc-description {\n",
       "    display: none;\n",
       "    position: absolute;\n",
       "    z-index: 9999;\n",
       "    left: 0;\n",
       "    padding: .5ex;\n",
       "    margin-left: 1.5em;\n",
       "    color: var(--sklearn-color-text);\n",
       "    box-shadow: .3em .3em .4em #999;\n",
       "    width: max-content;\n",
       "    text-align: left;\n",
       "    max-height: 10em;\n",
       "    overflow-y: auto;\n",
       "\n",
       "    /* unfitted */\n",
       "    background: var(--sklearn-color-unfitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       "/* Fitted state for parameter tooltips */\n",
       ".fitted .param-doc-description {\n",
       "    /* fitted */\n",
       "    background: var(--sklearn-color-fitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".param-doc-link:hover .param-doc-description {\n",
       "    display: block;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(max_depth=3, random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('criterion',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=criterion,-%7B%22gini%22%2C%20%22entropy%22%2C%20%22log_loss%22%7D%2C%20default%3D%22gini%22\">\n",
       "            criterion\n",
       "            <span class=\"param-doc-description\">criterion: {\"gini\", \"entropy\", \"log_loss\"}, default=\"gini\"<br><br>The function to measure the quality of a split. Supported criteria are<br>\"gini\" for the Gini impurity and \"log_loss\" and \"entropy\" both for the<br>Shannon information gain, see :ref:`tree_mathematical_formulation`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;gini&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('splitter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=splitter,-%7B%22best%22%2C%20%22random%22%7D%2C%20default%3D%22best%22\">\n",
       "            splitter\n",
       "            <span class=\"param-doc-description\">splitter: {\"best\", \"random\"}, default=\"best\"<br><br>The strategy used to choose the split at each node. Supported<br>strategies are \"best\" to choose the best split and \"random\" to choose<br>the best random split.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;best&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_depth',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_depth,-int%2C%20default%3DNone\">\n",
       "            max_depth\n",
       "            <span class=\"param-doc-description\">max_depth: int, default=None<br><br>The maximum depth of the tree. If None, then nodes are expanded until<br>all leaves are pure or until all leaves contain less than<br>min_samples_split samples.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">3</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_split',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_split,-int%20or%20float%2C%20default%3D2\">\n",
       "            min_samples_split\n",
       "            <span class=\"param-doc-description\">min_samples_split: int or float, default=2<br><br>The minimum number of samples required to split an internal node:<br><br>- If int, then consider `min_samples_split` as the minimum number.<br>- If float, then `min_samples_split` is a fraction and<br>  `ceil(min_samples_split * n_samples)` are the minimum<br>  number of samples for each split.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_leaf,-int%20or%20float%2C%20default%3D1\">\n",
       "            min_samples_leaf\n",
       "            <span class=\"param-doc-description\">min_samples_leaf: int or float, default=1<br><br>The minimum number of samples required to be at a leaf node.<br>A split point at any depth will only be considered if it leaves at<br>least ``min_samples_leaf`` training samples in each of the left and<br>right branches.  This may have the effect of smoothing the model,<br>especially in regression.<br><br>- If int, then consider `min_samples_leaf` as the minimum number.<br>- If float, then `min_samples_leaf` is a fraction and<br>  `ceil(min_samples_leaf * n_samples)` are the minimum<br>  number of samples for each node.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_weight_fraction_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_weight_fraction_leaf,-float%2C%20default%3D0.0\">\n",
       "            min_weight_fraction_leaf\n",
       "            <span class=\"param-doc-description\">min_weight_fraction_leaf: float, default=0.0<br><br>The minimum weighted fraction of the sum total of weights (of all<br>the input samples) required to be at a leaf node. Samples have<br>equal weight when sample_weight is not provided.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_features',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_features,-int%2C%20float%20or%20%7B%22sqrt%22%2C%20%22log2%22%7D%2C%20default%3DNone\">\n",
       "            max_features\n",
       "            <span class=\"param-doc-description\">max_features: int, float or {\"sqrt\", \"log2\"}, default=None<br><br>The number of features to consider when looking for the best split:<br><br>- If int, then consider `max_features` features at each split.<br>- If float, then `max_features` is a fraction and<br>  `max(1, int(max_features * n_features_in_))` features are considered at<br>  each split.<br>- If \"sqrt\", then `max_features=sqrt(n_features)`.<br>- If \"log2\", then `max_features=log2(n_features)`.<br>- If None, then `max_features=n_features`.<br><br>.. note::<br><br>    The search for a split does not stop until at least one<br>    valid partition of the node samples is found, even if it requires to<br>    effectively inspect more than ``max_features`` features.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=random_state,-int%2C%20RandomState%20instance%20or%20None%2C%20default%3DNone\">\n",
       "            random_state\n",
       "            <span class=\"param-doc-description\">random_state: int, RandomState instance or None, default=None<br><br>Controls the randomness of the estimator. The features are always<br>randomly permuted at each split, even if ``splitter`` is set to<br>``\"best\"``. When ``max_features < n_features``, the algorithm will<br>select ``max_features`` at random at each split before finding the best<br>split among them. But the best found split may vary across different<br>runs, even if ``max_features=n_features``. That is the case, if the<br>improvement of the criterion is identical for several splits and one<br>split has to be selected at random. To obtain a deterministic behaviour<br>during fitting, ``random_state`` has to be fixed to an integer.<br>See :term:`Glossary <random_state>` for details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">42</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_leaf_nodes',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_leaf_nodes,-int%2C%20default%3DNone\">\n",
       "            max_leaf_nodes\n",
       "            <span class=\"param-doc-description\">max_leaf_nodes: int, default=None<br><br>Grow a tree with ``max_leaf_nodes`` in best-first fashion.<br>Best nodes are defined as relative reduction in impurity.<br>If None then unlimited number of leaf nodes.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_impurity_decrease',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_impurity_decrease,-float%2C%20default%3D0.0\">\n",
       "            min_impurity_decrease\n",
       "            <span class=\"param-doc-description\">min_impurity_decrease: float, default=0.0<br><br>A node will be split if this split induces a decrease of the impurity<br>greater than or equal to this value.<br><br>The weighted impurity decrease equation is the following::<br><br>    N_t / N * (impurity - N_t_R / N_t * right_impurity<br>                        - N_t_L / N_t * left_impurity)<br><br>where ``N`` is the total number of samples, ``N_t`` is the number of<br>samples at the current node, ``N_t_L`` is the number of samples in the<br>left child, and ``N_t_R`` is the number of samples in the right child.<br><br>``N``, ``N_t``, ``N_t_R`` and ``N_t_L`` all refer to the weighted sum,<br>if ``sample_weight`` is passed.<br><br>.. versionadded:: 0.19</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('class_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=class_weight,-dict%2C%20list%20of%20dict%20or%20%22balanced%22%2C%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\">class_weight: dict, list of dict or \"balanced\", default=None<br><br>Weights associated with classes in the form ``{class_label: weight}``.<br>If None, all classes are supposed to have weight one. For<br>multi-output problems, a list of dicts can be provided in the same<br>order as the columns of y.<br><br>Note that for multioutput (including multilabel) weights should be<br>defined for each class of every column in its own dict. For example,<br>for four-class multilabel classification weights should be<br>[{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] instead of<br>[{1:1}, {2:5}, {3:1}, {4:1}].<br><br>The \"balanced\" mode uses the values of y to automatically adjust<br>weights inversely proportional to class frequencies in the input data<br>as ``n_samples / (n_classes * np.bincount(y))``<br><br>For multi-output, the weights of each column of y will be multiplied.<br><br>Note that these weights will be multiplied with sample_weight (passed<br>through the fit method) if sample_weight is specified.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('ccp_alpha',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=ccp_alpha,-non-negative%20float%2C%20default%3D0.0\">\n",
       "            ccp_alpha\n",
       "            <span class=\"param-doc-description\">ccp_alpha: non-negative float, default=0.0<br><br>Complexity parameter used for Minimal Cost-Complexity Pruning. The<br>subtree with the largest cost complexity that is smaller than<br>``ccp_alpha`` will be chosen. By default, no pruning is performed. See<br>:ref:`minimal_cost_complexity_pruning` for details. See<br>:ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py`<br>for an example of such pruning.<br><br>.. versionadded:: 0.22</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('monotonic_cst',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=monotonic_cst,-array-like%20of%20int%20of%20shape%20%28n_features%29%2C%20default%3DNone\">\n",
       "            monotonic_cst\n",
       "            <span class=\"param-doc-description\">monotonic_cst: array-like of int of shape (n_features), default=None<br><br>Indicates the monotonicity constraint to enforce on each feature.<br>  - 1: monotonic increase<br>  - 0: no constraint<br>  - -1: monotonic decrease<br><br>If monotonic_cst is None, no constraints are applied.<br><br>Monotonicity constraints are not supported for:<br>  - multiclass classifications (i.e. when `n_classes > 2`),<br>  - multioutput classifications (i.e. when `n_outputs_ > 1`),<br>  - classifications trained on data with missing values.<br><br>The constraints hold over the probability of the positive class.<br><br>Read more in the :ref:`User Guide <monotonic_cst_gbdt>`.<br><br>.. versionadded:: 1.4</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.copy-paste-icon').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling\n",
       "        .textContent.trim().split(' ')[0];\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "\n",
       "\n",
       "/**\n",
       " * Adapted from Skrub\n",
       " * https://github.com/skrub-data/skrub/blob/403466d1d5d4dc76a7ef569b3f8228db59a31dc3/skrub/_reporting/_data/templates/report.js#L789\n",
       " * @returns \"light\" or \"dark\"\n",
       " */\n",
       "function detectTheme(element) {\n",
       "    const body = document.querySelector('body');\n",
       "\n",
       "    // Check VSCode theme\n",
       "    const themeKindAttr = body.getAttribute('data-vscode-theme-kind');\n",
       "    const themeNameAttr = body.getAttribute('data-vscode-theme-name');\n",
       "\n",
       "    if (themeKindAttr && themeNameAttr) {\n",
       "        const themeKind = themeKindAttr.toLowerCase();\n",
       "        const themeName = themeNameAttr.toLowerCase();\n",
       "\n",
       "        if (themeKind.includes(\"dark\") || themeName.includes(\"dark\")) {\n",
       "            return \"dark\";\n",
       "        }\n",
       "        if (themeKind.includes(\"light\") || themeName.includes(\"light\")) {\n",
       "            return \"light\";\n",
       "        }\n",
       "    }\n",
       "\n",
       "    // Check Jupyter theme\n",
       "    if (body.getAttribute('data-jp-theme-light') === 'false') {\n",
       "        return 'dark';\n",
       "    } else if (body.getAttribute('data-jp-theme-light') === 'true') {\n",
       "        return 'light';\n",
       "    }\n",
       "\n",
       "    // Guess based on a parent element's color\n",
       "    const color = window.getComputedStyle(element.parentNode, null).getPropertyValue('color');\n",
       "    const match = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/i);\n",
       "    if (match) {\n",
       "        const [r, g, b] = [\n",
       "            parseFloat(match[1]),\n",
       "            parseFloat(match[2]),\n",
       "            parseFloat(match[3])\n",
       "        ];\n",
       "\n",
       "        // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness\n",
       "        const luma = 0.299 * r + 0.587 * g + 0.114 * b;\n",
       "\n",
       "        if (luma > 180) {\n",
       "            // If the text is very bright we have a dark theme\n",
       "            return 'dark';\n",
       "        }\n",
       "        if (luma < 75) {\n",
       "            // If the text is very dark we have a light theme\n",
       "            return 'light';\n",
       "        }\n",
       "        // Otherwise fall back to the next heuristic.\n",
       "    }\n",
       "\n",
       "    // Fallback to system preference\n",
       "    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n",
       "}\n",
       "\n",
       "\n",
       "function forceTheme(elementId) {\n",
       "    const estimatorElement = document.querySelector(`#${elementId}`);\n",
       "    if (estimatorElement === null) {\n",
       "        console.error(`Element with id ${elementId} not found.`);\n",
       "    } else {\n",
       "        const theme = detectTheme(estimatorElement);\n",
       "        estimatorElement.classList.add(theme);\n",
       "    }\n",
       "}\n",
       "\n",
       "forceTheme('sk-container-id-2');</script></body>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(max_depth=3, random_state=42)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "iris = load_iris(as_frame=True)\n",
    "X_iris = iris.data[[\"petal length (cm)\", \"petal width (cm)\"]].values\n",
    "y_iris = iris.target\n",
    "\n",
    "tree_clf_3 = DecisionTreeClassifier(max_depth=3,random_state=42)\n",
    "tree_clf_3.fit(X_iris, y_iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.42.4 (0)\n",
       " -->\n",
       "<!-- Title: Tree Pages: 1 -->\n",
       "<svg width=\"639pt\" height=\"433pt\"\n",
       " viewBox=\"0.00 0.00 639.00 433.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 429)\">\n",
       "<title>Tree</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-429 635,-429 635,4 -4,4\"/>\n",
       "<!-- 0 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"#ffffff\" stroke=\"black\" d=\"M310,-425C310,-425 134,-425 134,-425 128,-425 122,-419 122,-413 122,-413 122,-354 122,-354 122,-348 128,-342 134,-342 134,-342 310,-342 310,-342 316,-342 322,-348 322,-354 322,-354 322,-413 322,-413 322,-419 316,-425 310,-425\"/>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-409.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 2.45</text>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-394.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.667</text>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-379.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 150</text>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-364.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 50, 50]</text>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-349.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = setosa</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"#e58139\" stroke=\"black\" d=\"M188,-298.5C188,-298.5 72,-298.5 72,-298.5 66,-298.5 60,-292.5 60,-286.5 60,-286.5 60,-242.5 60,-242.5 60,-236.5 66,-230.5 72,-230.5 72,-230.5 188,-230.5 188,-230.5 194,-230.5 200,-236.5 200,-242.5 200,-242.5 200,-286.5 200,-286.5 200,-292.5 194,-298.5 188,-298.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"130\" y=\"-283.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"130\" y=\"-268.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 50</text>\n",
       "<text text-anchor=\"middle\" x=\"130\" y=\"-253.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 0, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"130\" y=\"-238.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = setosa</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;1 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>0&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M190.08,-341.91C181.14,-330.54 171.42,-318.18 162.45,-306.77\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"165.01,-304.36 156.08,-298.67 159.51,-308.69 165.01,-304.36\"/>\n",
       "<text text-anchor=\"middle\" x=\"153.11\" y=\"-319.79\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">True</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"#ffffff\" stroke=\"black\" d=\"M400,-306C400,-306 230,-306 230,-306 224,-306 218,-300 218,-294 218,-294 218,-235 218,-235 218,-229 224,-223 230,-223 230,-223 400,-223 400,-223 406,-223 412,-229 412,-235 412,-235 412,-294 412,-294 412,-300 406,-306 400,-306\"/>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-290.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal width (cm) &lt;= 1.75</text>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-275.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.5</text>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-260.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 100</text>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-245.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 50, 50]</text>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-230.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>0&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M254.27,-341.91C261.41,-332.92 269.04,-323.32 276.41,-314.05\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"279.31,-316.03 282.79,-306.02 273.83,-311.67 279.31,-316.03\"/>\n",
       "<text text-anchor=\"middle\" x=\"285.63\" y=\"-327.16\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">False</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>3</title>\n",
       "<path fill=\"#4de88e\" stroke=\"black\" d=\"M294,-187C294,-187 118,-187 118,-187 112,-187 106,-181 106,-175 106,-175 106,-116 106,-116 106,-110 112,-104 118,-104 118,-104 294,-104 294,-104 300,-104 306,-110 306,-116 306,-116 306,-175 306,-175 306,-181 300,-187 294,-187\"/>\n",
       "<text text-anchor=\"middle\" x=\"206\" y=\"-171.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 4.95</text>\n",
       "<text text-anchor=\"middle\" x=\"206\" y=\"-156.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.168</text>\n",
       "<text text-anchor=\"middle\" x=\"206\" y=\"-141.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 54</text>\n",
       "<text text-anchor=\"middle\" x=\"206\" y=\"-126.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 49, 5]</text>\n",
       "<text text-anchor=\"middle\" x=\"206\" y=\"-111.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>2&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M277.18,-222.91C268.64,-213.74 259.5,-203.93 250.71,-194.49\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"253.13,-191.95 243.75,-187.02 248.01,-196.72 253.13,-191.95\"/>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>6</title>\n",
       "<path fill=\"#843de6\" stroke=\"black\" d=\"M512,-187C512,-187 336,-187 336,-187 330,-187 324,-181 324,-175 324,-175 324,-116 324,-116 324,-110 330,-104 336,-104 336,-104 512,-104 512,-104 518,-104 524,-110 524,-116 524,-116 524,-175 524,-175 524,-181 518,-187 512,-187\"/>\n",
       "<text text-anchor=\"middle\" x=\"424\" y=\"-171.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 4.85</text>\n",
       "<text text-anchor=\"middle\" x=\"424\" y=\"-156.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.043</text>\n",
       "<text text-anchor=\"middle\" x=\"424\" y=\"-141.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 46</text>\n",
       "<text text-anchor=\"middle\" x=\"424\" y=\"-126.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 1, 45]</text>\n",
       "<text text-anchor=\"middle\" x=\"424\" y=\"-111.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;6 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>2&#45;&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M352.82,-222.91C361.36,-213.74 370.5,-203.93 379.29,-194.49\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"381.99,-196.72 386.25,-187.02 376.87,-191.95 381.99,-196.72\"/>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>4</title>\n",
       "<path fill=\"#3de684\" stroke=\"black\" d=\"M128,-68C128,-68 12,-68 12,-68 6,-68 0,-62 0,-56 0,-56 0,-12 0,-12 0,-6 6,0 12,0 12,0 128,0 128,0 134,0 140,-6 140,-12 140,-12 140,-56 140,-56 140,-62 134,-68 128,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.041</text>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 48</text>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 47, 1]</text>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;4 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>3&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M155.36,-103.73C143.58,-94.24 131.05,-84.16 119.33,-74.72\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"121.34,-71.84 111.36,-68.3 116.95,-77.3 121.34,-71.84\"/>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>5</title>\n",
       "<path fill=\"#c09cf2\" stroke=\"black\" d=\"M277.5,-68C277.5,-68 170.5,-68 170.5,-68 164.5,-68 158.5,-62 158.5,-56 158.5,-56 158.5,-12 158.5,-12 158.5,-6 164.5,0 170.5,0 170.5,0 277.5,0 277.5,0 283.5,0 289.5,-6 289.5,-12 289.5,-12 289.5,-56 289.5,-56 289.5,-62 283.5,-68 277.5,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"224\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.444</text>\n",
       "<text text-anchor=\"middle\" x=\"224\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 6</text>\n",
       "<text text-anchor=\"middle\" x=\"224\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 2, 4]</text>\n",
       "<text text-anchor=\"middle\" x=\"224\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;5 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>3&#45;&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M212.7,-103.73C214.07,-95.43 215.51,-86.67 216.88,-78.28\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"220.36,-78.73 218.53,-68.3 213.45,-77.6 220.36,-78.73\"/>\n",
       "</g>\n",
       "<!-- 7 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>7</title>\n",
       "<path fill=\"#c09cf2\" stroke=\"black\" d=\"M460.5,-68C460.5,-68 353.5,-68 353.5,-68 347.5,-68 341.5,-62 341.5,-56 341.5,-56 341.5,-12 341.5,-12 341.5,-6 347.5,0 353.5,0 353.5,0 460.5,0 460.5,0 466.5,0 472.5,-6 472.5,-12 472.5,-12 472.5,-56 472.5,-56 472.5,-62 466.5,-68 460.5,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"407\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.444</text>\n",
       "<text text-anchor=\"middle\" x=\"407\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 3</text>\n",
       "<text text-anchor=\"middle\" x=\"407\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 1, 2]</text>\n",
       "<text text-anchor=\"middle\" x=\"407\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;7 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>6&#45;&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M417.67,-103.73C416.38,-95.43 415.02,-86.67 413.72,-78.28\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"417.16,-77.64 412.17,-68.3 410.25,-78.72 417.16,-77.64\"/>\n",
       "</g>\n",
       "<!-- 8 -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>8</title>\n",
       "<path fill=\"#8139e5\" stroke=\"black\" d=\"M619,-68C619,-68 503,-68 503,-68 497,-68 491,-62 491,-56 491,-56 491,-12 491,-12 491,-6 497,0 503,0 503,0 619,0 619,0 625,0 631,-6 631,-12 631,-12 631,-56 631,-56 631,-62 625,-68 619,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"561\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"561\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 43</text>\n",
       "<text text-anchor=\"middle\" x=\"561\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 0, 43]</text>\n",
       "<text text-anchor=\"middle\" x=\"561\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;8 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>6&#45;&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M475.01,-103.73C486.88,-94.24 499.5,-84.16 511.31,-74.72\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"513.71,-77.28 519.34,-68.3 509.34,-71.81 513.71,-77.28\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.sources.Source at 0x7f84cb845310>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "export_graphviz(\n",
    "        tree_clf_3,\n",
    "        out_file=str(IMAGES_PATH / \"iris_tree.dot\"),  # path differs in the book\n",
    "        feature_names=[\"petal length (cm)\", \"petal width (cm)\"],\n",
    "        class_names=iris.target_names,\n",
    "        rounded=True,\n",
    "        filled=True\n",
    "    )\n",
    "\n",
    "Source.from_file(IMAGES_PATH / \"iris_tree.dot\")  # path differs in the book"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "No bound on tree depth"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-3 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "}\n",
       "\n",
       "#sk-container-id-3.light {\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: black;\n",
       "  --sklearn-color-background: white;\n",
       "  --sklearn-color-border-box: black;\n",
       "  --sklearn-color-icon: #696969;\n",
       "}\n",
       "\n",
       "#sk-container-id-3.dark {\n",
       "  --sklearn-color-text-on-default-background: white;\n",
       "  --sklearn-color-background: #111;\n",
       "  --sklearn-color-border-box: white;\n",
       "  --sklearn-color-icon: #878787;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-3 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: center;\n",
       "  justify-content: center;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-3 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-3 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-3 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table {\n",
       "    font-family: monospace;\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table summary::marker {\n",
       "    font-size: 0.7rem;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       "/*\n",
       "    `table td`is set in notebook with right text-align.\n",
       "    We need to overwrite it.\n",
       "*/\n",
       ".estimator-table table td.param {\n",
       "    text-align: left;\n",
       "    position: relative;\n",
       "    padding: 0;\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td.value {\n",
       "    color:rgb(255, 94, 0);\n",
       "    background-color: transparent;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       "/*\n",
       "    Styles for parameter documentation links\n",
       "    We need styling for visited so jupyter doesn't overwrite it\n",
       "*/\n",
       "a.param-doc-link,\n",
       "a.param-doc-link:link,\n",
       "a.param-doc-link:visited {\n",
       "    text-decoration: underline dashed;\n",
       "    text-underline-offset: .3em;\n",
       "    color: inherit;\n",
       "    display: block;\n",
       "    padding: .5em;\n",
       "}\n",
       "\n",
       "/* \"hack\" to make the entire area of the cell containing the link clickable */\n",
       "a.param-doc-link::before {\n",
       "    position: absolute;\n",
       "    content: \"\";\n",
       "    inset: 0;\n",
       "}\n",
       "\n",
       ".param-doc-description {\n",
       "    display: none;\n",
       "    position: absolute;\n",
       "    z-index: 9999;\n",
       "    left: 0;\n",
       "    padding: .5ex;\n",
       "    margin-left: 1.5em;\n",
       "    color: var(--sklearn-color-text);\n",
       "    box-shadow: .3em .3em .4em #999;\n",
       "    width: max-content;\n",
       "    text-align: left;\n",
       "    max-height: 10em;\n",
       "    overflow-y: auto;\n",
       "\n",
       "    /* unfitted */\n",
       "    background: var(--sklearn-color-unfitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       "/* Fitted state for parameter tooltips */\n",
       ".fitted .param-doc-description {\n",
       "    /* fitted */\n",
       "    background: var(--sklearn-color-fitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".param-doc-link:hover .param-doc-description {\n",
       "    display: block;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('criterion',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=criterion,-%7B%22gini%22%2C%20%22entropy%22%2C%20%22log_loss%22%7D%2C%20default%3D%22gini%22\">\n",
       "            criterion\n",
       "            <span class=\"param-doc-description\">criterion: {\"gini\", \"entropy\", \"log_loss\"}, default=\"gini\"<br><br>The function to measure the quality of a split. Supported criteria are<br>\"gini\" for the Gini impurity and \"log_loss\" and \"entropy\" both for the<br>Shannon information gain, see :ref:`tree_mathematical_formulation`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;gini&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('splitter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=splitter,-%7B%22best%22%2C%20%22random%22%7D%2C%20default%3D%22best%22\">\n",
       "            splitter\n",
       "            <span class=\"param-doc-description\">splitter: {\"best\", \"random\"}, default=\"best\"<br><br>The strategy used to choose the split at each node. Supported<br>strategies are \"best\" to choose the best split and \"random\" to choose<br>the best random split.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;best&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_depth',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_depth,-int%2C%20default%3DNone\">\n",
       "            max_depth\n",
       "            <span class=\"param-doc-description\">max_depth: int, default=None<br><br>The maximum depth of the tree. If None, then nodes are expanded until<br>all leaves are pure or until all leaves contain less than<br>min_samples_split samples.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_split',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_split,-int%20or%20float%2C%20default%3D2\">\n",
       "            min_samples_split\n",
       "            <span class=\"param-doc-description\">min_samples_split: int or float, default=2<br><br>The minimum number of samples required to split an internal node:<br><br>- If int, then consider `min_samples_split` as the minimum number.<br>- If float, then `min_samples_split` is a fraction and<br>  `ceil(min_samples_split * n_samples)` are the minimum<br>  number of samples for each split.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_leaf,-int%20or%20float%2C%20default%3D1\">\n",
       "            min_samples_leaf\n",
       "            <span class=\"param-doc-description\">min_samples_leaf: int or float, default=1<br><br>The minimum number of samples required to be at a leaf node.<br>A split point at any depth will only be considered if it leaves at<br>least ``min_samples_leaf`` training samples in each of the left and<br>right branches.  This may have the effect of smoothing the model,<br>especially in regression.<br><br>- If int, then consider `min_samples_leaf` as the minimum number.<br>- If float, then `min_samples_leaf` is a fraction and<br>  `ceil(min_samples_leaf * n_samples)` are the minimum<br>  number of samples for each node.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_weight_fraction_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_weight_fraction_leaf,-float%2C%20default%3D0.0\">\n",
       "            min_weight_fraction_leaf\n",
       "            <span class=\"param-doc-description\">min_weight_fraction_leaf: float, default=0.0<br><br>The minimum weighted fraction of the sum total of weights (of all<br>the input samples) required to be at a leaf node. Samples have<br>equal weight when sample_weight is not provided.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_features',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_features,-int%2C%20float%20or%20%7B%22sqrt%22%2C%20%22log2%22%7D%2C%20default%3DNone\">\n",
       "            max_features\n",
       "            <span class=\"param-doc-description\">max_features: int, float or {\"sqrt\", \"log2\"}, default=None<br><br>The number of features to consider when looking for the best split:<br><br>- If int, then consider `max_features` features at each split.<br>- If float, then `max_features` is a fraction and<br>  `max(1, int(max_features * n_features_in_))` features are considered at<br>  each split.<br>- If \"sqrt\", then `max_features=sqrt(n_features)`.<br>- If \"log2\", then `max_features=log2(n_features)`.<br>- If None, then `max_features=n_features`.<br><br>.. note::<br><br>    The search for a split does not stop until at least one<br>    valid partition of the node samples is found, even if it requires to<br>    effectively inspect more than ``max_features`` features.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=random_state,-int%2C%20RandomState%20instance%20or%20None%2C%20default%3DNone\">\n",
       "            random_state\n",
       "            <span class=\"param-doc-description\">random_state: int, RandomState instance or None, default=None<br><br>Controls the randomness of the estimator. The features are always<br>randomly permuted at each split, even if ``splitter`` is set to<br>``\"best\"``. When ``max_features < n_features``, the algorithm will<br>select ``max_features`` at random at each split before finding the best<br>split among them. But the best found split may vary across different<br>runs, even if ``max_features=n_features``. That is the case, if the<br>improvement of the criterion is identical for several splits and one<br>split has to be selected at random. To obtain a deterministic behaviour<br>during fitting, ``random_state`` has to be fixed to an integer.<br>See :term:`Glossary <random_state>` for details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">42</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_leaf_nodes',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_leaf_nodes,-int%2C%20default%3DNone\">\n",
       "            max_leaf_nodes\n",
       "            <span class=\"param-doc-description\">max_leaf_nodes: int, default=None<br><br>Grow a tree with ``max_leaf_nodes`` in best-first fashion.<br>Best nodes are defined as relative reduction in impurity.<br>If None then unlimited number of leaf nodes.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_impurity_decrease',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_impurity_decrease,-float%2C%20default%3D0.0\">\n",
       "            min_impurity_decrease\n",
       "            <span class=\"param-doc-description\">min_impurity_decrease: float, default=0.0<br><br>A node will be split if this split induces a decrease of the impurity<br>greater than or equal to this value.<br><br>The weighted impurity decrease equation is the following::<br><br>    N_t / N * (impurity - N_t_R / N_t * right_impurity<br>                        - N_t_L / N_t * left_impurity)<br><br>where ``N`` is the total number of samples, ``N_t`` is the number of<br>samples at the current node, ``N_t_L`` is the number of samples in the<br>left child, and ``N_t_R`` is the number of samples in the right child.<br><br>``N``, ``N_t``, ``N_t_R`` and ``N_t_L`` all refer to the weighted sum,<br>if ``sample_weight`` is passed.<br><br>.. versionadded:: 0.19</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('class_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=class_weight,-dict%2C%20list%20of%20dict%20or%20%22balanced%22%2C%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\">class_weight: dict, list of dict or \"balanced\", default=None<br><br>Weights associated with classes in the form ``{class_label: weight}``.<br>If None, all classes are supposed to have weight one. For<br>multi-output problems, a list of dicts can be provided in the same<br>order as the columns of y.<br><br>Note that for multioutput (including multilabel) weights should be<br>defined for each class of every column in its own dict. For example,<br>for four-class multilabel classification weights should be<br>[{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] instead of<br>[{1:1}, {2:5}, {3:1}, {4:1}].<br><br>The \"balanced\" mode uses the values of y to automatically adjust<br>weights inversely proportional to class frequencies in the input data<br>as ``n_samples / (n_classes * np.bincount(y))``<br><br>For multi-output, the weights of each column of y will be multiplied.<br><br>Note that these weights will be multiplied with sample_weight (passed<br>through the fit method) if sample_weight is specified.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('ccp_alpha',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=ccp_alpha,-non-negative%20float%2C%20default%3D0.0\">\n",
       "            ccp_alpha\n",
       "            <span class=\"param-doc-description\">ccp_alpha: non-negative float, default=0.0<br><br>Complexity parameter used for Minimal Cost-Complexity Pruning. The<br>subtree with the largest cost complexity that is smaller than<br>``ccp_alpha`` will be chosen. By default, no pruning is performed. See<br>:ref:`minimal_cost_complexity_pruning` for details. See<br>:ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py`<br>for an example of such pruning.<br><br>.. versionadded:: 0.22</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('monotonic_cst',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=monotonic_cst,-array-like%20of%20int%20of%20shape%20%28n_features%29%2C%20default%3DNone\">\n",
       "            monotonic_cst\n",
       "            <span class=\"param-doc-description\">monotonic_cst: array-like of int of shape (n_features), default=None<br><br>Indicates the monotonicity constraint to enforce on each feature.<br>  - 1: monotonic increase<br>  - 0: no constraint<br>  - -1: monotonic decrease<br><br>If monotonic_cst is None, no constraints are applied.<br><br>Monotonicity constraints are not supported for:<br>  - multiclass classifications (i.e. when `n_classes > 2`),<br>  - multioutput classifications (i.e. when `n_outputs_ > 1`),<br>  - classifications trained on data with missing values.<br><br>The constraints hold over the probability of the positive class.<br><br>Read more in the :ref:`User Guide <monotonic_cst_gbdt>`.<br><br>.. versionadded:: 1.4</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.copy-paste-icon').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling\n",
       "        .textContent.trim().split(' ')[0];\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "\n",
       "\n",
       "/**\n",
       " * Adapted from Skrub\n",
       " * https://github.com/skrub-data/skrub/blob/403466d1d5d4dc76a7ef569b3f8228db59a31dc3/skrub/_reporting/_data/templates/report.js#L789\n",
       " * @returns \"light\" or \"dark\"\n",
       " */\n",
       "function detectTheme(element) {\n",
       "    const body = document.querySelector('body');\n",
       "\n",
       "    // Check VSCode theme\n",
       "    const themeKindAttr = body.getAttribute('data-vscode-theme-kind');\n",
       "    const themeNameAttr = body.getAttribute('data-vscode-theme-name');\n",
       "\n",
       "    if (themeKindAttr && themeNameAttr) {\n",
       "        const themeKind = themeKindAttr.toLowerCase();\n",
       "        const themeName = themeNameAttr.toLowerCase();\n",
       "\n",
       "        if (themeKind.includes(\"dark\") || themeName.includes(\"dark\")) {\n",
       "            return \"dark\";\n",
       "        }\n",
       "        if (themeKind.includes(\"light\") || themeName.includes(\"light\")) {\n",
       "            return \"light\";\n",
       "        }\n",
       "    }\n",
       "\n",
       "    // Check Jupyter theme\n",
       "    if (body.getAttribute('data-jp-theme-light') === 'false') {\n",
       "        return 'dark';\n",
       "    } else if (body.getAttribute('data-jp-theme-light') === 'true') {\n",
       "        return 'light';\n",
       "    }\n",
       "\n",
       "    // Guess based on a parent element's color\n",
       "    const color = window.getComputedStyle(element.parentNode, null).getPropertyValue('color');\n",
       "    const match = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/i);\n",
       "    if (match) {\n",
       "        const [r, g, b] = [\n",
       "            parseFloat(match[1]),\n",
       "            parseFloat(match[2]),\n",
       "            parseFloat(match[3])\n",
       "        ];\n",
       "\n",
       "        // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness\n",
       "        const luma = 0.299 * r + 0.587 * g + 0.114 * b;\n",
       "\n",
       "        if (luma > 180) {\n",
       "            // If the text is very bright we have a dark theme\n",
       "            return 'dark';\n",
       "        }\n",
       "        if (luma < 75) {\n",
       "            // If the text is very dark we have a light theme\n",
       "            return 'light';\n",
       "        }\n",
       "        // Otherwise fall back to the next heuristic.\n",
       "    }\n",
       "\n",
       "    // Fallback to system preference\n",
       "    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n",
       "}\n",
       "\n",
       "\n",
       "function forceTheme(elementId) {\n",
       "    const estimatorElement = document.querySelector(`#${elementId}`);\n",
       "    if (estimatorElement === null) {\n",
       "        console.error(`Element with id ${elementId} not found.`);\n",
       "    } else {\n",
       "        const theme = detectTheme(estimatorElement);\n",
       "        estimatorElement.classList.add(theme);\n",
       "    }\n",
       "}\n",
       "\n",
       "forceTheme('sk-container-id-3');</script></body>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(random_state=42)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "iris = load_iris(as_frame=True)\n",
    "X_iris = iris.data[[\"petal length (cm)\", \"petal width (cm)\"]].values\n",
    "y_iris = iris.target\n",
    "\n",
    "tree_clf_unbounded= DecisionTreeClassifier(random_state=42)\n",
    "tree_clf_unbounded.fit(X_iris, y_iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.42.4 (0)\n",
       " -->\n",
       "<!-- Title: Tree Pages: 1 -->\n",
       "<svg width=\"851pt\" height=\"671pt\"\n",
       " viewBox=\"0.00 0.00 851.00 671.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 667)\">\n",
       "<title>Tree</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-667 847,-667 847,4 -4,4\"/>\n",
       "<!-- 0 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"#ffffff\" stroke=\"black\" d=\"M514,-663C514,-663 338,-663 338,-663 332,-663 326,-657 326,-651 326,-651 326,-592 326,-592 326,-586 332,-580 338,-580 338,-580 514,-580 514,-580 520,-580 526,-586 526,-592 526,-592 526,-651 526,-651 526,-657 520,-663 514,-663\"/>\n",
       "<text text-anchor=\"middle\" x=\"426\" y=\"-647.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 2.45</text>\n",
       "<text text-anchor=\"middle\" x=\"426\" y=\"-632.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.667</text>\n",
       "<text text-anchor=\"middle\" x=\"426\" y=\"-617.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 150</text>\n",
       "<text text-anchor=\"middle\" x=\"426\" y=\"-602.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 50, 50]</text>\n",
       "<text text-anchor=\"middle\" x=\"426\" y=\"-587.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = setosa</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"#e58139\" stroke=\"black\" d=\"M392,-536.5C392,-536.5 276,-536.5 276,-536.5 270,-536.5 264,-530.5 264,-524.5 264,-524.5 264,-480.5 264,-480.5 264,-474.5 270,-468.5 276,-468.5 276,-468.5 392,-468.5 392,-468.5 398,-468.5 404,-474.5 404,-480.5 404,-480.5 404,-524.5 404,-524.5 404,-530.5 398,-536.5 392,-536.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"334\" y=\"-521.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"334\" y=\"-506.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 50</text>\n",
       "<text text-anchor=\"middle\" x=\"334\" y=\"-491.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 0, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"334\" y=\"-476.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = setosa</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;1 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>0&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M394.08,-579.91C385.14,-568.54 375.42,-556.18 366.45,-544.77\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"369.01,-542.36 360.08,-536.67 363.51,-546.69 369.01,-542.36\"/>\n",
       "<text text-anchor=\"middle\" x=\"357.11\" y=\"-557.79\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">True</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"#ffffff\" stroke=\"black\" d=\"M604,-544C604,-544 434,-544 434,-544 428,-544 422,-538 422,-532 422,-532 422,-473 422,-473 422,-467 428,-461 434,-461 434,-461 604,-461 604,-461 610,-461 616,-467 616,-473 616,-473 616,-532 616,-532 616,-538 610,-544 604,-544\"/>\n",
       "<text text-anchor=\"middle\" x=\"519\" y=\"-528.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal width (cm) &lt;= 1.75</text>\n",
       "<text text-anchor=\"middle\" x=\"519\" y=\"-513.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.5</text>\n",
       "<text text-anchor=\"middle\" x=\"519\" y=\"-498.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 100</text>\n",
       "<text text-anchor=\"middle\" x=\"519\" y=\"-483.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 50, 50]</text>\n",
       "<text text-anchor=\"middle\" x=\"519\" y=\"-468.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>0&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M458.27,-579.91C465.41,-570.92 473.04,-561.32 480.41,-552.05\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"483.31,-554.03 486.79,-544.02 477.83,-549.67 483.31,-554.03\"/>\n",
       "<text text-anchor=\"middle\" x=\"489.63\" y=\"-565.16\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">False</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>3</title>\n",
       "<path fill=\"#4de88e\" stroke=\"black\" d=\"M498,-425C498,-425 322,-425 322,-425 316,-425 310,-419 310,-413 310,-413 310,-354 310,-354 310,-348 316,-342 322,-342 322,-342 498,-342 498,-342 504,-342 510,-348 510,-354 510,-354 510,-413 510,-413 510,-419 504,-425 498,-425\"/>\n",
       "<text text-anchor=\"middle\" x=\"410\" y=\"-409.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 4.95</text>\n",
       "<text text-anchor=\"middle\" x=\"410\" y=\"-394.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.168</text>\n",
       "<text text-anchor=\"middle\" x=\"410\" y=\"-379.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 54</text>\n",
       "<text text-anchor=\"middle\" x=\"410\" y=\"-364.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 49, 5]</text>\n",
       "<text text-anchor=\"middle\" x=\"410\" y=\"-349.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>2&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M481.18,-460.91C472.64,-451.74 463.5,-441.93 454.71,-432.49\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"457.13,-429.95 447.75,-425.02 452.01,-434.72 457.13,-429.95\"/>\n",
       "</g>\n",
       "<!-- 12 -->\n",
       "<g id=\"node13\" class=\"node\">\n",
       "<title>12</title>\n",
       "<path fill=\"#843de6\" stroke=\"black\" d=\"M716,-425C716,-425 540,-425 540,-425 534,-425 528,-419 528,-413 528,-413 528,-354 528,-354 528,-348 534,-342 540,-342 540,-342 716,-342 716,-342 722,-342 728,-348 728,-354 728,-354 728,-413 728,-413 728,-419 722,-425 716,-425\"/>\n",
       "<text text-anchor=\"middle\" x=\"628\" y=\"-409.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 4.85</text>\n",
       "<text text-anchor=\"middle\" x=\"628\" y=\"-394.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.043</text>\n",
       "<text text-anchor=\"middle\" x=\"628\" y=\"-379.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 46</text>\n",
       "<text text-anchor=\"middle\" x=\"628\" y=\"-364.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 1, 45]</text>\n",
       "<text text-anchor=\"middle\" x=\"628\" y=\"-349.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;12 -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>2&#45;&gt;12</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M556.82,-460.91C565.36,-451.74 574.5,-441.93 583.29,-432.49\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"585.99,-434.72 590.25,-425.02 580.87,-429.95 585.99,-434.72\"/>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>4</title>\n",
       "<path fill=\"#3de684\" stroke=\"black\" d=\"M293,-306C293,-306 123,-306 123,-306 117,-306 111,-300 111,-294 111,-294 111,-235 111,-235 111,-229 117,-223 123,-223 123,-223 293,-223 293,-223 299,-223 305,-229 305,-235 305,-235 305,-294 305,-294 305,-300 299,-306 293,-306\"/>\n",
       "<text text-anchor=\"middle\" x=\"208\" y=\"-290.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal width (cm) &lt;= 1.65</text>\n",
       "<text text-anchor=\"middle\" x=\"208\" y=\"-275.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.041</text>\n",
       "<text text-anchor=\"middle\" x=\"208\" y=\"-260.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 48</text>\n",
       "<text text-anchor=\"middle\" x=\"208\" y=\"-245.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 47, 1]</text>\n",
       "<text text-anchor=\"middle\" x=\"208\" y=\"-230.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;4 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>3&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M339.92,-341.91C322.84,-332.02 304.46,-321.37 286.99,-311.25\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"288.37,-308 277.96,-306.02 284.86,-314.06 288.37,-308\"/>\n",
       "</g>\n",
       "<!-- 7 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>7</title>\n",
       "<path fill=\"#c09cf2\" stroke=\"black\" d=\"M505,-306C505,-306 335,-306 335,-306 329,-306 323,-300 323,-294 323,-294 323,-235 323,-235 323,-229 329,-223 335,-223 335,-223 505,-223 505,-223 511,-223 517,-229 517,-235 517,-235 517,-294 517,-294 517,-300 511,-306 505,-306\"/>\n",
       "<text text-anchor=\"middle\" x=\"420\" y=\"-290.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal width (cm) &lt;= 1.55</text>\n",
       "<text text-anchor=\"middle\" x=\"420\" y=\"-275.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.444</text>\n",
       "<text text-anchor=\"middle\" x=\"420\" y=\"-260.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 6</text>\n",
       "<text text-anchor=\"middle\" x=\"420\" y=\"-245.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 2, 4]</text>\n",
       "<text text-anchor=\"middle\" x=\"420\" y=\"-230.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;7 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>3&#45;&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M413.47,-341.91C414.18,-333.56 414.94,-324.67 415.68,-316.02\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"419.17,-316.28 416.54,-306.02 412.2,-315.69 419.17,-316.28\"/>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>5</title>\n",
       "<path fill=\"#39e581\" stroke=\"black\" d=\"M128,-179.5C128,-179.5 12,-179.5 12,-179.5 6,-179.5 0,-173.5 0,-167.5 0,-167.5 0,-123.5 0,-123.5 0,-117.5 6,-111.5 12,-111.5 12,-111.5 128,-111.5 128,-111.5 134,-111.5 140,-117.5 140,-123.5 140,-123.5 140,-167.5 140,-167.5 140,-173.5 134,-179.5 128,-179.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-164.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-149.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 47</text>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-134.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 47, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"70\" y=\"-119.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;5 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>4&#45;&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M160.12,-222.91C146.2,-211.1 131,-198.22 117.12,-186.45\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"119.01,-183.46 109.12,-179.67 114.48,-188.8 119.01,-183.46\"/>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>6</title>\n",
       "<path fill=\"#8139e5\" stroke=\"black\" d=\"M277.5,-179.5C277.5,-179.5 170.5,-179.5 170.5,-179.5 164.5,-179.5 158.5,-173.5 158.5,-167.5 158.5,-167.5 158.5,-123.5 158.5,-123.5 158.5,-117.5 164.5,-111.5 170.5,-111.5 170.5,-111.5 277.5,-111.5 277.5,-111.5 283.5,-111.5 289.5,-117.5 289.5,-123.5 289.5,-123.5 289.5,-167.5 289.5,-167.5 289.5,-173.5 283.5,-179.5 277.5,-179.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"224\" y=\"-164.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"224\" y=\"-149.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 1</text>\n",
       "<text text-anchor=\"middle\" x=\"224\" y=\"-134.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 0, 1]</text>\n",
       "<text text-anchor=\"middle\" x=\"224\" y=\"-119.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;6 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>4&#45;&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M213.55,-222.91C215.01,-212.2 216.6,-200.62 218.08,-189.78\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"221.58,-190.05 219.46,-179.67 214.64,-189.1 221.58,-190.05\"/>\n",
       "</g>\n",
       "<!-- 8 -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>8</title>\n",
       "<path fill=\"#8139e5\" stroke=\"black\" d=\"M457.5,-179.5C457.5,-179.5 350.5,-179.5 350.5,-179.5 344.5,-179.5 338.5,-173.5 338.5,-167.5 338.5,-167.5 338.5,-123.5 338.5,-123.5 338.5,-117.5 344.5,-111.5 350.5,-111.5 350.5,-111.5 457.5,-111.5 457.5,-111.5 463.5,-111.5 469.5,-117.5 469.5,-123.5 469.5,-123.5 469.5,-167.5 469.5,-167.5 469.5,-173.5 463.5,-179.5 457.5,-179.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"404\" y=\"-164.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"404\" y=\"-149.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 3</text>\n",
       "<text text-anchor=\"middle\" x=\"404\" y=\"-134.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 0, 3]</text>\n",
       "<text text-anchor=\"middle\" x=\"404\" y=\"-119.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 7&#45;&gt;8 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>7&#45;&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M414.45,-222.91C412.99,-212.2 411.4,-200.62 409.92,-189.78\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"413.36,-189.1 408.54,-179.67 406.42,-190.05 413.36,-189.1\"/>\n",
       "</g>\n",
       "<!-- 9 -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>9</title>\n",
       "<path fill=\"#9cf2c0\" stroke=\"black\" d=\"M676,-187C676,-187 500,-187 500,-187 494,-187 488,-181 488,-175 488,-175 488,-116 488,-116 488,-110 494,-104 500,-104 500,-104 676,-104 676,-104 682,-104 688,-110 688,-116 688,-116 688,-175 688,-175 688,-181 682,-187 676,-187\"/>\n",
       "<text text-anchor=\"middle\" x=\"588\" y=\"-171.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 5.45</text>\n",
       "<text text-anchor=\"middle\" x=\"588\" y=\"-156.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.444</text>\n",
       "<text text-anchor=\"middle\" x=\"588\" y=\"-141.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 3</text>\n",
       "<text text-anchor=\"middle\" x=\"588\" y=\"-126.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 2, 1]</text>\n",
       "<text text-anchor=\"middle\" x=\"588\" y=\"-111.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 7&#45;&gt;9 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>7&#45;&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M478.29,-222.91C492.23,-213.2 507.22,-202.76 521.5,-192.81\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"523.61,-195.61 529.82,-187.02 519.61,-189.86 523.61,-195.61\"/>\n",
       "</g>\n",
       "<!-- 10 -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>10</title>\n",
       "<path fill=\"#39e581\" stroke=\"black\" d=\"M569,-68C569,-68 453,-68 453,-68 447,-68 441,-62 441,-56 441,-56 441,-12 441,-12 441,-6 447,0 453,0 453,0 569,0 569,0 575,0 581,-6 581,-12 581,-12 581,-56 581,-56 581,-62 575,-68 569,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"511\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"511\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 2</text>\n",
       "<text text-anchor=\"middle\" x=\"511\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 2, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"511\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 9&#45;&gt;10 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>9&#45;&gt;10</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M559.33,-103.73C553.11,-94.88 546.52,-85.51 540.27,-76.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"543.03,-74.47 534.42,-68.3 537.31,-78.49 543.03,-74.47\"/>\n",
       "</g>\n",
       "<!-- 11 -->\n",
       "<g id=\"node12\" class=\"node\">\n",
       "<title>11</title>\n",
       "<path fill=\"#8139e5\" stroke=\"black\" d=\"M718.5,-68C718.5,-68 611.5,-68 611.5,-68 605.5,-68 599.5,-62 599.5,-56 599.5,-56 599.5,-12 599.5,-12 599.5,-6 605.5,0 611.5,0 611.5,0 718.5,0 718.5,0 724.5,0 730.5,-6 730.5,-12 730.5,-12 730.5,-56 730.5,-56 730.5,-62 724.5,-68 718.5,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"665\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"665\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 1</text>\n",
       "<text text-anchor=\"middle\" x=\"665\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 0, 1]</text>\n",
       "<text text-anchor=\"middle\" x=\"665\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 9&#45;&gt;11 -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>9&#45;&gt;11</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M616.67,-103.73C622.89,-94.88 629.48,-85.51 635.73,-76.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"638.69,-78.49 641.58,-68.3 632.97,-74.47 638.69,-78.49\"/>\n",
       "</g>\n",
       "<!-- 13 -->\n",
       "<g id=\"node14\" class=\"node\">\n",
       "<title>13</title>\n",
       "<path fill=\"#c09cf2\" stroke=\"black\" d=\"M672.5,-298.5C672.5,-298.5 565.5,-298.5 565.5,-298.5 559.5,-298.5 553.5,-292.5 553.5,-286.5 553.5,-286.5 553.5,-242.5 553.5,-242.5 553.5,-236.5 559.5,-230.5 565.5,-230.5 565.5,-230.5 672.5,-230.5 672.5,-230.5 678.5,-230.5 684.5,-236.5 684.5,-242.5 684.5,-242.5 684.5,-286.5 684.5,-286.5 684.5,-292.5 678.5,-298.5 672.5,-298.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"619\" y=\"-283.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.444</text>\n",
       "<text text-anchor=\"middle\" x=\"619\" y=\"-268.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 3</text>\n",
       "<text text-anchor=\"middle\" x=\"619\" y=\"-253.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 1, 2]</text>\n",
       "<text text-anchor=\"middle\" x=\"619\" y=\"-238.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 12&#45;&gt;13 -->\n",
       "<g id=\"edge13\" class=\"edge\">\n",
       "<title>12&#45;&gt;13</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M624.88,-341.91C624.05,-331.2 623.16,-319.62 622.33,-308.78\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"625.81,-308.37 621.55,-298.67 618.83,-308.91 625.81,-308.37\"/>\n",
       "</g>\n",
       "<!-- 14 -->\n",
       "<g id=\"node15\" class=\"node\">\n",
       "<title>14</title>\n",
       "<path fill=\"#8139e5\" stroke=\"black\" d=\"M831,-298.5C831,-298.5 715,-298.5 715,-298.5 709,-298.5 703,-292.5 703,-286.5 703,-286.5 703,-242.5 703,-242.5 703,-236.5 709,-230.5 715,-230.5 715,-230.5 831,-230.5 831,-230.5 837,-230.5 843,-236.5 843,-242.5 843,-242.5 843,-286.5 843,-286.5 843,-292.5 837,-298.5 831,-298.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"773\" y=\"-283.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"773\" y=\"-268.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 43</text>\n",
       "<text text-anchor=\"middle\" x=\"773\" y=\"-253.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 0, 43]</text>\n",
       "<text text-anchor=\"middle\" x=\"773\" y=\"-238.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 12&#45;&gt;14 -->\n",
       "<g id=\"edge14\" class=\"edge\">\n",
       "<title>12&#45;&gt;14</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M678.31,-341.91C693.08,-329.99 709.21,-316.98 723.9,-305.12\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"726.31,-307.67 731.9,-298.67 721.92,-302.22 726.31,-307.67\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.sources.Source at 0x7f84cb844a50>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "export_graphviz(\n",
    "        tree_clf_unbounded,\n",
    "        out_file=str(IMAGES_PATH / \"iris_tree.dot\"),  # path differs in the book\n",
    "        feature_names=[\"petal length (cm)\", \"petal width (cm)\"],\n",
    "        class_names=iris.target_names,\n",
    "        rounded=True,\n",
    "        filled=True\n",
    "    )\n",
    "\n",
    "Source.from_file(IMAGES_PATH / \"iris_tree.dot\")  # path differs in the book"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Making Predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# extra code – just formatting details\n",
    "from matplotlib.colors import ListedColormap\n",
    "custom_cmap = ListedColormap(['#fafab0', '#9898ff', '#a0faa0'])\n",
    "plt.figure(figsize=(8, 4))\n",
    "\n",
    "lengths, widths = np.meshgrid(np.linspace(0, 7.2, 100), np.linspace(0, 3, 100))\n",
    "X_iris_all = np.c_[lengths.ravel(), widths.ravel()]\n",
    "y_pred = tree_clf.predict(X_iris_all).reshape(lengths.shape)\n",
    "plt.contourf(lengths, widths, y_pred, alpha=0.3, cmap=custom_cmap)\n",
    "for idx, (name, style) in enumerate(zip(iris.target_names, (\"yo\", \"bs\", \"g^\"))):\n",
    "    plt.plot(X_iris[:, 0][y_iris == idx], X_iris[:, 1][y_iris == idx],\n",
    "             style, label=f\"Iris {name}\")\n",
    "\n",
    "# extra code – this section beautifies and saves Figure 6–2\n",
    "tree_clf_deeper = DecisionTreeClassifier(max_depth=3, random_state=42)\n",
    "tree_clf_deeper.fit(X_iris, y_iris)\n",
    "th0, th1, th2a, th2b = tree_clf_deeper.tree_.threshold[[0, 2, 3, 6]]\n",
    "plt.xlabel(\"Petal length (cm)\")\n",
    "plt.ylabel(\"Petal width (cm)\")\n",
    "plt.plot([th0, th0], [0, 3], \"k-\", linewidth=2)\n",
    "plt.plot([th0, 7.2], [th1, th1], \"k--\", linewidth=2)\n",
    "plt.plot([th2a, th2a], [0, th1], \"k:\", linewidth=2)\n",
    "plt.plot([th2b, th2b], [th1, 3], \"k:\", linewidth=2)\n",
    "plt.text(th0 - 0.05, 1.0, \"Depth=0\", horizontalalignment=\"right\", fontsize=15)\n",
    "plt.text(3.2, th1 + 0.02, \"Depth=1\", verticalalignment=\"bottom\", fontsize=13)\n",
    "plt.text(th2a + 0.05, 0.5, \"(Depth=2)\", fontsize=11)\n",
    "plt.axis([0, 7.2, 0, 3])\n",
    "plt.legend()\n",
    "save_fig(\"decision_tree_decision_boundaries_plot\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can access the tree structure via the `tree_` attribute:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sklearn.tree._tree.Tree at 0x7f84cba39ae0>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.tree_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For more information, check out this class's documentation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# help(sklearn.tree._tree.Tree)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "See the extra material section below for an example."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Estimating Class Probabilities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.   , 0.907, 0.093]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.predict_proba([[5, 1.5]]).round(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.predict([[5, 1.5]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.   , 0.022, 0.978]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.predict_proba([[5, 2.5]]).round(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.predict([[5, 2.5]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Regularization Hyperparameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-4 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "}\n",
       "\n",
       "#sk-container-id-4.light {\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: black;\n",
       "  --sklearn-color-background: white;\n",
       "  --sklearn-color-border-box: black;\n",
       "  --sklearn-color-icon: #696969;\n",
       "}\n",
       "\n",
       "#sk-container-id-4.dark {\n",
       "  --sklearn-color-text-on-default-background: white;\n",
       "  --sklearn-color-background: #111;\n",
       "  --sklearn-color-border-box: white;\n",
       "  --sklearn-color-icon: #878787;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-4 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: center;\n",
       "  justify-content: center;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-4 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-4 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-4 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table {\n",
       "    font-family: monospace;\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table summary::marker {\n",
       "    font-size: 0.7rem;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       "/*\n",
       "    `table td`is set in notebook with right text-align.\n",
       "    We need to overwrite it.\n",
       "*/\n",
       ".estimator-table table td.param {\n",
       "    text-align: left;\n",
       "    position: relative;\n",
       "    padding: 0;\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td.value {\n",
       "    color:rgb(255, 94, 0);\n",
       "    background-color: transparent;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       "/*\n",
       "    Styles for parameter documentation links\n",
       "    We need styling for visited so jupyter doesn't overwrite it\n",
       "*/\n",
       "a.param-doc-link,\n",
       "a.param-doc-link:link,\n",
       "a.param-doc-link:visited {\n",
       "    text-decoration: underline dashed;\n",
       "    text-underline-offset: .3em;\n",
       "    color: inherit;\n",
       "    display: block;\n",
       "    padding: .5em;\n",
       "}\n",
       "\n",
       "/* \"hack\" to make the entire area of the cell containing the link clickable */\n",
       "a.param-doc-link::before {\n",
       "    position: absolute;\n",
       "    content: \"\";\n",
       "    inset: 0;\n",
       "}\n",
       "\n",
       ".param-doc-description {\n",
       "    display: none;\n",
       "    position: absolute;\n",
       "    z-index: 9999;\n",
       "    left: 0;\n",
       "    padding: .5ex;\n",
       "    margin-left: 1.5em;\n",
       "    color: var(--sklearn-color-text);\n",
       "    box-shadow: .3em .3em .4em #999;\n",
       "    width: max-content;\n",
       "    text-align: left;\n",
       "    max-height: 10em;\n",
       "    overflow-y: auto;\n",
       "\n",
       "    /* unfitted */\n",
       "    background: var(--sklearn-color-unfitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       "/* Fitted state for parameter tooltips */\n",
       ".fitted .param-doc-description {\n",
       "    /* fitted */\n",
       "    background: var(--sklearn-color-fitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".param-doc-link:hover .param-doc-description {\n",
       "    display: block;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(min_samples_leaf=5, random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" checked><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('criterion',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=criterion,-%7B%22gini%22%2C%20%22entropy%22%2C%20%22log_loss%22%7D%2C%20default%3D%22gini%22\">\n",
       "            criterion\n",
       "            <span class=\"param-doc-description\">criterion: {\"gini\", \"entropy\", \"log_loss\"}, default=\"gini\"<br><br>The function to measure the quality of a split. Supported criteria are<br>\"gini\" for the Gini impurity and \"log_loss\" and \"entropy\" both for the<br>Shannon information gain, see :ref:`tree_mathematical_formulation`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;gini&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('splitter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=splitter,-%7B%22best%22%2C%20%22random%22%7D%2C%20default%3D%22best%22\">\n",
       "            splitter\n",
       "            <span class=\"param-doc-description\">splitter: {\"best\", \"random\"}, default=\"best\"<br><br>The strategy used to choose the split at each node. Supported<br>strategies are \"best\" to choose the best split and \"random\" to choose<br>the best random split.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;best&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_depth',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_depth,-int%2C%20default%3DNone\">\n",
       "            max_depth\n",
       "            <span class=\"param-doc-description\">max_depth: int, default=None<br><br>The maximum depth of the tree. If None, then nodes are expanded until<br>all leaves are pure or until all leaves contain less than<br>min_samples_split samples.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_split',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_split,-int%20or%20float%2C%20default%3D2\">\n",
       "            min_samples_split\n",
       "            <span class=\"param-doc-description\">min_samples_split: int or float, default=2<br><br>The minimum number of samples required to split an internal node:<br><br>- If int, then consider `min_samples_split` as the minimum number.<br>- If float, then `min_samples_split` is a fraction and<br>  `ceil(min_samples_split * n_samples)` are the minimum<br>  number of samples for each split.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_leaf,-int%20or%20float%2C%20default%3D1\">\n",
       "            min_samples_leaf\n",
       "            <span class=\"param-doc-description\">min_samples_leaf: int or float, default=1<br><br>The minimum number of samples required to be at a leaf node.<br>A split point at any depth will only be considered if it leaves at<br>least ``min_samples_leaf`` training samples in each of the left and<br>right branches.  This may have the effect of smoothing the model,<br>especially in regression.<br><br>- If int, then consider `min_samples_leaf` as the minimum number.<br>- If float, then `min_samples_leaf` is a fraction and<br>  `ceil(min_samples_leaf * n_samples)` are the minimum<br>  number of samples for each node.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">5</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_weight_fraction_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_weight_fraction_leaf,-float%2C%20default%3D0.0\">\n",
       "            min_weight_fraction_leaf\n",
       "            <span class=\"param-doc-description\">min_weight_fraction_leaf: float, default=0.0<br><br>The minimum weighted fraction of the sum total of weights (of all<br>the input samples) required to be at a leaf node. Samples have<br>equal weight when sample_weight is not provided.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_features',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_features,-int%2C%20float%20or%20%7B%22sqrt%22%2C%20%22log2%22%7D%2C%20default%3DNone\">\n",
       "            max_features\n",
       "            <span class=\"param-doc-description\">max_features: int, float or {\"sqrt\", \"log2\"}, default=None<br><br>The number of features to consider when looking for the best split:<br><br>- If int, then consider `max_features` features at each split.<br>- If float, then `max_features` is a fraction and<br>  `max(1, int(max_features * n_features_in_))` features are considered at<br>  each split.<br>- If \"sqrt\", then `max_features=sqrt(n_features)`.<br>- If \"log2\", then `max_features=log2(n_features)`.<br>- If None, then `max_features=n_features`.<br><br>.. note::<br><br>    The search for a split does not stop until at least one<br>    valid partition of the node samples is found, even if it requires to<br>    effectively inspect more than ``max_features`` features.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=random_state,-int%2C%20RandomState%20instance%20or%20None%2C%20default%3DNone\">\n",
       "            random_state\n",
       "            <span class=\"param-doc-description\">random_state: int, RandomState instance or None, default=None<br><br>Controls the randomness of the estimator. The features are always<br>randomly permuted at each split, even if ``splitter`` is set to<br>``\"best\"``. When ``max_features < n_features``, the algorithm will<br>select ``max_features`` at random at each split before finding the best<br>split among them. But the best found split may vary across different<br>runs, even if ``max_features=n_features``. That is the case, if the<br>improvement of the criterion is identical for several splits and one<br>split has to be selected at random. To obtain a deterministic behaviour<br>during fitting, ``random_state`` has to be fixed to an integer.<br>See :term:`Glossary <random_state>` for details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">42</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_leaf_nodes',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_leaf_nodes,-int%2C%20default%3DNone\">\n",
       "            max_leaf_nodes\n",
       "            <span class=\"param-doc-description\">max_leaf_nodes: int, default=None<br><br>Grow a tree with ``max_leaf_nodes`` in best-first fashion.<br>Best nodes are defined as relative reduction in impurity.<br>If None then unlimited number of leaf nodes.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_impurity_decrease',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_impurity_decrease,-float%2C%20default%3D0.0\">\n",
       "            min_impurity_decrease\n",
       "            <span class=\"param-doc-description\">min_impurity_decrease: float, default=0.0<br><br>A node will be split if this split induces a decrease of the impurity<br>greater than or equal to this value.<br><br>The weighted impurity decrease equation is the following::<br><br>    N_t / N * (impurity - N_t_R / N_t * right_impurity<br>                        - N_t_L / N_t * left_impurity)<br><br>where ``N`` is the total number of samples, ``N_t`` is the number of<br>samples at the current node, ``N_t_L`` is the number of samples in the<br>left child, and ``N_t_R`` is the number of samples in the right child.<br><br>``N``, ``N_t``, ``N_t_R`` and ``N_t_L`` all refer to the weighted sum,<br>if ``sample_weight`` is passed.<br><br>.. versionadded:: 0.19</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('class_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=class_weight,-dict%2C%20list%20of%20dict%20or%20%22balanced%22%2C%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\">class_weight: dict, list of dict or \"balanced\", default=None<br><br>Weights associated with classes in the form ``{class_label: weight}``.<br>If None, all classes are supposed to have weight one. For<br>multi-output problems, a list of dicts can be provided in the same<br>order as the columns of y.<br><br>Note that for multioutput (including multilabel) weights should be<br>defined for each class of every column in its own dict. For example,<br>for four-class multilabel classification weights should be<br>[{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] instead of<br>[{1:1}, {2:5}, {3:1}, {4:1}].<br><br>The \"balanced\" mode uses the values of y to automatically adjust<br>weights inversely proportional to class frequencies in the input data<br>as ``n_samples / (n_classes * np.bincount(y))``<br><br>For multi-output, the weights of each column of y will be multiplied.<br><br>Note that these weights will be multiplied with sample_weight (passed<br>through the fit method) if sample_weight is specified.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('ccp_alpha',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=ccp_alpha,-non-negative%20float%2C%20default%3D0.0\">\n",
       "            ccp_alpha\n",
       "            <span class=\"param-doc-description\">ccp_alpha: non-negative float, default=0.0<br><br>Complexity parameter used for Minimal Cost-Complexity Pruning. The<br>subtree with the largest cost complexity that is smaller than<br>``ccp_alpha`` will be chosen. By default, no pruning is performed. See<br>:ref:`minimal_cost_complexity_pruning` for details. See<br>:ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py`<br>for an example of such pruning.<br><br>.. versionadded:: 0.22</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('monotonic_cst',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=monotonic_cst,-array-like%20of%20int%20of%20shape%20%28n_features%29%2C%20default%3DNone\">\n",
       "            monotonic_cst\n",
       "            <span class=\"param-doc-description\">monotonic_cst: array-like of int of shape (n_features), default=None<br><br>Indicates the monotonicity constraint to enforce on each feature.<br>  - 1: monotonic increase<br>  - 0: no constraint<br>  - -1: monotonic decrease<br><br>If monotonic_cst is None, no constraints are applied.<br><br>Monotonicity constraints are not supported for:<br>  - multiclass classifications (i.e. when `n_classes > 2`),<br>  - multioutput classifications (i.e. when `n_outputs_ > 1`),<br>  - classifications trained on data with missing values.<br><br>The constraints hold over the probability of the positive class.<br><br>Read more in the :ref:`User Guide <monotonic_cst_gbdt>`.<br><br>.. versionadded:: 1.4</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.copy-paste-icon').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling\n",
       "        .textContent.trim().split(' ')[0];\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "\n",
       "\n",
       "/**\n",
       " * Adapted from Skrub\n",
       " * https://github.com/skrub-data/skrub/blob/403466d1d5d4dc76a7ef569b3f8228db59a31dc3/skrub/_reporting/_data/templates/report.js#L789\n",
       " * @returns \"light\" or \"dark\"\n",
       " */\n",
       "function detectTheme(element) {\n",
       "    const body = document.querySelector('body');\n",
       "\n",
       "    // Check VSCode theme\n",
       "    const themeKindAttr = body.getAttribute('data-vscode-theme-kind');\n",
       "    const themeNameAttr = body.getAttribute('data-vscode-theme-name');\n",
       "\n",
       "    if (themeKindAttr && themeNameAttr) {\n",
       "        const themeKind = themeKindAttr.toLowerCase();\n",
       "        const themeName = themeNameAttr.toLowerCase();\n",
       "\n",
       "        if (themeKind.includes(\"dark\") || themeName.includes(\"dark\")) {\n",
       "            return \"dark\";\n",
       "        }\n",
       "        if (themeKind.includes(\"light\") || themeName.includes(\"light\")) {\n",
       "            return \"light\";\n",
       "        }\n",
       "    }\n",
       "\n",
       "    // Check Jupyter theme\n",
       "    if (body.getAttribute('data-jp-theme-light') === 'false') {\n",
       "        return 'dark';\n",
       "    } else if (body.getAttribute('data-jp-theme-light') === 'true') {\n",
       "        return 'light';\n",
       "    }\n",
       "\n",
       "    // Guess based on a parent element's color\n",
       "    const color = window.getComputedStyle(element.parentNode, null).getPropertyValue('color');\n",
       "    const match = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/i);\n",
       "    if (match) {\n",
       "        const [r, g, b] = [\n",
       "            parseFloat(match[1]),\n",
       "            parseFloat(match[2]),\n",
       "            parseFloat(match[3])\n",
       "        ];\n",
       "\n",
       "        // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness\n",
       "        const luma = 0.299 * r + 0.587 * g + 0.114 * b;\n",
       "\n",
       "        if (luma > 180) {\n",
       "            // If the text is very bright we have a dark theme\n",
       "            return 'dark';\n",
       "        }\n",
       "        if (luma < 75) {\n",
       "            // If the text is very dark we have a light theme\n",
       "            return 'light';\n",
       "        }\n",
       "        // Otherwise fall back to the next heuristic.\n",
       "    }\n",
       "\n",
       "    // Fallback to system preference\n",
       "    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n",
       "}\n",
       "\n",
       "\n",
       "function forceTheme(elementId) {\n",
       "    const estimatorElement = document.querySelector(`#${elementId}`);\n",
       "    if (estimatorElement === null) {\n",
       "        console.error(`Element with id ${elementId} not found.`);\n",
       "    } else {\n",
       "        const theme = detectTheme(estimatorElement);\n",
       "        estimatorElement.classList.add(theme);\n",
       "    }\n",
       "}\n",
       "\n",
       "forceTheme('sk-container-id-4');</script></body>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(min_samples_leaf=5, random_state=42)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import make_moons\n",
    "\n",
    "X_moons, y_moons = make_moons(n_samples=150, noise=0.2, random_state=42)\n",
    "\n",
    "tree_clf1 = DecisionTreeClassifier(random_state=42)\n",
    "tree_clf2 = DecisionTreeClassifier(min_samples_leaf=5, random_state=42)\n",
    "tree_clf1.fit(X_moons, y_moons)\n",
    "tree_clf2.fit(X_moons, y_moons)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9IAAAF6CAYAAAD1Q2B0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAkHhJREFUeJzt3Xd8VGWiPvDnTMqkTkKAhARIAhg6iIBgUCmCIm2B9booXgV1Lbu6C6Ki+HNV3MJF7GV1V1dRVxTWggKCi1QVCNJ7TwIJJJBAMuntvL8/4gxJpmTKOXPOzDzfz8d7l8mZc95JZuY5b5eEEAJERERERERE5BKD1gUgIiIiIiIi8iesSBMRERERERG5gRVpIiIiIiIiIjewIk1ERERERETkBlakiYiIiIiIiNzAijQRERERERGRG1iRJiIiIiIiInIDK9JEREREREREbmBFmoiIiIiIiMgNrEgTke6MHDkSkiSpdv709HSkp6erdn4iIgI2btwISZLw3HPPaV0Uv7V48WJIkoTFixdrXZRmtMrR48ePY+rUqUhOTobBYEB8fLzPy0BkwYo0kUpycnIgSRIkScLYsWPtHrNt2zZIkoSZM2f6tnAqmzlzJiRJQk5OTlBen4iIiJTV0NCAKVOm4Ntvv8WECRPwzDPP4Mknn9SsPJaGIkf/6a3xg5QXqnUBiILBf//7X6xfvx433HCD1kXxCx999BEqKytVO/+6detUOzcRETUaMmQIDh8+jHbt2mldFAoA2dnZOHToEO677z7885//1Lo4ViNGjMDIkSNtHh8wYIDPy0K+xYo0kcrS09Nx+vRpPPHEE9i+fbuqQ5YDRWpqqqrn79atm6rnJyIiICoqCj179tS6GBQgzp49CwBISUnRuCTNjRw5ktMXghSHdhOprEePHrjzzjuxY8cOLFu2zOXn5ebm4t5770XHjh0RHh6OTp064d5778Xp06ddPsdzzz0HSZKwceNGLF68GAMHDkRUVFSzltOysjI8++yz6NOnDyIjIxEfH4+xY8fixx9/tDnfuXPnMGvWLGRkZFiP7dWrFx588EGUlpYCaGw4+PDDDwEAXbp0sQ5xanpNy7/z8/Nx1113oUOHDjAYDNi4cSMA53Okv/76a9x0001o27YtIiIikJ6ejjvvvBMHDhxw+fqO5nZVVFTg2WefRc+ePREREYGEhARMmDABP/30k9Pf7ZIlSzBgwABERkYiOTkZs2bNQlVVlc1zvvjiC4wYMQKJiYmIiIhASkoKxowZgy+++MLuayUi8rWm85q3bNmCUaNGITY2Fu3bt8fvf/9763fbqlWrkJmZiejoaCQlJWHu3Lmor693eK6mLN/B5eXlmDVrFlJSUmA0GtG/f398/vnnHpfdlYwCgGPHjmHu3LkYOHCgNUu6d++OJ598EuXl5TbntWRSTU0NnnrqKaSmpiIyMhKDBg3C999/DwAoLS3FQw89hJSUFERERCAzMxPbt2+3OZfltZeUlOCBBx5Ahw4dEBERgauuugqffvqpW683Ozsbv/3tb5Gamgqj0Yjk5GTMnDkTubm5Nsfu2rUL//M//2M9tn379rj66qvx17/+1a1rtkYIgffffx/XXnstTCYToqKiMHjwYLz//vs2x549exbPPvssrrnmGiQmJsJoNCI9PR2///3vcf78+WbHpqenY8SIEQCA+fPnW7OdFVjSEnukiXzg+eefx2effYann34av/71rxEWFub0+GPHjuG6667DhQsXMGnSJPTp0wcHDhzA+++/jxUrVuDHH39E9+7dXb7+okWLsGHDBkyePBk33XQTQkJCAAAXL17E8OHDcfDgQVx77bV48MEHYTab8fXXX2PUqFH4z3/+gylTpgAAKisrce211yInJwc33XQTpk6ditraWmRnZ+Pjjz/GY489hri4OMyePRuLFy/G3r17MWvWLOtCIC0rrsXFxcjMzERCQgJuu+02VFdXw2QyOX0djz76KF5++WUkJCRgypQpSExMxJkzZ/D9999j0KBB6Nu3r8vXb6m6uho33HADtm/fjoEDB2L27NkoLCzE0qVL8d133+HTTz/FrbfeavO8N998E2vWrMHkyZNxww03YM2aNXj99ddRVFSETz75xHrc22+/jd///vdITk7G1KlT0bZtWxQUFGD79u346quvcMsttzgtHxGRL2VlZWHhwoUYO3YsHnjgAWzYsAFvv/02zGYzJk2ahJkzZ2Ly5MnIzMzEqlWrsGjRIsTExOCZZ55x6fx1dXW46aabcOnSJdxyyy2orKzEZ599ht/85jdYs2YNbrrpJrfK62pGAcCXX36Jf/3rXxg1ahRGjhwJWZaxbds2LFy4EJs2bcLmzZvt5vS0adOwf/9+/OpXv0JVVRU++eQTTJw4ET/99BPu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Ix06dMBvfvMbbNmyBYsWLbI7hygrKwuVlZUAgIMHD9rtsbU8FhERYX0sISEBAHDmzBmvytjUQw89BACYNWuWdVibRX19fbOyeXL9GTNmoK6uDvPmzWv2u9i3bx8WL16MuLg461Zgnti4caPN77iurs76Wpr+/oiIyD2uZlRaWhoAYMuWLc2GkOfl5WHevHk+KGmjp556CrW1tc2u/9prr8FoNOK2225z+tzJkycjNTUVL7/8srVxvam6ujr8+OOP1n9v3boV1dXVNsfZy29v/PGPf0RlZSXuu+8+uz2x2dnZyMnJAQAkJiYiMjISu3btst5nAI1DxF3Z/ssdonFxZZf/c3VLrZ07d9p9/LXXXsOGDRuQkZGBq6++WsFXQnrDHmkiDfzqV7/Cdddd1yzomnr77bdx3XXX4b777sOKFSvQu3dvHDx4EN988w3at2+Pt99+W5Fy/P3vf8fRo0cxd+5cfPzxx8jMzER8fDzOnDmDHTt24Pjx4zh37hyioqKwdu1aPP7447j22mvRvXt3tG3bFqdOncI333yDiIgIa0UXAG644Qa8+OKLuP/++3HLLbcgOjoaaWlpdoeyu2r8+PF47LHH8OKLLyIjIwNTp05FYmIi8vPzsW7dOjz22GOYPXu2x9efO3cuVq1ahY8//hiHDx/G6NGjcf78eSxduhT19fV49913ERsb63H5p0yZApPJhGuuuQZpaWmoq6vD2rVrcejQIfzP//yP9eaOiIjc52pGJScn45ZbbsEXX3yBwYMHY/To0SgsLMTKlSsxevRonDx5UvWyJicno6KiAv3798ekSZOs+0gXFxfj9ddfb3URMKPRiM8//xzjxo3DiBEjcMMNN6Bfv36QJAm5ubn44Ycf0LZtW+vCXgsXLsSGDRswfPhwdOnSBREREdi1axfWrVuHrl27YurUqYq8rgceeADbtm3Dhx9+iJ9++gljxoxBSkoKCgsLceTIEWRlZWHJkiVIT0+HwWDA73//e7z00ku48sorMWnSJJjNZqxevRppaWlISUlRpExquuWWWxAWFobBgwejU6dOqKiowLZt27B7927Ex8fj3//+N6dsBThWpIk0snDhQpthXRY9evTAjh07MH/+fKxZswarVq1C+/btcffdd+PZZ59VrNKVkJCALVu24M0338TSpUvxySefQJZldOjQAVdeeSX+9Kc/Wef5jB07Fjk5Odi8eTO+/PJLlJeXo2PHjpg2bRrmzp2L3r17W887btw4vPDCC3j33Xfx0ksvoa6uDiNGjPCqIg0AixYtQmZmJt588018/vnnqK6uRnJyMm644QbceOONXl0/IiIC69evx8KFC7F06VK88soriIqKwogRI/DUU0/huuuu86rsCxYswJo1a7B9+3asWLEC0dHR6NatG95++23ce++9Xp2biCjYuZNRixcvRnp6Or744gu88cYbSE1NxZw5c/DEE0/g888/V72s4eHhWLt2LZ588kl8/PHHKCkpQc+ePfHGG2+4vNbI1Vdfjb1792LRokX49ttv8dNPP8FoNKJjx46YMmVKs/P87ne/Q1xcHLKysrBp0yYIIZCamoqnnnoKjzzyiGK7R0iShMWLF2P8+PF49913sXLlSpSXlyMxMREZGRl48cUXMWbMGOvxCxYsQEJCAhYvXoy///3vSEpKwu23347nnnsOffv2VaRMavrd736H7777Dps3b0ZxcTEMBgPS0tIwe/ZsPProo3Z3AaHAIgm11oQnIiIiIiIry5xZyxBnIvJfnCNNRERERERE5AZWpImIiIiIiIjcwDnSRERERKQ7GzdutG4/6MyAAQO82lWBGueNuzLcfMqUKYptBUnk73Rdkd68eTMWLVqEnTt34ty5c/jqq6+cflFu3LjR7v6y586dQ4cOHVQsKREREREpaePGjS7tATxjxgy/qUjrdW704sWLsWnTplaPS09PZ0Wa6Be6rkhXVFTgyiuvxD333INf//rXLj/v6NGjzVYgbLnROxERERHp23PPPYfnnntO62IEBVd6/omoOV1XpMeNG4dx48a5/bzExETEx8crXyAiIiIiIiIKerquSHtqwIABqKmpQd++ffHcc8853KvXoqamBjU1NdZ/y7KMixcvom3btpAkSe3iEhEReUUIgbKyMqSkpMBg0G4dUeYpERH5M3fyNKAq0snJyXjnnXcwePBg1NTU4L333sPIkSORlZWFgQMHOnzeggULXJqDQ0REpGdnzpxBp06dNLs+85SIiAKBK3kqCSGEj8rjFUmSWl1szJ4RI0YgNTUVH3/8scNjWragl5aWIjU1FadyVyPWFO1pkYmIAlQYGmo7IfvUGezevQubN23GyRMn0KdbCl598n+1LlxQMpdXInX4PSgpKUFcXJxm5WCeEhG5R9R3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Jr42P8TX5p8C+bUBgf36/Om16aGiyjwNLHxt/imQXxsQ2K+Pr00fXM1TXS82dvr0aezZswenT59GQ0MD9uzZgz179qC8vNx6TM+ePfHVV18BACRJwuzZs/GXv/wF33zzDfbv34+77roLKSkpmDJlikavgoiIiIiIiAKJrhcbe+aZZ/Dhhx9a/33VVVcBADZs2ICRI0cCAI4ePWpdzAQA5s6di4qKCtx///0oKSnBddddhzVr1iAiIsKnZSciIiIiIqLApOuK9OLFi1vdQ7rlFG9JkvD888/j+eef9/i6RqMRzz77rN3haf6Or80/8bX5p0B+bUBgv75Afm2+FMi/R742/8TX5r8C+fXxtfknny82RkREREREROTPdD1HmoiIiIiIiEhvWJEmIiIiIiIicgMr0kRERERERERuYEUawF//+lcMGzYMUVFRiI+Pd+k5M2fOhCRJzf67+eab1S2oBzx5bUIIPPPMM0hOTkZkZCTGjBmD48ePq1tQD128eBF33HEHTCYT4uPjce+99zbbHs2ekSNH2vztHnzwQR+V2LG33noL6enpiIiIwNChQ7F9+3anx//nP/9Bz549ERERgX79+uHbb7/1UUnd585rW7x4sc3fR6+r7m/evBmTJk1CSkoKJEnC8uXLW33Oxo0bMXDgQBiNRlxxxRWtLqioFXdf28aNG23+bpIkoaCgwDcFdsOCBQtw9dVXIzY2FomJiZgyZQqOHj3a6vP86TOnlUDOUyCwM5V56h+fbebpZcxT7QV7nrIiDaC2tha33norfve737n1vJtvvhnnzp2z/vfpp5+qVELPefLaXnjhBbz++ut45513kJWVhejoaIwdOxbV1dUqltQzd9xxBw4ePIi1a9di5cqV2Lx5M+6///5Wn3ffffc1+9u98MILPiitY0uXLsWcOXPw7LPPYteuXbjyyisxduxYnD9/3u7xW7Zswe233457770Xu3fvxpQpUzBlyhQcOHDAxyVvnbuvDQBMJlOzv09ubq4PS+y6iooKXHnllXjrrbdcOj47OxsTJkzAqFGjsGfPHsyePRu//e1v8d1336lcUve5+9osjh492uxvl5iYqFIJPbdp0yY89NBD2LZtG9auXYu6ujrcdNNNqKiocPgcf/rMaSmQ8xQI7Exlnur/s808vYx5qg9Bn6eCrD744AMRFxfn0rEzZswQkydP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ibvvvrvZDU12dnaz13v69GkxfPhwkZCQIIxGo7jiiivE448/LkpLSzV6BZe98cYbIjU1VYSHh4shQ4aIbdu2WX82YsQIMWPGjGbHL1u2THTv3l2Eh4eLPn36iFWrVvm4xK5z57XNnj3bemxSUpIYP3682LVrlwalbp1li4qW/1lez4wZM8SIESNsnjNgwAARHh4uunbt2uyzpyfuvraFCxeKbt26iYiICJGQkCBGjhwp1q9fr03hW2HvdbX8HvT3z5xWAjlPhQjsTGWe+sdnm3na/DnMU20Fe55KQgihRM82ERERERERUTDgPtJEREREREREbmBFmoiIiIiIiMgNrEgTERERERERuYEVaSIiIiIiIiI3sCJNRERERERE5AZWpImIiIiIiIjcwIo0ERERERERkRtYkSYiIiIiIiJyAyvSRERERERERG5gRZqIiIiIiIjIDaxIE5GiMjMzIUkStm7d2uxxs9mMAQMGwGg0Yu3atRqVjoiIyD8wT4n0jRVpIlLUwoULAQBPP/209bHa2lpMnToV+/btw4cffogbb7xRq+IRERH5BeYpkb6xIk1Eiho+fDgmTJiA9evXY+PGjRBCYObMmVi/fj1eeeUV3HbbbVoXkYiISPeYp0T6JgkhhNaFIKLAsn//fgwYMADDhg3DkCFD8PLLL2PevHn429/+pnXRiIiI/AbzlEi/WJEmIlXMmDEDH330EQDgnnvuwb/+9S+bY7788ku8/fbb2LlzJy5duoTs7Gykp6f7uKRERET6xTwl0icO7SYiVbRv3x4AEBsbi7feesvuMRUVFRg+fDief/55XxaNiIjIbzBPifQpVOsCEFHgefPNN/HSSy8hKSkJhYWF+PDDD/HAAw/YHHfnnXcCAA4cOODrIhIREeke85RIv9gjTUSKWrZsGWbNmoVRo0Zh9+7diIuLw/z581FZWal10YiIiPwG85RI31iRJiLFrFu3DnfeeSf69euH5cuXIzk5GY888gjOnTuH1157TeviERER+QXmKZH+cbExIlLErl27MHLkSLRt2xZbtmxBcnIyAMBsNqNLly5oaGjAqVOnkJCQYPPcAwcOoF+/flwchYiIgh7zlMg/sEeaiLx28uRJjB8/HuHh4VizZo019AHAZDLhiSeeQGlpKRYsWKBhKYmIiPSNeUrkP9gjTUSaYws6ERGR95inRL7DVbuJSDMXL17E6dOncfLkSQDAoUOHUFJSgtTUVLtD1oiIiMgW85TI99gjTUSaWbx4Me6++26bxz/44APMnDnT9wUiIiLyQ8xTIt9jRZqIiIiIiIjIDVxsjIiIiIiIiMgNrEgTERERERERuYEVaSIiIiIiIiI3sCJNRERERERE5AZWpImIiIiIiIjcwIo0ERERERERkRtYkSYiIiIiIiJyAyvSRERERERERG5gRZqIiIiIiIjIDaxIExEREREREbmBFWkiIiIiIiIiN7AiTUREREREROSG/w/wcCZBh2GeUgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–3\n",
    "\n",
    "def plot_decision_boundary(clf, X, y, axes, cmap):\n",
    "    x1, x2 = np.meshgrid(np.linspace(axes[0], axes[1], 100),\n",
    "                         np.linspace(axes[2], axes[3], 100))\n",
    "    X_new = np.c_[x1.ravel(), x2.ravel()]\n",
    "    y_pred = clf.predict(X_new).reshape(x1.shape)\n",
    "    \n",
    "    plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=cmap)\n",
    "    plt.contour(x1, x2, y_pred, cmap=\"Greys\", alpha=0.8)\n",
    "    colors = {\"Wistia\": [\"#78785c\", \"#c47b27\"], \"Pastel1\": [\"red\", \"blue\"]}\n",
    "    markers = (\"o\", \"^\")\n",
    "    for idx in (0, 1):\n",
    "        plt.plot(X[:, 0][y == idx], X[:, 1][y == idx],\n",
    "                 color=colors[cmap][idx], marker=markers[idx], linestyle=\"none\")\n",
    "    plt.axis(axes)\n",
    "    plt.xlabel(r\"$x_1$\")\n",
    "    plt.ylabel(r\"$x_2$\", rotation=0)\n",
    "\n",
    "fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
    "plt.sca(axes[0])\n",
    "plot_decision_boundary(tree_clf1, X_moons, y_moons,\n",
    "                       axes=[-1.5, 2.4, -1, 1.5], cmap=\"Wistia\")\n",
    "plt.title(\"No restrictions\")\n",
    "plt.sca(axes[1])\n",
    "plot_decision_boundary(tree_clf2, X_moons, y_moons,\n",
    "                       axes=[-1.5, 2.4, -1, 1.5], cmap=\"Wistia\")\n",
    "plt.title(f\"min_samples_leaf = {tree_clf2.min_samples_leaf}\")\n",
    "plt.ylabel(\"\")\n",
    "save_fig(\"min_samples_leaf_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.898"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_moons_test, y_moons_test = make_moons(n_samples=1000, noise=0.2,\n",
    "                                        random_state=43)\n",
    "tree_clf1.score(X_moons_test, y_moons_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.92"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf2.score(X_moons_test, y_moons_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sensitivity to axis orientation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rotating the dataset also leads to completely different decision boundaries:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9IAAAF6CAYAAAD1Q2B0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAaBRJREFUeJzt3Xt0VPW9///XnoQEtYQAGjKRtFRbb0dEgULh1NoKCkK7Wg72aGutUkXrgVa09QjrBLDaI9p6wQs//ZbWo/2eWm3xi8dVKC2N0laBIF5OsQrWW0ExgCIJiiYw8/n9MZmQTGaS2TP7Ps/HWrPQyZ6Zz94D+ez35/J+W8YYIwAAAAAAkJeY3w0AAAAAACBMCKQBAAAAALCBQBoAAAAAABsIpAEAAAAAsIFAGgAAAAAAGwikAQAAAACwgUAaAAAAAAAbCKQBAAAAALCh3O8GBFEymdSOHTs0YMAAWZbld3MAACiIMUb79u1TXV2dYjH3xs7pNwEAUWCn3ySQzmLHjh2qr6/3uxkAADhi+/btGjZsmGvvT78JAIiSfPpNAuksBgwYIEn6x7PPqGrAx3xuDRAh1YP0Xus+Pb1pk/72t79p5cqVKi8v10MPPaSqqiq/WwdETmtrqz75yU929mtuod8EAERB67739YlRo/PqNwmks0gvS6sa8DFVuXzzAZSUqiodNNLhhx+u/v37q7y8XOXl5aqqqiKQBlzk9nJr+k0AQJTk02+SbAwAAAAAABsIpAEAAAAAsIFAGgAAAAAAGwikAQAAAACwgUAaAAAAAAAbCKQBAAAAALCBQBoAAAAAABsIpAEAAAAAsIFAGgAAAAAAGwikAQAAAACwgUAaAAAAAAAbCKQBAAAAALCBQBoAAAAAABsIpAEAAAAAsIFAGgAAAAAAG0IRSC9dulTDhw9X//79NW7cOG3cuLHX4/fu3avZs2crHo+rsrJSxx13nFatWuVRawEAAAAAUVbudwP68vDDD+vqq6/Wvffeq3HjxmnJkiWaPHmytm7dqpqamh7Ht7e366yzzlJNTY2WL1+uo48+Wv/4xz9UXV3tfeMBAAAAAJET+ED6tttu06xZszRz5kxJ0r333quVK1fqvvvu07x583ocf99992nPnj1at26d+vXrJ0kaPny4l00GAAAAgieRkDY0Sbt2SjVDpc+Ok8rK/G4VEEqBXtrd3t6uZ555RpMmTep8LhaLadKkSVq/fn3W1zz22GMaP368Zs+eraFDh+rkk0/WjTfeqEQikfNz2tra1Nra2u0BAACyo98EQmjlKlljxio241zFrpit2IxzZY0ZK61k+yNQiEAH0u+8844SiYSGDh3a7fmhQ4equbk562tee+01LV++XIlEQqtWrdKCBQt066236kc/+lHOz1m8eLEGDhzY+aivr3f0PAAAiBL6TSBkVq6Sdeks6e23uz/f3Jx6nmAasC3QgXQhksmkampq9NOf/lSjR4/Weeedp//4j//Qvffem/M18+fPV0tLS+dj+/btHrYYAIBwod8EQiSRkNWwQDJGVsaPLGNSfy5YmFr2DSBvgd4jfeSRR6qsrEw7d+7s9vzOnTtVW1ub9TXxeFz9+vVTWZf9HieeeKKam5vV3t6uioqKHq+prKxUZWWls40HACCi6DeBENnQJCtzJroLyxhpxw6ZDU3SP0/wsGFAuAV6RrqiokKjR49WY2Nj53PJZFKNjY0aP3581tf88z//s1555RUlk8nO515++WXF4/GsQTQAAAAQWbt29n2MneMASAp4IC1JV199tZYtW6YHHnhAL730kq644gp98MEHnVm8v/Wtb2n+/Pmdx19xxRXas2ePrrzySr388stauXKlbrzxRs2ePduvUwAAAAD8UTO072PsHAdAUsCXdkvSeeedp927d2vhwoVqbm7WqaeeqtWrV3cmINu2bZtisUPjAfX19fr973+vq666SqeccoqOPvpoXXnllbr22mv9OgUAAADAH58dJxOPpxKLdeyJ7spYlhSPp0phAchb4ANpSZozZ47mzJmT9Wdr167t8dz48eO1YcMGl1sFAAAABFxZmcyPbpB16SwZy+oWTBsrlX7M3HA99aQBmwK/tBsAAADwXSIhPbVOWrEi9WeYslxPmyrzs2VSZrLeeDz1/LSp/rQLCLFQzEgDAAAAvlm5SlbDgm7Zr008LvOjG8IThE6bKjNlcio7966dqT3Rnx3HTDRQIAJpAAAAIJeVq2RdOkvK3F/c3JxaLh2mGd2yMkpcAQ5haTcAAACQTSIhq2GBZIysjB+l9xpbCxaGa5m3V8K8FB7IAzPSAAAAQDYbmrot585kGSPt2JFaLs1M7yFRWAoP9IEZaQAAACCbXTudPa4UpJfCZw5AdCyF18pV/rQLcBiBNAAAAJBN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mGB+9rOfmYsuuii0NwR2z/2ee+4xxxxzjGlvb/eqiZFSqn0n/Sb9Zib6zRT6zfCJSr/J0m4frV+/XtXV1RozZkznc5MmTVIsFlNTU1PW1+zatUtNTU2qqanRhAkTNHToUJ1xxhl68sknvWq2Iwo5d0nav3+/vvGNb2jp0qWqra31oqmOKvS8M7W0tKiqqkrl5eVuNLNo7e3teuaZZzRp0qTO52KxmCZNmqT169dnfc369eu7HS9JkydPznl8EBVy3pn279+vAwcOaPDgwW4103GFnvf111+vmpoaXXLJJV400xWFnPtjjz2m8ePHa/bs2Ro6dKhOPvlk3XjjjUokEl41O9RKte+k36TfzES/mUK/GS5R6jcJpH3U3Nysmpqabs+Vl5dr8ODBam5uzvqa1157TZJ03XXXadasWVq9erVGjRqliRMn6u9//7vrbXZKIecuSVdddZUmTJigr3zlK2430RWFnndX77zzjm644QZddtllbjTREe+8844SiYSGDh3a7fmhQ4fmPM/m5mZbxwdRIeed6dprr1VdXV2Pm6MgK+S8n3zySf385z/XsmXLvGiiawo599dee03Lly9XIpHQqlWrtGDBAt1666360Y9+5EWTQ69U+076zUPoN1PoN1PoN8MlSv0mgbQL5s2bJ8uyen1s2bKloPdOJpOSpMsvv1wzZ87Uaaedpttvv13HH3+87rvvPidPoyBunvtjjz2mxx9/XEuWLHG20Q5w87y7am1t1bRp03TSSSfpuuuuK77hCJSbbrpJDz30kFasWKH+/fv73RzX7Nu3TxdeeKGWLVumI4880u/meC6ZTKqmpkY//elPNXr0aJ133nn6j//4D917771+N81Xpdp30m/Sb6Jw9JulIaj9ZjDXt4Tc97//fV188cW9HnPMMceotrZWu3bt6vb8wYMHtWfPnpzLr+LxuCTppJNO6vb8iSeeqG3bthXeaIe4ee6PP/64Xn31VVVXV3d7fsaMGTr99NO1du3aIlpeHDfPO23fvn2aMmWKBgwYoBUrVqhfv37FNts1Rx55pMrKyrRz585uz+/cuTPnedbW1to6PogKOe+0W265RTfddJP++Mc/6pRTTnGzmY6ze96vvvqq3njjDX35y1/ufC4d6JSXl2vr1q069thj3W20Qwr5zuPxuPr166eysrLO50488UQ1Nzervb1dFRUVrrY5qEq176TfzI1+k36zN/Sb9Ju+95t+b9IuZekEGps2bep87ve//32vCTSSyaSpq6vrkTDl1FNPNfPnz3e1vU4q5Nzffvtts3nz5m4PSeaOO+4wr732mldNL0oh522MMS0tLeazn/2sOeOMM8wHH3zgRVOLNnbsWDNnzpzO/08kEuboo4/uNWnKl770pW7PjR8/PpRJU+yctzHG3HzzzaaqqsqsX7/eiya6ws55f/jhhz3+LX/lK18xZ555ptm8ebNpa2vzsulFs/udz58/33ziE58wiUSi87klS5aYeDzuelujoFT7TvpN+s1M9Jv0m/Sb/vabBNI+mzJlijnttNNMU1OTefLJJ82nP/3pbiUd3nzzTXP88cebpqamzuduv/12U1VVZX7zm9+Yv//976ahocH079/fvPLKK36cQsEKOfdMCln2UWPsn3dLS4sZN26cGTFihHnllVfM22+/3fk4ePCgX6fRp4ceeshUVlaa+++/37z44ovmsssuM9XV1aa5udkYY8yFF15o5s2b13n8U089ZcrLy80tt9xiXnrpJbNo0aLQlvGwc9433XSTqaioMMuXL+/23e7bt8+vUyiI3fPOFObso3bPfdu2bWbAgAFmzpw5ZuvWrea3v/2tqampMT/60Y/8OoXQKdW+k36TfpN+k34zjX7T/36TQNpn7777rvn6179uPvaxj5mqqiozc+bMbr8IXn/9dSPJPPHEE91et3jxYjNs2DBz+OGHm/Hjx5u//OUvHre8eIWee1dhvCGwe95PPPGEkZT18frrr/tzEnm66667zMc//nFTUVFhxo4dazZs2ND5szPOOMNcdNFF3Y7/9a9/bY477jhTUVFh/umf/smsXLnS4xY7w855f+ITn8j63S5atMj7hhfJ7vfdVZhvCIyxf+7r1q0z48aNM5WVleaYY44x//mf/xnoG/ygKdW+k36TfpN+k34zjX7T/37TMsYY9xaOAwAAAAAQLWTtBgAAAADABgJpAAAAAABsIJAGAAAAAMAGAmkAAAAAAGwgkAYAAAAAwAYCaQAAAAAAbCCQBgAAAADABgJpAAAAAABsIJAGAAAAAMAGAmkAAAAAAGwgkAbgmvHjx8uyLK1fv77b862trTr11FNVWVmpNWvW+NQ6AACChX4TCA8CaQCuufnmmyVJDQ0Nnc+1t7dr+vTp+utf/6oHHnhAZ511ll/NAwAgUOg3gfAgkAbgms9//vOaNm2aHn/8ca1du1bGGF188cV6/PHHdfvtt+v888/3u4kAAAQG/SYQHpYxxvjdCADRtXnzZp166qmaMGGCxo4dq9tuu03z58/XjTfe6HfTAAAIHPpNIBwIpAG47qKLLtIvfvELSdK3v/1t/fznP+9xzP/7f/9P99xzj5555hm99957ev311zV8+HCPWwoAgP/oN4HgY2k3ANcdddRRkqQBAwZo6dKlWY/54IMP9PnPf17XX3+9l00DACBw6DeB4Cv3uwEAou3uu+/WrbfeqqFDh2rnzp164IEHdPnll/c47sILL5QkvfDCC143EQCAwKDfBMKBGWkArvn1r3+tK6+8Ul/84hf13HPPaeDAgfrhD3+o/fv3+900AAACh34TCA8CaQCuaGxs1IUXXqgRI0bo0UcfVTwe11VXXaW3335bd9xxh9/NAwAgUOg3gXAh2RgAxz377LP6whe+oCFDhmjdunWKx+OSpNbWVn3yk59UIpHQa6+9psGDB/d47QsvvKARI0aQNAUAUDLoN4HwYUYagKNeffVVTZ06VRUVFVq9enXnzYAkVVVV6dprr1VLS4sWL17sYysBAAgG+k0gnJiRBhAojKwDAJA/+k3AH2TtBhAIe/bs0bZt2/Tqq69Kkl588UXt3btXH//4x7MuZQMAoJTRbwL+YkYaQCDcf//9mjlzZo/n/+u//ksXX3yx9w0CACDA6DcBfxFIAwAAAABgA8nGAAAAAACwgUAaAAAAAAAbCKQBAAAAALCBQBoAAAAAABsIpAEAAAAAsIFAGgAAAAAAGwikAQAAAACwgUAaAAAAAAAbCKQBAAAAALCBQBoAAAAAABsIpAEAAAAAsIFAGgAAAAAAG/5/SA8k+Sgqc2UAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–7\n",
    "\n",
    "np.random.seed(6)\n",
    "X_square = np.random.rand(100, 2) - 0.5\n",
    "y_square = (X_square[:, 0] > 0).astype(np.int64)\n",
    "\n",
    "angle = np.pi / 4  # 45 degrees\n",
    "rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)],\n",
    "                            [np.sin(angle), np.cos(angle)]])\n",
    "X_rotated_square = X_square.dot(rotation_matrix)\n",
    "\n",
    "tree_clf_square = DecisionTreeClassifier(random_state=42)\n",
    "tree_clf_square.fit(X_square, y_square)\n",
    "tree_clf_rotated_square = DecisionTreeClassifier(random_state=42)\n",
    "tree_clf_rotated_square.fit(X_rotated_square, y_square)\n",
    "\n",
    "fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
    "plt.sca(axes[0])\n",
    "plot_decision_boundary(tree_clf_square, X_square, y_square,\n",
    "                       axes=[-0.7, 0.7, -0.7, 0.7], cmap=\"Pastel1\")\n",
    "plt.sca(axes[1])\n",
    "plot_decision_boundary(tree_clf_rotated_square, X_rotated_square, y_square,\n",
    "                       axes=[-0.7, 0.7, -0.7, 0.7], cmap=\"Pastel1\")\n",
    "plt.ylabel(\"\")\n",
    "\n",
    "save_fig(\"sensitivity_to_rotation_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-5 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "}\n",
       "\n",
       "#sk-container-id-5.light {\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: black;\n",
       "  --sklearn-color-background: white;\n",
       "  --sklearn-color-border-box: black;\n",
       "  --sklearn-color-icon: #696969;\n",
       "}\n",
       "\n",
       "#sk-container-id-5.dark {\n",
       "  --sklearn-color-text-on-default-background: white;\n",
       "  --sklearn-color-background: #111;\n",
       "  --sklearn-color-border-box: white;\n",
       "  --sklearn-color-icon: #878787;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-5 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-5 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-5 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-5 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: center;\n",
       "  justify-content: center;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-5 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-5 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-5 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-5 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-5 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-5 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-5 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-5 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-5 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-5 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table {\n",
       "    font-family: monospace;\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table summary::marker {\n",
       "    font-size: 0.7rem;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       "/*\n",
       "    `table td`is set in notebook with right text-align.\n",
       "    We need to overwrite it.\n",
       "*/\n",
       ".estimator-table table td.param {\n",
       "    text-align: left;\n",
       "    position: relative;\n",
       "    padding: 0;\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td.value {\n",
       "    color:rgb(255, 94, 0);\n",
       "    background-color: transparent;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       "/*\n",
       "    Styles for parameter documentation links\n",
       "    We need styling for visited so jupyter doesn't overwrite it\n",
       "*/\n",
       "a.param-doc-link,\n",
       "a.param-doc-link:link,\n",
       "a.param-doc-link:visited {\n",
       "    text-decoration: underline dashed;\n",
       "    text-underline-offset: .3em;\n",
       "    color: inherit;\n",
       "    display: block;\n",
       "    padding: .5em;\n",
       "}\n",
       "\n",
       "/* \"hack\" to make the entire area of the cell containing the link clickable */\n",
       "a.param-doc-link::before {\n",
       "    position: absolute;\n",
       "    content: \"\";\n",
       "    inset: 0;\n",
       "}\n",
       "\n",
       ".param-doc-description {\n",
       "    display: none;\n",
       "    position: absolute;\n",
       "    z-index: 9999;\n",
       "    left: 0;\n",
       "    padding: .5ex;\n",
       "    margin-left: 1.5em;\n",
       "    color: var(--sklearn-color-text);\n",
       "    box-shadow: .3em .3em .4em #999;\n",
       "    width: max-content;\n",
       "    text-align: left;\n",
       "    max-height: 10em;\n",
       "    overflow-y: auto;\n",
       "\n",
       "    /* unfitted */\n",
       "    background: var(--sklearn-color-unfitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       "/* Fitted state for parameter tooltips */\n",
       ".fitted .param-doc-description {\n",
       "    /* fitted */\n",
       "    background: var(--sklearn-color-fitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".param-doc-link:hover .param-doc-description {\n",
       "    display: block;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(max_depth=2, random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" checked><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('criterion',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=criterion,-%7B%22gini%22%2C%20%22entropy%22%2C%20%22log_loss%22%7D%2C%20default%3D%22gini%22\">\n",
       "            criterion\n",
       "            <span class=\"param-doc-description\">criterion: {\"gini\", \"entropy\", \"log_loss\"}, default=\"gini\"<br><br>The function to measure the quality of a split. Supported criteria are<br>\"gini\" for the Gini impurity and \"log_loss\" and \"entropy\" both for the<br>Shannon information gain, see :ref:`tree_mathematical_formulation`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;gini&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('splitter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=splitter,-%7B%22best%22%2C%20%22random%22%7D%2C%20default%3D%22best%22\">\n",
       "            splitter\n",
       "            <span class=\"param-doc-description\">splitter: {\"best\", \"random\"}, default=\"best\"<br><br>The strategy used to choose the split at each node. Supported<br>strategies are \"best\" to choose the best split and \"random\" to choose<br>the best random split.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;best&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_depth',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_depth,-int%2C%20default%3DNone\">\n",
       "            max_depth\n",
       "            <span class=\"param-doc-description\">max_depth: int, default=None<br><br>The maximum depth of the tree. If None, then nodes are expanded until<br>all leaves are pure or until all leaves contain less than<br>min_samples_split samples.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_split',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_split,-int%20or%20float%2C%20default%3D2\">\n",
       "            min_samples_split\n",
       "            <span class=\"param-doc-description\">min_samples_split: int or float, default=2<br><br>The minimum number of samples required to split an internal node:<br><br>- If int, then consider `min_samples_split` as the minimum number.<br>- If float, then `min_samples_split` is a fraction and<br>  `ceil(min_samples_split * n_samples)` are the minimum<br>  number of samples for each split.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_leaf,-int%20or%20float%2C%20default%3D1\">\n",
       "            min_samples_leaf\n",
       "            <span class=\"param-doc-description\">min_samples_leaf: int or float, default=1<br><br>The minimum number of samples required to be at a leaf node.<br>A split point at any depth will only be considered if it leaves at<br>least ``min_samples_leaf`` training samples in each of the left and<br>right branches.  This may have the effect of smoothing the model,<br>especially in regression.<br><br>- If int, then consider `min_samples_leaf` as the minimum number.<br>- If float, then `min_samples_leaf` is a fraction and<br>  `ceil(min_samples_leaf * n_samples)` are the minimum<br>  number of samples for each node.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_weight_fraction_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_weight_fraction_leaf,-float%2C%20default%3D0.0\">\n",
       "            min_weight_fraction_leaf\n",
       "            <span class=\"param-doc-description\">min_weight_fraction_leaf: float, default=0.0<br><br>The minimum weighted fraction of the sum total of weights (of all<br>the input samples) required to be at a leaf node. Samples have<br>equal weight when sample_weight is not provided.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_features',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_features,-int%2C%20float%20or%20%7B%22sqrt%22%2C%20%22log2%22%7D%2C%20default%3DNone\">\n",
       "            max_features\n",
       "            <span class=\"param-doc-description\">max_features: int, float or {\"sqrt\", \"log2\"}, default=None<br><br>The number of features to consider when looking for the best split:<br><br>- If int, then consider `max_features` features at each split.<br>- If float, then `max_features` is a fraction and<br>  `max(1, int(max_features * n_features_in_))` features are considered at<br>  each split.<br>- If \"sqrt\", then `max_features=sqrt(n_features)`.<br>- If \"log2\", then `max_features=log2(n_features)`.<br>- If None, then `max_features=n_features`.<br><br>.. note::<br><br>    The search for a split does not stop until at least one<br>    valid partition of the node samples is found, even if it requires to<br>    effectively inspect more than ``max_features`` features.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=random_state,-int%2C%20RandomState%20instance%20or%20None%2C%20default%3DNone\">\n",
       "            random_state\n",
       "            <span class=\"param-doc-description\">random_state: int, RandomState instance or None, default=None<br><br>Controls the randomness of the estimator. The features are always<br>randomly permuted at each split, even if ``splitter`` is set to<br>``\"best\"``. When ``max_features < n_features``, the algorithm will<br>select ``max_features`` at random at each split before finding the best<br>split among them. But the best found split may vary across different<br>runs, even if ``max_features=n_features``. That is the case, if the<br>improvement of the criterion is identical for several splits and one<br>split has to be selected at random. To obtain a deterministic behaviour<br>during fitting, ``random_state`` has to be fixed to an integer.<br>See :term:`Glossary <random_state>` for details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">42</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_leaf_nodes',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_leaf_nodes,-int%2C%20default%3DNone\">\n",
       "            max_leaf_nodes\n",
       "            <span class=\"param-doc-description\">max_leaf_nodes: int, default=None<br><br>Grow a tree with ``max_leaf_nodes`` in best-first fashion.<br>Best nodes are defined as relative reduction in impurity.<br>If None then unlimited number of leaf nodes.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_impurity_decrease',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_impurity_decrease,-float%2C%20default%3D0.0\">\n",
       "            min_impurity_decrease\n",
       "            <span class=\"param-doc-description\">min_impurity_decrease: float, default=0.0<br><br>A node will be split if this split induces a decrease of the impurity<br>greater than or equal to this value.<br><br>The weighted impurity decrease equation is the following::<br><br>    N_t / N * (impurity - N_t_R / N_t * right_impurity<br>                        - N_t_L / N_t * left_impurity)<br><br>where ``N`` is the total number of samples, ``N_t`` is the number of<br>samples at the current node, ``N_t_L`` is the number of samples in the<br>left child, and ``N_t_R`` is the number of samples in the right child.<br><br>``N``, ``N_t``, ``N_t_R`` and ``N_t_L`` all refer to the weighted sum,<br>if ``sample_weight`` is passed.<br><br>.. versionadded:: 0.19</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('class_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=class_weight,-dict%2C%20list%20of%20dict%20or%20%22balanced%22%2C%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\">class_weight: dict, list of dict or \"balanced\", default=None<br><br>Weights associated with classes in the form ``{class_label: weight}``.<br>If None, all classes are supposed to have weight one. For<br>multi-output problems, a list of dicts can be provided in the same<br>order as the columns of y.<br><br>Note that for multioutput (including multilabel) weights should be<br>defined for each class of every column in its own dict. For example,<br>for four-class multilabel classification weights should be<br>[{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] instead of<br>[{1:1}, {2:5}, {3:1}, {4:1}].<br><br>The \"balanced\" mode uses the values of y to automatically adjust<br>weights inversely proportional to class frequencies in the input data<br>as ``n_samples / (n_classes * np.bincount(y))``<br><br>For multi-output, the weights of each column of y will be multiplied.<br><br>Note that these weights will be multiplied with sample_weight (passed<br>through the fit method) if sample_weight is specified.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('ccp_alpha',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=ccp_alpha,-non-negative%20float%2C%20default%3D0.0\">\n",
       "            ccp_alpha\n",
       "            <span class=\"param-doc-description\">ccp_alpha: non-negative float, default=0.0<br><br>Complexity parameter used for Minimal Cost-Complexity Pruning. The<br>subtree with the largest cost complexity that is smaller than<br>``ccp_alpha`` will be chosen. By default, no pruning is performed. See<br>:ref:`minimal_cost_complexity_pruning` for details. See<br>:ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py`<br>for an example of such pruning.<br><br>.. versionadded:: 0.22</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('monotonic_cst',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=monotonic_cst,-array-like%20of%20int%20of%20shape%20%28n_features%29%2C%20default%3DNone\">\n",
       "            monotonic_cst\n",
       "            <span class=\"param-doc-description\">monotonic_cst: array-like of int of shape (n_features), default=None<br><br>Indicates the monotonicity constraint to enforce on each feature.<br>  - 1: monotonic increase<br>  - 0: no constraint<br>  - -1: monotonic decrease<br><br>If monotonic_cst is None, no constraints are applied.<br><br>Monotonicity constraints are not supported for:<br>  - multiclass classifications (i.e. when `n_classes > 2`),<br>  - multioutput classifications (i.e. when `n_outputs_ > 1`),<br>  - classifications trained on data with missing values.<br><br>The constraints hold over the probability of the positive class.<br><br>Read more in the :ref:`User Guide <monotonic_cst_gbdt>`.<br><br>.. versionadded:: 1.4</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.copy-paste-icon').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling\n",
       "        .textContent.trim().split(' ')[0];\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "\n",
       "\n",
       "/**\n",
       " * Adapted from Skrub\n",
       " * https://github.com/skrub-data/skrub/blob/403466d1d5d4dc76a7ef569b3f8228db59a31dc3/skrub/_reporting/_data/templates/report.js#L789\n",
       " * @returns \"light\" or \"dark\"\n",
       " */\n",
       "function detectTheme(element) {\n",
       "    const body = document.querySelector('body');\n",
       "\n",
       "    // Check VSCode theme\n",
       "    const themeKindAttr = body.getAttribute('data-vscode-theme-kind');\n",
       "    const themeNameAttr = body.getAttribute('data-vscode-theme-name');\n",
       "\n",
       "    if (themeKindAttr && themeNameAttr) {\n",
       "        const themeKind = themeKindAttr.toLowerCase();\n",
       "        const themeName = themeNameAttr.toLowerCase();\n",
       "\n",
       "        if (themeKind.includes(\"dark\") || themeName.includes(\"dark\")) {\n",
       "            return \"dark\";\n",
       "        }\n",
       "        if (themeKind.includes(\"light\") || themeName.includes(\"light\")) {\n",
       "            return \"light\";\n",
       "        }\n",
       "    }\n",
       "\n",
       "    // Check Jupyter theme\n",
       "    if (body.getAttribute('data-jp-theme-light') === 'false') {\n",
       "        return 'dark';\n",
       "    } else if (body.getAttribute('data-jp-theme-light') === 'true') {\n",
       "        return 'light';\n",
       "    }\n",
       "\n",
       "    // Guess based on a parent element's color\n",
       "    const color = window.getComputedStyle(element.parentNode, null).getPropertyValue('color');\n",
       "    const match = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/i);\n",
       "    if (match) {\n",
       "        const [r, g, b] = [\n",
       "            parseFloat(match[1]),\n",
       "            parseFloat(match[2]),\n",
       "            parseFloat(match[3])\n",
       "        ];\n",
       "\n",
       "        // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness\n",
       "        const luma = 0.299 * r + 0.587 * g + 0.114 * b;\n",
       "\n",
       "        if (luma > 180) {\n",
       "            // If the text is very bright we have a dark theme\n",
       "            return 'dark';\n",
       "        }\n",
       "        if (luma < 75) {\n",
       "            // If the text is very dark we have a light theme\n",
       "            return 'light';\n",
       "        }\n",
       "        // Otherwise fall back to the next heuristic.\n",
       "    }\n",
       "\n",
       "    // Fallback to system preference\n",
       "    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n",
       "}\n",
       "\n",
       "\n",
       "function forceTheme(elementId) {\n",
       "    const estimatorElement = document.querySelector(`#${elementId}`);\n",
       "    if (estimatorElement === null) {\n",
       "        console.error(`Element with id ${elementId} not found.`);\n",
       "    } else {\n",
       "        const theme = detectTheme(estimatorElement);\n",
       "        estimatorElement.classList.add(theme);\n",
       "    }\n",
       "}\n",
       "\n",
       "forceTheme('sk-container-id-5');</script></body>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(max_depth=2, random_state=42)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "pca_pipeline = make_pipeline(StandardScaler(), PCA())\n",
    "X_iris_rotated = pca_pipeline.fit_transform(X_iris)\n",
    "tree_clf_pca = DecisionTreeClassifier(max_depth=2, random_state=42)\n",
    "tree_clf_pca.fit(X_iris_rotated, y_iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwkAAAF6CAYAAABSshTKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdARJREFUeJzt3Xd4U2UbBvA7SWnCaFK6t6UF2UNWBcpelYqAqAgIwge4QBREAQcIqIggFGUpDgQFUVQUUBQLhVrKKiAbhTK7oNA2LR1pk3x/lMSmTTpokpNx/64rl/ac9+Q8iUXy5H3f5xFptVotiIiIiIiI7hILHQAREREREdkWJglERERERGSASQIRERERERlgkkBERERERAaYJBARERERkQEmCUREREREZIBJAhERERERGWCSQEREREREBlyEDsDWaDQapKamws3NDSKRSOhwiIiIiIjMRqvVIjc3FwEBARCLTc8XMEkoJzU1FcHBwUKHQURERERkMdeuXUNQUJDJ80wSynFzcwMAXLlyFHJ5A4GjIRJWixbdkZaWAR8ff/z55zmhwyEiC5EEXwcAxO2MQ2FBIWR1ZegV1UvYoIjIIvKUeYi4L0L/mdcUJgnl6JYYyeUNIJdX/uYROTrdNKRYLIabm1zgaIjIUiR3/74b/MRggSMhImupalk9Ny4TEREREZEBJglERERERGSAy42IiIgIAHAi6QSKVcWo41oHbTq0ETocIhIQkwQiIiICAEwcNhHpKenwC/TDoauHhA6HiATE5UZERERERGSASQIRERERERngciMiskkaTTG0WrXQYRDZBJFIArG4jtBhEJETYZJARDZFpVJCpcqERlOEKko4EzkNrRYQi6VwdfWCqyt7lhCR5TFJICKboVIpUViYArm8AdzcvODiUqfKZi9Ejk6r1aKkpBi5uTlQKlMAgIkCEVkckwQishkqVSbk8gbw8wtickBkoC7q13cDcB15eZlMEojI4rhxmYhsgkZTDI2mCG5uCiYIREaIRCK4uSmg0RRBoykWOhwicnBMEojIJmi1aohEgIsLN2cSmVK6BA/c1E9EFsckgYhsCmcRiEzjnw8ishbuSSAiIiIAwO7Tu6HVapmMEBGTBCIiIirVwK2B0CEQkY3gciMiIju3fv06yGQirF+/TuhQiIjIQdh8krBy5UqEhoZCJpMhIiIChw4dqnR8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SkoKevfujQ4dOuDLL7+EWMwJH6pcTX6/iMzF1dUVHTp0QGxsrH5DqUajQWxsLKZMmSJscEREldBqtXjxxRfx008/IS4uDo0aNRI6JJvDJMHGpKSkoFevXrjvvvuwZMkS3Lx5U3+O38yROVy9ehW3b9/G1atXoVarcfz4cQBA48aN0aBBA2GDI7szffp0PP300+jYsSM6d+6MmJgY3LlzB+PHjxc6NLJzeXl5uHDhgv7nS5cu4fjx4/Dw8EBISIiAkZEjmDx5MjZu3Iiff/4Zbm5u+n1UCoUCdevWFTg628ASqDZm3bp1Jv9y5X8qModx48bhq6++qnB8z5496NWrl/UDIru3YsUKLF68GOnp6WjXrh0++ugjRERECB0W2bm4uDj07t27wvGnn34a69ats35A5FBEIpHR419++WWVy3edBZMEIiIiIiIywMXuRERERERkgEkCEREREREZYJJAREREREQGmCQQEREREZEBJglERERERGSASQIRERERERlgkkBERERERAaYJBARERERkQEmCUREREREZIBJAhERERERGWCSQEREVtGqVSuIRCKTj3nz5gkdIhER3eUidABEROQcRo4cieLiYoNjKpUKMTExKCgoQI8ePQSKjIiIyhNptVqt0EEQEZHzKSoqwqOPPorffvsNq1atwnPPPSd0SEREdBdnEoiIyOoKCgowdOhQ/Pnnn1i7di0mTJggdEhERFQG9yQQEZFV5efnY/Dgwfjzzz/x5ZdfGiQIP/74I/r37w8PDw+IRCJcvnxZuECJiJwYkwQiIrKaO3fuYNCgQYiLi8OGDRswduzYCud79OiB+fPnCxQhEREBXG5ERERWkpubi0GDBuHAgQPYtGkTHn/88QpjxowZAwA4deqUtcMjIqIymCQQEZHF5eTkICoqCklJSfj+++8xdOhQoUMiIqJKMEkgIiKLysrKwoABA3Dy5En8+OOPePjhh4UOiYiIqsAkgYiILOqpp57CkSNH0LNnTxw5cgRHjhwxOO/j44MXXnhBoOiIiMgY9kkgIiKL0Wg0UCgUyMvLMzlmyJAh2Lp1q8GxU6dOoXXr1rh06RJCQ0MtGyQREVXAmQQiIrIYsViM3NxcocMgIqIaYpJAREQ24/bt27h69SouXrwIADhz5gyys7MREhICDw8PgaMjInIeXG5EREQ2Y926dRg/fnyF419++SXGjRtn/YCIiJwUkwQiIiIiIjLAjstERERERGSASQIRERERERlgkkBERERERAaYJBARERERkQEmCUREREREZIBJAhERERERGWCSQEREREREBpgkEBERERGRASYJRERERERkgEkCEREREREZYJJAREREREQGmCQQEREREZGB/wM0BQKezgiiOgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–8\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "\n",
    "axes = [-2.2, 2.4, -0.6, 0.7]\n",
    "z0s, z1s = np.meshgrid(np.linspace(axes[0], axes[1], 100),\n",
    "                       np.linspace(axes[2], axes[3], 100))\n",
    "X_iris_pca_all = np.c_[z0s.ravel(), z1s.ravel()]\n",
    "y_pred = tree_clf_pca.predict(X_iris_pca_all).reshape(z0s.shape)\n",
    "\n",
    "plt.contourf(z0s, z1s, y_pred, alpha=0.3, cmap=custom_cmap)\n",
    "for idx, (name, style) in enumerate(zip(iris.target_names, (\"yo\", \"bs\", \"g^\"))):\n",
    "    plt.plot(X_iris_rotated[:, 0][y_iris == idx],\n",
    "             X_iris_rotated[:, 1][y_iris == idx],\n",
    "             style, label=f\"Iris {name}\")\n",
    "\n",
    "plt.xlabel(\"$z_1$\")\n",
    "plt.ylabel(\"$z_2$\", rotation=0)\n",
    "th1, th2 = tree_clf_pca.tree_.threshold[[0, 2]]\n",
    "plt.plot([th1, th1], axes[2:], \"k-\", linewidth=2)\n",
    "plt.plot([th2, th2], axes[2:], \"k--\", linewidth=2)\n",
    "plt.text(th1 - 0.01, axes[2] + 0.05, \"Depth=0\",\n",
    "         horizontalalignment=\"right\", fontsize=15)\n",
    "plt.text(th2 - 0.01, axes[2] + 0.05, \"Depth=1\",\n",
    "         horizontalalignment=\"right\", fontsize=13)\n",
    "plt.axis(axes)\n",
    "plt.legend(loc=(0.32, 0.67))\n",
    "save_fig(\"pca_preprocessing_plot\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Decision Trees Have High Variance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We've seen that small changes in the dataset (such as a rotation) may produce a very different Decision Tree.\n",
    "Now let's show that training the same model on the same data may produce a very different model every time, since the CART training algorithm used by Scikit-Learn is stochastic. To show this, we will set `random_state` to a different value than earlier:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-6 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "}\n",
       "\n",
       "#sk-container-id-6.light {\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: black;\n",
       "  --sklearn-color-background: white;\n",
       "  --sklearn-color-border-box: black;\n",
       "  --sklearn-color-icon: #696969;\n",
       "}\n",
       "\n",
       "#sk-container-id-6.dark {\n",
       "  --sklearn-color-text-on-default-background: white;\n",
       "  --sklearn-color-background: #111;\n",
       "  --sklearn-color-border-box: white;\n",
       "  --sklearn-color-icon: #878787;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-6 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-6 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: center;\n",
       "  justify-content: center;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-6 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-6 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-6 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-6 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-6 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-6 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-6 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-6 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-6 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-6 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table {\n",
       "    font-family: monospace;\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table summary::marker {\n",
       "    font-size: 0.7rem;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       "/*\n",
       "    `table td`is set in notebook with right text-align.\n",
       "    We need to overwrite it.\n",
       "*/\n",
       ".estimator-table table td.param {\n",
       "    text-align: left;\n",
       "    position: relative;\n",
       "    padding: 0;\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td.value {\n",
       "    color:rgb(255, 94, 0);\n",
       "    background-color: transparent;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       "/*\n",
       "    Styles for parameter documentation links\n",
       "    We need styling for visited so jupyter doesn't overwrite it\n",
       "*/\n",
       "a.param-doc-link,\n",
       "a.param-doc-link:link,\n",
       "a.param-doc-link:visited {\n",
       "    text-decoration: underline dashed;\n",
       "    text-underline-offset: .3em;\n",
       "    color: inherit;\n",
       "    display: block;\n",
       "    padding: .5em;\n",
       "}\n",
       "\n",
       "/* \"hack\" to make the entire area of the cell containing the link clickable */\n",
       "a.param-doc-link::before {\n",
       "    position: absolute;\n",
       "    content: \"\";\n",
       "    inset: 0;\n",
       "}\n",
       "\n",
       ".param-doc-description {\n",
       "    display: none;\n",
       "    position: absolute;\n",
       "    z-index: 9999;\n",
       "    left: 0;\n",
       "    padding: .5ex;\n",
       "    margin-left: 1.5em;\n",
       "    color: var(--sklearn-color-text);\n",
       "    box-shadow: .3em .3em .4em #999;\n",
       "    width: max-content;\n",
       "    text-align: left;\n",
       "    max-height: 10em;\n",
       "    overflow-y: auto;\n",
       "\n",
       "    /* unfitted */\n",
       "    background: var(--sklearn-color-unfitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       "/* Fitted state for parameter tooltips */\n",
       ".fitted .param-doc-description {\n",
       "    /* fitted */\n",
       "    background: var(--sklearn-color-fitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".param-doc-link:hover .param-doc-description {\n",
       "    display: block;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-6\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(max_depth=2, random_state=40)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" checked><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('criterion',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=criterion,-%7B%22gini%22%2C%20%22entropy%22%2C%20%22log_loss%22%7D%2C%20default%3D%22gini%22\">\n",
       "            criterion\n",
       "            <span class=\"param-doc-description\">criterion: {\"gini\", \"entropy\", \"log_loss\"}, default=\"gini\"<br><br>The function to measure the quality of a split. Supported criteria are<br>\"gini\" for the Gini impurity and \"log_loss\" and \"entropy\" both for the<br>Shannon information gain, see :ref:`tree_mathematical_formulation`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;gini&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('splitter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=splitter,-%7B%22best%22%2C%20%22random%22%7D%2C%20default%3D%22best%22\">\n",
       "            splitter\n",
       "            <span class=\"param-doc-description\">splitter: {\"best\", \"random\"}, default=\"best\"<br><br>The strategy used to choose the split at each node. Supported<br>strategies are \"best\" to choose the best split and \"random\" to choose<br>the best random split.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;best&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_depth',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_depth,-int%2C%20default%3DNone\">\n",
       "            max_depth\n",
       "            <span class=\"param-doc-description\">max_depth: int, default=None<br><br>The maximum depth of the tree. If None, then nodes are expanded until<br>all leaves are pure or until all leaves contain less than<br>min_samples_split samples.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_split',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_split,-int%20or%20float%2C%20default%3D2\">\n",
       "            min_samples_split\n",
       "            <span class=\"param-doc-description\">min_samples_split: int or float, default=2<br><br>The minimum number of samples required to split an internal node:<br><br>- If int, then consider `min_samples_split` as the minimum number.<br>- If float, then `min_samples_split` is a fraction and<br>  `ceil(min_samples_split * n_samples)` are the minimum<br>  number of samples for each split.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_samples_leaf,-int%20or%20float%2C%20default%3D1\">\n",
       "            min_samples_leaf\n",
       "            <span class=\"param-doc-description\">min_samples_leaf: int or float, default=1<br><br>The minimum number of samples required to be at a leaf node.<br>A split point at any depth will only be considered if it leaves at<br>least ``min_samples_leaf`` training samples in each of the left and<br>right branches.  This may have the effect of smoothing the model,<br>especially in regression.<br><br>- If int, then consider `min_samples_leaf` as the minimum number.<br>- If float, then `min_samples_leaf` is a fraction and<br>  `ceil(min_samples_leaf * n_samples)` are the minimum<br>  number of samples for each node.<br><br>.. versionchanged:: 0.18<br>   Added float values for fractions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_weight_fraction_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_weight_fraction_leaf,-float%2C%20default%3D0.0\">\n",
       "            min_weight_fraction_leaf\n",
       "            <span class=\"param-doc-description\">min_weight_fraction_leaf: float, default=0.0<br><br>The minimum weighted fraction of the sum total of weights (of all<br>the input samples) required to be at a leaf node. Samples have<br>equal weight when sample_weight is not provided.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_features',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_features,-int%2C%20float%20or%20%7B%22sqrt%22%2C%20%22log2%22%7D%2C%20default%3DNone\">\n",
       "            max_features\n",
       "            <span class=\"param-doc-description\">max_features: int, float or {\"sqrt\", \"log2\"}, default=None<br><br>The number of features to consider when looking for the best split:<br><br>- If int, then consider `max_features` features at each split.<br>- If float, then `max_features` is a fraction and<br>  `max(1, int(max_features * n_features_in_))` features are considered at<br>  each split.<br>- If \"sqrt\", then `max_features=sqrt(n_features)`.<br>- If \"log2\", then `max_features=log2(n_features)`.<br>- If None, then `max_features=n_features`.<br><br>.. note::<br><br>    The search for a split does not stop until at least one<br>    valid partition of the node samples is found, even if it requires to<br>    effectively inspect more than ``max_features`` features.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=random_state,-int%2C%20RandomState%20instance%20or%20None%2C%20default%3DNone\">\n",
       "            random_state\n",
       "            <span class=\"param-doc-description\">random_state: int, RandomState instance or None, default=None<br><br>Controls the randomness of the estimator. The features are always<br>randomly permuted at each split, even if ``splitter`` is set to<br>``\"best\"``. When ``max_features < n_features``, the algorithm will<br>select ``max_features`` at random at each split before finding the best<br>split among them. But the best found split may vary across different<br>runs, even if ``max_features=n_features``. That is the case, if the<br>improvement of the criterion is identical for several splits and one<br>split has to be selected at random. To obtain a deterministic behaviour<br>during fitting, ``random_state`` has to be fixed to an integer.<br>See :term:`Glossary <random_state>` for details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">40</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_leaf_nodes',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=max_leaf_nodes,-int%2C%20default%3DNone\">\n",
       "            max_leaf_nodes\n",
       "            <span class=\"param-doc-description\">max_leaf_nodes: int, default=None<br><br>Grow a tree with ``max_leaf_nodes`` in best-first fashion.<br>Best nodes are defined as relative reduction in impurity.<br>If None then unlimited number of leaf nodes.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_impurity_decrease',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=min_impurity_decrease,-float%2C%20default%3D0.0\">\n",
       "            min_impurity_decrease\n",
       "            <span class=\"param-doc-description\">min_impurity_decrease: float, default=0.0<br><br>A node will be split if this split induces a decrease of the impurity<br>greater than or equal to this value.<br><br>The weighted impurity decrease equation is the following::<br><br>    N_t / N * (impurity - N_t_R / N_t * right_impurity<br>                        - N_t_L / N_t * left_impurity)<br><br>where ``N`` is the total number of samples, ``N_t`` is the number of<br>samples at the current node, ``N_t_L`` is the number of samples in the<br>left child, and ``N_t_R`` is the number of samples in the right child.<br><br>``N``, ``N_t``, ``N_t_R`` and ``N_t_L`` all refer to the weighted sum,<br>if ``sample_weight`` is passed.<br><br>.. versionadded:: 0.19</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('class_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=class_weight,-dict%2C%20list%20of%20dict%20or%20%22balanced%22%2C%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\">class_weight: dict, list of dict or \"balanced\", default=None<br><br>Weights associated with classes in the form ``{class_label: weight}``.<br>If None, all classes are supposed to have weight one. For<br>multi-output problems, a list of dicts can be provided in the same<br>order as the columns of y.<br><br>Note that for multioutput (including multilabel) weights should be<br>defined for each class of every column in its own dict. For example,<br>for four-class multilabel classification weights should be<br>[{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] instead of<br>[{1:1}, {2:5}, {3:1}, {4:1}].<br><br>The \"balanced\" mode uses the values of y to automatically adjust<br>weights inversely proportional to class frequencies in the input data<br>as ``n_samples / (n_classes * np.bincount(y))``<br><br>For multi-output, the weights of each column of y will be multiplied.<br><br>Note that these weights will be multiplied with sample_weight (passed<br>through the fit method) if sample_weight is specified.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('ccp_alpha',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=ccp_alpha,-non-negative%20float%2C%20default%3D0.0\">\n",
       "            ccp_alpha\n",
       "            <span class=\"param-doc-description\">ccp_alpha: non-negative float, default=0.0<br><br>Complexity parameter used for Minimal Cost-Complexity Pruning. The<br>subtree with the largest cost complexity that is smaller than<br>``ccp_alpha`` will be chosen. By default, no pruning is performed. See<br>:ref:`minimal_cost_complexity_pruning` for details. See<br>:ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py`<br>for an example of such pruning.<br><br>.. versionadded:: 0.22</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('monotonic_cst',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.tree.DecisionTreeClassifier.html#:~:text=monotonic_cst,-array-like%20of%20int%20of%20shape%20%28n_features%29%2C%20default%3DNone\">\n",
       "            monotonic_cst\n",
       "            <span class=\"param-doc-description\">monotonic_cst: array-like of int of shape (n_features), default=None<br><br>Indicates the monotonicity constraint to enforce on each feature.<br>  - 1: monotonic increase<br>  - 0: no constraint<br>  - -1: monotonic decrease<br><br>If monotonic_cst is None, no constraints are applied.<br><br>Monotonicity constraints are not supported for:<br>  - multiclass classifications (i.e. when `n_classes > 2`),<br>  - multioutput classifications (i.e. when `n_outputs_ > 1`),<br>  - classifications trained on data with missing values.<br><br>The constraints hold over the probability of the positive class.<br><br>Read more in the :ref:`User Guide <monotonic_cst_gbdt>`.<br><br>.. versionadded:: 1.4</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.copy-paste-icon').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling\n",
       "        .textContent.trim().split(' ')[0];\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "\n",
       "\n",
       "/**\n",
       " * Adapted from Skrub\n",
       " * https://github.com/skrub-data/skrub/blob/403466d1d5d4dc76a7ef569b3f8228db59a31dc3/skrub/_reporting/_data/templates/report.js#L789\n",
       " * @returns \"light\" or \"dark\"\n",
       " */\n",
       "function detectTheme(element) {\n",
       "    const body = document.querySelector('body');\n",
       "\n",
       "    // Check VSCode theme\n",
       "    const themeKindAttr = body.getAttribute('data-vscode-theme-kind');\n",
       "    const themeNameAttr = body.getAttribute('data-vscode-theme-name');\n",
       "\n",
       "    if (themeKindAttr && themeNameAttr) {\n",
       "        const themeKind = themeKindAttr.toLowerCase();\n",
       "        const themeName = themeNameAttr.toLowerCase();\n",
       "\n",
       "        if (themeKind.includes(\"dark\") || themeName.includes(\"dark\")) {\n",
       "            return \"dark\";\n",
       "        }\n",
       "        if (themeKind.includes(\"light\") || themeName.includes(\"light\")) {\n",
       "            return \"light\";\n",
       "        }\n",
       "    }\n",
       "\n",
       "    // Check Jupyter theme\n",
       "    if (body.getAttribute('data-jp-theme-light') === 'false') {\n",
       "        return 'dark';\n",
       "    } else if (body.getAttribute('data-jp-theme-light') === 'true') {\n",
       "        return 'light';\n",
       "    }\n",
       "\n",
       "    // Guess based on a parent element's color\n",
       "    const color = window.getComputedStyle(element.parentNode, null).getPropertyValue('color');\n",
       "    const match = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/i);\n",
       "    if (match) {\n",
       "        const [r, g, b] = [\n",
       "            parseFloat(match[1]),\n",
       "            parseFloat(match[2]),\n",
       "            parseFloat(match[3])\n",
       "        ];\n",
       "\n",
       "        // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness\n",
       "        const luma = 0.299 * r + 0.587 * g + 0.114 * b;\n",
       "\n",
       "        if (luma > 180) {\n",
       "            // If the text is very bright we have a dark theme\n",
       "            return 'dark';\n",
       "        }\n",
       "        if (luma < 75) {\n",
       "            // If the text is very dark we have a light theme\n",
       "            return 'light';\n",
       "        }\n",
       "        // Otherwise fall back to the next heuristic.\n",
       "    }\n",
       "\n",
       "    // Fallback to system preference\n",
       "    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n",
       "}\n",
       "\n",
       "\n",
       "function forceTheme(elementId) {\n",
       "    const estimatorElement = document.querySelector(`#${elementId}`);\n",
       "    if (estimatorElement === null) {\n",
       "        console.error(`Element with id ${elementId} not found.`);\n",
       "    } else {\n",
       "        const theme = detectTheme(estimatorElement);\n",
       "        estimatorElement.classList.add(theme);\n",
       "    }\n",
       "}\n",
       "\n",
       "forceTheme('sk-container-id-6');</script></body>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(max_depth=2, random_state=40)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf_tweaked = DecisionTreeClassifier(max_depth=2, random_state=40)\n",
    "tree_clf_tweaked.fit(X_iris, y_iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Gu0lEgn27dunY3hERERERGQIebqZWZcbfSUSCTIyMvK8XWHKupn51at/eY8CERERERVbWfco6P1m5ocPH+YrMCIiIiIiKhrylCh4eXkVVBxERERERGREeDMzERERERFpYKJAREREREQamCgQEREREZEGJgpERERERKSBiQIREREREWlgokBERERERBryXJmZiHQnCBmIjz+L1NQYWFo6Qy73g0RiZuiwiIiIiDQwUSAqJLGx+3Dv3mSkpkaplllauqJixZkoU6aDASMjIiIi0sSpR0SFIDZ2H27d+lItSQCA1NRo3Lr1JWJj9xkoMiIiIiLtmCgQFTBByMC9e5MBCNrWAgDu358CQcgo1LiIiIiIcsJEgaiAZd6TEJVDCwEpKZGIjz9baDERERER5YaJAlEBS02N0Ws7IiIiosLARIGogFlaOuu1HREREVFhYKJAVMDkcj9YWroCkGTTQgKZzA1yuV9hhkVERESUIyYKRAVMIjFDxYozs169vxYAUKHCDNZTICIiIqPCRIGoEJQp0wHVq6+CpaWL2nKZzBXVq69iHQUiIiIyOiy4RlRIypTpAAeHD0VVZmYFZyIiIjI0ox1RWLp0KcqVKwcrKyv4+fnh3Llz2bZdu3YtJBKJ2o+VlVUhRkskjkRihlKlGsPJ6ROUKtVY65f/2Nh9OHu2Ia5d64w7d77CtWudcfZsQxZlIyIiokJllInCli1bMHr0aEydOhWXLl1C7dq10a5dOzx79izbbezs7BAVFaX6efz4cSFGTKQfrOBMRERExsIoE4UFCxbgyy+/RL9+/VC9enUsX74cJUqUwK+//prtNhKJBC4uLqofZ2c+apKKFlZwJiIiImNidIlCamoqLl68iNatW6uWSaVStG7dGmFhYdlul5iYCC8vL3h4eCAwMBA3b97Mtm1KSgoUCoXaD5GhsYIzERERGROjSxRiY2ORkZGhMSLg7OyM6OhordtUqVIFv/76K3bv3o3169dDqVSicePGePr0qdb2wcHBkMvlqh8PDw+9HwdRXrGCMxERERkTo0sUdOHv74/evXujTp06CAgIwI4dO+Do6IgVK1ZobT9hwgTEx8erfp48eVLIERNpYgVnIiIiMiZG93jUMmXKwMzMDDEx6ldNY2Ji4OLiks1W6iwsLFC3bl3cu3dP63qZTAaZTJbvWIn0KauCc2pqNLTfpyCB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3759gSUKMpkM+/fvx5o1a7Bu3Tps374dKSkpcHZ2RvXq1TF48OB8TX8xMzPD33//jalTp2LTpk1YtGgRKlSogPnz58Pe3h579uzRuNE3636MI0eOYM+ePVAqlXB3d9d7olCuXDm0a9cO27Ztw+LFizUekzp37lz4+/tjyZIl2LZtG5KTk+Hq6opWrVqhTZs2eo3lXVmPlB00aFCB7YOITJtEePeZekREREZm0qRJmDVrFv7++2+0b9/eIDGEhISgdevWWL9+vVpSZyjp6emoVKkSvL29ceTIEUOHQ0TFFBMFIiIyClFRUWrF2QDg1q1baNSoEczMzBAZGQlra2sDRQe0b98ejx49ws2bNw3yhKN3rVmzBl9++SUuXLiAevXqGTQWIiq+OPWIiIiMwpAhQ/Do0SP4+vqidOnSuH//Pvbs2YO0tDSsWbPGoEkCkDnVaePGjYiIiMi25kNhkUgkWLVqFZMEIipQHFEgIiKjsGHDBixfvhy3b99GfHw8bGxs0LBhQ3zzzTdo166docMjIjI5TBSIiIiIiEgD6ygQEREREZEGJgpERERERKSBiQIREREREWlgokBERERERBqYKBARERERkQYmCkREREREpIGJAhERERERaWCiQEREREREGpgoEBERERGRhv8DuguC3+fYxKEAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–9\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "y_pred = tree_clf_tweaked.predict(X_iris_all).reshape(lengths.shape)\n",
    "plt.contourf(lengths, widths, y_pred, alpha=0.3, cmap=custom_cmap)\n",
    "\n",
    "for idx, (name, style) in enumerate(zip(iris.target_names, (\"yo\", \"bs\", \"g^\"))):\n",
    "    plt.plot(X_iris[:, 0][y_iris == idx], X_iris[:, 1][y_iris == idx],\n",
    "             style, label=f\"Iris {name}\")\n",
    "\n",
    "th0, th1 = tree_clf_tweaked.tree_.threshold[[0, 2]]\n",
    "plt.plot([0, 7.2], [th0, th0], \"k-\", linewidth=2)\n",
    "plt.plot([0, 7.2], [th1, th1], \"k--\", linewidth=2)\n",
    "plt.text(1.8, th0 + 0.05, \"Depth=0\", verticalalignment=\"bottom\", fontsize=15)\n",
    "plt.text(2.3, th1 + 0.05, \"Depth=1\", verticalalignment=\"bottom\", fontsize=13)\n",
    "plt.xlabel(\"Petal length (cm)\")\n",
    "plt.ylabel(\"Petal width (cm)\")\n",
    "plt.axis([0, 7.2, 0, 3])\n",
    "plt.legend()\n",
    "save_fig(\"decision_tree_high_variance_plot\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Extra Material – Accessing the tree structure"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A trained `DecisionTreeClassifier` has a `tree_` attribute that stores the tree's structure:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sklearn.tree._tree.Tree at 0x7f84cba39ae0>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree = tree_clf.tree_\n",
    "tree"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can get the total number of nodes in the tree:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.node_count"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And other self-explanatory attributes are available:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.max_depth"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.max_n_classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.n_features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.n_outputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.int64(3)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.n_leaves"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All the information about the nodes is stored in NumPy arrays. For example, the impurity of each node:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.66666667, 0.        , 0.5       , 0.16803841, 0.04253308])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.impurity"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The root node is at index 0. The left and right children nodes of node _i_ are `tree.children_left[i]` and `tree.children_right[i]`. For example, the children of the root node are:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(np.int64(1), np.int64(2))"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.children_left[0], tree.children_right[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When the left and right nodes are equal, it means this is a leaf node (and the children node ids are arbitrary):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(np.int64(-1), np.int64(-1))"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.children_left[3], tree.children_right[3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So you can get the leaf node ids like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 3, 4])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "is_leaf = (tree.children_left == tree.children_right)\n",
    "np.arange(tree.node_count)[is_leaf]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Non-leaf nodes are called _split nodes_. The feature they split is available via the `feature` array. Values for leaf nodes should be ignored:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0, -2,  1, -2, -2], dtype=int64)"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.feature"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And the corresponding thresholds are:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2.44999999, -2.        ,  1.75      , -2.        , -2.        ])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.threshold"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And the number of instances per class that reached each node is available too:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[0.33333333, 0.33333333, 0.33333333]],\n",
       "\n",
       "       [[1.        , 0.        , 0.        ]],\n",
       "\n",
       "       [[0.        , 0.5       , 0.5       ]],\n",
       "\n",
       "       [[0.        , 0.90740741, 0.09259259]],\n",
       "\n",
       "       [[0.        , 0.02173913, 0.97826087]]])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([150,  50, 100,  54,  46], dtype=int64)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.n_node_samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.False_"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.all(tree.value.sum(axis=(1, 2)) == tree.n_node_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's how you can compute the depth of each node:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 1., 2., 2.])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def compute_depth(tree_clf):\n",
    "    tree = tree_clf.tree_\n",
    "    depth = np.zeros(tree.node_count)\n",
    "    stack = [(0, 0)]\n",
    "    while stack:\n",
    "        node, node_depth = stack.pop()\n",
    "        depth[node] = node_depth\n",
    "        if tree.children_left[node] != tree.children_right[node]:\n",
    "            stack.append((tree.children_left[node], node_depth + 1))\n",
    "            stack.append((tree.children_right[node], node_depth + 1))\n",
    "    return depth\n",
    "\n",
    "depth = compute_depth(tree_clf)\n",
    "depth"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's how to get the thresholds of all split nodes at depth 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1], dtype=int64)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.tree_.feature[(depth == 1) & (~is_leaf)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.75])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.tree_.threshold[(depth == 1) & (~is_leaf)]"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.5"
  },
  "nav_menu": {
   "height": "309px",
   "width": "468px"
  },
  "toc": {
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 6,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
