summaryrefslogtreecommitdiff
path: root/ML
diff options
context:
space:
mode:
authorMarcellus <msimon_fr@hotmail.com>2026-03-09 16:10:12 +0100
committerMarcellus <msimon_fr@hotmail.com>2026-03-09 16:10:12 +0100
commita47f22758f5a4234b333bdad050cfb622eca00d8 (patch)
tree28f960a1ebec3bee04e23a69ffe8f0f88a02b842 /ML
parentf2e9fecc8d42913e5a32e06bc3a77f0147736b41 (diff)
feat: 05_Decision trees
Diffstat (limited to 'ML')
-rw-r--r--ML/05_Decision_Trees/06_decision_trees_TODO.ipynb8320
-rw-r--r--ML/05_Decision_Trees/decision_trees.md24
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/decision_tree_decision_boundaries_plot.pngbin0 -> 127050 bytes
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/decision_tree_high_variance_plot.pngbin0 -> 117727 bytes
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/iris_tree.dot13
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/iris_tree.pngbin0 -> 60737 bytes
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/min_samples_leaf_plot.pngbin0 -> 163672 bytes
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/pca_preprocessing_plot.pngbin0 -> 117738 bytes
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/regression_tree.dot17
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/regression_tree.pngbin0 -> 72036 bytes
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/sensitivity_to_rotation_plot.pngbin0 -> 143577 bytes
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/tree_regression_plot.pngbin0 -> 148058 bytes
-rw-r--r--ML/05_Decision_Trees/images/decision_trees/tree_regression_regularization_plot.pngbin0 -> 173746 bytes
13 files changed, 8374 insertions, 0 deletions
diff --git a/ML/05_Decision_Trees/06_decision_trees_TODO.ipynb b/ML/05_Decision_Trees/06_decision_trees_TODO.ipynb
new file mode 100644
index 0000000..913afe9
--- /dev/null
+++ b/ML/05_Decision_Trees/06_decision_trees_TODO.ipynb
@@ -0,0 +1,8320 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 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": [
+ "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": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[Text(0.4, 0.8333333333333334, 'x[0] <= 2.45\\ngini = 0.667\\nsamples = 150\\nvalue = [50, 50, 50]'),\n",
+ " Text(0.2, 0.5, 'gini = 0.0\\nsamples = 50\\nvalue = [50, 0, 0]'),\n",
+ " Text(0.30000000000000004, 0.6666666666666667, 'True '),\n",
+ " Text(0.6, 0.5, 'x[1] <= 1.75\\ngini = 0.5\\nsamples = 100\\nvalue = [0, 50, 50]'),\n",
+ " Text(0.5, 0.6666666666666667, ' False'),\n",
+ " Text(0.4, 0.16666666666666666, 'gini = 0.168\\nsamples = 54\\nvalue = [0, 49, 5]'),\n",
+ " Text(0.8, 0.16666666666666666, 'gini = 0.043\\nsamples = 46\\nvalue = [0, 1, 45]')]"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "<Figure size 640x480 with 1 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from sklearn import tree\n",
+ "tree.plot_tree(tree_clf)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### More beautiful\n",
+ "**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 12.2.1 (20241206.2353)\n",
+ " -->\n",
+ "<!-- Title: Tree Pages: 1 -->\n",
+ "<svg width=\"350pt\" height=\"325pt\"\n",
+ " viewBox=\"0.00 0.00 349.50 324.50\" 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 320.5)\">\n",
+ "<title>Tree</title>\n",
+ "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-320.5 345.5,-320.5 345.5,4 -4,4\"/>\n",
+ "<!-- 0 -->\n",
+ "<g id=\"node1\" class=\"node\">\n",
+ "<title>0</title>\n",
+ "<path fill=\"#ffffff\" stroke=\"black\" d=\"M208,-316.5C208,-316.5 64.5,-316.5 64.5,-316.5 58.5,-316.5 52.5,-310.5 52.5,-304.5 52.5,-304.5 52.5,-241.75 52.5,-241.75 52.5,-235.75 58.5,-229.75 64.5,-229.75 64.5,-229.75 208,-229.75 208,-229.75 214,-229.75 220,-235.75 220,-241.75 220,-241.75 220,-304.5 220,-304.5 220,-310.5 214,-316.5 208,-316.5\"/>\n",
+ "<text text-anchor=\"middle\" x=\"136.25\" y=\"-299.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 2.45</text>\n",
+ "<text text-anchor=\"middle\" x=\"136.25\" y=\"-283.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.667</text>\n",
+ "<text text-anchor=\"middle\" x=\"136.25\" y=\"-267.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 150</text>\n",
+ "<text text-anchor=\"middle\" x=\"136.25\" y=\"-251.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 50, 50]</text>\n",
+ "<text text-anchor=\"middle\" x=\"136.25\" y=\"-236.2\" 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=\"M104.5,-185.88C104.5,-185.88 12,-185.88 12,-185.88 6,-185.88 0,-179.88 0,-173.88 0,-173.88 0,-126.88 0,-126.88 0,-120.88 6,-114.88 12,-114.88 12,-114.88 104.5,-114.88 104.5,-114.88 110.5,-114.88 116.5,-120.88 116.5,-126.88 116.5,-126.88 116.5,-173.88 116.5,-173.88 116.5,-179.88 110.5,-185.88 104.5,-185.88\"/>\n",
+ "<text text-anchor=\"middle\" x=\"58.25\" y=\"-168.57\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
+ "<text text-anchor=\"middle\" x=\"58.25\" y=\"-152.82\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 50</text>\n",
+ "<text text-anchor=\"middle\" x=\"58.25\" y=\"-137.07\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 0, 0]</text>\n",
+ "<text text-anchor=\"middle\" x=\"58.25\" y=\"-121.33\" 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=\"M108.75,-229.55C101.63,-218.52 93.94,-206.63 86.77,-195.52\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"89.81,-193.78 81.44,-187.27 83.93,-197.57 89.81,-193.78\"/>\n",
+ "<text text-anchor=\"middle\" x=\"75.36\" y=\"-205.02\" 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=\"M284.38,-193.75C284.38,-193.75 146.12,-193.75 146.12,-193.75 140.12,-193.75 134.12,-187.75 134.12,-181.75 134.12,-181.75 134.12,-119 134.12,-119 134.12,-113 140.12,-107 146.12,-107 146.12,-107 284.38,-107 284.38,-107 290.38,-107 296.38,-113 296.38,-119 296.38,-119 296.38,-181.75 296.38,-181.75 296.38,-187.75 290.38,-193.75 284.38,-193.75\"/>\n",
+ "<text text-anchor=\"middle\" x=\"215.25\" y=\"-176.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal width (cm) &lt;= 1.75</text>\n",
+ "<text text-anchor=\"middle\" x=\"215.25\" y=\"-160.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.5</text>\n",
+ "<text text-anchor=\"middle\" x=\"215.25\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 100</text>\n",
+ "<text text-anchor=\"middle\" x=\"215.25\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 50, 50]</text>\n",
+ "<text text-anchor=\"middle\" x=\"215.25\" y=\"-113.45\" 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=\"M164.1,-229.55C169.65,-221.08 175.53,-212.09 181.26,-203.33\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"184.01,-205.52 186.55,-195.24 178.15,-201.69 184.01,-205.52\"/>\n",
+ "<text text-anchor=\"middle\" x=\"192.5\" y=\"-213.02\" 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=\"M195.38,-71C195.38,-71 99.12,-71 99.12,-71 93.12,-71 87.12,-65 87.12,-59 87.12,-59 87.12,-12 87.12,-12 87.12,-6 93.12,0 99.12,0 99.12,0 195.38,0 195.38,0 201.38,0 207.38,-6 207.38,-12 207.38,-12 207.38,-59 207.38,-59 207.38,-65 201.38,-71 195.38,-71\"/>\n",
+ "<text text-anchor=\"middle\" x=\"147.25\" y=\"-53.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.168</text>\n",
+ "<text text-anchor=\"middle\" x=\"147.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 54</text>\n",
+ "<text text-anchor=\"middle\" x=\"147.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 49, 5]</text>\n",
+ "<text text-anchor=\"middle\" x=\"147.25\" y=\"-6.45\" 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=\"M189.54,-106.7C184.46,-98.27 179.11,-89.39 174,-80.9\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"177.07,-79.21 168.91,-72.45 171.07,-82.83 177.07,-79.21\"/>\n",
+ "</g>\n",
+ "<!-- 4 -->\n",
+ "<g id=\"node5\" class=\"node\">\n",
+ "<title>4</title>\n",
+ "<path fill=\"#843de6\" stroke=\"black\" d=\"M329.5,-71C329.5,-71 237,-71 237,-71 231,-71 225,-65 225,-59 225,-59 225,-12 225,-12 225,-6 231,0 237,0 237,0 329.5,0 329.5,0 335.5,0 341.5,-6 341.5,-12 341.5,-12 341.5,-59 341.5,-59 341.5,-65 335.5,-71 329.5,-71\"/>\n",
+ "<text text-anchor=\"middle\" x=\"283.25\" y=\"-53.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.043</text>\n",
+ "<text text-anchor=\"middle\" x=\"283.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 46</text>\n",
+ "<text text-anchor=\"middle\" x=\"283.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 1, 45]</text>\n",
+ "<text text-anchor=\"middle\" x=\"283.25\" y=\"-6.45\" 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=\"M240.96,-106.7C246.04,-98.27 251.39,-89.39 256.5,-80.9\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"259.43,-82.83 261.59,-72.45 253.43,-79.21 259.43,-82.83\"/>\n",
+ "</g>\n",
+ "</g>\n",
+ "</svg>\n"
+ ],
+ "text/plain": [
+ "<graphviz.sources.Source at 0x7ff2b6a027b0>"
+ ]
+ },
+ "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": [
+ "# Making Predictions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "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": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<sklearn.tree._tree.Tree at 0x7ff2b69b1220>"
+ ]
+ },
+ "execution_count": 11,
+ "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": 12,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on class Tree in module sklearn.tree._tree:\n",
+ "\n",
+ "class Tree(builtins.object)\n",
+ " | Array-based representation of a binary decision tree.\n",
+ " |\n",
+ " | The binary tree is represented as a number of parallel arrays. The i-th\n",
+ " | element of each array holds information about the node `i`. Node 0 is the\n",
+ " | tree's root. You can find a detailed description of all arrays in\n",
+ " | `_tree.pxd`. NOTE: Some of the arrays only apply to either leaves or split\n",
+ " | nodes, resp. In this case the values of nodes of the other type are\n",
+ " | arbitrary!\n",
+ " |\n",
+ " | Attributes\n",
+ " | ----------\n",
+ " | node_count : intp_t\n",
+ " | The number of nodes (internal nodes + leaves) in the tree.\n",
+ " |\n",
+ " | capacity : intp_t\n",
+ " | The current capacity (i.e., size) of the arrays, which is at least as\n",
+ " | great as `node_count`.\n",
+ " |\n",
+ " | max_depth : intp_t\n",
+ " | The depth of the tree, i.e. the maximum depth of its leaves.\n",
+ " |\n",
+ " | children_left : array of intp_t, shape [node_count]\n",
+ " | children_left[i] holds the node id of the left child of node i.\n",
+ " | For leaves, children_left[i] == TREE_LEAF. Otherwise,\n",
+ " | children_left[i] > i. This child handles the case where\n",
+ " | X[:, feature[i]] <= threshold[i].\n",
+ " |\n",
+ " | children_right : array of intp_t, shape [node_count]\n",
+ " | children_right[i] holds the node id of the right child of node i.\n",
+ " | For leaves, children_right[i] == TREE_LEAF. Otherwise,\n",
+ " | children_right[i] > i. This child handles the case where\n",
+ " | X[:, feature[i]] > threshold[i].\n",
+ " |\n",
+ " | n_leaves : intp_t\n",
+ " | Number of leaves in the tree.\n",
+ " |\n",
+ " | feature : array of intp_t, shape [node_count]\n",
+ " | feature[i] holds the feature to split on, for the internal node i.\n",
+ " |\n",
+ " | threshold : array of float64_t, shape [node_count]\n",
+ " | threshold[i] holds the threshold for the internal node i.\n",
+ " |\n",
+ " | value : array of float64_t, shape [node_count, n_outputs, max_n_classes]\n",
+ " | Contains the constant prediction value of each node.\n",
+ " |\n",
+ " | impurity : array of float64_t, shape [node_count]\n",
+ " | impurity[i] holds the impurity (i.e., the value of the splitting\n",
+ " | criterion) at node i.\n",
+ " |\n",
+ " | n_node_samples : array of intp_t, shape [node_count]\n",
+ " | n_node_samples[i] holds the number of training samples reaching node i.\n",
+ " |\n",
+ " | weighted_n_node_samples : array of float64_t, shape [node_count]\n",
+ " | weighted_n_node_samples[i] holds the weighted number of training samples\n",
+ " | reaching node i.\n",
+ " |\n",
+ " | missing_go_to_left : array of bool, shape [node_count]\n",
+ " | missing_go_to_left[i] holds a bool indicating whether or not there were\n",
+ " | missing values at node i.\n",
+ " |\n",
+ " | Methods defined here:\n",
+ " |\n",
+ " | __getstate__(self)\n",
+ " | Getstate re-implementation, for pickling.\n",
+ " |\n",
+ " | __reduce__(self)\n",
+ " | Reduce re-implementation, for pickling.\n",
+ " |\n",
+ " | __setstate__(self, d)\n",
+ " | Setstate re-implementation, for unpickling.\n",
+ " |\n",
+ " | apply(self, X)\n",
+ " | Finds the terminal region (=leaf node) for each sample in X.\n",
+ " |\n",
+ " | compute_feature_importances(self, normalize=True)\n",
+ " | Computes the importance of each feature (aka variable).\n",
+ " |\n",
+ " | compute_node_depths(self)\n",
+ " | Compute the depth of each node in a tree.\n",
+ " |\n",
+ " | .. versionadded:: 1.3\n",
+ " |\n",
+ " | Returns\n",
+ " | -------\n",
+ " | depths : ndarray of shape (self.node_count,), dtype=np.int64\n",
+ " | The depth of each node in the tree.\n",
+ " |\n",
+ " | compute_partial_dependence(self, X, target_features, out)\n",
+ " | Partial dependence of the response on the ``target_feature`` set.\n",
+ " |\n",
+ " | For each sample in ``X`` a tree traversal is performed.\n",
+ " | Each traversal starts from the root with weight 1.0.\n",
+ " |\n",
+ " | At each non-leaf node that splits on a target feature, either\n",
+ " | the left child or the right child is visited based on the feature\n",
+ " | value of the current sample, and the weight is not modified.\n",
+ " | At each non-leaf node that splits on a complementary feature,\n",
+ " | both children are visited and the weight is multiplied by the fraction\n",
+ " | of training samples which went to each child.\n",
+ " |\n",
+ " | At each leaf, the value of the node is multiplied by the current\n",
+ " | weight (weights sum to 1 for all visited terminal nodes).\n",
+ " |\n",
+ " | Parameters\n",
+ " | ----------\n",
+ " | X : view on 2d ndarray, shape (n_samples, n_target_features)\n",
+ " | The grid points on which the partial dependence should be\n",
+ " | evaluated.\n",
+ " | target_features : view on 1d ndarray, shape (n_target_features)\n",
+ " | The set of target features for which the partial dependence\n",
+ " | should be evaluated.\n",
+ " | out : view on 1d ndarray, shape (n_samples)\n",
+ " | The value of the partial dependence function on each grid\n",
+ " | point.\n",
+ " |\n",
+ " | decision_path(self, X)\n",
+ " | Finds the decision path (=node) for each sample in X.\n",
+ " |\n",
+ " | predict(self, X)\n",
+ " | Predict target for X.\n",
+ " |\n",
+ " | ----------------------------------------------------------------------\n",
+ " | Static methods defined here:\n",
+ " |\n",
+ " | __new__(*args, **kwargs)\n",
+ " | Create and return a new object. See help(type) for accurate signature.\n",
+ " |\n",
+ " | ----------------------------------------------------------------------\n",
+ " | Data descriptors defined here:\n",
+ " |\n",
+ " | capacity\n",
+ " |\n",
+ " | children_left\n",
+ " |\n",
+ " | children_right\n",
+ " |\n",
+ " | feature\n",
+ " |\n",
+ " | impurity\n",
+ " |\n",
+ " | max_depth\n",
+ " |\n",
+ " | max_n_classes\n",
+ " |\n",
+ " | missing_go_to_left\n",
+ " |\n",
+ " | n_classes\n",
+ " |\n",
+ " | n_features\n",
+ " |\n",
+ " | n_leaves\n",
+ " |\n",
+ " | n_node_samples\n",
+ " |\n",
+ " | n_outputs\n",
+ " |\n",
+ " | node_count\n",
+ " |\n",
+ " | threshold\n",
+ " |\n",
+ " | value\n",
+ " |\n",
+ " | weighted_n_node_samples\n",
+ " |\n",
+ " | ----------------------------------------------------------------------\n",
+ " | Data and other attributes defined here:\n",
+ " |\n",
+ " | __pyx_vtable__ = <capsule object NULL>\n",
+ "\n"
+ ]
+ }
+ ],
+ "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": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[0. , 0.907, 0.093]])"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree_clf.predict_proba([[5, 1.5]]).round(3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1])"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree_clf.predict([[5, 1.5]])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Regularization Hyperparameters"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "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(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-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=\"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-2');</script></body>"
+ ],
+ "text/plain": [
+ "DecisionTreeClassifier(min_samples_leaf=5, random_state=42)"
+ ]
+ },
+ "execution_count": 15,
+ "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": 16,
+ "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/99BPuv/9+1NbW4tZbb8WFCxewdOlS3HzzzcjOzrZe16K2thZjxoxBeXk57rzzTlRUVGDZsmWYPn06ioqK8Ic//KHV15uVlYWxY8eioqICEydOREZGBnJycvDJJ59g9erV2Lp1K7p27QoA2LNnD4YNG4aQkBBMnjwZaWlpKCkpwaFDh/DPf/4T/+///T+3fteOCCFwxx134NNPP0VGRgamT5+O8PBwrF27Fvfeey8OHTqEF1980Xr85s2b8dJLL2H06NEYOnQowsLCsHv3brz99tv47rvvsGvXLuvvbvbs2dizZw8+/PDDZkOp7Q2p9rXjx4/j1VdfRVVVFTp16oQbbrgBHTt21LpY5AuCiFSRnZ0tAIixY8cKIYR47LHHBADxxhtvWI/ZunWrACBmzJjR7LmjRo0SAMQ//vGPZo+/9dZbAoC44YYbXCrDs88+KwCI6OhosW/fPpufT58+XQAQ7777brPHCwsLRefOnUX79u1FVVWVEEKIb775RgAQs2fPtjlPWVmZqK6utv57xowZAoDIzs62Wy4AAoC4++67RX19vc3PR4wYIVp+Pa1YsUIAEP369RNFRUXNflZXVycKCgpcvn5aWppIS0tr9tj8+fMFAHHHHXcIWZatj+/atUuEh4eL+Ph4YTabrY9bfrdxcXHiyJEj1scrKytF9+7dhcFgEPn5+dbHBw4cKMLDw0VhYaFNeVq+HiIirWzYsMH6Hb18+XLr47W1taJ///5CkiTRrl07sX37duvPzGazSExMFAkJCaK2ttbmXM8++2yza6SlpQkAYvLkyaKmpsb6+Pfff98sN93hTkbl5eU1u66FJQf+/e9/N3vckknXXXedKC8vtz6+dOlSAUDEx8eLW2+9VdTV1Vl/tnDhQgFAvPTSS3Zf+/Dhw5uV4cyZM6Jdu3bCaDSKvLw86+MffPCBACA++OAD62O1tbUiPT1dxMbGil27djU7/w8//CBCQkLExIkTrY/NmTPH5u9p4Wn+2MvRf/7zn9Zsb/o+qKmpEZMmTRIAxI4dO6yPFxYWirKyMptzf/jhhwKA+Mtf/tLscUfvp9Y8++yzbv3n6N6hpaaflab/hYaGikceecTu/Q0FFlakiVTSsiJ98eJFER8fLxITE63BYa8inZubKwCI3r17N6vQCSFEQ0OD6NmzpwAgTp8+3WoZLJW9Rx55xOZnFy5cECEhIQ4r5a+//roAIFasWCGEuHyTMm/evFav60pFOjw8XFy4cMHuz+1VpMeNGycAiPXr13t9fXs3AF27dhVhYWHizJkzNsffd999AoD46KOPrI9ZfrfPPPOMzfGWn33zzTfWxwYOHCiio6PFxYsXWy0/EZFWLJWDUaNG2fzs+eeft1aUWrrnnnsEAHHq1CmbczmqSDc9tunPEhIS3C63OxnlSHFxsQAgZs6c2exxSyZt2rSp2eMNDQ0iLCxMABC5ubnNfnb69GkBQNx1113NHre89h9//NHm+n/+858FAPHiiy9aH7NXkf7yyy8FAPH888/bfR2//vWvhcFgEKWlpUKIyxXp7777rvVfgovs5Wj//v1FdHS0qKystDl+3759AoB49NFHWz23LMvCZDKJkSNHNnvc04q0vcqus/82bNjg0nkPHDgg/u///k8cOHBAlJeXi8LCQrF8+XLrfdqcOXPcKif5Hw7tJvKRNm3a4Mknn8STTz6JF1980eG8nj179gBoXAWy5Txhg8GA4cOH48iRI9izZw86d+7s0rWHDBli89jPP/+MhoYG1NTU2C3L8ePHAQBHjhzBxIkTMXz4cCQnJ+P//u//sHfvXkycOBEjRoxAr169PFpArUuXLm6t5Lp9+3YYjUbrHCklmc1mnDp1Cr169UKnTp1sfj5q1Ci8++672LNnD+68885mPxs0aJDN8ZZzlJSUWB+77bbbMHfuXPTt2xfTp0/HqFGjcN1117U6nJ2ISAv2VhxOTk5u9Wdnz55Fly5dWj1/fHy83eM6deqErVu3uldYwK2MEkLggw8+wOLFi3HgwAGUlpZClmXrzy2LWrXU8nUbDAYkJiaisrLSZpHMpr+PlkJDQ5GZmWnz+PXXXw8A2L17t9PXum3bNgDA0aNH7eZ3QUEBZFnGsWPHMHjwYPzmN7/Bq6++iqlTp2LatGm48cYbMXz4cEWHH1dWVmL//v1ISUnBwoULbX5eV1cHoPGeoqkvv/wS//jHP7Br1y5cunQJDQ0N1p85+ju4SwihyHla6tOnD/r06WP9d3R0NCZPnoyhQ4eif//+eP311/HEE08gMTFRleuT9liRJvKhP/7xj3jzzTfx0ksv4fe//73dY8xmMwAgKSnJ7s8t4Ww5zhX2znXx4kUAwE8//WR3MS2LiooKAEBcXBy2bduGZ555BitWrMC3334LAOjcuTOefPJJh6/HnTI5U1paio4dO8JgUH6NRG9+5/YqwqGhjV+tTW8IHnvsMbRt2xZvv/02XnrpJbz44osIDQ3FhAkT8Morr7h040lE5CvOvtuc/cxSYWpNy3nDTc/TtFLrKncyypLFnTt3xq9+9SskJyfDaDQCaFzIqqamxu41HL1ud38f7dq1s5tllgxqujCaPZb8broOhz2W/B46dCg2btyIv/3tb1iyZAk++OADAMDVV1+NhQsXYtSoUU7P44pLly5BCIH8/HzMnz+/1TIBwEsvvYTHHnsM7du3x0033YROnTohMjISAPDqq686/DvoXYcOHTB58mS89957yMrKwqRJk7QuEqmEFWkiH4qMjMT8+fNx7733Yv78+Ta9m8DloC4sLLR7joKCgmbHucJej7Hl+Y8++mizxT+cSU1NxeLFiyHLMvbt24f//ve/eP311/HQQw+hTZs2uP32270qkzPx8fHWVnalK9Nq/M5bkiQJ99xzD+655x4UFxfjhx9+wKeffoply5bh+PHj2Ldvn3UROCIicp8rGXX+/Hm89dZb6N+/P7Zu3YqoqCjr8wsKCpxWApVSVFRkN8ssGeSokcHCkkUrVqzAxIkTXbrm9ddfj9WrV6OqqgpZWVlYsWIF/v73v2PChAk4cOCAdWEyT1nKNGjQIOzYsaPV4+vr6/HnP/8ZycnJ2LNnT7NeWyEEXnjhBa/K05S7K3vPnDmz1QVKW2MZcde04YACDyvSRD42Y8YMvPzyy3j33XftDu2yDB3bvHkzhBDNKpxCCGzevLnZcZ66+uqrIUmSR0PoDAYDBgwYgAEDBiAzMxPDhw/HN998Y61IWyqETXtkvTVkyBB8++232LRpU6ut5+5e32QyoWvXrjhx4gTy8/NthrtZtuXy9ndu0bZtW0yZMgVTpkxBUVER1q9fjxMnTqBHjx6KnJ+IKJg5y6hTp05BCIExY8Y0q0QDwA8//OCT8tXX12Pr1q249tpr7V7/qquucvr8oUOHAgC2bt3qckXaIjIyEiNHjsTIkSMRHx+PZ555BmvXrsUDDzzg1nlaio2NRa9evXD48GGUlJRYd8xwpKioCKWlpRg9erTN0OcdO3bY3ULSU+42jowcOdLrinRWVhaA1ncMIf/GfaSJfCwkJAR/+9vfUFdXZ7eVNDU1FaNGjcLBgwdt9l385z//icOHD+OGG25weX60Ix06dMBvfvMbbNmyBYsWLbI7hygrKwuVlZUAgIMHD9rtsbU8FhERYX0sISEBAHDmzBmvytjUQw89BACYNWuWdVibRX19fbOyeXL9GTNmoK6uDvPmzWv2u9i3bx8WL16MuLg461Zgnti4caPN77iurs76Wpr+/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": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.898"
+ ]
+ },
+ "execution_count": 17,
+ "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": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.92"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree_clf2.score(X_moons_test, y_moons_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Regression"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's prepare a simple quadratic training set:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Code example:**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "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>DecisionTreeRegressor(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-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeRegressor</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.DecisionTreeRegressor.html\">?<span>Documentation for DecisionTreeRegressor</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.DecisionTreeRegressor.html#:~:text=criterion,-%7B%22squared_error%22%2C%20%22friedman_mse%22%2C%20%22absolute_error%22%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%22poisson%22%7D%2C%20default%3D%22squared_error%22\">\n",
+ " criterion\n",
+ " <span class=\"param-doc-description\">criterion: {\"squared_error\", \"friedman_mse\", \"absolute_error\", \"poisson\"}, default=\"squared_error\"<br><br>The function to measure the quality of a split. Supported criteria<br>are \"squared_error\" for the mean squared error, which is equal to<br>variance reduction as feature selection criterion and minimizes the L2<br>loss using the mean of each terminal node, \"friedman_mse\", which uses<br>mean squared error with Friedman's improvement score for potential<br>splits, \"absolute_error\" for the mean absolute error, which minimizes<br>the L1 loss using the median of each terminal node, and \"poisson\" which<br>uses reduction in the half mean Poisson deviance to find splits.<br><br>.. versionadded:: 0.18<br> Mean Absolute Error (MAE) criterion.<br><br>.. versionadded:: 0.24<br> Poisson deviance criterion.</span>\n",
+ " </a>\n",
+ " </td>\n",
+ " <td class=\"value\">&#x27;squared_error&#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.DecisionTreeRegressor.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.DecisionTreeRegressor.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.<br><br>For an example of how ``max_depth`` influences the model, see<br>:ref:`sphx_glr_auto_examples_tree_plot_tree_regression.py`.</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.DecisionTreeRegressor.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.DecisionTreeRegressor.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.DecisionTreeRegressor.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.DecisionTreeRegressor.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 each<br> 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: 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.DecisionTreeRegressor.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.DecisionTreeRegressor.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.DecisionTreeRegressor.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('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.DecisionTreeRegressor.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.DecisionTreeRegressor.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> - multioutput regressions (i.e. when `n_outputs_ > 1`),<br> - regressions trained on data with missing values.<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": [
+ "DecisionTreeRegressor(max_depth=2, random_state=42)"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.tree import DecisionTreeRegressor\n",
+ "\n",
+ "np.random.seed(42)\n",
+ "X_quad = np.random.rand(200, 1) - 0.5 # a single random input feature\n",
+ "y_quad = X_quad ** 2 + 0.025 * np.random.randn(200, 1)\n",
+ "\n",
+ "tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)\n",
+ "tree_reg.fit(X_quad, y_quad)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "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 12.2.1 (20241206.2353)\n",
+ " -->\n",
+ "<!-- Title: Tree Pages: 1 -->\n",
+ "<svg width=\"662pt\" height=\"277pt\"\n",
+ " viewBox=\"0.00 0.00 662.25 277.25\" 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 273.25)\">\n",
+ "<title>Tree</title>\n",
+ "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-273.25 658.25,-273.25 658.25,4 -4,4\"/>\n",
+ "<!-- 0 -->\n",
+ "<g id=\"node1\" class=\"node\">\n",
+ "<title>0</title>\n",
+ "<path fill=\"#f6d6be\" stroke=\"black\" d=\"M390.25,-269.25C390.25,-269.25 264,-269.25 264,-269.25 258,-269.25 252,-263.25 252,-257.25 252,-257.25 252,-210.25 252,-210.25 252,-204.25 258,-198.25 264,-198.25 264,-198.25 390.25,-198.25 390.25,-198.25 396.25,-198.25 402.25,-204.25 402.25,-210.25 402.25,-210.25 402.25,-257.25 402.25,-257.25 402.25,-263.25 396.25,-269.25 390.25,-269.25\"/>\n",
+ "<text text-anchor=\"middle\" x=\"327.12\" y=\"-251.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">x1 &lt;= &#45;0.303</text>\n",
+ "<text text-anchor=\"middle\" x=\"327.12\" y=\"-236.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.006</text>\n",
+ "<text text-anchor=\"middle\" x=\"327.12\" y=\"-220.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 200</text>\n",
+ "<text text-anchor=\"middle\" x=\"327.12\" y=\"-204.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.088</text>\n",
+ "</g>\n",
+ "<!-- 1 -->\n",
+ "<g id=\"node2\" class=\"node\">\n",
+ "<title>1</title>\n",
+ "<path fill=\"#eb9d65\" stroke=\"black\" d=\"M306.25,-162.25C306.25,-162.25 180,-162.25 180,-162.25 174,-162.25 168,-156.25 168,-150.25 168,-150.25 168,-103.25 168,-103.25 168,-97.25 174,-91.25 180,-91.25 180,-91.25 306.25,-91.25 306.25,-91.25 312.25,-91.25 318.25,-97.25 318.25,-103.25 318.25,-103.25 318.25,-150.25 318.25,-150.25 318.25,-156.25 312.25,-162.25 306.25,-162.25\"/>\n",
+ "<text text-anchor=\"middle\" x=\"243.12\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">x1 &lt;= &#45;0.408</text>\n",
+ "<text text-anchor=\"middle\" x=\"243.12\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.002</text>\n",
+ "<text text-anchor=\"middle\" x=\"243.12\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 44</text>\n",
+ "<text text-anchor=\"middle\" x=\"243.12\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.172</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=\"M299.15,-197.79C292.42,-189.37 285.15,-180.28 278.14,-171.52\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"280.9,-169.36 271.92,-163.74 275.43,-173.74 280.9,-169.36\"/>\n",
+ "<text text-anchor=\"middle\" x=\"268.21\" y=\"-181.98\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">True</text>\n",
+ "</g>\n",
+ "<!-- 4 -->\n",
+ "<g id=\"node5\" class=\"node\">\n",
+ "<title>4</title>\n",
+ "<path fill=\"#fae6d7\" stroke=\"black\" d=\"M474.25,-162.25C474.25,-162.25 348,-162.25 348,-162.25 342,-162.25 336,-156.25 336,-150.25 336,-150.25 336,-103.25 336,-103.25 336,-97.25 342,-91.25 348,-91.25 348,-91.25 474.25,-91.25 474.25,-91.25 480.25,-91.25 486.25,-97.25 486.25,-103.25 486.25,-103.25 486.25,-150.25 486.25,-150.25 486.25,-156.25 480.25,-162.25 474.25,-162.25\"/>\n",
+ "<text text-anchor=\"middle\" x=\"411.12\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">x1 &lt;= 0.272</text>\n",
+ "<text text-anchor=\"middle\" x=\"411.12\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.005</text>\n",
+ "<text text-anchor=\"middle\" x=\"411.12\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 156</text>\n",
+ "<text text-anchor=\"middle\" x=\"411.12\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.065</text>\n",
+ "</g>\n",
+ "<!-- 0&#45;&gt;4 -->\n",
+ "<g id=\"edge4\" class=\"edge\">\n",
+ "<title>0&#45;&gt;4</title>\n",
+ "<path fill=\"none\" stroke=\"black\" d=\"M355.1,-197.79C361.83,-189.37 369.1,-180.28 376.11,-171.52\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"378.82,-173.74 382.33,-163.74 373.35,-169.36 378.82,-173.74\"/>\n",
+ "<text text-anchor=\"middle\" x=\"386.04\" y=\"-181.98\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">False</text>\n",
+ "</g>\n",
+ "<!-- 2 -->\n",
+ "<g id=\"node3\" class=\"node\">\n",
+ "<title>2</title>\n",
+ "<path fill=\"#e58139\" stroke=\"black\" d=\"M138.25,-55.25C138.25,-55.25 12,-55.25 12,-55.25 6,-55.25 0,-49.25 0,-43.25 0,-43.25 0,-12 0,-12 0,-6 6,0 12,0 12,0 138.25,0 138.25,0 144.25,0 150.25,-6 150.25,-12 150.25,-12 150.25,-43.25 150.25,-43.25 150.25,-49.25 144.25,-55.25 138.25,-55.25\"/>\n",
+ "<text text-anchor=\"middle\" x=\"75.12\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.001</text>\n",
+ "<text text-anchor=\"middle\" x=\"75.12\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 20</text>\n",
+ "<text text-anchor=\"middle\" x=\"75.12\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.213</text>\n",
+ "</g>\n",
+ "<!-- 1&#45;&gt;2 -->\n",
+ "<g id=\"edge2\" class=\"edge\">\n",
+ "<title>1&#45;&gt;2</title>\n",
+ "<path fill=\"none\" stroke=\"black\" d=\"M182.95,-90.96C166.18,-81.27 148.04,-70.78 131.5,-61.22\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"133.69,-58.44 123.28,-56.47 130.19,-64.5 133.69,-58.44\"/>\n",
+ "</g>\n",
+ "<!-- 3 -->\n",
+ "<g id=\"node4\" class=\"node\">\n",
+ "<title>3</title>\n",
+ "<path fill=\"#f0b489\" stroke=\"black\" d=\"M306.25,-55.25C306.25,-55.25 180,-55.25 180,-55.25 174,-55.25 168,-49.25 168,-43.25 168,-43.25 168,-12 168,-12 168,-6 174,0 180,0 180,0 306.25,0 306.25,0 312.25,0 318.25,-6 318.25,-12 318.25,-12 318.25,-43.25 318.25,-43.25 318.25,-49.25 312.25,-55.25 306.25,-55.25\"/>\n",
+ "<text text-anchor=\"middle\" x=\"243.12\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.001</text>\n",
+ "<text text-anchor=\"middle\" x=\"243.12\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 24</text>\n",
+ "<text text-anchor=\"middle\" x=\"243.12\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.138</text>\n",
+ "</g>\n",
+ "<!-- 1&#45;&gt;3 -->\n",
+ "<g id=\"edge3\" class=\"edge\">\n",
+ "<title>1&#45;&gt;3</title>\n",
+ "<path fill=\"none\" stroke=\"black\" d=\"M243.12,-90.96C243.12,-83.13 243.12,-74.79 243.12,-66.83\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"246.63,-67.07 243.13,-57.07 239.63,-67.07 246.63,-67.07\"/>\n",
+ "</g>\n",
+ "<!-- 5 -->\n",
+ "<g id=\"node6\" class=\"node\">\n",
+ "<title>5</title>\n",
+ "<path fill=\"#ffffff\" stroke=\"black\" d=\"M474.25,-55.25C474.25,-55.25 348,-55.25 348,-55.25 342,-55.25 336,-49.25 336,-43.25 336,-43.25 336,-12 336,-12 336,-6 342,0 348,0 348,0 474.25,0 474.25,0 480.25,0 486.25,-6 486.25,-12 486.25,-12 486.25,-43.25 486.25,-43.25 486.25,-49.25 480.25,-55.25 474.25,-55.25\"/>\n",
+ "<text text-anchor=\"middle\" x=\"411.12\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.001</text>\n",
+ "<text text-anchor=\"middle\" x=\"411.12\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 110</text>\n",
+ "<text text-anchor=\"middle\" x=\"411.12\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.028</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=\"M411.12,-90.96C411.12,-83.13 411.12,-74.79 411.12,-66.83\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"414.63,-67.07 411.13,-57.07 407.63,-67.07 414.63,-67.07\"/>\n",
+ "</g>\n",
+ "<!-- 6 -->\n",
+ "<g id=\"node7\" class=\"node\">\n",
+ "<title>6</title>\n",
+ "<path fill=\"#edaa79\" stroke=\"black\" d=\"M642.25,-55.25C642.25,-55.25 516,-55.25 516,-55.25 510,-55.25 504,-49.25 504,-43.25 504,-43.25 504,-12 504,-12 504,-6 510,0 516,0 516,0 642.25,0 642.25,0 648.25,0 654.25,-6 654.25,-12 654.25,-12 654.25,-43.25 654.25,-43.25 654.25,-49.25 648.25,-55.25 642.25,-55.25\"/>\n",
+ "<text text-anchor=\"middle\" x=\"579.12\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.002</text>\n",
+ "<text text-anchor=\"middle\" x=\"579.12\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 46</text>\n",
+ "<text text-anchor=\"middle\" x=\"579.12\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.154</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=\"M471.3,-90.96C488.07,-81.27 506.21,-70.78 522.75,-61.22\"/>\n",
+ "<polygon fill=\"black\" stroke=\"black\" points=\"524.06,-64.5 530.97,-56.47 520.56,-58.44 524.06,-64.5\"/>\n",
+ "</g>\n",
+ "</g>\n",
+ "</svg>\n"
+ ],
+ "text/plain": [
+ "<graphviz.sources.Source at 0x7ff2b663cb90>"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# extra code – we've already seen how to use export_graphviz()\n",
+ "export_graphviz(\n",
+ " tree_reg,\n",
+ " out_file=str(IMAGES_PATH / \"regression_tree.dot\"),\n",
+ " feature_names=[\"x1\"],\n",
+ " rounded=True,\n",
+ " filled=True\n",
+ ")\n",
+ "Source.from_file(IMAGES_PATH / \"regression_tree.dot\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!dot -Tpng {IMAGES_PATH / \"regression_tree.dot\"} -o {IMAGES_PATH / \"regression_tree.png\"}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "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>DecisionTreeRegressor(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-4\" type=\"checkbox\" checked><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeRegressor</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.DecisionTreeRegressor.html\">?<span>Documentation for DecisionTreeRegressor</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.DecisionTreeRegressor.html#:~:text=criterion,-%7B%22squared_error%22%2C%20%22friedman_mse%22%2C%20%22absolute_error%22%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%22poisson%22%7D%2C%20default%3D%22squared_error%22\">\n",
+ " criterion\n",
+ " <span class=\"param-doc-description\">criterion: {\"squared_error\", \"friedman_mse\", \"absolute_error\", \"poisson\"}, default=\"squared_error\"<br><br>The function to measure the quality of a split. Supported criteria<br>are \"squared_error\" for the mean squared error, which is equal to<br>variance reduction as feature selection criterion and minimizes the L2<br>loss using the mean of each terminal node, \"friedman_mse\", which uses<br>mean squared error with Friedman's improvement score for potential<br>splits, \"absolute_error\" for the mean absolute error, which minimizes<br>the L1 loss using the median of each terminal node, and \"poisson\" which<br>uses reduction in the half mean Poisson deviance to find splits.<br><br>.. versionadded:: 0.18<br> Mean Absolute Error (MAE) criterion.<br><br>.. versionadded:: 0.24<br> Poisson deviance criterion.</span>\n",
+ " </a>\n",
+ " </td>\n",
+ " <td class=\"value\">&#x27;squared_error&#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.DecisionTreeRegressor.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.DecisionTreeRegressor.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.<br><br>For an example of how ``max_depth`` influences the model, see<br>:ref:`sphx_glr_auto_examples_tree_plot_tree_regression.py`.</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.DecisionTreeRegressor.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.DecisionTreeRegressor.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.DecisionTreeRegressor.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.DecisionTreeRegressor.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 each<br> 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: 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.DecisionTreeRegressor.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.DecisionTreeRegressor.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.DecisionTreeRegressor.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('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.DecisionTreeRegressor.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.DecisionTreeRegressor.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> - multioutput regressions (i.e. when `n_outputs_ > 1`),<br> - regressions trained on data with missing values.<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": [
+ "DecisionTreeRegressor(max_depth=3, random_state=42)"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree_reg2 = DecisionTreeRegressor(max_depth=3, random_state=42)\n",
+ "tree_reg2.fit(X_quad, y_quad)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.30265072, -0.40830374, -2. , -2. , 0.27175756,\n",
+ " -2. , -2. ])"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree_reg.tree_.threshold"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.30265072, -0.40830374, -0.45416115, -2. , -2. ,\n",
+ " -0.37022041, -2. , -2. , 0.27175756, -0.21270403,\n",
+ " -2. , -2. , 0.40399227, -2. , -2. ])"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree_reg2.tree_.threshold"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9IAAAF6CAYAAAD1Q2B0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAr5RJREFUeJzs3Xl8E3X6wPFPWnpw9cC2FBpOKacCgoCICrKsuN7rgYsXaEFcYV1lFcWfAl6LCiqr4gUV1gNFd111ZRe8wFVAUBCQuxyFptAD6AEUSknn90dImrRJmmOSmUye9+uVF3QymTyZSb7PfGe+h0lRFAUhhBBCCCGEEEL4JEbrAIQQQgghhBBCiEgiFWkhhBBCCCGEEMIPUpEWQgghhBBCCCH8IBVpIYQQQgghhBDCD1KRFkIIIYQQQggh/CAVaSGEEEIIIYQQwg9SkRZCCCGEEEIIIfwgFWkhhBBCCCGEEMIPUpEWQgghhBBCCCH8IBVpIUTImUwmhg0bpnUYLoYNG4bJZNI6DCGEEKIByZtC6J9UpIUQhrRw4UJMJhMLFy7UOhQAjh8/znvvvceoUaPo2rUrTZs2JSUlhaFDh/LBBx9oHZ4QQogop7e8CfDyyy9z5ZVX0rFjR5o3b05KSgp9+vRhxowZHDlyROvwRJRronUAQggRDb7//ntuv/12zjrrLH7zm99www03UFJSwieffMItt9zCypUrefXVV7UOUwghhNCN3NxcAIYOHUpmZiYnT55kzZo1PPHEE7z99tusXbuWzMxMjaMU0Uoq0kIIEQaZmZm8++67jBo1ivj4eMfyv/71rwwaNIi5c+dyxx13MHDgQA2jFEIIIfRjzZo1JCYmNlj++OOP8/TTT/PCCy8wa9YsDSITQpp2C6GZFStWYDKZmDFjBqtWreLSSy+lZcuWpKenc++993LixAkAlixZwuDBg2nevDmtW7dmypQpnD592rGdiooKnnvuOYYOHUrbtm2Jj4+nbdu23HHHHezevdvlPQ8fPozZbKZly5bs2rXL5+d8NX/+fM455xwSExNp164dU6ZM4eTJkx7XP3r0KNOnT6dXr16Ops4jR47khx9+aLCuvW/WyZMneeSRR2jfvj2JiYn06NGDV155BUVRHOuOHTuWO++8E4A777wTk8nkeNRXU1PDjBkz6NixIwkJCXTt2pXXXnstoM/vTd++fbnttttcKtEArVu3ZsKECQD873//U/19hRDCKCRvRlfeBNxWogFuuukmgID3uxBqkDvSQmhszZo1PPfcc4wcOZIJEyawfPlyXn/9dSorK7n66qsZO3Ys1157LYMHD2bJkiXMmjWLFi1aMG3aNAC2bdvGtGnTuPTSS/n9739P8+bN2b59O4sWLWLJkiWsX7+eDh06AHDWWWfxzjvv8Nvf/tbRnDguLg6AnJwcCgsLWbhwIV26dPH7czz11FNMmzaN1q1bM378eOLi4li8eDHbtm1zu/6RI0e45JJL2LJlC0OGDOGee+6hsrKSzz77jEsvvZSPP/6Y6667rsHrRo0axS+//MINN9wAwD//+U/uu+8+8vPzeeGFFwC47rrrKC8v57PPPuPaa6+lb9++HuMePXo0a9eu5Xe/+x2xsbF89NFHTJw4kbi4OMaPH+/3fgiE/Rg0aSJFshBCNEbypuTNJUuWAHDOOeeE5f2EcEsRQmhi+fLlCqAAyqeffupYfurUKaV3796KyWRS0tLSlLVr1zqeq6ysVDIyMpRWrVopp06dUhRFUcrLy5XDhw832P63336rxMTEKOPGjWvw3COPPKIAypQpUxRFUZS5c+cqgDJ69OiAPkteXp7SpEkTJSsrSykuLnYsr6ioULp166YAytChQ11ec8sttyiAMm/ePJflxcXFSrt27ZT09HTlxIkTjuVDhw5VAKVbt25KeXm5Y3l5ebnSrVs3xWQyKT/99JNj+YIFCxRAWbBggduY7dsbNGiQUlFR4Vi+fft2pUmTJkq3bt1c1i8rK1OmT5/u16OsrKzRfXf69Gnl3HPPVUwmk/Lrr782ur4QQkQryZvRmzfffPNNZfr06crkyZOVYcOGKYBy3nnnKUeOHHG7vhDhIBVpITRiPyG49NJLGzz35JNPKoBy5513NnjurrvuUgBlz549jb7Hueeeq3Ts2LHB8lOnTikDBgxQYmJilJdffllp2rSp0rFjR5fE6I8nnnhCAZQXXnihwXPvvvtugxOC0tJSJTY2Vhk+fLjb7b388ssKoPz73/92LLMn8Pfee8/je0yaNMmxzNcTgm+//dbjc5WVlY5le/fudZzA+frYu3ev2/d2NnXqVAVQ7rrrrkbXFUKIaCZ5M3rzZv/+/V3Wu+yyy1wuQAihBWlHKITG3DWfatOmTaPPHThwgE6dOgG2fmNz5sxhzZo1HDp0yKUvWP0+uWBrSvzBBx/Qt29f7rvvPmJjY3n//fdJSkoK6DNs3LgRgIsvvrjBc+6W/fTTT1itVqqrq5kxY0aD5/Py8gDYvn07V111VaPbsy/75Zdf/I69f//+DZaZzWYAysvLadmyJQAdO3Z06U+mhjfeeIOZM2dy3nnn8be//U3VbQshhFFJ3pzR4Hmj582ff/4ZgEOHDrF69WoeeeQR+vXrx3/+8x969+6tynsI4S+pSAuhMXdJ2N5X1ttzNTU1AHz88cfcfPPNtGjRgpEjR9KxY0eaNWvmmAty3759bt+3c+fO9OnTh5UrV9K/f38uvPDCgD9DRUUFABkZGQ2ea926dYNl9rkfV65cycqVKz1u9/jx4z5tz77MHoc/vO1jq9Xq9/Z8NX/+fO69917OPfdcvvrqK1q0aBGy9xJCCCORvBmdeRMgLS2Nq6++mr59+5Kdnc348eNZs2ZNSN9TCE+kIi1EhJsxYwaJiYmsW7eO7Oxsl+c+/PBDj6978cUXWblyJWeddRZr167ltdde49577w0ohuTkZABKSkocA7TYFRcXN1jfnoT/8pe/MHv2bL/eq7i4mPbt27t9D3scoVBeXs6cOXP8es39999PSkpKg+Xz5s1jwoQJ9OzZk2+++YazzjpLnSCFEEI0SvJm5OXN+tq1a0ePHj346aefqKqqolmzZoEFKUQQpCItRITbvXs3vXr1anAycPDgQfbs2eP2Nb/88guPPvoo3bp1Y/ny5QwZMoQHH3yQoUOH0qtXL79j6NOnD5988gnff/89AwYMcHnu+++/b7D+gAEDMJlMrF692u/3+v7777n11lvdvsd5553nWBYbGwuod3W8vLycJ554wq/XjB07tsEJgb0S3aNHD7799lvS09NViU8IIYRvJG9GVt705ODBg5hMJkfcQoSbzCMtRITr0KEDu3btcrmCffLkSf74xz86mrE5O378OKNHjwbggw8+oE2bNixatIiamhpGjx7tdf5KT2655RZiY2N58cUXKSkpcSyvrKzk6aefbrB+ZmYmo0aNYtWqVcyaNcttH6o1a9ZQVVXVYPlTTz3l0hStoqKCp59+GpPJxJgxYxzLW7VqBUBBQYHfn8cde18vfx4dO3Z02cb8+fOZMGEC3bt359tvv3XbpE8IIURoSd6MjLx58OBBCgsLG2xXURRmzJhBcXExv/nNb0hISFAlXiH8JXekhYhwf/rTn/jTn/7Eeeedx4033sjp06f56quvUBSFPn36OAY0sfvzn//Mjh07mD17tuNK9AUXXMD06dN5/PHHeeihh3jllVf8iqFLly5MmzaN6dOn07t3b0aNGkWTJk345z//Se/evdmxY0eD17z22mvs2LGDKVOm8O677zJ48GBSUlIoKCjg559/Ji8vj4MHDzZortW1a1fOOeccl/kwLRYLkydP5vzzz3esN3jwYJo2bcqcOXMoKytz3Pl97LHH/Ppsavn222+5++67URSFSy65hNdff73BOn379nU7B6gQQgj1SN6MjLy5Y8cOfvvb33LBBReQnZ1N69atOXToEN9//z07duygbdu2zJ07V5PYhABkHmkhtGKfxmP69OkNnvM2BcX06dMVQFm+fLmiKIpSW1urvPHGG0qvXr2UxMREJTMzU8nJyVFKSkoc01HY/eMf/1AA5be//a1SW1vrsl2r1apccsklDabP8Me8efOUnj17KvHx8YrZbFYefPBBpaqqyu18mIqiKFVVVcrzzz+v9O/fX2nevLnStGlTpVOnTsp1112nvPPOO0pNTY1jXftnOXHihDJlyhSlXbt2Snx8vNKtWzfl5ZdfbvB5FEVRlixZogwYMEBp2rSpY8qM+ttzZ8yYMT5PX+Ur+zH19hgzZoxq7yeEEEYjeTO68ubBgweVKVOmKIMGDVLS09OVJk2aKC1btlT69eunPP74427nAhcinEyKovJ8LkIIEQLDhg3ju+++U30KKiGEEMKIJG8KEVrSR1oIIYQQQgghhPCDVKSFEEIIIYQQQgg/yGBjQgi35syZQ3l5eaPrjR07tsHo1EIIIUS0kbwpRHTRZR/puXPnMmvWLIqKiujTpw+vvPIKAwcOdLvuvHnzeOedd9i8eTMA/fv3569//avL+mPHjuXvf/+7y+tGjhzJ0qVLQ/chhIhwHTt2ZN++fY2ut3z5coYNGxb6gIQQQggdk7wpRHTR3R3pxYsXM3nyZN544w0GDRrEnDlzGDlyJDt27HA75+qKFSsYPXo0F154IYmJiTz33HNcdtllbNmyhaysLMd6l19+OQsWLHD8LXPOCeFdfn6+1iEIIYQQEUPyphDRRXd3pAcNGsSAAQN49dVXAaitraVdu3b86U9/4pFHHmn09VarldTUVF599VXuuOMOwHZHury8nE8//TSUoQshhBBCCCGEiAK6uiN96tQp1q1bx9SpUx3LYmJiGDFiBKtXr/ZpG1VVVdTU1NCqVSuX5StWrCAjI4PU1FSGDx/O008/zVlnneVxO9XV1VRXVzv+rq2t5ciRI5x11lmYTCY/P5kQQggRfoqicPToUdq2bUtMTOjGF5WcKYQQwgj8yZu6qkgfOnQIq9VK69atXZa3bt2a7du3+7SNhx9+mLZt2zJixAjHsssvv5zrr7+eTp06sXv3bh599FF+97vfsXr1amJjY91uZ+bMmTzxxBOBfxghhBBCJwoKCjCbzSHbvuRMIYQQRuJL3tRV0+4DBw6QlZXFqlWrGDx4sGP5lClT+O6771izZo3X1z/77LM8//zzrFixgt69e3tcb8+ePZx99tl8/fXX/OY3v3G7Tv2r6xUVFbRv356CggKOHk1i9244+2xw6oatme7du3Pw4EHatGnj8wUHPYjUuIUQjZPft7reeQfuuw8UBUwmePllONN7yavKykratWtHeXk5ycnJIYsvknImRO73M1LjFkI0Tn7f6gpH3tTVHem0tDRiY2MpLi52WV5cXExmZqbX186ePZtnn32Wr7/+2mslGqBz586kpaWxa9cujxXphIQEtwOSffppEn/+cxK1tRATA2+9BTk5jXywELM3O4iJiSEpKUnbYPwQqXELIRonv2/1WCzw5z/bTgbA9u/998N114GvN5lD3bw61DmzoqKCH374gYsuukiVCwLBfj/VjsdXev1dabU/hDASvf6+1RSusiJceTN0HaYCEB8fT//+/fnmm28cy2pra/nmm29c7lDX9/zzz/PUU0+xdOlSzj///Ebfx2KxcPjwYdq0aeN3jPfdB7W19thgwgTbwRJCCCFCIS+vLu/YWa2wa5c28fhDrZy5e/durrrqKnbv3q1ugAHSWzxak/0hhPBFuMqKcOVNXd2RBpg8eTJjxozh/PPPZ+DAgcyZM4fjx49z5513AnDHHXeQlZXFzJkzAXjuueeYNm0aixYtomPHjhQVFQHQokULWrRowbFjx3jiiSe44YYbyMzMZPfu3UyZMoUuXbowcuRIv+Or3xDeflBC2PVMCCFEFMvOtt3NdT4piI2FLl20i8lXauXMc889lwMHDpCWlqZecEHQWzxak/0hhPBFuMqKcOVNXd2RBrj55puZPXs206ZNo2/f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1iGKKHL++edjNps538BTCfhSzsoUWepo1aoVo0ePplWrVsHnzcTEurx5xRW+vcZLPEL2hxBqMHzetFppBYwG4mnpWBzJeVMq0hHA6xcqNpYioBCwHKl0NI2IpC+hs4ULF7Jw4ULeeecdPvvsM7Zt20ZeXh6jRo1i165dXHrppWzYsEHrMHXp6aef5scff2Tw4MHs3LmTxYsXs2bNGl544QVKS0u56667tA5RRJGioiIKCwspKirSOpSQ8bWclSmygnfkyBHee+89jhw54tP6Xo9NQoIjb+4/UBpQ3vQ3HqOT/SFE8AyfN61WjgDvASc4CUR+3pSKdITw+IVyatp97Jhrp/1I+RI25uyzz2bx4sXk5ORQVVUlFUI3Tp06xauvvgrA3LlzadGiheO5yZMn07t3b7777jvWrVunVYhCGJKv5awvd1GFZ/n5+dx+++3k5+f7/BqPx8apaXd5WWB5M5B4jEz2hxCiUVYr+cDtwKh7KgyRN6UiHUHcfaEOVzjPYKY06LQfCV9CX73wwgs0b96cX375hR9++KHB8wUFBUyaNImzzz6bxMREWrVqxVVXXcWqVasarLtixQpMJhNjx47l4MGDjB07ltatW9O0aVP69evHO++847L+woULHX2f9+3b59Kfe9iwYW7jnT9/Pr1796Zp06ZkZmYyYcIEysvLg94P7qxcuZKKigrOPvtszjvvvAbP33jjjQD8+9//Dsn7CxHNjFTO6lXfvn05efIkffv29et17o7N0VN1FWlTgHkz0HiMSvaHEKJRVit9gZPAJb3aGyJvSkU6wh0srbsjbR/iSs+DigUjOTmZ3/3udwAsX77c5bnVq1fTp08f5s6dS1xcHFdeeSXnnHMOy5Yt45JLLmHx4sVut3nkyBEuuOACli5dyrBhw7j44ov59ddfGTNmDDNmzHCs16VLF8aMGQNA8+bNHX25x4wZw+WXX95gu1OmTGHixIm0adOG3/3udyiKwltvvcU111yDoigq7ZE69pFS+/Xr5/Z5+/JNmzap/t5CCBFqMTExJCQkEFO/E3MADlfVTX9lwlYe+5s31YzHCGR/CCEaZbUSAyQAMXFxWkejCinxIlybrNgGyyJhULFA2a92b9u2zbGssrKSG264gcrKSt577z22b9/OP//5T/73v/+xevVqkpKSGDduHKWlpQ229+9//5tu3bqxe/duFi9ezJdffsmqVato0aIFTz31FOvXrwfgoosuYuHChQCkpaU5+nIvXLiQRx55pMF23333XTZt2sSyZcv45JNP2LJlC126dOH7779vcBHAfrfbn0f9u+D79+8HwOzh0p59+b59+xrfyUIIoTN79uzh+uuvV2XQxNRMp1G7z1Sk/c2basZjBLI/hBCNqq1lD3A9sMcg4yk0aXwVoWdnZThXpJWIGVQsUGlptuHyy8rKHMvefvttDh48yF/+8hduvfVWl/XPP/98Hn/8cSZPnsx7773HAw884PJ8TEwMr7zyCs2bN3csGzBgABMnTuS5557jtddeY/78+X7H+dRTT9GtWzeXuO+55x4efPBB/ve//zF8+HDHc853u33VvXt3l7+PHTsGQLNmzdyub/98R48e9et9hBBCD2pra6murqa2/vxUAUhOd23aHUjeVDMeI5D9IYRolNVKLVANGKWkkIq0jlgstnkss7P9SOhOg421aAbbdhi3Eg04mkU7z9X85ZdfAnD99de7fc3FF18M4HbqrL59+7pUeO1Gjx7Nc889x/fffx9QnJdddlmDZV27dgXg4MGDLssvuugiLrroooDeRwghokGXLl1YsmRJg+UB5c3EuqbdyS3h563+501P8UQr2R9CiEZZrXQBlgC0batxMOqQpt06kZtrGzl0+HDXEUQb5VSRjm0Snkq0xWIb0dQ+MEs4HTp0CMBlrkr7KKFDhgxx2wx6wIABLq911qFDB7fvY58r+sCBAwHF6a6JdcuWtjnzqqurA9qmN/ZRuquqqtw+f/z4cZcYhBAi0gWcN51G7W7SRDF83hRCCF2wWuv+H9uwa2okkjvSOmCxwN13g71FlH0E0ZEjfagYO38RPQxiFdAVew9yc+tijYmxzbkZzmm1fvnlFwB69uzpWGZvSnbjjTe6NNGur35z6FDyZ8CVH374we/m4927d3fpm92+fXsALB7O0uzLPV04EEIIPVu/fj39+/dn3bp19OvXL7i86VSRDjRv1o/HG63zZjj4sz+EEFHKamU90B9Yt38/RigppCKtA3l5dScDdvYRRH2pSD8PVAHNnPrd2qmZwIM6cVFBRUUFy5YtA+DSSy91LDebzezYsYNHHnmE/v37+7VNT4Nv2Ze3DUPTk127dvH3v//dr9cMHTrUpSLdp08fAMfgaPXZl/fu3TvAKIXwz/PPP09V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",
+ "text/plain": [
+ "<Figure size 1000x400 with 2 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# extra code – this cell generates and saves Figure 6–5\n",
+ "\n",
+ "def plot_regression_predictions(tree_reg, X, y, axes=[-0.5, 0.5, -0.05, 0.25]):\n",
+ " x1 = np.linspace(axes[0], axes[1], 500).reshape(-1, 1)\n",
+ " y_pred = tree_reg.predict(x1)\n",
+ " plt.axis(axes)\n",
+ " plt.xlabel(\"$x_1$\")\n",
+ " plt.plot(X, y, \"b.\")\n",
+ " plt.plot(x1, y_pred, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
+ "\n",
+ "fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
+ "plt.sca(axes[0])\n",
+ "plot_regression_predictions(tree_reg, X_quad, y_quad)\n",
+ "\n",
+ "th0, th1a, th1b = tree_reg.tree_.threshold[[0, 1, 4]]\n",
+ "for split, style in ((th0, \"k-\"), (th1a, \"k--\"), (th1b, \"k--\")):\n",
+ " plt.plot([split, split], [-0.05, 0.25], style, linewidth=2)\n",
+ "plt.text(th0, 0.16, \"Depth=0\", fontsize=15)\n",
+ "plt.text(th1a + 0.01, -0.01, \"Depth=1\", horizontalalignment=\"center\", fontsize=13)\n",
+ "plt.text(th1b + 0.01, -0.01, \"Depth=1\", fontsize=13)\n",
+ "plt.ylabel(\"$y$\", rotation=0)\n",
+ "plt.legend(loc=\"upper center\", fontsize=16)\n",
+ "plt.title(\"max_depth=2\")\n",
+ "\n",
+ "plt.sca(axes[1])\n",
+ "th2s = tree_reg2.tree_.threshold[[2, 5, 9, 12]]\n",
+ "plot_regression_predictions(tree_reg2, X_quad, y_quad)\n",
+ "for split, style in ((th0, \"k-\"), (th1a, \"k--\"), (th1b, \"k--\")):\n",
+ " plt.plot([split, split], [-0.05, 0.25], style, linewidth=2)\n",
+ "for split in th2s:\n",
+ " plt.plot([split, split], [-0.05, 0.25], \"k:\", linewidth=1)\n",
+ "plt.text(th2s[2] + 0.01, 0.15, \"Depth=2\", fontsize=13)\n",
+ "plt.title(\"max_depth=3\")\n",
+ "\n",
+ "save_fig(\"tree_regression_plot\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9IAAAF6CAYAAAD1Q2B0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAyTxJREFUeJzsnXl81GT+xz+Z6QmltJReMJwy4MkhFCxQOWSpu4LgKuJJ0VJAcBfEE3VBRTkU8bbSWm3d9aq6Pw90cZUFrVChgqioYEEKBHtRCgUKPWby+yPNTJJJZpLp3P2+X6++OvMkeZK58jyf53sxHMdxIAiCIAiCIAiCIAhCEwZ/XwBBEARBEARBEARBBBMkpAmCIAiCIAiCIAhCBySkCYIgCIIgCIIgCEIHJKQJgiAIgiAIgiAIQgckpAmCIAiCIAiCIAhCBySkCYIgCIIgCIIgCEIHJKQJgiAIgiAIgiAIQgckpAmCIAiCIAiCIAhCBySkCYIgCIIgCIIgCEIHJKQJgggaxo8fD4ZhvNZ/37590bdvX6/1TxAE0VHYsmULGIbBI4884u9LCVoKCwvBMAwKCwv9fSkS/DVWlpeX45prrkFqaioMBgPi4uJ8fg0EIYaENEH4mIqKCjAMA4ZhkJmZqbjPt99+C4ZhMHv2bN9enJeZPXs2GIZBRUVFhzw/QRAEQRD6sVgsmD59Oj777DNcddVVWLZsGR544AGP9f/JJ5/gb3/7G8aMGYPOnTtrWgRqamrCY489BrPZjKioKPTo0QNz585FTU2Nx66LCGzC/H0BBNGR+e9//4v//e9/mDhxor8vJSh444030NjY6LX+N23a5LW+CYIgOhIjR47Er7/+iu7du/v7UogQ4ODBg/jll1+Qk5ODvLw8j/f/9NNP46uvvkJsbCx69OiB/fv3O93farVi2rRp+Pzzz3HZZZfh2muvRXl5OV599VVs2rQJ3377LRITEz1+nURgQRZpgvATffv2hcFgwP333w+O4/x9OUFB7969cf7553ut//POOw/nnXee1/onCILoKHTq1Annn38+CWnCI/zxxx8AgB49enil/xUrVuC3337DiRMnsGLFCpf7FxUV4fPPP8eNN96Ibdu2YfXq1fjggw/w8ssv4/fff8fDDz/sleskAgsS0gThJwYNGoRbb70V3333HYqLizUfd+jQIWRnZ6Nnz56IiIiAyWRCdnY2Dh8+rLmPRx55BAzDYMuWLSgsLMSll16KTp06Yfz48bZ9Tp06heXLl+Oiiy5CdHQ04uLikJmZiW+++cahv8rKSixatAhms9m27wUXXID58+fj5MmTAPiFg6KiIgBAv379bO7t4nMKz48ePYpZs2YhJSUFBoMBW7ZsAeA8Rvqjjz7C5MmTkZCQgKioKPTt2xe33nor9uzZo/n8anFfZ86cwfLly3H++ecjKioK3bp1w1VXXYWtW7c6fW/feustDB06FNHR0UhNTcWiRYtw9uxZh2M++OADjBs3DklJSTb3sEmTJuGDDz5QfK0EQRDeQhzbvG3bNkyYMAFdunRBYmIiFixYYLuHffrpp0hPT0fnzp2RnJyM++67D62trYr9iBHus6dPn8aiRYvQo0cPREZGYvDgwXj//ffdvm4t4xAA/Pbbb7jvvvtw6aWX2saLgQMH4oEHHsDp06cd+hXGnaamJjz44IPo3bs3oqOjMXz4cHz55ZcAgJMnT2LhwoXo0aMHoqKikJ6ejh07djj0Jbz2EydOYN68eUhJSUFUVBSGDRuGt99+W9frPXjwIObMmYPevXsjMjISqampmD17Ng4dOuSw765du3DdddfZ9k1MTERaWhqeeOIJXed0BcdxeO211zBmzBjExsaiU6dOGDFiBF577TWHff/44w8sX74cl112GZKSkhAZGYm+fftiwYIFDq7Rffv2xbhx4wAAjz76qG389mT8fUZGBsxms+Y8LPn5+QCAVatWSY6ZN28e+vfvjzfffFNxvCdCC3LtJgg/8thjj+Gdd97Bww8/jL/+9a8IDw93uv9vv/2GsWPHora2FlOnTsVFF12EPXv24LXXXsMnn3yCb775BgMHDtR8/qeeegqbN2/GtGnTMHnyZBiNRgDA8ePHcfnll+Pnn3/GmDFjMH/+fDQ0NOCjjz7ChAkT8N5772H69OkAgMbGRowZMwYVFRWYPHkyrrnmGjQ3N+PgwYP45z//iXvuuQddu3bF4sWLUVhYiB9++AGLFi2yJQmRC9e6ujqkp6ejW7duuOGGG3Du3DnExsY6fR1333031q1bh27dumH69OlISkrCkSNH8OWXX2L48OG4+OKLNZ9fzrlz5zBx4kTs2LEDl156KRYvXozq6mq8++67+Pzzz/H2229jxowZDse9+OKL2LhxI6ZNm4aJEydi48aNeP7553Hs2DG8+eabtv1yc3OxYMECpKam4pprrkFCQgKqqqqwY8cO/N///R+uvfZap9dHEAThDbZv3441a9YgMzMT8+bNw+bNm5Gbm4uGhgZMnToVs2fPxrRp05Ceno5PP/0UTz31FGJiYrBs2TKXfbe0tGDy5Mmor6/Htddei8bGRrzzzju4/vrrsXHjRkyePFnXtWodhwDg3//+NwoKCjBhwgSMHz8eVqsV3377LdasWYOvvvoKX3/9teJYPHPmTPz000+4+uqrcfbsWbz55puYMmUKtm7dirlz56K5uRkzZsxAbW0t3n33XVx55ZU4ePCg7bwCzc3NmDRpEk6fPo1bb70VZ86cQXFxMW666SYcO3YMf/vb31y+3u3btyMzMxNnzpzBlClTYDabUVFRgTfffBP/+c9/UFpaiv79+wMAdu/ejdGjR8NoNGLatGno06cPTpw4gV9++QV5eXl46KGHdL3XanAch5tvvhlvv/02zGYzbrrpJkREROCLL75AdnY2fvnlF6xdu9a2/9dff42nn34aV1xxBUaNGoXw8HB8//33yM3Nxeeff45du3bZ3rvFixdj9+7dKCoqwrhx42wL4OKFcF9y7tw5bN++HYMGDUKfPn0k2xiGwZ/+9CesX78e3333HTIyMvxyjYSP4AiC8CkHDx7kAHCZmZkcx3HcPffcwwHgXnjhBds+paWlHAAuKytLcuyECRM4ANz69esl7S+99BIHgJs4caKma1i+fDkHgOvcuTP3448/Omy/6aabOABcfn6+pL26uprr1asXl5iYyJ09e5bjOI77+OOPOQDc4sWLHfo5deoUd+7cOdvzrKwsDgB38OBBxesCwAHgbrvtNq61tdVh+7hx4zj5beuTTz7hAHCXXHIJd+zYMcm2lpYWrqqqSvP5+/Tpw/Xp00fS9uijj3IAuJtvvpmzWq229l27dnERERFcXFwc19DQYGsX3tuuXbtye/futbU3NjZyAwcO5AwGA3f06FFb+6WXXspFRERw1dXVDtcjfz0EQRDeZvPmzbZ78Ycffmhrb25u5gYPHswxDMN1796d27Fjh21bQ0MDl5SUxHXr1o1rbm6W9LN8+XJJ/3369OEAcNOmTeOampps7V9++aVkbNSDnnGIZVnJeQWEe/2//vUvSbsw7owdO5Y7ffq0rf3dd9/lAHBxcXHcjBkzuJaWFtu2NWvWcAC4p59+WvG1X3755ZJrOHLkCNe9e3cuMjKSY1nW1v76669zALjXX3/d1tbc3Mz17duX69KlC7dr1y5J/yUlJZzRaOSmTJlia1uyZInDZyng7hijNFbm5eXZxm/hO8BxHNfU1MRNnTqVA8B99913tvbq6mru1KlTDn0XFRVxALjHH39c0q72feI4fl61fPlyXX/OePvtt1XPxXEct2fPHg6A5H0Ws3btWg4AV1BQ4PQ8RPBDrt0E4WcefPBBxMXFYcWKFYpuZQKHDx/G5s2bceGFFyInJ0eybf78+Tj//PPxv//9D0eOHNF87rlz5+KSSy6RtB07dgzvvvsuJk6ciDlz5ki2JSUl4d5770Vtba3NpU0gOjraof+YmBhERkZqvh4AiIiIwJNPPmmzjrvi5ZdfBgA899xzSEhIkGwLCwtDcnKyrvPLKSoqQnh4OFavXi1x3xo2bBiysrJw4sQJfPjhhw7HLVq0CIMGDbI9j46Oxo033gir1YqdO3dK9g0PD1e0gMhfD0EQhK+YMGECpk2bZnseHh6O6667DhzHYerUqUhLS7Nt69KlC6ZMmYLjx4+DZVlN/T/zzDOIiIiwPb/iiivQp08flJWVuX3NWsYhISxKzp133gkADmObwBNPPIHOnTvbnl933XUIDw/HiRMnsHbtWoSF2Z08b7zxRgDADz/8oNjXypUrJddgMpmwaNEiNDU14Z133nH2ErFhwwZUVFTg3nvvxbBhwyTbxo4di2nTpuGzzz5DQ0ODZJvSe+PJMebFF19E586d8dJLL0nGs4iICJsLudh9PSkpCTExMQ793HrrrYiNjVX9HJSoqKjAo48+quuvPQihAnJvAwHBi04cUkCEJuTaTRB+Jj4+Hg888AAeeOABrF27VjXmZ/fu3QCAcePGOcTwGAwGXH755di7dy92796NXr16aTr3yJEjHdrKyspgsVjQ1NSkeC3l5eUAgL1792LKlCm4/PLLkZqaitWrV+OHH37AlClTMG7cOFxwwQVu1Xzu16+fruQ0O3bsQGRkpC1+ypM0NDTg999/xwUXXACTyeSwfcKECcjPz8fu3btx6623SrYNHz7cYX+hjxMnTtjabrjhBtx33324+OKLcdNNN2HChAkYO3asS3d2giAIbzJ06FCHttTUVJfb/vjjD/Tr189p33FxcYr7mEwmlJaW6r5WPeMQx3F4/fXXUVhYiD179uDkyZOwWq227UJSKzny12wwGJCUlITGxkb07t1bsk38XsgJCwtDenq6Q7vgAvz99987fa3ffvstAGDfvn2KY3RVVRWsVit+++03jBgxAtdffz2effZZXHPNNZg5cyb+9Kc/4fLLL0fPnj2dnkcPjY2N+Omnn9CjRw+sWbPGYXtLSwsAft4g5t///jfWr1+PXbt2ob6+HhaLxbZN7XNQYvz48ZS0lfALJKQJIgD4+9//jhdffBFPP/00FixYoLiPsLqsZmEVBm75KrQzlPo6fvw4AGDr1q2KybQEzpw5A4Bfkf3222+xbNkyfPLJJ/jss88AAL169cIDDzyg+nr0XJMzTp48iZ49e8Jg8LyDTXvecyUhLFgsxJOFe+65BwkJCcjNzcXTTz9ts2xcddVVeOaZZ1xOSAmCILyBs3uYs22CaHKGmiUvLCxMImq1omccEsbbXr164eqrr0ZqaqrNYv3oo4+iqalJ8Rxqr1nve9G9e3fF8UoYZ1xZMYUxWpxrQwlhjB41ahS2bNmClStX4q233sLrr78OAEhLS8OaNWswYcIEp/1oob6+HhzH4ejRo06tvcI1AXy5qXvuuQeJiYmYPHkyTCaTzWr+7LPPqn4OgYDw/VX7rIQ5gdr3nAgdSEgTRAAQHR2NRx99FNnZ2Xj00UcdrJuAfRCvrq5W7KOqqkqynxaULMbC8XfffbckMYgzevfujcLCQlitVvz444/473//i+effx4LFy5EfHy8zc3N3WtyRlxcnG0F3tNi2hvvuRyGYXD77bfj9ttvR11dHUpKSvD222+juLgY5eXl+PHHHzW7uRMEQXRUtIxDNTU1eOmllzB48GCUlpaiU6dOtuOrqqra7fKrhWPHjimOV8I440p8CePNJ598gilTpmg6Z0ZGBv7zn//g7Nmz2L59Oz755BO8/PLLuOqqq7Bnzx5bYjJ3Ea5p+PDh+O6771zu39raihUrViA1NRW7d+9GUlKSbRvHcXjyySd1nb+iogKFhYW6jmlPxu/+/fvDYDDYPPTkCO1ms9ntcxDBAQlpgggQsrKysG7dOuTn5yu6fQluZV9//TU4jpMITo7j8PXXX0v2c5e0tDQwDOOWe53BYMDQoUMxdOhQpKen4/LLL8fHH39sE9KCIBRbZNvLyJEj8dlnn+Grr75yubKu9/yxsbHo378/9u/fj6NHjzq4wglludr7ngskJCRg+vTpmD59Oo4dO4b//e9/2L9/vyTWmiAIglDH2Tj0+++/g+M4TJo0SSKiAaCkpMQn19fa2orS0lKMGTNG8fzyuGc5o0aNAgCUlpZqFtIC0dHRGD9+PMaPH4+4uDgsW7YMX3zxBebNm6erHzldunTBBRdcgF9//RUnTpywVcVQ49ixYzh58iSuuOIKiYgGgO+++0532SghRloP7RHS0dHRGDlyJL799lscOnRIkrmb4zh88cUX6Ny5M0aMGOH2OYjggJKNEUSAYDQasXLlSrS0tCje4Hv37o0JEybg559/dqjJmJeXh19//RUTJ07UHB+tRkpKCq6//nps27YNTz31lGLc0fbt29HY2AgA+PnnnxUttkJbVFSUra1bt24AoCshmisWLlwIgE/uJbi8CbS2tkquzZ3zZ2VloaWlBUuXLpW8Fz/++CMKCwvRtWtXWykwd9iyZYvDe9zS0mJ7LeL3jyAIgnBE6zgkCJ5t27ZJXMhZlsXSpUt9cKU8Dz74IJqbmyXnf+655xAZGYkbbrjB6bHTpk1D7969sW7dOtsCupiWlhZ88803tuelpaU4d+6cw35KY3R7+Pvf/47Gxkbk5ORIXLgFDh48iIqKCgB8orHo6Gjs2rXLNpcAeBdxLeW/5Agx0nr+2svcuXMBwGFusH79evz++++4+eabFRO8EaEFWaQJIoC4+uqrMXbsWMkgKCY3Nxdjx45FTk4OPvnkE1x44YX4+eef8fHHHyMxMRG5ubkeuY6XX34Z+/btw3333Yd//vOfSE9PR1xcHI4cOYLvvvsO5eXlqKysRKdOnfDFF1/g3nvvxZgxYzBw4EAkJCTg999/x8cff4yoqCib0AWAiRMnYu3atZg7dy6uvfZadO7cGX369FF0ZdfKX/7yF9xzzz1Yu3YtzGYzrrnmGiQlJeHo0aPYtGkT7rnnHixevNjt899333349NNP8c9//hO//vorrrjiCtTU1ODdd99Fa2sr8vPz0aVLF7evf/r06YiNjcVll12GPn36oKWlBV988QV++eUXXHfddQ41KgmCIAgpWseh1NRUXHvttfjggw8wYsQIXHHFFaiursaGDRtwxRVX4MCBA16/1tTUVJw5cwaDBw/G1KlTbXWk6+rq8Pzzz7tMAhYZGYn3338ff/7znzFu3DhMnDgRl1xyCRiGwaFDh1BSUoKEhARbYq81a9Zg8+bNuPzyy9GvXz9ERUVh165d2LRpE/r3749rrrnGI69r3rx5+Pbbb1FUVIStW7di0qRJ6NGjB6qrq7F3715s374db731Fvr27QuDwYAFCxbg6aefxpAhQzB16lQ0NDTgP//5D/r06YMePXp45Jr08OGHH9oqcBw8eNDWJoj/888/Hw888IBt/6ysLLz77rt4++23cfDgQYwbNw779+/Hv//9b/Tr1w+PP/64r18C4Q98VmiLIAiO4xzrSMvZunWrrYanvI40x3FcRUUFd9ttt3GpqalcWFgYl5qayt12221cRUWF5msQah1v3rxZdZ/GxkbuySef5IYPH8517tyZi46O5vr168dNnz6de+ONN2w1M3/55Rdu0aJF3LBhw7iEhAQuMjKS69+/P5eVlcX9/PPPDv0++eSTnNls5sLDwzkA3Lhx42zb5M/lKNWRFvjggw+4CRMmcF27duUiIyO5vn37crfeeiu3Z88ezedXqo3JcRx3+vRp7h//+Ac3cOBAW+3oP//5z1xJSYnDvs7eW6WaoC+//DJ39dVXc3369OGioqK4hIQEbuTIkVxubq6kFidBEIQvcFavV+keJiC/9zmrI610n+U45/d4Z+gZh06dOsXdfffdXN++fbnIyEjObDZzK1as4JqbmxXHIGfX5Oy1KPUl7H/8+HFu7ty5XHJyMhcZGckNGTKEe+uttxz6cPZ+syzLLVq0iDObzVxkZCQXGxvLXXDBBdycOXO4TZs22fbbuHEjN2vWLG7QoEFcly5duJiYGO7CCy/kHnzwQa62tlbx2l3h7HW/++673KRJk7j4+HguPDyc69mzJzd+/Hju6aeflpyvubmZe+KJJ2zX37t3b+7uu+/mTp06pdi/s++lJxC+v2p/SnOTc+fOcY888gh33nnncREREVxKSgo3Z84crqqqyivXSAQeDMdRvniCIAiCIAiC8CZ9+/YFAJuVkyCI4IZipAmCIAiCIAiCIAhCBySkCYIgCIIgCIIgCEIHlGyMIAiCIAiCCCi2bNliKzHojKFDh7arcgIBFBYWanI3nz59usfKPRJEKBCQQvqll17CU089haqqKgwZMgQvvPACRo4cqbhvfn4+3njjDezZswcAXwx+5cqVkv1nz56NoqIiyXGZmZnYuHGj914EQRAEQRAE4RZb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upPIysoS9913nzh8+LA4cOCASEpKElOmTLHtN5vNYvDgweLw4cNuzwFWInWhtF/r6upEamqqGDJkiDhz5oyoqKiwfTU3NwfqZQTcpk2bRHh4uCguLhanTp0Subm5Ijo6WlRWVgohhJg2bZpYtGiR7fiDBw+K0NBQsWrVKvHll1+KJUuWiG7duonjx48H6iXoltK+XbFihQgLCxPvv/++w+9nQ0NDoF6CbintW2fBWoW0M+NYqR2Ol+rgeKkdjpfa6arjJQPpTqK6ulpMmTJF3HbbbSIyMlLMmDHD4T/6uXPnBACxb98+t+fghwNXSvt13759AoDs17lz5wLzInTi9ddfF/369RNhYWEiJSVFfPrpp7Z9o0aNEtnZ2Q7Hb968Wdx5550iLCxM/OhHPxI7d+70c4uDh5K+7d+/v+zv55IlS/zf8CCg9PfWXrB+MOjMOFZqh+OlejheaofjpXa64ngpCSGEtpPHiYiIiIiIiDoPVu0mIiIiIiIiUoCBNBEREREREZECDKSJiIiIiIiIFGAgTURERERERKQAA2kiIiIiIiIiBRhIExERERERESnAQJqIiIiIiIhIAQbSRERERERERAowkCYiIiIiIiJSgIE0ERERERERkQIMpInIb9LS0iBJEkwmk8P2+vp6DB06FOHh4di9e3eAWkdERBR4HCuJggMDaSLym5UrVwIAnnvuOdu2Gzdu4OGHH8a///1vlJSU4Kc//WmgmkdERBRwHCuJggMDaSLymwcffBDjxo3D3r17sX//fgghMH36dOzduxevvvoqHn300UA3kYiIKKA4VhIFB0kIIQLdCCLqOo4fP46hQ4dixIgRSElJwerVq7F48WIsX7480E0jIiLSBY6VRPrHQJqI/C47OxsbNmwAAPz2t79FUVGRyzF/+9vfUFBQgKNHj6K2thbnzp3DgAED/NxSIiKiwOBYSaRvnNpNRH4XHx8PAOjevTvy8/Nlj7l27RoefPBBLFu2zJ9NIyIi0gWOlUT6FhroBhBR1/LGG2/glVdeQUJCAqqqqlBSUoJZs2a5HDdt2jQAwIkTJ/zdRCIiooDiWEmkf8xIE5HfbN68GU8++SR+8pOf4PPPP0dUVBSWLl2K69evB7ppREREusCxkig4MJAmIr/Ys2cPpk2bhiFDhmDbtm3o1asX5s+fj4qKCqxduzbQzSMiIgo4jpVEwYPFxohIc8eOHcNDDz2EuLg4HDp0CL169QIA1NfXY+DAgWhpacHXX3+N2NhYl8eeOHECQ4YMYQEVIiLq1DhWEgUXZqSJSFNnz57F2LFjERYWhl27dtk+GABAZGQkFi5ciLq6OuTl5QWwlURERIHDsZIo+DAjTUS6xqvsREREnnGsJPI/Vu0mIl2qqanB+fPncfbsWQDAqVOncPXqVfTr1092WhsREVFXw7GSKHCYkSYiXSouLsaMGTNctr/zzjuYPn26/xtERESkMxwriQKHgTQRERERERGRAiw2RkRERERERKQAA2kiIiIiIiIiBRhIExERERERESnAQJqIiIiIiIhIAQbSRERERERERAowkCYiIiIiIiJSgIE0ERERERERkQIMpImIiIiIiIgUYCBNREREREREpAADaSIiIiIiIiIFGEgTERERERERKcBAmoiIiIiIiEiB/w93iH4/867ehwAAAABJRU5ErkJggg==",
+ "text/plain": [
+ "<Figure size 1000x400 with 2 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# extra code – this cell generates and saves Figure 6–6\n",
+ "\n",
+ "tree_reg1 = DecisionTreeRegressor(random_state=42)\n",
+ "tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)\n",
+ "tree_reg1.fit(X_quad, y_quad)\n",
+ "tree_reg2.fit(X_quad, y_quad)\n",
+ "\n",
+ "x1 = np.linspace(-0.5, 0.5, 500).reshape(-1, 1)\n",
+ "y_pred1 = tree_reg1.predict(x1)\n",
+ "y_pred2 = tree_reg2.predict(x1)\n",
+ "\n",
+ "fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
+ "\n",
+ "plt.sca(axes[0])\n",
+ "plt.plot(X_quad, y_quad, \"b.\")\n",
+ "plt.plot(x1, y_pred1, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
+ "plt.axis([-0.5, 0.5, -0.05, 0.25])\n",
+ "plt.xlabel(\"$x_1$\")\n",
+ "plt.ylabel(\"$y$\", rotation=0)\n",
+ "plt.legend(loc=\"upper center\")\n",
+ "plt.title(\"No restrictions\")\n",
+ "\n",
+ "plt.sca(axes[1])\n",
+ "plt.plot(X_quad, y_quad, \"b.\")\n",
+ "plt.plot(x1, y_pred2, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
+ "plt.axis([-0.5, 0.5, -0.05, 0.25])\n",
+ "plt.xlabel(\"$x_1$\")\n",
+ "plt.title(f\"min_samples_leaf={tree_reg2.min_samples_leaf}\")\n",
+ "\n",
+ "save_fig(\"tree_regression_regularization_plot\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "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": 27,
+ "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": 28,
+ "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": 28,
+ "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": 29,
+ "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": 30,
+ "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": 30,
+ "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": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwoAAAF6CAYAAAC5ha/JAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAfHhJREFUeJzt3XdcE/f/B/BXwggoEAWZMsQ9cCuIC7WOWrXQqnW17n7VqnVUq9attWidrVp3a62z7qp1FRUX7j1bJ8pSVAigzNzvD35EYwIcIZBAXs/Hg0ebu8997n0XiHnf53P3lgiCIICIiIiIiOgdUkMHQERERERExoeJAhERERERaWCiQEREREREGpgoEBERERGRBiYKRERERESkgYkCERERERFpYKJAREREREQamCgQEREREZEGJgpERERERKSBiQIREREREWkwukRh2bJlqFWrFuzs7GBnZwd/f3/s378/x222bt2KqlWrwsrKCjVr1sTff/9dSNESERERERVPRpcouLu7Y/bs2bh48SIuXLiAVq1aITAwEDdv3tTa/vTp0+jRowcGDBiAy5cvIygoCEFBQbhx40YhR05EREREVHxIBEEQDB1Ebuzt7TF37lwMGDBAY123bt2QlJSEvXv3qpY1atQIderUwfLlywszTCIiIiKiYsPoRhTelZGRgc2bNyMpKQn+/v5a24SFhaF169Zqy9q1a4ewsLDCCJGIiIiIqFgyN3QA2ly/fh3+/v5ITk6GjY0Ndu7cierVq2ttGx0dDWdnZ7Vlzs7OiI6Ozrb/lJQUpKSkqF4rlUq8fPkSDg4OkEgk+jkIIiIiIiIjIwgCEhIS4ObmBqk05zEDo0wUqlSpgitXriA+Ph7btm1Dnz59EBoamm2ykFfBwcGYPn26XvoiIiIiIipqnjx5And39xzbGGWiYGlpiYoVKwIA6tevj/Pnz+Onn37CihUrNNq6uLggJiZGbVlMTAxcXFyy7X/ChAkYPXq06nV8fDw8PT1x9vFZ2NjZ6OkoiIiIiIiMS6IiEX5efrC1tc21rVEmCu9TKpVqU4Xe5e/vj5CQEIwcOVK17PDhw9ne0wAAMpkMMplMY7mNnQ1s7XI/aURERERERZmY6fZGlyhMmDAB7du3h6enJxISErBx40YcO3YMBw8eBAD07t0bZcuWRXBwMABgxIgRCAgIwPz589GhQwds3rwZFy5cwMqVKw15GERERERERZrRJQrPnj1D7969ERUVBblcjlq1auHgwYNo06YNACA8PFztxovGjRtj48aNmDRpEr777jtUqlQJu3btgo+Pj6EOgYiIiIioyCsSdRQKmkKhgFwux81XNzn1iIiIiIiKrQRFAmqUroH4+HjY2dnl2Nao6ygQEREREZFhMFEgIiIiIiINRnePQlGiTFNCmaE0dBhEBic1k0JqwesORERExQkTBR2kKlKR/CIZyhQmCURZpDIprBysYGlnaehQiIiISA+YKORRqiIVr6New7akLezK2MHcwhzI/TG0RMWXAKSnpUMRr0BCVAIAMFkgIiIqBpgo5FHyi2TYlrSFq7urqEIVRCbBGihpWxJ4CiS9TGKiQEREVAxwUnEeKNOUUKYoYSe3Y5JA9B6JRAI7uR2UyUoo0zgtj4iIqKhjopAHWTcum1twIIZIm6y/Dd7kT0REVPQxUdAFBxOItOPfBhERUbHBRIGIiIiIiDQwUSAiIiIiIg1MFKjArVu7DjKpDOvWrjN0KEREREQkEhMFEu3Ro0eQSWXo2L6joUMpUDOnzYRMKkPosVBDh0JERERkMHx8DxW4wE8C4dvIF66uroYOhYiIiIhEYqJghAQhA4r4k0hNjYalpQvs5E0hkZgZOiydyeVyyOVyQ4dBRERERHnAqUdG5sXzXbh4phJuXm2L/273xs2rbXHxTCW8eL7L0KFla2C/gZBJZXjw4AEWzl+I2jVqw9bKFgP7DQSQ/T0Kly9dRveu3VHRqyJsrWxR1qksGvs2xuxZs0XtNz4+HtOnTEftGrVhb2uPMvIyqFapGgb0HYDHjx+rtRUEAWt/XYsWTVugjLwMSpUsBf+G/lj761q1dm1atsH3M74HALRt1RYyqQwyqQyVvSurtbt54yZ6dusJd2d32FrZonL5yvhm5Dd48eKFRpz//fcfvuz/JSqXrwxbK1u4OLigQZ0G+GbkNxAEQdXu0sVLGDFsBOrWrAvHUo6Ql5CjXq16mDt7LtLS0kSdEyIiIiJ94YiCEXnxfBfu3uoOQFBbnpoaibu3uqNK9c1wcAwySGxijPp6FM6dOYf2HdqjQ8cOcHRyzLbt1StXEdAkAGZmZugU2Amenp6Ii4vDndt3sGbVGoyfOD7HfQmCgI4fdsS5s+fQuEljtG3XFlKpFOHh4dj71170/LwnvLy8VG37fN4HWzZtQcVKFdGtRzdYWloi5J8QDBo4CLdv3caceXMAAF/0+QIAcDz0OL7o84WqD3mptyMip06eQscPOyI1NRWfdvkUXl5eOHvmLJb8vAR/7/sbJ8JOoEyZMgCAyMhINPVriqSkJLTv0B5dP+uKpKQk3Lt3DyuWrcCceXNgbp75Z7hm1Rr8vfdvNG3eFB+2/xCvX7/G8dDjmPTdJFy4cAFbtm3R8Z0hIiIiyjsmCkZCEDLw8N5ovJ8k/P9aABI8vP8N7Mt0MtppSDeu3cDZS2fh6emZa9sNf2xASkoKtu7cio8DP1Zbp+2q/Ptu3riJc2fP4eOgj7F1x1a1dSkpKWpX4H9d/Su2bNqCPn37YOmKpbCwsAAApKamonvX7li0YBG69eiGevXroXff3nj86LEqUQhoEaDWt1KpxMB+A/H69Wvs2b8Hbdu1Va2b8O0ELJi3ABPHTcSKNSsAADu370RcXBzmLZyH4SOGq/X18uVLVZIAAOO+G4efl/4MM7O3768gCBg8cDDW/rYWp0+dRuMmjXM9N0RERET6wKlHRiLznoSIHFoISE15CkX8yUKLKa9GjRklKkl4l7W1tcYyBweHfG0vk8lgY2Ojer1s6TKULFkSPy39SZUkAIClpSVmfD8DALBlk7ir9adPncaD+w/Qrn07tSQBACZOmQh7e3ts3rQZqampucZpb2+v9trT01MtSQAAiUSCwUMHAwCO/HNEVIxERERE+sARBSORmhqt13aG0NC3oei2XT7rgsU/LcZnn36Grp91xQdtPkDT5k1RtmxZUdtXrVYVNWvVxJZNWxDxNAKdAjshoEUAatepDan0bf77+vVr3Lh+A25ubpg3Z55GP1kjD3fv3hW13yuXrwAAmgc011hnY2ODeg3q4Z9D/+Dfu//Cp6YPOnTqgMnfTcaIYSNw9MhRtG3XFs0CmqF8+fIa26empuKXJb9g65atuHvnLhITE9XuYYiMjBQVIxEREZE+MFEwEpaWLnptZwhOzk6i2/r6+eLw0cOYEzwHmzdtxu9rfwcANGjYALNmz0KLli1y3N7c3BwHQw5i5rSZ2LVjF8aNGQcAcHR0xJChQzB+4niYmZnh1atXEAQBERERqpuUtXmd9FpU3AmKBACAs7Oz1vVZj4BVKBQAgHLlyuFE2AnMnD4TB/4+gG1/bgMAVKlaBVOnT0Xnrp1V23bv2h379uxDpcqV0PWzrnB0coSFhQXi4uKw5OclGqMURERERAWJiYKRsJM3haVlWaSmRkL7fQoSWMrKwk7etLBDE00ikeSpfdNmTdG0WVO8efMG586ew749+7Bi2QoEdQzCpeuXtF51f5eDgwMWLV6EhT8vxJ07d3DsyDH8suQXzJg2AxYWFvh2wrews7MDANSrXw9h58N0PrYstna2AICYmBit66OjM0d8svYLADV8amDz1s1IS0vDpYuXcHD/QSxdvBS9uveCq5srGjdpjAvnL2Dfnn1o064Ndu/drTYFKetGaSIiIqLCxHsUjIREYgbviguyXr2/FgDgXWG+0d7InB/W1tYIaBGAH+f/iHETxuHNmzcIORwienuJRIJq1aphyNAh+PvQ3wCAvXv2AgBsbW1RtVpV3Ll9B3FxcaL6y/qSnpGRobGuTt06ADKfivS+pKQkXLpwCdbW1qhcpbLGegsLC/g18sOU6VOw4KcFEAQBf+/NjPfB/QcAgPYftde4T+HkCeO9L4WIiIiKLyYKRsTBMQhVqm+GpaWb2nJLWVmjfzRqXp0JO4Pk5GSN5VlX6q2srHLc/tGjR3j06JHG8mcxzzS2Hzp8KF6/fo0h/xuCpKQkjW0ePnyo1ldp+9IAgKdPnmq0bdykMcpXKI+D+w8i5B/1ZCb4+2C8ePEC3bpnPn4VyKyNkDUNKafj9PTKvAn89KnTau1u3byFubPnamxPREREVNA49cjIODgGwb5Mp2JVmVmbeT/OQ+jRUDRt3hTlypWDlZUVLl++jKMhR+Fd3huBnwTmuP3VK1fRrXM3NPRtiGrVqsHZxRmRkZH4a9dfkEqlGD7y7aNIvxz0Jc6dPYc/fv8DYafC0Kp1K7i6uuLZs2e4e+cuzp09h3Ub1qFcuXIAgBYtW0AikWDKxCm4dfNWZmXpUnJ8NewrSKVSrP5tNTp+2BGBHQLRuWtneHp64uyZswg9ForyFcrj+9lv74XY8McGrF65Gk2bN0X58uVhZ2eH27dv48DfB2Bvb4/e/XoDyLwRvKFvQ2z7cxuio6Lh6+eLJ0+eYO9fe9G+Q3vs2LZD7+8BERERUU6YKBghicQM8lIBuTcswv43+H+Qy+U4d/YcToSegCAI8PD0wLgJ4/D1qK/V5vhrU79BfYz5dgyOhx7H/r/3Iy4uDi4uLmjVuhVGjxkNv0Z+qrYSiQSrf1uND9t/iDWrM4uaJSYmwsnJCRUrVcTsubPRqnUrVftq1ath1a+rsGjBIvyy5BekpKTAy8sLXw37CgDQpGkTnAg7gVkzZ+GfQ/8gPj4ebm5uGPb1MEyYNEFVbA0AuvXohuTkZISdDsOFcxeQkpKCsu5l8b/B/8PosaNVj5M1MzPDzj07MWn8JBw6eAgXzl9QxdaufTsmCkRERFToJMK7z180UQqFAnK5HDdf3VTdrKpNenI6Eh8lwsvbK9epMUSmKDk5GY8fPoZNORuYW/E6BBERkbFJUCSgRukaiI+Pz/XCLO9RICIiIiIiDUwUiIiIiIhIAxMFIiIiIiLSwESBiIiIiIg0MFEgIiIiIiINTBSIiIiIiEgDEwUiIiIiItLARIGIiIiIiDQwUSAiIiIiIg1MFIiIiIiISAMTBSIiIiIi0sBEgYiIiIiINDBRICIiIiIiDUaXKAQHB6Nhw4awtbWFk5MTgoKCcPfu3Ry3Wbt2LSQSidqPlZVVIUVMuVm3dh1kUhnWrV1n6FAMok3LNpBJZYW2v5nTZkImlSH0WGih7ZOIiAreiQcn0GpZK5x4cMLo9mmI2KjgGV2iEBoaiqFDh+LMmTM4fPgw0tLS0LZtWyQlJeW4nZ2dHaKiolQ/jx8/LqSITcejR48gk8rQsX1HQ4dCRERkUgRBwJwjc3Av9h7mHJkDQRCMZp+GiI0Kh7mhA3jfgQMH1F6vXbsWTk5OuHjxIpo3b57tdhKJBC4uLgUdHukg8JNA+Dbyhaurq6FDMYg1v6/B69evDR0GEREVYccfHMe1qGsAgGtR13D8wXEEVAgwin0aIjYqHEaXKLwvPj4eAGBvb59ju8TERHh5eUGpVKJevXr44YcfUKNGDa1tU1JSkJKSonqtUCj0F3A+hIcDL2Il2a53KCPA07MQA9ITuVwOuVxu6DAMxrMovmlERGQ0BEHA3KNzYSYxQ4aQATOJGeYenYvm5ZtDIsn+e0Nh7NMQsVHhMbqpR+9SKpUYOXIkmjRpAh8fn2zbValSBb/++it2796N9evXQ6lUonHjxnj69KnW9sHBwaovr3K5HB4eHgV1CKKFhwM+VS3QqEH2Pz5VLRAebuhINQ3sNxAyqQwPHjzAwvkLUbtGbdha2WJgv4EAsr9H4fKly+jetTsqelWErZUtyjqVRWPfxpg9a3au+xw0YBBkUhlOHNc+F3LRgkWQSWVYs2qN2vLr167j8x6fw8vNCzYyG1QqVwkjh4/Eixcv1NplTbMa2G8gbt++ja6fdoVrGVfIpDI8evQoT/HndI/CX7v/wkftPoJrGVfYWduhsndl9OvdDzdv3FRrFxsbi29GfoPK5SvD1soW7s7u6Nmtp0a73OzdsxdtW7WFYylHyEvI0aBOAyxasAjp6el5Pn4iIiocWVfsM4QMAECGkKG6cm/ofRoiNio8Rj2iMHToUNy4cQMnT57MsZ2/vz/8/f1Vrxs3boxq1aphxYoVmDlzpkb7CRMmYPTo0arXCoXC4MnCi1gJUpJzzrxTkiV4ESuBp6dxzv0b9fUonDtzDu07tEeHjh3g6OSYbdurV64ioEkAzMzM0CmwEzw9PREXF4c7t+9gzao1GD9xfI776vlFT6z9bS02rt+IZs2baazfuH4jZDIZOnftrFq256896NWtF6RSKToFdoK7uztu376NZUuX4fChwzh55iRKly6t1s/9e/fR3L85fGr64Is+X+Dly5ewtLTMd/wA8O033+KnhT/B3t4eHwd+DEcnRzx9+hRH/jmCuvXqooZP5ojY8+fP0bxxczy4/wABLQLwWbfP8OjRI+zYtgP79+3H3gN70aRpk1z3t2jBIowbMw729vbo1qMbSpYsib179mLcmHE4dfIU/tz+p8bVn+yOn4iICsf7V+yzFOSVe7H7NERsVLiMNlEYNmwY9u7di+PHj8Pd3T1P21pYWKBu3bq4d++e1vUymQwyWeE9hcZU3Lh2A2cvnRU11WbDHxuQkpKCrTu34uPAj9XWvX91X5vmAc3h6emJndt3YtHiRWrv580bN3H1ylV82uVTlCpVStVn/979UaZMGRw9eRReXl6q9n9u/hNf9PwC06dMx6LFi9T2c/rUaUycPBFTpk9RW75o/qJ8xb9v7z78tPAn+NT0waEjh+Dg4KBal56ertbHxHET8eD+A3w7/lvM/OFt4rv/i/0I6hiEL/t/iRt3bkAqzX6A8P79+5g4fiKcnJxw+vxpVWI8Y9YMtG/THn/t+gsb129Ery96iTp+IiIqHO/O/3/Xu1fu9X0/gNh9GiI2KlxGN/VIEAQMGzYMO3fuxJEjR+Dt7Z3nPjIyMnD9+nWTvXnWUEaNGZXn+fjW1tYay9790pwdiUSC7j2749WrV9i/b7/aug1/bAAA9OjVQ7Vs/br1UCgUmPnDTLUkAQA+6/4Z6tari61btmrsx8XFJcfRAV3jX7FsBQBg/qL5Gu3Nzc3h7OwMAEhNTcWWzVvg4OCACZMmqLVr/1F7fNDmA9y/dx+nT53OcX9bNm5Beno6RoweoTZ6JpPJMGv2LADAut81H1+b2/ETEVHBybpiL4H2q/ISSDD36Fy9PmVI7D6VSmWhx0aFz+gShaFDh2L9+vXYuHEjbG1tER0djejoaLx580bVpnfv3pgw4e2XphkzZuDQoUN48OABLl26hM8//xyPHz/GwIEDDXEIJquhb0PRbbt81gVSqRSfffoZ/tf/f9iyaQsiIiLytL+eX/QEAGxYv0G1TKlUYsumzC/W7T9qr1p+7uw51X9nTpup8ZOcnIzY2FjExsaq7aNm7Zpap9rkN/4L5y5AJpOheUD2T/ICgLt37iI5ORkNfBugRIkSGutbtGgBIHMqV06uXLkCAAhooXllp5F/I1hZWeHaFc2rQtkdPxERFbzUjFREKiIhIJvHkkJAlCIKqRmphb7PxNTEQo+NCp/RTT1atmwZgLdfgLL89ttv6Nu3LwAgPDxcbZrFq1ev8OWXXyI6OhqlS5dG/fr1cfr0aVSvXr2wwiYATs5Ootv6+vni8NHDmBM8B5s3bcbva38HADRo2ACzZs9Ci5Ytcu2jWrVqqFe/Hg78fQCvXr1C6dKlEXosFE+fPsWgIYNgYWGhavvy5UsAwPJflufYZ1JSEsqUKaN6nXVlX9/xx8fHo2zZsjlOFwLePpEruzhcXDMfCZygSBDVj7b3SCKRwNnZWWuik91+iYio4MnMZdg7YC9evM5+SmuZkmUgM9ffdGqx+7Szsiv02KjwGV2iIGaI6tixY2qvFy5ciIULFxZQRCRWXm9YatqsKZo2a4o3b97g3Nlz2LdnH1YsW4GgjkG4dP0Sypcvn2sfPT/viTGjxmDbn9vw5aAvsXH9RgDQmGtvZ2cHALh07ZLqJmExcjqm/MRfqlQpREdHQ6lU5pgsZMUdExOjdX1MdOZyWzvbHI8jq59nMc80pl4JgoCYmBhVm3fxJjQiMnYnHpzA1INTMb3ddDQrr/lwi6Jg2allmBc6D2MCxmBIkyFq69zkbnCTuxVqPGL3aYjYqHAZ3dQjMj3W1tYIaBGAH+f/iHETxuHNmzcIORwiattuPbrB3NwcmzZswps3b7Brxy5UqFgBfo381NplTYs6E3bGKOJv4NsAKSkpOB6a8+PjqlStAisrK1w8f1Fr0bbQ0FAAQO06tXPsp06dOpntj4VqrDt39hySk5NRq06tHPsgIjI2xaEisFKpxKITi5CWkYZFJxZBqVQaOiQiFSYKRsKhjACZVc4fcDIrAQ5lit6HoDZnws4gOTlZY3nWlXMrKytR/Tg5OaF129Y4feo0Fi9aDIVCgZ69emq069OvD2xtbTF10lTcunlLY/3r169x9szZQot/8FeDAQDfjPxGNS0qS3p6uqofS0tLdOveDbGxsfgx+Ee1dgcPHMThg4dRoWIFNG7SOMf9deuZmVD9vPBnREZGqpanpqZi4viJAIDefXrn2AcRkbHRVhG4qFl6ainepGXeh/km7Q2Wnlpq4IiI3jK6qUemytMTuHEnrVhWZtZm3o/zEHo0FE2bN0W5cuVgZWWFy5cv42jIUXiX90bgJ4Gi++r1eS8c+PsAZkybAQDo8XkPjTaOjo5Yt3Eden7WEw3qNEDbD9uiSpUqSElJwePHj3Ei9AQaNW6Evfv3Fkr87T9qj1HfjMLC+QtRo3INBAYFwtHJEZGRkTgachQjvxmJr0d+DQCYNWcWjh8/juBZwQgLC4Ovry8eP36M7Vu3o0SJElj166pc73WoUKECZs2ehXFjxqFB7Qbo3LUzSpYsiX179+Hfu/+iU2An9PxcM8EiIjJWxaEisFKpxJJTS9SWLTm1BEObDM31c52oMDBRMCKenjDaYmr69r/B/4NcLse5s+dwIvQEBEGAh6cHxk0Yh69Hfa11vnx2OgV2gp2dHRQKBRr5N0KFChW0tvuow0c4e+ksFs5diCMhRxByOAQlS5ZEWfey6N23d56+KOsj/tlzZ6ORfyMsW7oMO7bvQHJyMlxcXdCiVQu0btNa1c7R0REnz5zEDzN/wN6/9uLUiVOQy+X4OOhjTJoySfQ9FyNHj0SFihXw88KfsWnDJqSmpqJS5UqYM28Ohn09rMj8w0pEBGg+678oPrv/3dGELFmjCsObDTdQVERvSYSiOKFPzxQKBeRyOW6+upnjTaHpyelIfJQIL28v0VNjiExJcnIyHj98DJtyNjC34nUIIioYgiCg05pOuBl9U6MicA2XGtgzYI/RX/xQKpWo9mM1jUQBAKwtrHH729scVaACkaBIQI3SNRAfH5/rhU3+BhIREVGRkjWa8G6SAKiPKhg7baMJWXivAhkLJgpERERUZBiiWrG+abs34X1LTi3hE5DI4JgoEBERUZFhiGrF+paYmojkNM0n570rOS0ZiamJhRQRkXacRExERERFhiGqFeubnZUddvXbhUevHmXbxtveG3ZW4h/sQVQQOKJARERERYqb3A01XWuipmtNxL2Jw4hdIxD3Jk61zNXOVWObEw9OoNWyVjjx4ESOfeu7XXbqutfFJzU/yfanTtk6et9nQfVVEP2ZCmM/b0wUiIiIqEgSW5nZUO30SZ/71Hf8xaFCtiEUhfPGRIGIiIiKJLGVmQ3VTp/0uU99x18cKmQbQlE4b0wUiIiIqMh5tzIzAFVl5vevyhqqnT7pc5/6jt8Q56M4KCrnjYkCERERFTnv11LIroaCodrpkz73qe/4DXE+ioOict6YKBAREVGR8v7V2CzvX5U1VDt90uc+9R2/Ic5HcVCUzhsTBSIiIipSxFZmNlQ7fdLnPvUdf3GokG0IRem8MVEgIiKiIkNsZWalUmmQdvq8GqzPKtT6rmhdHCpkG0JRO2/5ThTS0tIQERGBq1ev4r///kNcXJwewqLiZN3adZBJZVi3dp1B45BJZWjTsk2B7kNfxzqw30DIpDI8evRIP4ERERUTYiszJ6YmGqSdPitC67MKtb4rWheHCtmGUNTOm06VmR88eIDff/8dISEhuHDhAtLS0tTWly1bFgEBAQgKCkJQUBDMzMyy6YmKkkePHqFK+Spo064N9u7fa+hwiIjIBImtzGxnZWeQdvqsCK3PKtT6rmhdHCpkG0JRO28SIQ9jG+fOncPkyZMREhICpVIJCwsL+Pj4wNnZGfb29njz5g1evnyJu3fvIjo6GhKJBE5OThg2bBhGjx4Na2vrgjwWnSkUCsjlctx8dRO2drbZtktPTkfio0R4eXvBysqqECM0DromCvHx8YiKioKrqyvkcnkBRpizO3fuoESJEvD09CywfejrWKOiohAfH48KFSrAwsJCjxEWrOTkZDx++Bg25WxgbqXTdQgiIiIqQAmKBNQoXQPx8fGws7PLsa3oqUfdu3eHv78/rl69imHDhuHkyZNQKBS4ePEi/v77b6xfvx7bt2/H0aNHERkZicePH2PlypWoWrUqpkyZgsqVK+Po0aP5PjgqeuRyOapWrWrQJAEAqlatWqBJAqC/Y3V1dUXVqlWLVJJARES6OfHgBFota4UTD04YZX/0lqmdW9GJwvnz57Fq1SpERERg0aJFaNy4MWSy7IdFPDw8MGDAABw9ehR37txBy5YtERYWppegybhkzad/8OABFs5fiNo1asPWyhYD+w0EkP28/cuXLqN71+6o6FURtla2KOtUFo19G2P2rNm57nPQgEGQSWU4cVz7H+qiBYsgk8qwZtUa1TJt9yjkFjsAHA89jg8CPkBpm9JwLeOKXt174cmTJ2jTsg1kUvW/geyONWvfMTExGNB3ANwc3SAvIUcz/2YIPRaa7TnVdo/CieMn0OWTLvBw8YCtlS0qeFbAZ50/w6mTp1RtIiMjMWPqDDTzbwZ3Z3fYWtmisndlDP9qOJ49e5b9iSUiokIlCALmHJmDe7H3MOfInHzfxKrv/ugtUzy3oucG3L17F+bmuk0lqFSpEtatW4f09HSdtjdFIQ9CMPrAaCz4cAE+KP+BocMRZdTXo3DuzDm079AeHTp2gKOTY7Ztr165ioAmATAzM0OnwE7w9PREXFwc7ty+gzWr1mD8xPE57qvnFz2x9re12Lh+I5o1b6axfuP6jZDJZOjctXO+Yj986DCCOmbeZ9O1W1e4uroi9FgoWjVrhVKlS4nqO0tcXBxaNmsJuVyOnp/3xPPnz7F1y1Z0/LAjzlw4gxo+NXLtY/FPizF29FhYW1sj8JNAeHh4IDIyEqdOnsKObTvQpGkTAMDJ4yexaMEitPygJRr6NoSFhQWuXLmClctX4vChwzh78azBR3iIiOjtozIBqB6NGVAhwGj6o7dM8dyK/uava5Kg7z5MgSAImHxkMu7E3sHkI5PRyrsVJBLtj9EyJjeu3cDZS2dFTe/Z8McGpKSkYOvOrfg48GO1dS9eZH+DT5bmAc3h6emJndt3YtHiRWqjWzdv3MTVK1fxaZdPUapUKZ1jz8jIwNBBQ5GRkYFDRw6pvoQDwIC+A7B+3XpRfWe5dvUaBg0ZhEWLF0EqzRzMa9GyBQZ/ORi/LPkFS5cvzXX7b7/5Fq6urjh68ijKlSunWicIAqKiolSvW7RqgfCocNjY2Kj1sX7degzoOwDLlizLNRkjIqKC9W7hrQwhQ1Vwq3n55jr9u6/v/ugtUz23rKNghA7fP4yLkRcBABcjL+Lw/cMGjkicUWNG5fkeAG03uDs4OOS6nUQiQfee3fHq1Svs37dfbd2GPzYAAHr06iE6Dm2xnzp5Co8fP0aHTh3UkgQAmDZzWp6f5lWyZEn8MOcHVZIAAF/0+QLm5ua4eOFirtuvWrEKSqUS02ZOU0sSgMzz4ebmpnrt5OSkkSQAQK8vesHOzg5HQo7kKXYiItK/9wtv5bfglr77o7dM9dzm6xK/IAjYvXs3rl69isjISI3HpAKZX2DWrFmjZWvSRhAETDs2TS1jnXZsGtpUaGP0GWtD34ai23b5rAsW/7QYn336Gbp+1hUftPkATZs3RdmyZUX30fOLnvhx9o/YsH4Dgj4NAgAolUps2bQFDg4OaP9R+3zFfu1q5vBi4yaNNdZ5eHjAw9MDjx4+Er2PSpUraXx5Nzc3h7Ozs6j6IxfOXwAAtG7bWtT+du3YhVUrV+HKpSt49eoVMjLeVoCMjIwUHTcREenf+1eos+h6pVrf/dFbpnxudU4U7t27h44dO+K///7L8WYOJgp58+5oApCZsWaNKrSt2NaAkeXOydlJdFtfP18cPnoYc4LnYPOmzfh97e8AgAYNG2DW7Flo0bJFrn1Uq1YN9erXw4G/D+DVq1coXbo0Qo+F4unTpxg0ZFCenhikLfYERULmOiftx+Xs7JynRCG7R5CZm5tDmaHMdfv4+HhIJBK4urrm2nbh/IUYP3Y8HB0d0bpta5QtW1Y1erP4p8VITTGOQi5ERKbq3fnu73r3SnVe5r/ruz96y5TPrc6JwtChQ/Hvv/9iyJAh6NGjB1xdXXkPQj69P5qQpaiMKuQ1tqbNmqJps6Z48+YNzp09h3179mHFshUI6hiES9cvoXz58rn20fPznhgzagy2/bkNXw76EhvXbwSQOcUmv7Fn1dTI7ilBMTExedpHfpUqVUp1L0JOIy/p6ekI/j4Yrq6uOHf5nFqiIwgC5s+dXxjhEhFRNrKuUEsg0VqhVwJJnq5U67s/esvUz63O9yicOHECH3/8MZYuXYqmTZuiQoUK8PLy0vpD4mSNJrybJADqowrFkbW1NQJaBODH+T9i3IRxePPmDUIOh4jatluPbjA3N8emDZvw5s0b7NqxCxUqVoBfI798x1Wrdi0AQNhpzcf6Pn36FE/Cn+R7H3nRoGEDAMA/h/7JsV1sbCzi4+Ph5++nMRpy8cJFvHnzpsBiJCKi3KVmpCJSEan1iycACBAQpYhCaoa40V9990dvmfq51XkIwNbWFhUrVtRnLCYtazRBCimU0JyGIoW0SIwqiHUm7Azq1K2jUeE66yq92MrXTk5OaN22NQ7uP4jFixZDoVBgxKgReomxSdMm8PT0xL49+3Am7Awa+TdSrZs+ZbranP/C8L/B/8PqlasxbfI0tGjVQi0JzxppcHNzg5OTE6ytrXH50mW8fv0aJUqUAAC8evUKo74eVagxExGRJpm5DHsH7MWL19k/5a9MyTKQmWdfr6og+6O3TP3c6jyi0KZNG5w+fVqfsZi01IxUPIl/ojVJAAAllHga/7TYZKzzfpwHDxcPfPLxJxj19ShM+HYCPmzzIZb/shze5b0R+Emg6L56fd4LgiBgxrQZAIAen4t/2lFOzMzMsHjZYkilUrT7oB0G9huISRMmIaBJAI4dOYZatWsVatLmU9MH8xbOQ1RUFOr61EXfL/piysQpGDRgEGpUqYH5P2ZOKZJKpRg0ZBAeP3qMBnUaYOzosRg8cDDq1awHqVSq9nQkIiLSjZgKvTm1cZO7oaZrTdR0rYm4N3EYsWsE4t7EqZa52mnejya2P20/7/dnahWGxcjunOT13BYnOo8ozJ07F/7+/hg7dixmzpwp+gowaSczl+H0wNOIfR2bbRvHko7FJmP93+D/QS6X49zZczgRegKCIMDD0wPjJozD16O+zvbGX206BXaCnZ0dFAoFGvk3QoUKFfQW54ftP8S+g/swY+oMbPtzG6ytrdHyg5ZYv3k9AjsE5ilOffhq2Feo4VMDixYswsH9B5GYmAgnJyc09GuILp91UbX7Pvh72NvbY93v67Bi2Qo4Ozvjs+6fYfK0yahXs16hxkxEVNy8X6G3qXdTjQtHYtoURDt9xW9qeE60kwj5qD999+5d+Pv7IyMjA5UqVdL6pUkikSAkRNx8c0NRKBSQy+W4+eqm6gZWbdKT05H4KBFe3l5MjExcQkICPFw84FPTByfPnDR0OEYjOTkZjx8+hk05G5hb8eEGRFQ8hd4PxRcbv1C9/qPnHxpPvRHTpiDa6St+U2NK5yRBkYAapWsgPj4+1wueOv9LfvnyZbRp00b1/PdLly5pbcdsjIqypKQkKJVK2Nq+TSAzMjIwfux4vHnzRqOqNBERFW9iKvSKreKr73b6it/U8JxkT+d7FEaOHIm4uDjMmTMH4eHhSEtLg1Kp1Pgp7Bs+ifTp3n/34OXmhW5dumH82PEYOngo6teuj9UrV6N6jeoY+vVQQ4dIRESFSEyFXrFVfPXdTl/xmxqek+zpnChcvHgR3bp1w9ixY+Hu7g4zMzN9xkVkFNzKuqFz1864cvkKVixbgXVr1yE1NRWjvhmFoyeOomTJkoYOkYiICsm7V57flXUFWhAEUW3E9pWXdvqK39TwnORM56lHdnZ2cHZ21mcsREbH0dERq35dZegwiIjICIip0AtAVBVfsdV+9VkV2JQrDGeH5yRnOo8oBAYG4siRI1AqtT/Ok4iIiKi4eLdCrzZZFXp/PPJjrm2USqWovsS2E3PVW2z8pnQFneckdzonCnPmzIFMJkOvXr0QERGhz5iIiIiIjIqYCr2RikhRVXwTUxP12k5MjSVTrzCsDc9J7nR+PGr58uWRmpqKqKgoAEDp0qWzfTzq/fv3RfcbHByMHTt24M6dO7C2tkbjxo0xZ84cVKlSJcfttm7dismTJ+PRo0eoVKkS5syZg48++kjUPvl4VCL94ONRiag4i4yPzLVCryAIubZxtXMV1Vde2ukr/uJcPEwbUzwnhfJ4VKVSCQsLC3h6eqqWacs58pqHhIaGYujQoWjYsCHS09Px3XffoW3btrh161a2N46ePn0aPXr0QHBwMDp27IiNGzciKCgIly5dgo+PT94OTAzTHYEiyhn/NohIhBMPTmDqwamY3m46mpVvlq92+uwrN25yN7jJc69uL7aNPtuJoc++jEFhvqf63GdRkq+Ca4Xh+fPncHJyQmhoKJo3b661Tbdu3ZCUlIS9e/eqljVq1Ah16tTB8uXLc92H2BEFZZoSivsKlC1bFjZ2Nnk/GKJiLlGRiIiICNhVsIPUQueZjURUjAmCgE5rOuFa1DXUcq2FPQP2ZFuJOLd2+uyLihZDvKfF5fcoLyMKRv8veXx8PADA3t4+2zZhYWFo3bq12rJ27dohLCxMr7FILaSQyqRQxCtM+sYWIm0EQYAiXgGplZRJAhFl692nzOT0rHox7fTZFxUthnhPTfH3SOepR/Hx8Xj8+DEqVqyIEiVKaKxPSkrC/fv3Ua5cuVyzlewolUqMHDkSTZo0yXEKUXR0tMajWp2dnREdHa21fUpKClJSUlSvFQqF6JisHKyQEJUAPAXs5HYwtzBHNjfLE5kGAUhPS4ciXoGEpASUcNX8PCAiAvRbidgQVY3JOBjiPTXV3yOdE4UZM2Zg5cqViIyM1Lo+IyMDTZo0wVdffYU5c+botI+hQ4fixo0bOHnypK5hahUcHIzp06frtK2lnSUAIOllEhIiEvQZFlGRJrWSooRrCdXfCBHR+95/Zn12z6oX006ffVHRYoj31FR/j3ROFA4cOIA2bdrA1lb7nH47Ozu0a9cOf//9t06JwrBhw7B3714cP34c7u7uObZ1cXFBTEyM2rKYmBi4uLhobT9hwgSMHj1a9VqhUMDDw0N0bJZ2lrC0s4QyTQllButIEEnNON2IiHL2/hXZLO9fmRXTDoDe+irOV4OLI0O8p6b8e6RzohAeHo6OHTvm2KZChQo4fPhwnvoVBAHDhw/Hzp07cezYMXh7e+e6jb+/P0JCQjBy5EjVssOHD8Pf319re5lMBplMlqe4tJFa8MsRkalqXL4x3Mu5488jfxo6FKIiQZ+ViAH9Vj+mosMQ76kp/x7p/C1XIpGozfPXJiUlBRkZGTm2ed/QoUOxfv16bNy4Eba2toiOjkZ0dDTevHmjatO7d29MmDBB9XrEiBE4cOAA5s+fjzt37mDatGm4cOEChg0blreDIiKDCjsWBk8zT9VPOYty8HHwQetarTGq7ygcO3CsUB8ksPqn1di6dmuh7U+bpMQkLJyxEP0D+8PX0xeeZp74rNVnBo2JKK/EVsAVW4lYn9WP+XCSosMQlZRNvXqzziMKVatWxYEDByAIgtbhFqVSif379+daKO19y5YtAwC0aNFCbflvv/2Gvn37AsgczZBK3+Y4jRs3xsaNGzFp0iR89913qFSpEnbt2lUwNRSIqMAFdg9Ey/YtIQgCkhKTcP/ufRzafQjb/9iOph80xbI/l0FeSl7gcfz6069wL+eOrn27Fvi+svMy9iUWTl8IR2dH1KxXE7ExsQaLhUhXYivgiqlEHKmIhCAIeq1qLDPP/ywDKnh5qaSsr/fUEPs0JjonCj169MA333yD/v37Y9GiRZDL3/6jHR8fjxEjRuDevXuYN29envoVk5EdO3ZMY1nXrl3Rtavh/jEnIv3xqeeDTz//VG3ZlPlT8MO4H7Bq4SoM7zkc6/5eZ6DoCpeTqxPOPj4LV/fMyqBV7aoaOCKivJOZy7B3wN5cK+DaWdmJaiem+rHYvorjl7viSuzvkT7fU0Ps05jonCgMGzYM27dvx++//47du3ejYcOGKFu2LCIiInD+/HnExcWhefPmnP5DRHphZmaGyfMm48r5Kzh28BjOnTwH36a+AABFvAJLgpdg/479iHoSBRs7GzT9oCnGfj8WXuW9VH1sXbsV3wz4BhsObsD5U+exde1WPI9+jvJVymPY+GH4uPvHqraeZplV558+fqr6fwA4df8UPMq9ffjBvTv38P2Y73H2xFlIpVI0bd0UMxfPhJOLk16OWyaTqZIEoqJMl0rEOVXBzWqz7NQyzAudhzEBYzCkyRCd9vkuU6u8qy+Fdd4MUV26uFW0zgudEwULCwv8888/mDRpElatWqV207KdnR3Gjh2LGTNmwMLCQi+BEhEBQPd+3XH+5Hkc+fsIfJv6QhGvwCdNP0FkeCQ+6/cZKlevjGfRz/DHsj8Q6B+Ivef2wt1L/clpwROC8SbpDb4Y8gWAzARiWK9hSElOUU0zWvT7Isz4Zgbsy9hj2IS3FzwcHB1U/x8dEY1urbqhXVA7fDfnO9y+dhsbVm5AoiIRGw5uULVLS0tDQrz4xynbl8m+wCSRqRAEAXOOzMG92HuYc2QOmno31ZjqrFQqsejEIqRlpGHRiUUY5D9IbWpyQeyTNPG8FV86JwoAYGVlhXnz5mHOnDm4c+cO4uPjUapUKVSpUgVmZmb6ipGISKVqrcypNw//fQgAmD91PsIfhGP36d2oXru6ql3XPl3RtnZbLJi2AAt+W6DWx6vYVzh45SDs5JnFID8f9Dna1WmHGWNmoFO3TrCytsKnn3+KeVPmoYxzGY1pUFke3XuEpZuWotNnnVTLpFIp1i1bh/t376NClQoAgAunLqDbB91EH2N4RrjotkTFlbYquO8/WWbpqaV4k5b5sJM3aW+w9NRSDG82vED3SZp43oqvfCUKWczMzFCjRg19dEVElCNbu8zaLQmKBAiCgF0bd8GvmR9cyrrgZexLVbsSJUugrl9dHD98XKOPzwd/rkoSgMwq670G9cKPE39E2LEwtGzfUlQszm7OakkCADRu2Rjrlq3Dw/8eqhKFarWrqY0wEFHOxFTBVSqVWHJqidp2S04twdAmQ3UaVTDVyrv5xfNWvIlOFLJ7ulFe6KMPIjJtCYrMKTy2drZ48fwFXr14heOHj6OOcx2t7bV9YahUtZLGssrVKgMAwh+Kv5rvWd5TY1lph9IAgFcvXqmWlSpdCs1ac64zkVhiquC+O5qQJT+jCqZaeTe/eN6KN9GJgo+PD6ZNm6bTk4WePHmCWbNmoVy5chg/fnyetyciynLn2h0AQPkq5VVPSWv6QVMM+XZITpsViBynWL7zALfU1FTEvYwT3a++boQmKorEVMEVBEFjNCGLLqMKplx5Nz943oo/0YlCpUqV0K1bN4wbNw5ffPEFunTpAh8fn2x/AV68eIHDhw9j/fr1OHz4MOzt7fHHH3/oLXAiMk2bf9sMAGj1USs4ODrArpQdEhMS83TF/r87/6FtYFu1Zf/e/hcA4On9dpRAX//AXTx9kfcoEIkkpgrutchrGqMJWXQZVTDlyrv5wfNW/IlOFHbt2oXQ0FBMnjwZM2fOxPfff4+SJUuiTp06cHZ2RqlSpZCcnIyXL1/i7t27ePgw80bD0qVLY9y4cfj2229hY2NTYAdCRMVbRkYGgscH4/zJ82jVvhUaNmkIAPik5yf4/ZffsW/bPnTo0kFju9hnsSjjVEZt2frl6/HF4C9U9yko4hXYsGID7ErZoVFAI1W7EjYl8jQSkB3eo0AkzrtVcLUVuMqqgvvv839z7Ccvowpi98mr4+p43kxDnm5mDggIwPHjx3Hz5k389ttvOHLkCE6fPg2lUqnWzsHBAYGBgfjkk0/w2WefQSYrnkUoiKhg3Lh0AzvW7wAAJCUk4f6/mZWZnz5+iuZtmuPnDT+r2o79fiwunL6Ar7p/hY5dO6Juo7qwtLTE08dPcXT/UdSsV1PjqUely5RGoH+g6lGoW9duRUR4BH5c+SOsS1ir2tX1q4stv27BvCnzULFqRUilUrTu1BolSpbI0/Hk9x6FtUvXQhGnAACkp6Uj4nEEfp6VeQ6q1aqGNp3a6Nw3kTERUwU3Mj4SyenJOfaTnJaMxNRE2FnZ5dhO7D6Lc+VdXfG8mQadnnpUo0YNVcXlpKQkREZG4sWLF7C2toajoyPc3EyzKAUR6cfuzbuxe/NuSKVSlLQpCRd3F/g198MP3X9Aiw9bqLW1k9thx4kdWLlgJfZu3YtDfx2Cubk5XN1d0aBJA/QY0EOj/wnBE3Du5Dms+2UdYmNi4V3ZGz//8TOCegaptfv2+28R/zIev//yOxRxCgiCgFP3T+U5UcivlfNX4unjp6rXTx49wbwpmZ/BXXp3YaJABhURboaXsdlfubcvo0RZz4xs179LbBXcaEU0Hr16lG0bb3tvUUlCXvbJL7vqeN5Mg0TIuhvQhCkUCsjlctx8dVP16EUiKn6yKjNvCdkC/xb+hg6HqMiLCDdDi2quSEn+/6klTX4EWk4Gjs4ETn0LAJBZCTh2O0otWcipmnJeGXMlZbHHqe9j0Gd/hji/xvyeFgcJigTUKF0D8fHxsLPLOaHWvXwhERERmbSXsdK3SQKUQMB0wDw187/InJackixRG3F4v5ry+9OX8+L9isDGdO1T7HHq+xj02Z8hzq8xv6emiIkCERER5V/TYMDydeb/W77OfK2FtmrKutJWEdhYiD1OfR+DPvszxPk15vfUFDFRICIionxSAs1/eFs/REDma6hfRc+umrIuowrvPsMfePvsfmO4Ai32OPV9DPrszxDn15jfU1PFRIGITEbXvl0RnhHO+xOI9C1rNCFrFpIEWkcVcqqmnFdZV56zCn29++x+QxN7nPo+Bn32Z4jza8zvqaliokBERET58N5oQpb3RhW0XWXPktdRhfevPGcxhivQYo9T38egz/4McX6N+T01ZUwUiIiISHfvjyZkeW9UQdtV9ix5HVV4/8pzFmO4Ai32OPV9DPrszxDn15jfU1PGRIGIiIh0olRmM5qQ5f9HFdLT07O9yp5F7KjCuxWBtcmqCGyIK9A5jSZkWXJqCTIyMvR6DPo8J4Y4v8b8npq6fNdRSE9Px927dxEXF4eMDO0FVZo3b56fXRS4rDoKTq5OuZZ796nrg193/6q2rH9gf9y4fCPX/Xw56kt8OepL1evEhES0qtFKVIyrd65Grfq1VK//2fsPvvvqu1y3K2lTEkdvHVVbNuvbWdi9eXeu27b6qBVmL5+ttqyDbwc8j36e67bfzf5OrXjV/bv30aONZuErbfac3QNnV2fV6w0rN+Cn73/Kdbvylctj8z+b1ZZ9/fnXOHP8TK7b9hjYA6OmjFJb5uvpKyren9b9pDbnPexYGEb0HiFq23Ph59ReL5yxEJtWb8p1u0bNG+Hn9T+rLeveujse/Psg121HTBqBXv/rpXodExWDTn6dRMW76fAmVKhSQfV618Zd+GH8D7lu5+jiiH3n9qktGz94PI78fSTXbQO7B2LijxPVlrWs3hJJiUm5bvvDLz+gdcfWqtfXLl7DwE8G5rodABy5eQQ2tjaq16sWrsKqhaty3Y6fEfyMeF9x/oxITxcQ+zrm7YI+AMq80+AagMOAg7UTXrx5lv1ObQDJIAmuj72uKpSW3WeEAAHPE5+/TSpqAmir3sZsqRnKWJbJ9otnFn1/RqxcsBIxCTE5bAXAFbh0/hLarmyL2KTYzGUbAUSpN5NKpXC0cVQ7huw+IzTOiRal+pfC+R/PqwqgZfcZodGXJYDh6m2sj1rD7p5drudX7GeE1vjbAHj7kYbSSaVhudEy130C/IzI7TNCqVTiWdQzUXUUdKrMDGRmf1OmTMHixYuRkJCQY9vsEghj8ywqhw+x/+fmoVl1+mXsS0RHROe6bYJC/TwJgiBqOwBIS01Te538JlnUtu9+iGWJfxUvatu4l3Eay55HPxe17ZvX6sOu6enpoo9VmaH+Qfc66bWobW3lmsXyRL838Zq/w2LjTU1J1XgtdlttcYjZ9mXsS41lz2PEvTevk16rvVZmKEXHm56ervb6zes3Oh9r3Ms4UdvGv4rXWBYTGYPEhMRct01+k6z2Oi01TXS8719DSVCIe2/4GcHPiPeZ0mdE38oTUcbTVfX62vPTOJSwES8Scv73VW4txx/9/4CdlZ2q0vPjBwpR+23r2RYjBqp/qeo6vytinufyhR36/4yIicx9n1UqVUEZmzJqVY2/+esb3Em4o9ZOCSVi4tX7y89nxLyP5qlVSRb7GWFtY41tA7epLVtxfwX+Cv0r123z8xnxdaOv0a5nO9VrRbgCPeaKu5jAzwjdttVG50Rh5syZmDVrFkqVKoXevXvD3d0d5uY6d2cUxIwo2Jex17rMpaxLrv2/X/VZIpGI2g4ALCwt1F5bWVuJ2rakTUmNZfLSclHblrIvpbHM0cUx1+0AwLqEtdprc3Nz0ccqNVN/D0qULCFqW0dnzdhEvzdaPhzExmsps9R4LXZbbXGI2Vbb76Gjs6PWD6r3lShZQu211EwqOt73/8atS1iLe2+0/N6Usi8lalt5abnGMmc3Z9gkan7BfZ+VtZXaawtLC9HHKpGoX7WytdP9veFnhCZ+RhT8Z8T71W0L4zOiT+vW6qOOCUpc25X7yKGjiyPqlK3zXqVnNwBls2mfAbP/v+fVu6w3arrWVFvv6uYqatTREJ8RHm4eAAA3uRvc5JkXFtzd3BEXE5frtvn5jHAprd4uL58RGufXybXAPyMqulZU2+99xX1+Rogg5jMia0RBDJ2nHpUrVw4SiQQXLlyAg4ODLl0YjaypR9euxcPWNuchGCIiImMnCAKC9vnh2ovzqOXQELs6nNX4YmuMbtwAOomYCblnD+DjU/DxEBVHCQkK1KolFzX1SOebmaOjoxEUFFTkkwQiIqLi5njkIVx7cR4AcO3FeRyPPGTgiIioKNI5UfD29oZCodBnLERERJRPgiBgweXJkP7/8+ilEjMsuDyZT4whojzTOVEYMmQI9u7di2fPxM1xIiIiooKXNZqg/P/n0SuFDI4qEJFORN99HB4ervY6MDAQJ06cQOPGjTFlyhTUq1cv23lOnp6e+YuSiIiIcvXuaILyncJVWaMKzd3aFol7FYjIOIhOFLJuXn6fIAjo169ftttJJBKNRyoSERGR/r17b8K73h1VCCjbTsuWRESaRCcKvXv35lUIIiIiI5U1miCBFAI0C29JIOWoAhHliehEYe3atQUYBhEREeVHqjIVkUnhWpMEABCgRFTSE6QqUyEzk2ltY2ilSwMyGZCSkn0bmSyzHREVPJ0rpIWHh6NUqVI5Pn81ISEBr1694j0KREREBUxmJsOKBucR/uJ5tm28HJxEJwkREcCrV9mvL10aKKu9HprOypYFQkJy3y+QWXOhMGMjMkU6Jwre3t6YOnUqpkyZkm2bn3/+GVOmTEFGRka2bYiIiCj/IiKAnh08kJLikW0bmSzzi3huX6IjIoAPPsj9yr6YvvKqbNmc+zRkbEXFych/MP3c15jq+zOaurU2dDhUhOn8eFQxz2PmM5uJiIgKx6tXOX95BjLX53S1viD60jdjjs0YCIKAuZe+w73425h76Tt+F6N80TlREOPp06ewtbUtyF0QERER0f9jVW7SpzxNPZoxY4ba62PHjmltl5GRgSdPnmDz5s1o1KiRzsERERERkTjv19Fg/QzKrzwlCtOmTVP9v0QiwbFjx7JNFgDAzc0Nc+bM0TU2IiIiIhLp/ToarJ9B+ZWnROHo0aMAMjPWVq1aoW/fvujTp49GOzMzM9jb26Nq1aqQSgt0dhMRERGRyWNVbioIeUoUAgICVP8/depUtGzZEs2bN9d7UEREREQkHqtyU0HQ+fGoU6dO1WccRERERKQDVuWmgiI6UTh+/LjOO+GoAxERUcHSZ1VjY66QbMyxGUpxqMpNxkkiiHzArlQq1TkLNfaCawqFAnK5HNeuxcPWNvtK00RERMZMn9WUDVGZWSxjjs1QIpOe4GVy9lW5Hayc4FrSvRAjImOVkKBArVpyxMfHw84u5++9okcUpkyZopEonDlzBgcPHkSlSpXQpEkTODs7IyYmBqdPn8a///6Ldu3a5fnxqMePH8fcuXNx8eJFREVFYefOnQgKCsq2/bFjx9CyZUuN5VFRUXBxccnTvomIiPTFEF9md+8GbtzIfr2PD/DVV+Ji07eLF4EnT7Jf7+EB1K8vrq/cqjebIreSHnArmX1VbiJdiE4U3n00KgCcOHECwcHBWLlyJQYMGKCWRAiCgFWrVmHEiBGYOHFingJKSkpC7dq10b9/f3z66aeit7t7965aVuTk5JSn/RIREelLRATwwQe5T48JCdHfF95ffgHmzs25zf79gEIBrF2bc2yWlpn/TU3Nvk1e4r94EejSJfd227apJwsnI//B9HNfY6rvz2jq1lrrNmLaEJFudH526eTJk9GhQwcMHDhQY6RBIpHgf//7H9q3b4/Jkyfnqd/27dvj+++/xyeffJKn7ZycnODi4qL64WNZiYjIUF69yvmLOJC5Pqer+nmV00jCu65fzz221NSckwQgb/HnNJKQXTtBEDD30ne4F38bcy99B20zpcW0ISLd6fxt+uLFi6hWrVqObapVq4YLFy7ouos8qVOnDlxdXdGmTRucOnWqUPZJREREBePdx31mPd5TlzZEpDudEwVLS0tcvnw5xzaXL1+GZdb4ZQFxdXXF8uXLsX37dmzfvh0eHh5o0aIFLl26lO02KSkpUCgUaj9ERERkHN4tHga8LRr27oiBmDZElD86Jwpt27bFgQMHMHv2bKS+Nz6ZmpqK4OBgHDx4EO3aFWxxjypVqmDQoEGoX78+GjdujF9//RWNGzfGwoULs90mODgYcrlc9ePhwZt/iIiIjEXWSEFWheF3i4blpQ0R5Y/OicLcuXPh6uqKiRMnwsvLC506dcKAAQPQqVMneHl5YdKkSXBzc8OPP/6oz3hF8fX1xb1797JdP2HCBMTHx6t+noidPElEREQF6v2RgizvjhiIaUNE+adzZWZ3d3dcuHAB48ePx59//ol9+/ap1llZWeGLL77A7NmzDfKI0itXrsDV1TXb9TKZDDIZC44QEREZm3fvO3jX+yMGubUJKFuwMxqITIHOiQIAuLi4YO3atVi1ahXu3r2L+Ph4yOVyVK5cWed7ExITE9VGAx4+fIgrV67A3t4enp6emDBhAiIiIrBu3ToAwKJFi+Dt7Y0aNWogOTkZq1evxpEjR3DoEIceiYiIipKskQIJpFqrDEsgxfxLkyCRIMc2Cy5PRnO3tjoXiiWiTPlKFLJYWFjAx8dHH13hwoULagXURo8eDQDo06cP1q5di6ioKISHh6vWp6am4ptvvkFERARKlCiBWrVq4Z9//tFahI2IiKgwlC6dWWcgtzoK+ixs5uOTWSchNzVrZtY10EcdBbHxi70V0NU9FZEPwrUmAAAgQImopCcQJEKubVKVqZCZcfYAUX5IBE7kg0KhgFwux7Vr8bC1zbmUNRERFS2GqJCs7/2KrWr8yy/iKjOL6e/5c+C//7JvU6kS8OGH4o9T7DFEJj3By+Tn2bZzsHKCACHXNq4l3bPfGZEJS0hQoFYtOeLj49WKFWsjOlFo1aoVJBIJfv/9d7i7u6NVq1aigpFIJAgJCRHV1lCYKBARFU+GqJCsb7pWNc6OmHNiYQGkpeXe17JlwMiRRfv8GgNWl6bClJdEQfTUo2PHjkEikeD169eq12JwfiARERlKXiokG+sX2bxUNRaTKIg5J2KSBCBzxKGon19De7+6dBPXD/jdiYyG6ERBqVTm+JqIiIiI8kZbdWk+sYmMhc51FIiIiIhId6wuTcZO50SBRcqIiIiIdMfq0mTsdE4UvLy8UKlSJXz55ZfYsGEDIiMj9RkXERERUbHF6tJUFOicKPTu3RtpaWlYs2YNevfuDQ8PD1SpUgWDBw/G5s2bERMTo884iYiIiIqN90cTsnBUgYyJzonC2rVr8ejRI9y/fx+rVq1Cjx498Pr1a6xcuRI9e/aEm5sbqlevjqFDh+ozXiIiIqIi7d0K1NpkVZfmqAIZWr5vZvb29kb//v2xfv16PHnyBP/++y/mzJmDMmXK4M6dO1i+fLk+4iQiIsqzrArJOdF3hWR9E1vVWGw7MefEwkJcX5UqFf3zawipylREJuVegTpVmUNpbKJCIPrxqDl5/fo1Tpw4gaNHj+Lo0aO4fPky0tPTUbJkSTRp0kQfuyAiomKgsKskly2bWexLzD4PHBBXiVhshWEx7QBxfS1blnts9euLP78bNugvNrHnl96Smcmwu+P5XKtLy8xyycKICpjoyszvO3LkiCoxOH/+PNLS0mBlZQV/f3+0atUKLVu2hK+vL8zN9ZKLFChWZiYiKnjGXCX5wAFgyJDc240dC8ydm3u7WbOAiRPzHxcgvvrxhg1Ar176a8dqykTFU4FUZn5f69atIZFI0KhRI0yYMAEtW7aEv78/LC0tde2SiIiKMWOukpzT1fp33bghrt2tW7rH8j6x1Y+fPNFvO1ZTJqJ8Xe4XBAHXr1+HXC6HjY0N7OzsUKdOHZYeJyIiIiIq4nROFF68eIHQ0FDV9KNx48YBAORyOQICAlTTj3x8fPQWLBERERERFQ6dE4XSpUsjKCgIQUFBAIDY2FgcPXpUlTz89ddfAABHR0dER0frJVgiIiIiIiocervTuEyZMmjWrBnS09ORnJyM2NhYPH/+HM+fZ39HPxERERERGad8JQqxsbE4duyY6glI//77L4DMexdcXFzQo0cPtGzZUi+BEhERERFR4dE5UahVqxZu3rwJIDMxcHR0RJcuXdCyZUu0bNkSVapU0VuQRERERERUuHROFCIiIhAUFKRKDGrUqKHPuIiIqJjJqgic2/P7DVHFt1Ilce18fID9+3NvV716/uJ5V1b149zOm4eHftuxmjIR6VxwTRCEYvMYVBZcIyIqHIVdmTkv+9y4Mef6B9WrAz17iq/MLKbSs6Oj/qo856Uys5h2ACsuExVHeSm4pnOiUJwwUSAiKp7EVoPWd7VifVahNkRFa2Ouok1E+ZOXREFaSDEREREVOrHVoPNSrVif+xXTnz77EssQ+yQi48NEgYiIiIiINDBRICIiIiIiDUwUiIiIiIhIAxMFIiIiIiLSwESBiIiIiIg0MFEgIiIiIiINoiszS6VSnQqsSSQSpKen53k7IiKi/BJbDVrf1Yr1WYXaEBWtjbmKNhEVHtGJQvPmzYtNJWYiImNjiIrFxYGY87Zhg7iqxiEh+nsPypbVX3/67EssQ+yTiIwPKzODlZmJyLBYBVc3Ys6bpWXmf1NTs2/Dc0tEpoSVmYmIihBWwdWNmPOWmppzkgDw3BIRZYeJAhERERERaRB9j0J2wsLC8M8//yAyMhIpWi7tSCQSrFmzJr+7ISIiIiKiQqRzopCeno4ePXpgx44dEAQBEokE797ukPWaiQIRERERUdGj89Sj+fPnY/v27ejXrx8uXLgAQRAwcuRIhIWFYc6cOShVqhS6du2K+/fv6zNeIiIiIiIqBDqPKGzYsAE+Pj5YvXq1almpUqXg5+cHPz8/fPTRR/D19UWrVq0waNAgvQRLRERERESFQ+cRhXv37qFFixaq1xKJBGlpaarXNWrUQKdOnbBs2bJ8BUhERERERIVP50TB0tISJUqUUL22sbHBs2fP1Np4eXnhv//+0z06IiITkFUFNyesgqtJzHmztHxbSyE7PLdERNrpPPXIw8MDT94pdVm1alUcP35cdQMzAJw5cwb29vb5j5KIqBgzVBXcixfFVSwu7L4A8ZWqxZw3QFxfYvfJKtpEZCp0ThQCAgKwe/duVWLQrVs3jBkzBh07dsRHH32EkydP4uTJk+jfv3+e+j1+/Djmzp2LixcvIioqCjt37kRQUFCO2xw7dgyjR4/GzZs34eHhgUmTJqFv3766HhpRkeXtLVF7bW5uDltbOZycXOHjUx8ffNAJbdoEwtw8309GLlBNm5ZDRMRjPHxomMLxyclv8MsvwdizZzMiI8NRqpQ9AgI+xOjRM+HiUjDfAMuWLdwvlxcvAl265N5u27bcv+Drsy8g75WqxZy33NqI3eeGDUCvXqyiTUSmQeepR/3790fHjh0REREBABg+fDg6duyI/fv3Y/jw4diyZQsaNmyI2bNn56nfpKQk1K5dG0uXLhXV/uHDh+jQoQNatmyJK1euYOTIkRg4cCAOHjyY52MiKi46d+6Dzp37oFOnHqhfvwnS09OxY8c6fPVVF7RpUw1XrpwzaHze3hI0bVrOoDFkJyUlGT17tsLixTPx+nUi2rQJhKurB7Zu/Q0dO9ZFePgDQ4eoFzld/c9rO332BRimUrXYfT55wiraRGQ6dL6sWK9ePbUblS0sLPDXX3/hwoULuH//Pry8vODr6wupNG+5SPv27dG+fXvR7ZcvXw5vb2/Mnz8fAFCtWjWcPHkSCxcuRLt27fK0b6LiYt68tRrLHj++j7lzv8O+fX+iZ8+W2LbtFKpXr1PosRm7xYu/x+XLZ1Cvnj/WrTuEkiVtAACrVy/ArFnf4Ntv+2Pz5mOGDZKIiKgQ6DyikJ0GDRqgW7duaNSoUZ6TBF2EhYWhdevWasvatWuHsLCwbLdJSUmBQqFQ+yEq7ry8KmDJki347LMBePPmNb79Nm/TAk1Bamoq1q1bAgCYMWOpKkkAgIEDR6Nq1Vo4ezYU169fNFSIREREhUbnb/JmZmaYOXNmjm1mzZpV4HOho6Oj4ezsrLbM2dkZCoUCb9680bpNcHAw5HK56sfDw6NAYyQyJhMnzkeJEiVx8+ZlnD9/UmN9ZOQTTJkyDAEBFVClihXq1LHHgAEdcfHiaY22Z84cg7e3BGPG9MWzZ1EYM6YvGjRwRtWq1ujYsR62b1+n1n7btrWq+ygiIh7D21ui+unevYXWeDdvXo0PP6yFqlWt0bChC777bhAUirh8nwdtLl48hYSEeHh5VUCNGnU11rdvnzkRPyRkT4Hsn4iIyJjonCgIggBByP1GQzFtCtuECRMQHx+v+nkiduIsUTFgZydHQEDm9L6wsKNq6y5dCsNHH9XGH38shbm5BVq16oDKlX1w/PhBdOvWHHv3btHaZ1zcS3zySSOEhh5Ao0Yt0LBhM9y9ex1jxvTBokXTVO28vCqic+c+AIASJUqq7qXo3LkPAgI+1Og3OPhbTJ06FE5OrmjRoj0EQcCmTSsxcODHBfLZcvv2VQBAjRr1tK738clcfufONb3vm4iIyNgU6OX+58+fw9rauiB3ARcXF8TExKgti4mJgZ2dXbb7lslkkOX28G2iYqx69TrYv38b7t+/rVqWkKDAkCGdkZiowMKF6xEU1Eu17tq1C+jduy3Gjx8If/9WcHBwVOsvJGQPmjZtgxUrdqJEiZIAgKtXz6NXr8ybglu3/hg+PvXQsGFTNGzYFNu3/47SpctovZfiXTt3/oG//76GChWqAABevoxF587+OH/+BMLCjqJx41aqttu2rcXYsf3ydB78/ALU7jeIjAwHALi6umtt7+KSuTwi4nGe9kNERFQU5SlRWLdOfRrBlStXNJYBQEZGBp48eYJ169bBx8cnfxHmwt/fH3///bfassOHD8Pf379A90tUlNnblwEAxMe/fTTL1q2/4tmzKAwc+I1akgAAtWo1wPDhk/H996Oxa9d6DBgwSm29VCrFtGmLVUkCANSu3RBffDEUy5fPwR9//II5c1bnOc7Ro2eqkoSsuHv2HIwffhiDc+eOqyUK745WiFWhQlW110lJiQAAK6sS2pqrji8xMSFP+yEiIiqK8pQo9O3bV1VMTSKRYPfu3di9e7dGu6wpAdbW1pg2bVqeAkpMTMS9e/dUrx8+fIgrV67A3t4enp6emDBhAiIiIlQJyuDBg7FkyRJ8++236N+/P44cOYI///wT+/bty9N+iUxJ1t9o1t8zAJw4cQgA8OGHn2rdpmHDZgCAq1c1H61avXodtS/0WTp16oHly+fg/PkTOsXZrFlbjWXe3pUBAM+eRb0XX+ZoBYkj9tYsMe302RfwtuJybrUK9FlNWew+PTwKPzYiIkPJU6Lw22+/Acj8ktG/f38EBQUhMDBQo52ZmRns7e3h7++P0nn8tLxw4QJatmypej169GgAQJ8+fbB27VpERUUhPDxctd7b2xv79u3DqFGj8NNPP8Hd3R2rV6/mo1GJcvDyZSwAQC5/Wzn96dNHAIAuXZqI2vZdZct6aW3r7l4OAPDsWaQOUWqfAmRjYwsASE3N5WH2Osh6ylFy8mut61+/TlKLoSirXz+zAJo+qinrsy/AMJWq87JPQ1TRJiIyhDwlCn36vB3WDw0NxSeffIKPP/5YrwG1aNEix5sU165dq3Wby5cv6zUOouLs1q3Mv5dKlaqrlimVSgCZT/Z5dwrR+96frlOQ8vKI5fPnT2LLlrxNb6pQoSqGDBmveu3m5gkAiIp6qrV9dHTm8uwSo6Kmfn3xX94Lsy+g8CtV52WfhoiNiMgQdL6ZOWt0gYiKFoUiHsePZ1Yu9/d/O3rn6uqOBw/uYsiQ8ahZM2/f+LK7uTdruZOTm47Rivf48T1s3/57nrbx8wtQSxSqVasNALh585LW9jduZC6vWrWWjlESEREVHfl+6tHOnTuxadMm3LlzB69fv1bdX3Dnzh389ddf6NWrF8ry0guR0Zg16xu8fp2EWrUaol69tzf9N23aBqdOheDgwZ15ThRu3bqChw//g7d3JbXle/duBgCNewcsLCyQkZGu4xFo16VLX3Tp0jdffdSv3wS2tnI8fnwft25d0ahcvX//NgDABx90ytd+iIiIigKd6ygolUp069YNXbp0wfbt2/HgwQM8fPhQtb506dKYOHGi1qciEVHhCw9/gGHDuuHPP9egRImSmDNnjdr6nj0HwcHBCStX/oiNG1eqpiJlSU9PR2joQdy9e0Ojb6VSiWnThuPNm7dz+69fv4h165ZAIpGgV68hau2dnNwQGxtTYIXTdGVpaYnevYcBAKZMGaq6JwEAVq9egDt3rsHPLyDPiRQREVFRpPOIwsKFC7F161YMHjwYs2fPxoIFC9QqNTs7O6NZs2bYt28fJkyYoJdgiUicMWP6Asj8Ap+YqMDDh//i/v07EAQB5cpVwk8/bUTVqjXVtrGzK4VVq3Zj4MBOmDhxEJYu/R6VK/tALi+N58+jcePGJSgUcVixYieqVFF/7HGrVh1x585VBARUgK9vcyQkxCMs7AjS0tIwbNgk1KrVQK1969Yf4/ffF6Njx3qoV68xZDIrlC9fBYMGjS3Q8yLG8OGTcOrUP7h48TRatqyEhg2bISLiMa5cOQsHB0f8+OOvhg6RiIioUOicKKxduxYNGzbEL7/8AkD9MYtZKlasyMeUEhlA1lx9c3Nz2NjYwdnZDZ9+2htt2gSideuPYWZmpnW7unUb4cCB61izZiGOHt2Hs2dDAQBOTq7w8wtAu3afoEmT1hrblS7tgB07zmD27HE4ceIgEhIUqFixOvr3H6l1OtC33wZDEAT8889u7Nu3Benp6fDzCzCKREEms8KmTUfxyy/B+OuvjTh8eBfkcnt06dIXo0fPzLYYGxERUXEjEXJ6xFAOrK2tMXToUMybNw8AMH36dMyYMQMZGRmqNhMmTMDChQuRnJysn2gLiEKhgFwux7Vr8bC1tTN0OERFxpkzx9CjR0t07twn1yrLREREZHgJCQrUqiVHfHw87Oxy/t6r8z0K1tbWiI+Pz7HN48ePUapUKV13QUREREREBqJzolC3bl0cPHgw29GCly9f4sCBA2jUqJHOwRERERERkWHonCh8/fXXePr0KTp37oynT9WLE92/fx+ffPIJ4uPj8fXXX+c7SCIiIiIiKlw638wcGBiIcePGYc6cOfDy8kLJkpmVXJ2cnPDixQsIgoDJkyejVatWeguWiIxLo0Yt8PChTrc5ERERkZHTeUQBAIKDg3Hw4EF07NgRJUqUgJmZGZRKJT788EPs378f06dP11ecRERERERUiPJdmblNmzZo06aNPmIhIiIiIiIjkecRhbCwMLRq1Qq2traws7NDmzZtcO7cuYKIjYiIiIiIDCRPdRSuX78OPz8/jScdWVtb49y5c6hRo4beAywMWXUUXF2dIZXmazYWEREREZHRUiqViIqKEVVHIU9Tj2bPno3k5GRMnDgRw4cPBwAsXboUM2fOxJw5c7Bu3TrdozYCUVExhg6BiIiIiMgo5GlEwdPTE+XKlcPx48fVlgcEBODRo0d4/Pix3gMsDBxRICIiIiJTUGAjCjExMejevbvGcj8/P5w9ezZvURqhW7dOwM7O1tBhEBEREREVCIUiAaVLVxbVNk+Xz9PS0mBjY6OxvGTJkkhLS8tLV0REREREZMQ4z4aIiIiIiDTkuY7C+vXrcebMGbVl9+7dAwB89NFHGu0lEgn27dunY3hERERERGQIebqZWZcbfSUSCTIyMvK8XWHKupn51at/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": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<sklearn.tree._tree.Tree at 0x7ff2b69b1220>"
+ ]
+ },
+ "execution_count": 32,
+ "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": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5"
+ ]
+ },
+ "execution_count": 33,
+ "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": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree.max_depth"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree.max_n_classes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree.n_features"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1"
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree.n_outputs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "np.int64(3)"
+ ]
+ },
+ "execution_count": 38,
+ "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": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0.66666667, 0. , 0.5 , 0.16803841, 0.04253308])"
+ ]
+ },
+ "execution_count": 39,
+ "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": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(np.int64(1), np.int64(2))"
+ ]
+ },
+ "execution_count": 40,
+ "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": 41,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(np.int64(-1), np.int64(-1))"
+ ]
+ },
+ "execution_count": 41,
+ "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": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1, 3, 4])"
+ ]
+ },
+ "execution_count": 42,
+ "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": 43,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0, -2, 1, -2, -2], dtype=int64)"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree.feature"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And the corresponding thresholds are:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 2.44999999, -2. , 1.75 , -2. , -2. ])"
+ ]
+ },
+ "execution_count": 44,
+ "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": 45,
+ "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": 45,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree.value"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([150, 50, 100, 54, 46], dtype=int64)"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree.n_node_samples"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "np.False_"
+ ]
+ },
+ "execution_count": 47,
+ "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": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0., 1., 1., 2., 2.])"
+ ]
+ },
+ "execution_count": 48,
+ "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": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1], dtype=int64)"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree_clf.tree_.feature[(depth == 1) & (~is_leaf)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1.75])"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tree_clf.tree_.threshold[(depth == 1) & (~is_leaf)]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Lab Session \n",
+ "## _Exercise 1: train and fine-tune a Decision Tree for the moons dataset._\n",
+ "- a. Generate a moons dataset using `make_moons(n_samples=10000, noise=0.4)`. (Remember Adding `random_state=42` to make this notebook's output constant)\n",
+ "- b. Use grid search with cross-validation (with the help of the `GridSearchCV` class) to find good hyperparameter values for a `DecisionTreeClassifier`. Hint: try various values for `max_leaf_nodes`.\n",
+ "- c. Train it on the full training set using these hyperparameters, and measure your model's performance on the test set. You should get roughly 85% to 87% accuracy.\n",
+ "\n",
+ "## _Exercise 2: Grow a forest._\n",
+ "- a. Continuing the previous exercise, generate 1,000 subsets of the training set, each containing 100 instances selected randomly. Hint: you can use Scikit-Learn's `ShuffleSplit` class for this.\n",
+ "- b. Train one Decision Tree on each subset, using the best hyperparameter values found above. Evaluate these 1,000 Decision Trees on the test set. Since they were trained on smaller sets, these \n",
+ "- Decision Trees will likely perform worse than the first Decision Tree, achieving only about 80% accuracy.\n",
+ "- c. Now comes the magic. For each test set instance, generate the predictions of the 1,000 Decision Trees, and keep only the most frequent prediction (you can use SciPy's `mode()` function for this). This gives you _majority-vote predictions_ over the test set.\n",
+ "- d. Evaluate these predictions on the test set: you should obtain a slightly higher accuracy than your first model (about 0.5 to 1.5% higher). Congratulations, you have trained a Random Forest classifier!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<style>#sk-container-id-8 {\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-8.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-8.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-8 {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-8 pre {\n",
+ " padding: 0;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-8 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-8 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-8 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-8 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-8 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-8 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-8 div.sk-parallel-item {\n",
+ " display: flex;\n",
+ " flex-direction: column;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-8 div.sk-parallel-item:first-child::after {\n",
+ " align-self: flex-end;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-8 div.sk-parallel-item:last-child::after {\n",
+ " align-self: flex-start;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-8 div.sk-parallel-item:only-child::after {\n",
+ " width: 0;\n",
+ "}\n",
+ "\n",
+ "/* Serial-specific style estimator block */\n",
+ "\n",
+ "#sk-container-id-8 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-8 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-8 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-8 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-8 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-8 label.sk-toggleable__label-arrow:hover:before {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "/* Toggleable content - dropdown */\n",
+ "\n",
+ "#sk-container-id-8 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-8 div.sk-toggleable__content.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-8 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-8 div.sk-toggleable__content.fitted pre {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-8 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-8 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-8 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-8 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-8 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-8 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-8 div.sk-label label.sk-toggleable__label,\n",
+ "#sk-container-id-8 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-8 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-8 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-8 div.sk-label label {\n",
+ " font-family: monospace;\n",
+ " font-weight: bold;\n",
+ " line-height: 1.2em;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-8 div.sk-label-container {\n",
+ " text-align: center;\n",
+ "}\n",
+ "\n",
+ "/* Estimator-specific */\n",
+ "#sk-container-id-8 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-8 div.sk-estimator.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "/* on hover */\n",
+ "#sk-container-id-8 div.sk-estimator:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-8 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-8 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-8 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-8 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-8 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-8\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(estimator=DecisionTreeClassifier(),\n",
+ " param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
+ " &#x27;max_leaf_nodes&#x27;: [2, 3, 4, 5, 6, 7, 8]})</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 sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-10\" type=\"checkbox\" ><label for=\"sk-estimator-id-10\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>GridSearchCV</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</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=\"user-set\">\n",
+ " <td><i class=\"copy-paste-icon\"\n",
+ " onclick=\"copyToClipboard('estimator',\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.model_selection.GridSearchCV.html#:~:text=estimator,-estimator%20object\">\n",
+ " estimator\n",
+ " <span class=\"param-doc-description\">estimator: estimator object<br><br>This is assumed to implement the scikit-learn estimator interface.<br>Either estimator needs to provide a ``score`` function,<br>or ``scoring`` must be passed.</span>\n",
+ " </a>\n",
+ " </td>\n",
+ " <td class=\"value\">DecisionTreeClassifier()</td>\n",
+ " </tr>\n",
+ " \n",
+ "\n",
+ " <tr class=\"user-set\">\n",
+ " <td><i class=\"copy-paste-icon\"\n",
+ " onclick=\"copyToClipboard('param_grid',\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.model_selection.GridSearchCV.html#:~:text=param_grid,-dict%20or%20list%20of%20dictionaries\">\n",
+ " param_grid\n",
+ " <span class=\"param-doc-description\">param_grid: dict or list of dictionaries<br><br>Dictionary with parameters names (`str`) as keys and lists of<br>parameter settings to try as values, or a list of such<br>dictionaries, in which case the grids spanned by each dictionary<br>in the list are explored. This enables searching over any sequence<br>of parameter settings.</span>\n",
+ " </a>\n",
+ " </td>\n",
+ " <td class=\"value\">{&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;], &#x27;max_leaf_nodes&#x27;: [2, 3, ...]}</td>\n",
+ " </tr>\n",
+ " \n",
+ "\n",
+ " <tr class=\"default\">\n",
+ " <td><i class=\"copy-paste-icon\"\n",
+ " onclick=\"copyToClipboard('scoring',\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.model_selection.GridSearchCV.html#:~:text=scoring,-str%2C%20callable%2C%20list%2C%20tuple%20or%20dict%2C%20default%3DNone\">\n",
+ " scoring\n",
+ " <span class=\"param-doc-description\">scoring: str, callable, list, tuple or dict, default=None<br><br>Strategy to evaluate the performance of the cross-validated model on<br>the test set.<br><br>If `scoring` represents a single score, one can use:<br><br>- a single string (see :ref:`scoring_string_names`);<br>- a callable (see :ref:`scoring_callable`) that returns a single value;<br>- `None`, the `estimator`'s<br> :ref:`default evaluation criterion <scoring_api_overview>` is used.<br><br>If `scoring` represents multiple scores, one can use:<br><br>- a list or tuple of unique strings;<br>- a callable returning a dictionary where the keys are the metric<br> names and the values are the metric scores;<br>- a dictionary with metric names as keys and callables as values.<br><br>See :ref:`multimetric_grid_search` for an example.</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('n_jobs',\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.model_selection.GridSearchCV.html#:~:text=n_jobs,-int%2C%20default%3DNone\">\n",
+ " n_jobs\n",
+ " <span class=\"param-doc-description\">n_jobs: int, default=None<br><br>Number of jobs to run in parallel.<br>``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.<br>``-1`` means using all processors. See :term:`Glossary <n_jobs>`<br>for more details.<br><br>.. versionchanged:: v0.20<br> `n_jobs` default changed from 1 to None</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('refit',\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.model_selection.GridSearchCV.html#:~:text=refit,-bool%2C%20str%2C%20or%20callable%2C%20default%3DTrue\">\n",
+ " refit\n",
+ " <span class=\"param-doc-description\">refit: bool, str, or callable, default=True<br><br>Refit an estimator using the best found parameters on the whole<br>dataset.<br><br>For multiple metric evaluation, this needs to be a `str` denoting the<br>scorer that would be used to find the best parameters for refitting<br>the estimator at the end.<br><br>Where there are considerations other than maximum score in<br>choosing a best estimator, ``refit`` can be set to a function which<br>returns the selected ``best_index_`` given ``cv_results_``. In that<br>case, the ``best_estimator_`` and ``best_params_`` will be set<br>according to the returned ``best_index_`` while the ``best_score_``<br>attribute will not be available.<br><br>The refitted estimator is made available at the ``best_estimator_``<br>attribute and permits using ``predict`` directly on this<br>``GridSearchCV`` instance.<br><br>Also for multiple metric evaluation, the attributes ``best_index_``,<br>``best_score_`` and ``best_params_`` will only be available if<br>``refit`` is set and all of them will be determined w.r.t this specific<br>scorer.<br><br>See ``scoring`` parameter to know more about multiple metric<br>evaluation.<br><br>See :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_digits.py`<br>to see how to design a custom selection strategy using a callable<br>via `refit`.<br><br>See :ref:`this example<br><sphx_glr_auto_examples_model_selection_plot_grid_search_refit_callable.py>`<br>for an example of how to use ``refit=callable`` to balance model<br>complexity and cross-validated score.<br><br>.. versionchanged:: 0.20<br> Support for callable added.</span>\n",
+ " </a>\n",
+ " </td>\n",
+ " <td class=\"value\">True</td>\n",
+ " </tr>\n",
+ " \n",
+ "\n",
+ " <tr class=\"default\">\n",
+ " <td><i class=\"copy-paste-icon\"\n",
+ " onclick=\"copyToClipboard('cv',\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.model_selection.GridSearchCV.html#:~:text=cv,-int%2C%20cross-validation%20generator%20or%20an%20iterable%2C%20default%3DNone\">\n",
+ " cv\n",
+ " <span class=\"param-doc-description\">cv: int, cross-validation generator or an iterable, default=None<br><br>Determines the cross-validation splitting strategy.<br>Possible inputs for cv are:<br><br>- None, to use the default 5-fold cross validation,<br>- integer, to specify the number of folds in a `(Stratified)KFold`,<br>- :term:`CV splitter`,<br>- An iterable yielding (train, test) splits as arrays of indices.<br><br>For integer/None inputs, if the estimator is a classifier and ``y`` is<br>either binary or multiclass, :class:`StratifiedKFold` is used. In all<br>other cases, :class:`KFold` is used. These splitters are instantiated<br>with `shuffle=False` so the splits will be the same across calls.<br><br>Refer :ref:`User Guide <cross_validation>` for the various<br>cross-validation strategies that can be used here.<br><br>.. versionchanged:: 0.22<br> ``cv`` default value if None changed from 3-fold to 5-fold.</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('verbose',\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.model_selection.GridSearchCV.html#:~:text=verbose,-int\">\n",
+ " verbose\n",
+ " <span class=\"param-doc-description\">verbose: int<br><br>Controls the verbosity: the higher, the more messages.<br><br>- >1 : the computation time for each fold and parameter candidate is<br> displayed;<br>- >2 : the score is also displayed;<br>- >3 : the fold and candidate parameter indexes are also displayed<br> together with the starting time of the computation.</span>\n",
+ " </a>\n",
+ " </td>\n",
+ " <td class=\"value\">0</td>\n",
+ " </tr>\n",
+ " \n",
+ "\n",
+ " <tr class=\"default\">\n",
+ " <td><i class=\"copy-paste-icon\"\n",
+ " onclick=\"copyToClipboard('pre_dispatch',\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.model_selection.GridSearchCV.html#:~:text=pre_dispatch,-int%2C%20or%20str%2C%20default%3D%272%2An_jobs%27\">\n",
+ " pre_dispatch\n",
+ " <span class=\"param-doc-description\">pre_dispatch: int, or str, default='2*n_jobs'<br><br>Controls the number of jobs that get dispatched during parallel<br>execution. Reducing this number can be useful to avoid an<br>explosion of memory consumption when more jobs get dispatched<br>than CPUs can process. This parameter can be:<br><br>- None, in which case all the jobs are immediately created and spawned. Use<br> this for lightweight and fast-running jobs, to avoid delays due to on-demand<br> spawning of the jobs<br>- An int, giving the exact number of total jobs that are spawned<br>- A str, giving an expression as a function of n_jobs, as in '2*n_jobs'</span>\n",
+ " </a>\n",
+ " </td>\n",
+ " <td class=\"value\">&#x27;2*n_jobs&#x27;</td>\n",
+ " </tr>\n",
+ " \n",
+ "\n",
+ " <tr class=\"default\">\n",
+ " <td><i class=\"copy-paste-icon\"\n",
+ " onclick=\"copyToClipboard('error_score',\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.model_selection.GridSearchCV.html#:~:text=error_score,-%27raise%27%20or%20numeric%2C%20default%3Dnp.nan\">\n",
+ " error_score\n",
+ " <span class=\"param-doc-description\">error_score: 'raise' or numeric, default=np.nan<br><br>Value to assign to the score if an error occurs in estimator fitting.<br>If set to 'raise', the error is raised. If a numeric value is given,<br>FitFailedWarning is raised. This parameter does not affect the refit<br>step, which will always raise the error.</span>\n",
+ " </a>\n",
+ " </td>\n",
+ " <td class=\"value\">nan</td>\n",
+ " </tr>\n",
+ " \n",
+ "\n",
+ " <tr class=\"default\">\n",
+ " <td><i class=\"copy-paste-icon\"\n",
+ " onclick=\"copyToClipboard('return_train_score',\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.model_selection.GridSearchCV.html#:~:text=return_train_score,-bool%2C%20default%3DFalse\">\n",
+ " return_train_score\n",
+ " <span class=\"param-doc-description\">return_train_score: bool, default=False<br><br>If ``False``, the ``cv_results_`` attribute will not include training<br>scores.<br>Computing training scores is used to get insights on how different<br>parameter settings impact the overfitting/underfitting trade-off.<br>However computing the scores on the training set can be computationally<br>expensive and is not strictly required to select the parameters that<br>yield the best generalization performance.<br><br>.. versionadded:: 0.19<br><br>.. versionchanged:: 0.21<br> Default value was changed from ``True`` to ``False``</span>\n",
+ " </a>\n",
+ " </td>\n",
+ " <td class=\"value\">False</td>\n",
+ " </tr>\n",
+ " \n",
+ " </tbody>\n",
+ " </table>\n",
+ " </details>\n",
+ " </div>\n",
+ " </div></div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-11\" type=\"checkbox\" ><label for=\"sk-estimator-id-11\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>best_estimator_: DecisionTreeClassifier</div></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"best_estimator___\"><pre>DecisionTreeClassifier(max_leaf_nodes=4)</pre></div></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-12\" type=\"checkbox\" ><label for=\"sk-estimator-id-12\" 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></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"best_estimator___\">\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=\"default\">\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\">None</td>\n",
+ " </tr>\n",
+ " \n",
+ "\n",
+ " <tr class=\"user-set\">\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\">4</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></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-8');</script></body>"
+ ],
+ "text/plain": [
+ "GridSearchCV(estimator=DecisionTreeClassifier(),\n",
+ " param_grid={'criterion': ['gini', 'entropy'],\n",
+ " 'max_leaf_nodes': [2, 3, 4, 5, 6, 7, 8]})"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.datasets import make_moons\n",
+ "from sklearn.model_selection import GridSearchCV\n",
+ "from sklearn.tree import DecisionTreeClassifier\n",
+ "X, y = make_moons(n_samples=10000, noise=0.4, random_state=42)\n",
+ "params = {\"max_leaf_nodes\" : list(range(2, 9)), \"criterion\": [\"gini\", \"entropy\"]}\n",
+ "dtc = DecisionTreeClassifier()\n",
+ "gs = GridSearchCV(dtc, params)\n",
+ "gs.fit(X, y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.915\n"
+ ]
+ }
+ ],
+ "source": [
+ "best_decision_tree = DecisionTreeClassifier(criterion=\"gini\", max_leaf_nodes=4, random_state=42)\n",
+ "best_decision_tree.fit(X, y)\n",
+ "from sklearn.metrics import accuracy_score\n",
+ "#X_moons_test, y_moons_test\n",
+ "y_pred = best_decision_tree.predict(X_moons_test)\n",
+ "print(accuracy_score(y_moons_test, y_pred))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import ShuffleSplit"
+ ]
+ }
+ ],
+ "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.11"
+ },
+ "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
+}
diff --git a/ML/05_Decision_Trees/decision_trees.md b/ML/05_Decision_Trees/decision_trees.md
new file mode 100644
index 0000000..496856d
--- /dev/null
+++ b/ML/05_Decision_Trees/decision_trees.md
@@ -0,0 +1,24 @@
+# Decision trees
+Grande explicabilité
+
+## Construction (CART)
+- Recherche pour chaque noeud d'une feature et d'un seuil qui sépare le dataset
+ - Minimisation d'une fonction de coût basée sur l'impureté de Gini
+- `max_depth` pour la profondeur max de l'arbre
+- Autres hyperparamètres : nb_feuilles, taille du split...
+
+Arrêt sur un résultat raisonnable car complexité
+
+Peu de différence entre **entropie** et **impureté de Gini**
+
+## Régularisation
+Overfitting probable
+
+## Régression
+prédiction de valeur != classe
+minimisation de la MSE au moment de split
+
+# Limites des arbres de décision
+- peu adoptés
+- attention normalisation
+- Variance élevée (sensibilité aux hyperparamètres)
diff --git a/ML/05_Decision_Trees/images/decision_trees/decision_tree_decision_boundaries_plot.png b/ML/05_Decision_Trees/images/decision_trees/decision_tree_decision_boundaries_plot.png
new file mode 100644
index 0000000..45cef4c
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/decision_tree_decision_boundaries_plot.png
Binary files differ
diff --git a/ML/05_Decision_Trees/images/decision_trees/decision_tree_high_variance_plot.png b/ML/05_Decision_Trees/images/decision_trees/decision_tree_high_variance_plot.png
new file mode 100644
index 0000000..0009964
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/decision_tree_high_variance_plot.png
Binary files differ
diff --git a/ML/05_Decision_Trees/images/decision_trees/iris_tree.dot b/ML/05_Decision_Trees/images/decision_trees/iris_tree.dot
new file mode 100644
index 0000000..13c0e77
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/iris_tree.dot
@@ -0,0 +1,13 @@
+digraph Tree {
+node [shape=box, style="filled, rounded", color="black", fontname="helvetica"] ;
+edge [fontname="helvetica"] ;
+0 [label="petal length (cm) <= 2.45\ngini = 0.667\nsamples = 150\nvalue = [50, 50, 50]\nclass = setosa", fillcolor="#ffffff"] ;
+1 [label="gini = 0.0\nsamples = 50\nvalue = [50, 0, 0]\nclass = setosa", fillcolor="#e58139"] ;
+0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
+2 [label="petal width (cm) <= 1.75\ngini = 0.5\nsamples = 100\nvalue = [0, 50, 50]\nclass = versicolor", fillcolor="#ffffff"] ;
+0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
+3 [label="gini = 0.168\nsamples = 54\nvalue = [0, 49, 5]\nclass = versicolor", fillcolor="#4de88e"] ;
+2 -> 3 ;
+4 [label="gini = 0.043\nsamples = 46\nvalue = [0, 1, 45]\nclass = virginica", fillcolor="#843de6"] ;
+2 -> 4 ;
+} \ No newline at end of file
diff --git a/ML/05_Decision_Trees/images/decision_trees/iris_tree.png b/ML/05_Decision_Trees/images/decision_trees/iris_tree.png
new file mode 100644
index 0000000..4b2bb95
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/iris_tree.png
Binary files differ
diff --git a/ML/05_Decision_Trees/images/decision_trees/min_samples_leaf_plot.png b/ML/05_Decision_Trees/images/decision_trees/min_samples_leaf_plot.png
new file mode 100644
index 0000000..04ea531
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/min_samples_leaf_plot.png
Binary files differ
diff --git a/ML/05_Decision_Trees/images/decision_trees/pca_preprocessing_plot.png b/ML/05_Decision_Trees/images/decision_trees/pca_preprocessing_plot.png
new file mode 100644
index 0000000..1ec2a25
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/pca_preprocessing_plot.png
Binary files differ
diff --git a/ML/05_Decision_Trees/images/decision_trees/regression_tree.dot b/ML/05_Decision_Trees/images/decision_trees/regression_tree.dot
new file mode 100644
index 0000000..aa13252
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/regression_tree.dot
@@ -0,0 +1,17 @@
+digraph Tree {
+node [shape=box, style="filled, rounded", color="black", fontname="helvetica"] ;
+edge [fontname="helvetica"] ;
+0 [label="x1 <= -0.303\nsquared_error = 0.006\nsamples = 200\nvalue = 0.088", fillcolor="#f6d6be"] ;
+1 [label="x1 <= -0.408\nsquared_error = 0.002\nsamples = 44\nvalue = 0.172", fillcolor="#eb9d65"] ;
+0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
+2 [label="squared_error = 0.001\nsamples = 20\nvalue = 0.213", fillcolor="#e58139"] ;
+1 -> 2 ;
+3 [label="squared_error = 0.001\nsamples = 24\nvalue = 0.138", fillcolor="#f0b489"] ;
+1 -> 3 ;
+4 [label="x1 <= 0.272\nsquared_error = 0.005\nsamples = 156\nvalue = 0.065", fillcolor="#fae6d7"] ;
+0 -> 4 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
+5 [label="squared_error = 0.001\nsamples = 110\nvalue = 0.028", fillcolor="#ffffff"] ;
+4 -> 5 ;
+6 [label="squared_error = 0.002\nsamples = 46\nvalue = 0.154", fillcolor="#edaa79"] ;
+4 -> 6 ;
+} \ No newline at end of file
diff --git a/ML/05_Decision_Trees/images/decision_trees/regression_tree.png b/ML/05_Decision_Trees/images/decision_trees/regression_tree.png
new file mode 100644
index 0000000..90021e6
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/regression_tree.png
Binary files differ
diff --git a/ML/05_Decision_Trees/images/decision_trees/sensitivity_to_rotation_plot.png b/ML/05_Decision_Trees/images/decision_trees/sensitivity_to_rotation_plot.png
new file mode 100644
index 0000000..b0a1390
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/sensitivity_to_rotation_plot.png
Binary files differ
diff --git a/ML/05_Decision_Trees/images/decision_trees/tree_regression_plot.png b/ML/05_Decision_Trees/images/decision_trees/tree_regression_plot.png
new file mode 100644
index 0000000..7420734
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/tree_regression_plot.png
Binary files differ
diff --git a/ML/05_Decision_Trees/images/decision_trees/tree_regression_regularization_plot.png b/ML/05_Decision_Trees/images/decision_trees/tree_regression_regularization_plot.png
new file mode 100644
index 0000000..2ae5e0d
--- /dev/null
+++ b/ML/05_Decision_Trees/images/decision_trees/tree_regression_regularization_plot.png
Binary files differ