{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Chapter 7 – Ensemble Learning and Random Forests**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_This notebook contains all the sample code and solutions to the exercises in chapter 7._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<table align=\"left\">\n",
    "  <td>\n",
    "    <a href=\"https://colab.research.google.com/github/ageron/handson-ml3/blob/main/07_ensemble_learning_and_random_forests.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://kaggle.com/kernels/welcome?src=https://github.com/ageron/handson-ml3/blob/main/07_ensemble_learning_and_random_forests.ipynb\"><img src=\"https://kaggle.com/static/images/open-in-kaggle.svg\" /></a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": []
   },
   "source": [
    "# Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This project requires Python 3.7 or above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "\n",
    "assert sys.version_info >= (3, 7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It also requires Scikit-Learn ≥ 1.0.1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from packaging import version\n",
    "import sklearn\n",
    "\n",
    "assert version.parse(sklearn.__version__) >= version.parse(\"1.0.1\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we did in previous chapters, let's define the default font sizes to make the figures prettier:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.rc('font', size=14)\n",
    "plt.rc('axes', labelsize=14, titlesize=14)\n",
    "plt.rc('legend', fontsize=14)\n",
    "plt.rc('xtick', labelsize=10)\n",
    "plt.rc('ytick', labelsize=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And let's create the `images/ensembles` 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\" / \"ensembles\"\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": [
    "# Voting Classifiers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's build a voting classifier:"
   ]
  },
  {
   "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>VotingClassifier(estimators=[(&#x27;lr&#x27;, LogisticRegression(random_state=42)),\n",
       "                             (&#x27;rf&#x27;, RandomForestClassifier(random_state=42)),\n",
       "                             (&#x27;svc&#x27;, SVC(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 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-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>VotingClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.ensemble.VotingClassifier.html\">?<span>Documentation for VotingClassifier</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('estimators',\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.ensemble.VotingClassifier.html#:~:text=estimators,-list%20of%20%28str%2C%20estimator%29%20tuples\">\n",
       "            estimators\n",
       "            <span class=\"param-doc-description\">estimators: list of (str, estimator) tuples<br><br>Invoking the ``fit`` method on the ``VotingClassifier`` will fit clones<br>of those original estimators that will be stored in the class attribute<br>``self.estimators_``. An estimator can be set to ``'drop'`` using<br>:meth:`set_params`.<br><br>.. versionchanged:: 0.21<br>    ``'drop'`` is accepted. Using None was deprecated in 0.22 and<br>    support was removed in 0.24.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">[(&#x27;lr&#x27;, ...), (&#x27;rf&#x27;, ...), ...]</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('voting',\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.ensemble.VotingClassifier.html#:~:text=voting,-%7B%27hard%27%2C%20%27soft%27%7D%2C%20default%3D%27hard%27\">\n",
       "            voting\n",
       "            <span class=\"param-doc-description\">voting: {'hard', 'soft'}, default='hard'<br><br>If 'hard', uses predicted class labels for majority rule voting.<br>Else if 'soft', predicts the class label based on the argmax of<br>the sums of the predicted probabilities, which is recommended for<br>an ensemble of well-calibrated classifiers.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;hard&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('weights',\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.ensemble.VotingClassifier.html#:~:text=weights,-array-like%20of%20shape%20%28n_classifiers%2C%29%2C%20default%3DNone\">\n",
       "            weights\n",
       "            <span class=\"param-doc-description\">weights: array-like of shape (n_classifiers,), default=None<br><br>Sequence of weights (`float` or `int`) to weight the occurrences of<br>predicted class labels (`hard` voting) or class probabilities<br>before averaging (`soft` voting). Uses uniform weights if `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('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.ensemble.VotingClassifier.html#:~:text=n_jobs,-int%2C%20default%3DNone\">\n",
       "            n_jobs\n",
       "            <span class=\"param-doc-description\">n_jobs: int, default=None<br><br>The number of jobs to run in parallel for ``fit``.<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>.. versionadded:: 0.18</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('flatten_transform',\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.ensemble.VotingClassifier.html#:~:text=flatten_transform,-bool%2C%20default%3DTrue\">\n",
       "            flatten_transform\n",
       "            <span class=\"param-doc-description\">flatten_transform: bool, default=True<br><br>Affects shape of transform output only when voting='soft'<br>If voting='soft' and flatten_transform=True, transform method returns<br>matrix with shape (n_samples, n_classifiers * n_classes). If<br>flatten_transform=False, it returns<br>(n_classifiers, n_samples, n_classes).</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('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.ensemble.VotingClassifier.html#:~:text=verbose,-bool%2C%20default%3DFalse\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\">verbose: bool, default=False<br><br>If True, the time elapsed while fitting will be printed as it<br>is completed.<br><br>.. versionadded:: 0.23</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\"><label>lr</label></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-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LogisticRegression</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"lr__\">\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('penalty',\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.linear_model.LogisticRegression.html#:~:text=penalty,-%7B%27l1%27%2C%20%27l2%27%2C%20%27elasticnet%27%2C%20None%7D%2C%20default%3D%27l2%27\">\n",
       "            penalty\n",
       "            <span class=\"param-doc-description\">penalty: {'l1', 'l2', 'elasticnet', None}, default='l2'<br><br>Specify the norm of the penalty:<br><br>- `None`: no penalty is added;<br>- `'l2'`: add a L2 penalty term and it is the default choice;<br>- `'l1'`: add a L1 penalty term;<br>- `'elasticnet'`: both L1 and L2 penalty terms are added.<br><br>.. warning::<br>   Some penalties may not work with some solvers. See the parameter<br>   `solver` below, to know the compatibility between the penalty and<br>   solver.<br><br>.. versionadded:: 0.19<br>   l1 penalty with SAGA solver (allowing 'multinomial' + L1)<br><br>.. deprecated:: 1.8<br>   `penalty` was deprecated in version 1.8 and will be removed in 1.10.<br>   Use `l1_ratio` instead. `l1_ratio=0` for `penalty='l2'`, `l1_ratio=1` for<br>   `penalty='l1'` and `l1_ratio` set to any float between 0 and 1 for<br>   `'penalty='elasticnet'`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;deprecated&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('C',\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.linear_model.LogisticRegression.html#:~:text=C,-float%2C%20default%3D1.0\">\n",
       "            C\n",
       "            <span class=\"param-doc-description\">C: float, default=1.0<br><br>Inverse of regularization strength; must be a positive float.<br>Like in support vector machines, smaller values specify stronger<br>regularization. `C=np.inf` results in unpenalized logistic regression.<br>For a visual example on the effect of tuning the `C` parameter<br>with an L1 penalty, see:<br>:ref:`sphx_glr_auto_examples_linear_model_plot_logistic_path.py`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('l1_ratio',\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.linear_model.LogisticRegression.html#:~:text=l1_ratio,-float%2C%20default%3D0.0\">\n",
       "            l1_ratio\n",
       "            <span class=\"param-doc-description\">l1_ratio: float, default=0.0<br><br>The Elastic-Net mixing parameter, with `0 <= l1_ratio <= 1`. Setting<br>`l1_ratio=1` gives a pure L1-penalty, setting `l1_ratio=0` a pure L2-penalty.<br>Any value between 0 and 1 gives an Elastic-Net penalty of the form<br>`l1_ratio * L1 + (1 - l1_ratio) * L2`.<br><br>.. warning::<br>   Certain values of `l1_ratio`, i.e. some penalties, may not work with some<br>   solvers. See the parameter `solver` below, to know the compatibility between<br>   the penalty and solver.<br><br>.. versionchanged:: 1.8<br>    Default value changed from None to 0.0.<br><br>.. deprecated:: 1.8<br>    `None` is deprecated and will be removed in version 1.10. Always use<br>    `l1_ratio` to specify the penalty type.</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('dual',\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.linear_model.LogisticRegression.html#:~:text=dual,-bool%2C%20default%3DFalse\">\n",
       "            dual\n",
       "            <span class=\"param-doc-description\">dual: bool, default=False<br><br>Dual (constrained) or primal (regularized, see also<br>:ref:`this equation <regularized-logistic-loss>`) formulation. Dual formulation<br>is only implemented for l2 penalty with liblinear solver. Prefer `dual=False`<br>when n_samples > n_features.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('tol',\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.linear_model.LogisticRegression.html#:~:text=tol,-float%2C%20default%3D1e-4\">\n",
       "            tol\n",
       "            <span class=\"param-doc-description\">tol: float, default=1e-4<br><br>Tolerance for stopping criteria.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0001</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('fit_intercept',\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.linear_model.LogisticRegression.html#:~:text=fit_intercept,-bool%2C%20default%3DTrue\">\n",
       "            fit_intercept\n",
       "            <span class=\"param-doc-description\">fit_intercept: bool, default=True<br><br>Specifies if a constant (a.k.a. bias or intercept) should be<br>added to the decision function.</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('intercept_scaling',\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.linear_model.LogisticRegression.html#:~:text=intercept_scaling,-float%2C%20default%3D1\">\n",
       "            intercept_scaling\n",
       "            <span class=\"param-doc-description\">intercept_scaling: float, default=1<br><br>Useful only when the solver `liblinear` is used<br>and `self.fit_intercept` is set to `True`. In this case, `x` becomes<br>`[x, self.intercept_scaling]`,<br>i.e. a \"synthetic\" feature with constant value equal to<br>`intercept_scaling` is appended to the instance vector.<br>The intercept becomes<br>``intercept_scaling * synthetic_feature_weight``.<br><br>.. note::<br>    The synthetic feature weight is subject to L1 or L2<br>    regularization as all other features.<br>    To lessen the effect of regularization on synthetic feature weight<br>    (and therefore on the intercept) `intercept_scaling` has to be increased.</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('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.linear_model.LogisticRegression.html#:~:text=class_weight,-dict%20or%20%27balanced%27%2C%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\">class_weight: dict or 'balanced', default=None<br><br>Weights associated with classes in the form ``{class_label: weight}``.<br>If not given, all classes are supposed to have weight one.<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>Note that these weights will be multiplied with sample_weight (passed<br>through the fit method) if sample_weight is specified.<br><br>.. versionadded:: 0.17<br>   *class_weight='balanced'*</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.linear_model.LogisticRegression.html#:~:text=random_state,-int%2C%20RandomState%20instance%2C%20default%3DNone\">\n",
       "            random_state\n",
       "            <span class=\"param-doc-description\">random_state: int, RandomState instance, default=None<br><br>Used when ``solver`` == 'sag', 'saga' or 'liblinear' to shuffle the<br>data. 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('solver',\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.linear_model.LogisticRegression.html#:~:text=solver,-%7B%27lbfgs%27%2C%20%27liblinear%27%2C%20%27newton-cg%27%2C%20%27newton-cholesky%27%2C%20%27sag%27%2C%20%27saga%27%7D%2C%20%20%20%20%20%20%20%20%20%20%20%20%20default%3D%27lbfgs%27\">\n",
       "            solver\n",
       "            <span class=\"param-doc-description\">solver: {'lbfgs', 'liblinear', 'newton-cg', 'newton-cholesky', 'sag', 'saga'},             default='lbfgs'<br><br>Algorithm to use in the optimization problem. Default is 'lbfgs'.<br>To choose a solver, you might want to consider the following aspects:<br><br>- 'lbfgs' is a good default solver because it works reasonably well for a wide<br>  class of problems.<br>- For :term:`multiclass` problems (`n_classes >= 3`), all solvers except<br>  'liblinear' minimize the full multinomial loss, 'liblinear' will raise an<br>  error.<br>- 'newton-cholesky' is a good choice for<br>  `n_samples` >> `n_features * n_classes`, especially with one-hot encoded<br>  categorical features with rare categories. Be aware that the memory usage<br>  of this solver has a quadratic dependency on `n_features * n_classes`<br>  because it explicitly computes the full Hessian matrix.<br>- For small datasets, 'liblinear' is a good choice, whereas 'sag'<br>  and 'saga' are faster for large ones;<br>- 'liblinear' can only handle binary classification by default. To apply a<br>  one-versus-rest scheme for the multiclass setting one can wrap it with the<br>  :class:`~sklearn.multiclass.OneVsRestClassifier`.<br><br>.. warning::<br>   The choice of the algorithm depends on the penalty chosen (`l1_ratio=0`<br>   for L2-penalty, `l1_ratio=1` for L1-penalty and `0 < l1_ratio < 1` for<br>   Elastic-Net) and on (multinomial) multiclass support:<br><br>   ================= ======================== ======================<br>   solver            l1_ratio                 multinomial multiclass<br>   ================= ======================== ======================<br>   'lbfgs'           l1_ratio=0               yes<br>   'liblinear'       l1_ratio=1 or l1_ratio=0 no<br>   'newton-cg'       l1_ratio=0               yes<br>   'newton-cholesky' l1_ratio=0               yes<br>   'sag'             l1_ratio=0               yes<br>   'saga'            0<=l1_ratio<=1           yes<br>   ================= ======================== ======================<br><br>.. note::<br>   'sag' and 'saga' fast convergence is only guaranteed on features<br>   with approximately the same scale. You can preprocess the data with<br>   a scaler from :mod:`sklearn.preprocessing`.<br><br>.. seealso::<br>   Refer to the :ref:`User Guide <Logistic_regression>` for more<br>   information regarding :class:`LogisticRegression` and more specifically the<br>   :ref:`Table <logistic_regression_solvers>`<br>   summarizing solver/penalty supports.<br><br>.. versionadded:: 0.17<br>   Stochastic Average Gradient (SAG) descent solver. Multinomial support in<br>   version 0.18.<br>.. versionadded:: 0.19<br>   SAGA solver.<br>.. versionchanged:: 0.22<br>   The default solver changed from 'liblinear' to 'lbfgs' in 0.22.<br>.. versionadded:: 1.2<br>   newton-cholesky solver. Multinomial support in version 1.6.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;lbfgs&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_iter',\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.linear_model.LogisticRegression.html#:~:text=max_iter,-int%2C%20default%3D100\">\n",
       "            max_iter\n",
       "            <span class=\"param-doc-description\">max_iter: int, default=100<br><br>Maximum number of iterations taken for the solvers to converge.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">100</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.linear_model.LogisticRegression.html#:~:text=verbose,-int%2C%20default%3D0\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\">verbose: int, default=0<br><br>For the liblinear and lbfgs solvers set verbose to any positive<br>number for verbosity.</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('warm_start',\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.linear_model.LogisticRegression.html#:~:text=warm_start,-bool%2C%20default%3DFalse\">\n",
       "            warm_start\n",
       "            <span class=\"param-doc-description\">warm_start: bool, default=False<br><br>When set to True, reuse the solution of the previous call to fit as<br>initialization, otherwise, just erase the previous solution.<br>Useless for liblinear solver. See :term:`the Glossary <warm_start>`.<br><br>.. versionadded:: 0.17<br>   *warm_start* to support *lbfgs*, *newton-cg*, *sag*, *saga* solvers.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</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.linear_model.LogisticRegression.html#:~:text=n_jobs,-int%2C%20default%3DNone\">\n",
       "            n_jobs\n",
       "            <span class=\"param-doc-description\">n_jobs: int, default=None<br><br>Does not have any effect.<br><br>.. deprecated:: 1.8<br>   `n_jobs` is deprecated in version 1.8 and will be removed in 1.10.</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 class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><label>rf</label></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-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>RandomForestClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"rf__\">\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('n_estimators',\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.ensemble.RandomForestClassifier.html#:~:text=n_estimators,-int%2C%20default%3D100\">\n",
       "            n_estimators\n",
       "            <span class=\"param-doc-description\">n_estimators: int, default=100<br><br>The number of trees in the forest.<br><br>.. versionchanged:: 0.22<br>   The default value of ``n_estimators`` changed from 10 to 100<br>   in 0.22.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">100</td>\n",
       "        </tr>\n",
       "    \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.ensemble.RandomForestClassifier.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`.<br>Note: This parameter is tree-specific.</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('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.ensemble.RandomForestClassifier.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.ensemble.RandomForestClassifier.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.ensemble.RandomForestClassifier.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.ensemble.RandomForestClassifier.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.ensemble.RandomForestClassifier.html#:~:text=max_features,-%7B%22sqrt%22%2C%20%22log2%22%2C%20None%7D%2C%20int%20or%20float%2C%20default%3D%22sqrt%22\">\n",
       "            max_features\n",
       "            <span class=\"param-doc-description\">max_features: {\"sqrt\", \"log2\", None}, int or float, default=\"sqrt\"<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>.. versionchanged:: 1.1<br>    The default of `max_features` changed from `\"auto\"` to `\"sqrt\"`.<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\">&#x27;sqrt&#x27;</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.ensemble.RandomForestClassifier.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 trees 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.ensemble.RandomForestClassifier.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('bootstrap',\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.ensemble.RandomForestClassifier.html#:~:text=bootstrap,-bool%2C%20default%3DTrue\">\n",
       "            bootstrap\n",
       "            <span class=\"param-doc-description\">bootstrap: bool, default=True<br><br>Whether bootstrap samples are used when building trees. If False, the<br>whole dataset is used to build each tree.</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('oob_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.ensemble.RandomForestClassifier.html#:~:text=oob_score,-bool%20or%20callable%2C%20default%3DFalse\">\n",
       "            oob_score\n",
       "            <span class=\"param-doc-description\">oob_score: bool or callable, default=False<br><br>Whether to use out-of-bag samples to estimate the generalization score.<br>By default, :func:`~sklearn.metrics.accuracy_score` is used.<br>Provide a callable with signature `metric(y_true, y_pred)` to use a<br>custom metric. Only available if `bootstrap=True`.<br><br>For an illustration of out-of-bag (OOB) error estimation, see the example<br>:ref:`sphx_glr_auto_examples_ensemble_plot_ensemble_oob.py`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</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.ensemble.RandomForestClassifier.html#:~:text=n_jobs,-int%2C%20default%3DNone\">\n",
       "            n_jobs\n",
       "            <span class=\"param-doc-description\">n_jobs: int, default=None<br><br>The number of jobs to run in parallel. :meth:`fit`, :meth:`predict`,<br>:meth:`decision_path` and :meth:`apply` are all parallelized over the<br>trees. ``None`` means 1 unless in a :obj:`joblib.parallel_backend`<br>context. ``-1`` means using all processors. See :term:`Glossary<br><n_jobs>` for more 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('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.ensemble.RandomForestClassifier.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 both the randomness of the bootstrapping of the samples used<br>when building trees (if ``bootstrap=True``) and the sampling of the<br>features to consider when looking for the best split at each node<br>(if ``max_features < n_features``).<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('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.ensemble.RandomForestClassifier.html#:~:text=verbose,-int%2C%20default%3D0\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\">verbose: int, default=0<br><br>Controls the verbosity when fitting and predicting.</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('warm_start',\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.ensemble.RandomForestClassifier.html#:~:text=warm_start,-bool%2C%20default%3DFalse\">\n",
       "            warm_start\n",
       "            <span class=\"param-doc-description\">warm_start: bool, default=False<br><br>When set to ``True``, reuse the solution of the previous call to fit<br>and add more estimators to the ensemble, otherwise, just fit a whole<br>new forest. See :term:`Glossary <warm_start>` and<br>:ref:`tree_ensemble_warm_start` for details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</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.ensemble.RandomForestClassifier.html#:~:text=class_weight,-%7B%22balanced%22%2C%20%22balanced_subsample%22%7D%2C%20dict%20or%20list%20of%20dicts%2C%20%20%20%20%20%20%20%20%20%20%20%20%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\">class_weight: {\"balanced\", \"balanced_subsample\"}, dict or list of dicts,             default=None<br><br>Weights associated with classes in the form ``{class_label: weight}``.<br>If not given, 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>The \"balanced_subsample\" mode is the same as \"balanced\" except that<br>weights are computed based on the bootstrap sample for every tree<br>grown.<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.ensemble.RandomForestClassifier.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('max_samples',\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.ensemble.RandomForestClassifier.html#:~:text=max_samples,-int%20or%20float%2C%20default%3DNone\">\n",
       "            max_samples\n",
       "            <span class=\"param-doc-description\">max_samples: int or float, default=None<br><br>If bootstrap is True, the number of samples to draw from X<br>to train each base estimator.<br><br>- If None (default), then draw `X.shape[0]` samples.<br>- If int, then draw `max_samples` samples.<br>- If float, then draw `max(round(n_samples * max_samples), 1)` samples. Thus,<br>  `max_samples` should be in the interval `(0.0, 1.0]`.<br><br>.. versionadded:: 0.22</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('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.ensemble.RandomForestClassifier.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 class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><label>svc</label></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-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SVC</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"svc__\">\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('C',\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.svm.SVC.html#:~:text=C,-float%2C%20default%3D1.0\">\n",
       "            C\n",
       "            <span class=\"param-doc-description\">C: float, default=1.0<br><br>Regularization parameter. The strength of the regularization is<br>inversely proportional to C. Must be strictly positive. The penalty<br>is a squared l2 penalty. For an intuitive visualization of the effects<br>of scaling the regularization parameter C, see<br>:ref:`sphx_glr_auto_examples_svm_plot_svm_scale_c.py`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('kernel',\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.svm.SVC.html#:~:text=kernel,-%7B%27linear%27%2C%20%27poly%27%2C%20%27rbf%27%2C%20%27sigmoid%27%2C%20%27precomputed%27%7D%20or%20callable%2C%20%20%20%20%20%20%20%20%20%20default%3D%27rbf%27\">\n",
       "            kernel\n",
       "            <span class=\"param-doc-description\">kernel: {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'} or callable,          default='rbf'<br><br>Specifies the kernel type to be used in the algorithm. If<br>none is given, 'rbf' will be used. If a callable is given it is used to<br>pre-compute the kernel matrix from data matrices; that matrix should be<br>an array of shape ``(n_samples, n_samples)``. For an intuitive<br>visualization of different kernel types see<br>:ref:`sphx_glr_auto_examples_svm_plot_svm_kernels.py`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;rbf&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('degree',\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.svm.SVC.html#:~:text=degree,-int%2C%20default%3D3\">\n",
       "            degree\n",
       "            <span class=\"param-doc-description\">degree: int, default=3<br><br>Degree of the polynomial kernel function ('poly').<br>Must be non-negative. Ignored by all other kernels.</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('gamma',\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.svm.SVC.html#:~:text=gamma,-%7B%27scale%27%2C%20%27auto%27%7D%20or%20float%2C%20default%3D%27scale%27\">\n",
       "            gamma\n",
       "            <span class=\"param-doc-description\">gamma: {'scale', 'auto'} or float, default='scale'<br><br>Kernel coefficient for 'rbf', 'poly' and 'sigmoid'.<br><br>- if ``gamma='scale'`` (default) is passed then it uses<br>  1 / (n_features * X.var()) as value of gamma,<br>- if 'auto', uses 1 / n_features<br>- if float, must be non-negative.<br><br>.. versionchanged:: 0.22<br>   The default value of ``gamma`` changed from 'auto' to 'scale'.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;scale&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('coef0',\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.svm.SVC.html#:~:text=coef0,-float%2C%20default%3D0.0\">\n",
       "            coef0\n",
       "            <span class=\"param-doc-description\">coef0: float, default=0.0<br><br>Independent term in kernel function.<br>It is only significant in 'poly' and 'sigmoid'.</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('shrinking',\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.svm.SVC.html#:~:text=shrinking,-bool%2C%20default%3DTrue\">\n",
       "            shrinking\n",
       "            <span class=\"param-doc-description\">shrinking: bool, default=True<br><br>Whether to use the shrinking heuristic.<br>See the :ref:`User Guide <shrinking_svm>`.</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('probability',\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.svm.SVC.html#:~:text=probability,-bool%2C%20default%3DFalse\">\n",
       "            probability\n",
       "            <span class=\"param-doc-description\">probability: bool, default=False<br><br>Whether to enable probability estimates. This must be enabled prior<br>to calling `fit`, will slow down that method as it internally uses<br>5-fold cross-validation, and `predict_proba` may be inconsistent with<br>`predict`. Read more in the :ref:`User Guide <scores_probabilities>`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('tol',\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.svm.SVC.html#:~:text=tol,-float%2C%20default%3D1e-3\">\n",
       "            tol\n",
       "            <span class=\"param-doc-description\">tol: float, default=1e-3<br><br>Tolerance for stopping criterion.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.001</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('cache_size',\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.svm.SVC.html#:~:text=cache_size,-float%2C%20default%3D200\">\n",
       "            cache_size\n",
       "            <span class=\"param-doc-description\">cache_size: float, default=200<br><br>Specify the size of the kernel cache (in MB).</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">200</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.svm.SVC.html#:~:text=class_weight,-dict%20or%20%27balanced%27%2C%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\">class_weight: dict or 'balanced', default=None<br><br>Set the parameter C of class i to class_weight[i]*C for<br>SVC. If not given, all classes are supposed to have<br>weight one.<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))``.</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.svm.SVC.html#:~:text=verbose,-bool%2C%20default%3DFalse\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\">verbose: bool, default=False<br><br>Enable verbose output. Note that this setting takes advantage of a<br>per-process runtime setting in libsvm that, if enabled, may not work<br>properly in a multithreaded context.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_iter',\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.svm.SVC.html#:~:text=max_iter,-int%2C%20default%3D-1\">\n",
       "            max_iter\n",
       "            <span class=\"param-doc-description\">max_iter: int, default=-1<br><br>Hard limit on iterations within solver, or -1 for no limit.</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('decision_function_shape',\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.svm.SVC.html#:~:text=decision_function_shape,-%7B%27ovo%27%2C%20%27ovr%27%7D%2C%20default%3D%27ovr%27\">\n",
       "            decision_function_shape\n",
       "            <span class=\"param-doc-description\">decision_function_shape: {'ovo', 'ovr'}, default='ovr'<br><br>Whether to return a one-vs-rest ('ovr') decision function of shape<br>(n_samples, n_classes) as all other classifiers, or the original<br>one-vs-one ('ovo') decision function of libsvm which has shape<br>(n_samples, n_classes * (n_classes - 1) / 2). However, note that<br>internally, one-vs-one ('ovo') is always used as a multi-class strategy<br>to train models; an ovr matrix is only constructed from the ovo matrix.<br>The parameter is ignored for binary classification.<br><br>.. versionchanged:: 0.19<br>    decision_function_shape is 'ovr' by default.<br><br>.. versionadded:: 0.17<br>   *decision_function_shape='ovr'* is recommended.<br><br>.. versionchanged:: 0.17<br>   Deprecated *decision_function_shape='ovo' and None*.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;ovr&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('break_ties',\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.svm.SVC.html#:~:text=break_ties,-bool%2C%20default%3DFalse\">\n",
       "            break_ties\n",
       "            <span class=\"param-doc-description\">break_ties: bool, default=False<br><br>If true, ``decision_function_shape='ovr'``, and number of classes > 2,<br>:term:`predict` will break ties according to the confidence values of<br>:term:`decision_function`; otherwise the first class among the tied<br>classes is returned. Please note that breaking ties comes at a<br>relatively high computational cost compared to a simple predict. See<br>:ref:`sphx_glr_auto_examples_svm_plot_svm_tie_breaking.py` for an<br>example of its usage with ``decision_function_shape='ovr'``.<br><br>.. versionadded:: 0.22</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</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.svm.SVC.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 pseudo random number generation for shuffling the data for<br>probability estimates. Ignored when `probability` is False.<br>Pass an int for reproducible output across multiple function calls.<br>See :term:`Glossary <random_state>`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">42</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-1');</script></body>"
      ],
      "text/plain": [
       "VotingClassifier(estimators=[('lr', LogisticRegression(random_state=42)),\n",
       "                             ('rf', RandomForestClassifier(random_state=42)),\n",
       "                             ('svc', SVC(random_state=42))])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import make_moons\n",
    "from sklearn.ensemble import RandomForestClassifier, VotingClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.svm import SVC\n",
    "\n",
    "X, y = make_moons(n_samples=500, noise=0.30, random_state=42)\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)\n",
    "\n",
    "voting_clf = VotingClassifier(\n",
    "    estimators=[\n",
    "        ('lr', LogisticRegression(random_state=42)),\n",
    "        ('rf', RandomForestClassifier(random_state=42)),\n",
    "        ('svc', SVC(random_state=42))\n",
    "    ]\n",
    ")\n",
    "voting_clf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lr = 0.864\n",
      "rf = 0.896\n",
      "svc = 0.896\n"
     ]
    }
   ],
   "source": [
    "for name, clf in voting_clf.named_estimators_.items():\n",
    "    print(name, \"=\", clf.score(X_test, y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "voting_clf.predict(X_test[:1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([1]), array([1]), array([0])]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[clf.predict(X_test[:1]) for clf in voting_clf.estimators_]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.912"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "voting_clf.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's use soft voting:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.92"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "voting_clf.voting = \"soft\"\n",
    "voting_clf.named_estimators[\"svc\"].probability = True\n",
    "voting_clf.fit(X_train, y_train)\n",
    "voting_clf.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Bagging and Pasting\n",
    "## Bagging and Pasting in Scikit-Learn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "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>BaggingClassifier(estimator=DecisionTreeClassifier(), max_samples=100,\n",
       "                  n_estimators=500, n_jobs=-1, 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 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-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>BaggingClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.ensemble.BaggingClassifier.html\">?<span>Documentation for BaggingClassifier</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.ensemble.BaggingClassifier.html#:~:text=estimator,-object%2C%20default%3DNone\">\n",
       "            estimator\n",
       "            <span class=\"param-doc-description\">estimator: object, default=None<br><br>The base estimator to fit on random subsets of the dataset.<br>If None, then the base estimator is a<br>:class:`~sklearn.tree.DecisionTreeClassifier`.<br><br>.. versionadded:: 1.2<br>   `base_estimator` was renamed to `estimator`.</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('n_estimators',\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.ensemble.BaggingClassifier.html#:~:text=n_estimators,-int%2C%20default%3D10\">\n",
       "            n_estimators\n",
       "            <span class=\"param-doc-description\">n_estimators: int, default=10<br><br>The number of base estimators in the ensemble.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">500</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_samples',\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.ensemble.BaggingClassifier.html#:~:text=max_samples,-int%20or%20float%2C%20default%3DNone\">\n",
       "            max_samples\n",
       "            <span class=\"param-doc-description\">max_samples: int or float, default=None<br><br>The number of samples to draw from X to train each base estimator (with<br>replacement by default, see `bootstrap` for more details).<br><br>- If None, then draw `X.shape[0]` samples irrespective of `sample_weight`.<br>- If int, then draw `max_samples` samples.<br>- If float, then draw `max_samples * X.shape[0]` unweighted samples or<br>  `max_samples * sample_weight.sum()` weighted samples.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">100</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.ensemble.BaggingClassifier.html#:~:text=max_features,-int%20or%20float%2C%20default%3D1.0\">\n",
       "            max_features\n",
       "            <span class=\"param-doc-description\">max_features: int or float, default=1.0<br><br>The number of features to draw from X to train each base estimator (<br>without replacement by default, see `bootstrap_features` for more<br>details).<br><br>- If int, then draw `max_features` features.<br>- If float, then draw `max(1, int(max_features * n_features_in_))` features.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('bootstrap',\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.ensemble.BaggingClassifier.html#:~:text=bootstrap,-bool%2C%20default%3DTrue\">\n",
       "            bootstrap\n",
       "            <span class=\"param-doc-description\">bootstrap: bool, default=True<br><br>Whether samples are drawn with replacement. If False, sampling without<br>replacement is performed. If fitting with `sample_weight`, it is<br>strongly recommended to choose True, as only drawing with replacement<br>will ensure the expected frequency semantics of `sample_weight`.</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('bootstrap_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.ensemble.BaggingClassifier.html#:~:text=bootstrap_features,-bool%2C%20default%3DFalse\">\n",
       "            bootstrap_features\n",
       "            <span class=\"param-doc-description\">bootstrap_features: bool, default=False<br><br>Whether features are drawn with replacement.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('oob_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.ensemble.BaggingClassifier.html#:~:text=oob_score,-bool%2C%20default%3DFalse\">\n",
       "            oob_score\n",
       "            <span class=\"param-doc-description\">oob_score: bool, default=False<br><br>Whether to use out-of-bag samples to estimate<br>the generalization error. Only available if bootstrap=True.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('warm_start',\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.ensemble.BaggingClassifier.html#:~:text=warm_start,-bool%2C%20default%3DFalse\">\n",
       "            warm_start\n",
       "            <span class=\"param-doc-description\">warm_start: bool, default=False<br><br>When set to True, reuse the solution of the previous call to fit<br>and add more estimators to the ensemble, otherwise, just fit<br>a whole new ensemble. See :term:`the Glossary <warm_start>`.<br><br>.. versionadded:: 0.17<br>   *warm_start* constructor parameter.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\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.ensemble.BaggingClassifier.html#:~:text=n_jobs,-int%2C%20default%3DNone\">\n",
       "            n_jobs\n",
       "            <span class=\"param-doc-description\">n_jobs: int, default=None<br><br>The number of jobs to run in parallel for both :meth:`fit` and<br>:meth:`predict`. ``None`` means 1 unless in a<br>:obj:`joblib.parallel_backend` context. ``-1`` means using all<br>processors. See :term:`Glossary <n_jobs>` for more details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">-1</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.ensemble.BaggingClassifier.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 random resampling of the original dataset<br>(sample wise and feature wise).<br>If the base estimator accepts a `random_state` attribute, a different<br>seed is generated for each instance in the ensemble.<br>Pass an int for reproducible output across multiple function calls.<br>See :term:`Glossary <random_state>`.</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('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.ensemble.BaggingClassifier.html#:~:text=verbose,-int%2C%20default%3D0\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\">verbose: int, default=0<br><br>Controls the verbosity when fitting and predicting.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0</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-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>estimator: DecisionTreeClassifier</div></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"estimator__\"><pre>DecisionTreeClassifier()</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-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" 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=\"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=\"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></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": [
       "BaggingClassifier(estimator=DecisionTreeClassifier(), max_samples=100,\n",
       "                  n_estimators=500, n_jobs=-1, random_state=42)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import BaggingClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,\n",
    "                            max_samples=100, n_jobs=-1, random_state=42)\n",
    "bag_clf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9IAAAF6CAYAAAD1Q2B0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA5aZJREFUeJzsnXl4G9XV/78zli3LtiQ7tuN4d+IsjhNnJxuBxAmQnaUtS2nZu/5KodBCSwstvG1f2tIFWmh5oaVQCoR9SUICIWRz7Ox7HGfzbsdrYsuW5UWa+/vDkWxZ24w0I43l83mePODRnTt3RqP7vffcc8/hGGMMBEEQBEEQBEEQBEGIgg91AwiCIAiCIAiCIAhiOEETaYIgCIIgCIIgCIKQAE2kCYIgCIIgCIIgCEICNJEmCIIgCIIgCIIgCAnQRJogCIIgCIIgCIIgJEATaYIgCIIgCIIgCIKQAE2kCYIgCIIgCIIgCEICNJEmCIIgCIIgCIIgCAnQRJogCIIgCIIgCIIgJEATaYIgAABPPvkkOI7D9u3b/To/JycHOTk5sraJIAiCUB+kFyOPu+++GxzHobKyUtFzwh2O47BkyZJQN4OQCZpIE0SQqaysBMdxTv9iYmKQlpaGZcuW4Ze//CXOnz8f6mYOW5YsWeLyfL3983cgSBAEoTSkF8pCehEY27dvB8dxePLJJxW/lrvvQ6fTYdKkSfjxj3+M5uZmxdtAEEPhGGMs1I0giJFEZWUlxo4di9zcXHzzm98EAPT09KCpqQn79u3DiRMnEBERgUcffRS//e1vwXFcUNrV0tKClpYWZGVlISYmRvL59sFcbm6u3E2TxKuvvupi/f7oo49w9OhR3HXXXS6rIHfffTetjBAEoUpIL5SF9EI8Fy5cQHt7O3JzcxEZGQmgfyJdWFiIX/3qV24n03fffTdee+01VFRUBPzcOI5DYmIi7r//fsex1tZWbN++HSdOnEBubi4OHToEg8EQ0HWUpqysDDExMcjKygp1UwgZ0IS6AQQxUhk/frxb4SkqKsIdd9yBp59+GhEREfj1r38dlPYkJSUhKSnJ7/NDPSCyc/fdd7scq6ysxNGjR3H33XeTSxVBEMMO0gtlIL0QT2pqKlJTU0PahqSkJJffAWMMa9euxcaNG/Hee+/h3nvvDU3jRJKXlxfqJhAyQq7dBKEyFi1ahM2bN0Or1eIPf/gDampqXMp8/PHHWLZsGRISEhAdHY2pU6fij3/8I2w2m9s6P/74Y1x33XVITExEdHQ0cnJycMcdd+DEiROOMp72vG3btg0rV65EWloatFotUlJScNVVV+Gll15yKudpz5vZbMavfvUr5OXlITo6GqNGjcLq1auxe/dul7KD2/Dmm29ixowZ0Ol0SE1NxYMPPgiLxSLiCYrH3ua2tjbcf//9yMzMhEajwauvvuooc+zYMdx2221ITU1FVFQUsrOz8cMf/hCtra1u65RaniAIwl9IL0aOXoh9tu546KGHwHEcDhw44HT8xhtvBMdxDm8HO3aX7aeeespxbOh+5yeffBKFhYUAgKeeesrJ5XroKj9jDH/961+Rl5cHrVaL7OxsPPXUUxAEwWfbfcFxHJYvXw6g31NiMAcPHsT999+PqVOnwmg0QqfToaCgAL/73e/Q19fntr4dO3bg6quvRmxsLBITE3HrrbeipqbGsQ1gKC0tLfjOd76D0aNHIyYmBldccQU+/PBDvPrqq+A4zun9sLd3qIHG/mwrKipEP6euri48+uijyMzMdPyuX3755aC62xO0Ik0QqmTSpEm45ZZb8Prrr+Ojjz7CD3/4Q8dnjz32GH73u98hPT0dX/nKV2A0GrFr1y488sgj2Lt3L959912nun784x/jz3/+M0aNGoUbb7wRo0ePRk1NDb744gvMnj0bU6dO9diOjRs3Yu3atYiPj8cNN9yA1NRUNDc34+jRo3j99dfxne98x+t9dHd3Y+nSpdi3bx9mzZqFH/3oR2hsbMTbb7+Nzz77DG+99RZuvvlml/Oef/55bN68GTfccAOWLl2KzZs3469//StaWlrwxhtvSHya3unp6cHSpUvR2dmJ66+/HhqNBikpKQCATz75BLfccgt4nscNN9yAzMxMlJaW4vnnn8dnn32GvXv3IiEhwVGX1PIEQRCBQnoR/noR6LMtLCzEs88+i23btmHOnDkAAEEQsHPnTgD9k/TB2P+2T5TdsWTJElRWVuK1117D4sWLnSaH8fHxTmUfeeQR7NixA2vWrMHy5cvx0Ucf4cknn0Rvby9++9vfem27GLZs2QIAmDVrltPxl19+GevXr8fVV1+NVatWoaurC9u3b8djjz2G/fv34/3333cq//nnn2P16tWIiIjArbfeirS0NGzbtg2LFi1yq92dnZ1YvHgxSktLsXDhQlx99dWora3Fbbfd5pjcS0Hsc7LZbFizZg22bduGgoIC3H777bh48SJ+/OMfkxdFsGEEQQSViooKBoAtX77ca7l//etfDAC74447HMc+//xzx7mdnZ2O44IgsO9973sMAHvvvfccx9evX88AsIKCAtbS0uJUf19fH2toaHD8/atf/YoBYNu2bXMc+8pXvsIAsCNHjri0b2h92dnZLDs72+nYU089xQCwb3zjG0wQBMfxQ4cOsaioKBYfH89MJpNLG4xGIysrK3Mc7+rqYhMnTmQ8z7O6ujpPj8wjd911l8u92dtsf55dXV0u92cwGFh6ejqrrKx0+uytt95iANj999/vd3mCIAhfkF6QXjAm7dm649KlS4znebZy5UrHsYMHDzIAbNmyZQwAO336tOOzq666iul0OtbT0+PyXCoqKhzHtm3bxgCwX/3qV26vaz9n7NixrL6+3nG8ubmZxcfHM71e73QNbwBgiYmJ7Fe/+pXj3wMPPMCmTZvGNBoNe/DBB13OqaqqYlar1emYIAjs3nvvZQBYUVGR47jVamXZ2dmM4zi2a9cup3PuvPNOBoANnTY9/vjjDAD7zne+43T8iy++cJT/97//7XIfixcvdjom9Tn985//ZADYypUrne7v5MmTLDo62ut3QsgLuXYThEpJS0sD4Oyq9PzzzwMAXnrpJcTGxjqOcxyH3/3ud+A4Dm+99Zbj+N///ncAwHPPPYfExESn+gdb0n2h0+lcjg2tzx2vvfYaIiMjHW2zM3PmTNx1111oa2vDRx995HLegw8+iEmTJjld/+tf/zoEQcDBgwdFtVkKf/jDH1zu8T//+Q9MJhOefvppZGdnO3122223YdasWVi3bp3f5QmCIOSC9GJk6IW/zzY+Ph4zZ87Erl27YLVaAQysOv/P//wPAODLL78EAFgsFuzduxcLFixAVFSUz7rF8MQTTzjtr05KSsINN9yAjo4OnD59WnQ9ra2teOqppxz//vrXv+LYsWOYP38+brzxRpfyWVlZiIiIcDrGcRx+8IMfAAC++OILx/GioiJUVVVh7dq1WLRokdM5v/nNb1zqAYD//ve/iIqKcjxDO8uWLcN1110n+r7siH1O//3vfwEAv/3tb53alZ+fjzvvvFPydQn/IddughhG7NmzB7GxsXjllVfcfq7T6VBWVub4e9++fdBq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FhkZGeK1116zahcU6d23H//4x2LdunVi//79YteuXeKhhx4SbrdbvPHGG1btgqL77rtPeDwesXnzZnHixInQv76+vtA2Tv6bs1Iq56kQqZ2pzFP7/20zT5mndpPuecoLaTGy9AaAqH9vvvlmaBsA4plnnhFCCNHX1yeuvfZaUVpaKrKyssTUqVPFPffcEzqQ2YnefRNiZLmO7373u6KsrEzk5OSIJUuWiMbGxuQ3XoMzZ86Iz372s6KwsFAUFxeLz3/+82EnNE1NTWH729zcLK6++mpRUlIicnJyxLnnniu+8Y1viK6uLov2YNTPf/5zMWXKFJGdnS3mzZsntm3bFvrZokWLxB133BG2/R/+8Adx3nnniezsbHHhhReKv/71r0lusXZ69u3hhx8ObVtWViZWrFghduzYYUGrYwsuURH5L7g/d9xxh1i0aFHUc+bMmSOys7PF9OnTw/727ETvvj3++ONixowZIjc3V5SUlIjFixeLTZs2WdP4GOT2K/I46PS/Oaukcp4KkdqZyjx1xt828zT8OcxTa6V7nrqEEMKIO9tERERERERE6YDrSBMRERERERHpwAtpIiIiIiIiIh14IU1ERERERESkAy+kiYiIiIiIiHTghTQRERERERGRDryQJiIiIiIiItKBF9JEREREREREOvBCmoiIiIiIiEgHXkgTERERERER6cALaSIiIiIiIiIdeCFNRIZasGABXC4Xtm7dGvZ4d3c35syZg5ycHGzYsMGi1hERETkD85TI3nghTUSGevzxxwEA3/nOd0KPDQ4O4sYbb8TOnTvx3HPP4ZOf/KRVzSMiInIE5imRvfFCmogMdfXVV2PlypXYtGkTNm/eDCEE7rzzTmzatAk//vGPccstt1jdRCIiIttjnhLZm0sIIaxuBBGlll27dmHOnDlYuHAh5s2bhx/96Ef49re/jX/7t3+zumlERESOwTwlsi9eSBORKe644w48//zzAIC77roLv/nNb6K2efnll/GLX/wC27dvR0dHB5qamlBVVZXklhIREdkX85TInji0m4hMUVpaCgAoKirC008/LbtNb28vrr76ajz66KPJbBoREZFjME+J7CnT6gYQUer5z//8T/zHf/wHysrK0Nraiueeew5f/OIXo7a7/fbbAQAfffRRsptIRERke8xTIvviHWkiMtQf/vAHPPTQQ7jmmmtQX18Pj8eDNWvWoK+vz+qmEREROQbzlMjeeCFNRIbZuHEjbr/9dtTW1mLdunWoqKjAV77yFZw4cQI//elPrW4eERGRIzBPieyPxcaIyBA7duzA4sWLcc455+C9995DRUUFAKC7uxvTpk1DIBDAoUOHUFJSEvXcjz76CLW1tSyOQkREaY95SuQMvCNNRAk7ePAgVqxYgezsbLz22muh0AeA4uJifOtb30JXVxcee+wxC1tJRERkb8xTIufgHWkishx70ImIiBLHPCVKHlbtJiLLtLe3o7m5GQcPHgQA7NmzB52dnZgyZYrskDUiIiKKxjwlSj7ekSYiyzz77LP4/Oc/H/X4M888gzvvvDP5DSIiInIg5ilR8vFCmoiIiIiIiEgHFhsjIiIiIiIi0oEX0kREREREREQ68EKaiIiIiIiISAdeSBMRERERERHpwAtpIiIiIiIiIh14IU1ERERERESkAy+kiYiIiIiIiHTghTQRERERERGRDryQJiIiIiIiItKBF9JEREREREREOvBCmoiIiIiIiEgHXkgTERERERER6fD/A/15Ssdqxd22AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 7–5\n",
    "\n",
    "def plot_decision_boundary(clf, X, y, alpha=1.0):\n",
    "    axes=[-1.5, 2.4, -1, 1.5]\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 * alpha, cmap='Wistia')\n",
    "    plt.contour(x1, x2, y_pred, cmap=\"Greys\", alpha=0.8 * alpha)\n",
    "    colors = [\"#78785c\", \"#c47b27\"]\n",
    "    markers = (\"o\", \"^\")\n",
    "    for idx in (0, 1):\n",
    "        plt.plot(X[:, 0][y == idx], X[:, 1][y == idx],\n",
    "                 color=colors[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",
    "tree_clf = DecisionTreeClassifier(random_state=42)\n",
    "tree_clf.fit(X_train, y_train)\n",
    "\n",
    "fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
    "plt.sca(axes[0])\n",
    "plot_decision_boundary(tree_clf, X_train, y_train)\n",
    "plt.title(\"Decision Tree\")\n",
    "plt.sca(axes[1])\n",
    "plot_decision_boundary(bag_clf, X_train, y_train)\n",
    "plt.title(\"Decision Trees with Bagging\")\n",
    "plt.ylabel(\"\")\n",
    "save_fig(\"decision_tree_without_and_with_bagging_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Out-of-Bag evaluation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.896"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,\n",
    "                            oob_score=True, n_jobs=-1, random_state=42)\n",
    "bag_clf.fit(X_train, y_train)\n",
    "bag_clf.oob_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.32352941, 0.67647059],\n",
       "       [0.3375    , 0.6625    ],\n",
       "       [1.        , 0.        ]])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bag_clf.oob_decision_function_[:3]  # probas for the first 3 instances"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.92"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "y_pred = bag_clf.predict(X_test)\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you randomly draw one instance from a dataset of size _m_, each instance in the dataset obviously has probability 1/_m_ of getting picked, and therefore it has a probability 1 – 1/_m_ of _not_ getting picked. If you draw _m_ instances with replacement, all draws are independent and therefore each instance has a probability (1 – 1/_m_)<sup>_m_</sup> of _not_ getting picked. Now let's use the fact that exp(_x_) is equal to the limit of (1 + _x_/_m_)<sup>_m_</sup> as _m_ approaches infinity. So if _m_ is large, the ratio of out-of-bag instances will be about exp(–1) ≈ 0.37. So roughly 63% (1 – 0.37) will be sampled."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6323045752290363\n",
      "0.6321205588285577\n"
     ]
    }
   ],
   "source": [
    "# extra code – shows how to compute the 63% proba\n",
    "print(1 - (1 - 1 / 1000) ** 1000)\n",
    "print(1 - np.exp(-1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Random Forests"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16,\n",
    "                                 n_jobs=-1, random_state=42)\n",
    "rnd_clf.fit(X_train, y_train)\n",
    "y_pred_rf = rnd_clf.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A Random Forest is equivalent to a bag of decision trees:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "bag_clf = BaggingClassifier(\n",
    "    DecisionTreeClassifier(max_features=\"sqrt\", max_leaf_nodes=16),\n",
    "    n_estimators=500, n_jobs=-1, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.True_"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# extra code – verifies that the predictions are identical\n",
    "bag_clf.fit(X_train, y_train)\n",
    "y_pred_bag = bag_clf.predict(X_test)\n",
    "np.all(y_pred_bag == y_pred_rf)  # same predictions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Feature Importance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.11 sepal length (cm)\n",
      "0.02 sepal width (cm)\n",
      "0.44 petal length (cm)\n",
      "0.42 petal width (cm)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "\n",
    "iris = load_iris(as_frame=True)\n",
    "rnd_clf = RandomForestClassifier(n_estimators=500, random_state=42)\n",
    "rnd_clf.fit(iris.data, iris.target)\n",
    "for score, name in zip(rnd_clf.feature_importances_, iris.data.columns):\n",
    "    print(round(score, 2), name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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aXrwwQfVu3dv3XzzzWrcuLHy8vL06aef6oYbbtBtt912WmtnZ2frd7/7nW688UZdeumlSkxM1PXXX6/evXtr4sSJmjhxoi699FLddNNNOnr0qN555x0FQaA+ffpo48aNdXrf3bt3V7t27bRgwQI1atRIHTp0UCwW08SJE5WWllancx+Pgg0AgDNk2rRp6t+/f42PdevWTevWrdOUKVP01ltv6Y033lCrVq00duxYTZ48udr1XePHj1dBQYEWLFigadOm6ejRoxo9erQzBduPfvQjXX/99Zo5c6a2bNmiFi1a6L777tPUqVOr7cT80Y9+pIsuukgzZszQf/zHf6i0tFRdu3bV008/rXvvvfe0r1f793//d0nSihUrlJeXp4qKCnXo0EG9e/fWv/7rv6phw4Z65pln9Jvf/Ebp6em65ppr9OSTT+oHP/hBnd93YmKiXnvtNT388MN6+eWXq36zw2233RZqwRYLvjk8BwAAqKWcnBxNmTJF7777bo236kA4uIYNAADAcRRsAAAAjqNgAwAAcBzXsAEAADiODhsAAIDjKNgAAAAcR8EGAADgOAo2AAAAx1GwAQAAOI6CDQAAwHEUbAAAAI6jYAMAAHDc/wNEe0tnM8xxpgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 7–6\n",
    "\n",
    "from sklearn.datasets import fetch_openml\n",
    "\n",
    "X_mnist, y_mnist = fetch_openml('mnist_784', return_X_y=True, as_frame=False)\n",
    "\n",
    "rnd_clf = RandomForestClassifier(n_estimators=100, random_state=42)\n",
    "rnd_clf.fit(X_mnist, y_mnist)\n",
    "\n",
    "heatmap_image = rnd_clf.feature_importances_.reshape(28, 28)\n",
    "plt.imshow(heatmap_image, cmap=\"hot\")\n",
    "cbar = plt.colorbar(ticks=[rnd_clf.feature_importances_.min(),\n",
    "                           rnd_clf.feature_importances_.max()])\n",
    "cbar.ax.set_yticklabels(['Not important', 'Very important'], fontsize=14)\n",
    "plt.axis(\"off\")\n",
    "save_fig(\"mnist_feature_importance_plot\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.5"
  },
  "nav_menu": {
   "height": "252px",
   "width": "333px"
  },
  "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
}
