{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d0f0221a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Q5A: Predict car acceptability/safety with a Random Forest classifier.\n",
    "# Source: https://www.kaggle.com/datasets/elikplim/car-evaluation-data-set\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.compose import ColumnTransformer\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import accuracy_score, classification_report, ConfusionMatrixDisplay\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.preprocessing import OneHotEncoder\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e2f41e5c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset shape: (1728, 7)\n",
      "Acceptability classes: {'unacc': 1210, 'acc': 384, 'good': 69, 'vgood': 65}\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>buying</th>\n",
       "      <th>maint</th>\n",
       "      <th>doors</th>\n",
       "      <th>persons</th>\n",
       "      <th>lug_boot</th>\n",
       "      <th>safety</th>\n",
       "      <th>acceptability</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>vhigh</td>\n",
       "      <td>vhigh</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>small</td>\n",
       "      <td>low</td>\n",
       "      <td>unacc</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>vhigh</td>\n",
       "      <td>vhigh</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>small</td>\n",
       "      <td>med</td>\n",
       "      <td>unacc</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>vhigh</td>\n",
       "      <td>vhigh</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>small</td>\n",
       "      <td>high</td>\n",
       "      <td>unacc</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>vhigh</td>\n",
       "      <td>vhigh</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>med</td>\n",
       "      <td>low</td>\n",
       "      <td>unacc</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>vhigh</td>\n",
       "      <td>vhigh</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>med</td>\n",
       "      <td>med</td>\n",
       "      <td>unacc</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  buying  maint doors persons lug_boot safety acceptability\n",
       "0  vhigh  vhigh     2       2    small    low         unacc\n",
       "1  vhigh  vhigh     2       2    small    med         unacc\n",
       "2  vhigh  vhigh     2       2    small   high         unacc\n",
       "3  vhigh  vhigh     2       2      med    low         unacc\n",
       "4  vhigh  vhigh     2       2      med    med         unacc"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# The downloaded CSV has no header. The last column is car acceptability.\n",
    "# Safety is one input feature; it is not the target label in this dataset.\n",
    "columns = [\"buying\", \"maint\", \"doors\", \"persons\", \"lug_boot\", \"safety\", \"acceptability\"]\n",
    "cars = pd.read_csv(\"car_evaluation.csv\", header=None, names=columns)\n",
    "print(\"Dataset shape:\", cars.shape)\n",
    "print(\"Acceptability classes:\", cars[\"acceptability\"].value_counts().to_dict())\n",
    "cars.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a416fe2b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>.sk-global {\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-global.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-global.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-global {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       ".sk-global pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       ".sk-global input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip-path: inset(100%);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       ".sk-global 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-global 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-global 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-global 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-global 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-global div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       ".sk-global 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-global 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-global 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-global 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-global 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-global label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       ".sk-global 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-global div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       ".sk-global 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-global div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       ".sk-global 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-global input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       ".sk-global 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-global 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-global 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-global 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-global div.sk-label label.sk-toggleable__label,\n",
       ".sk-global 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-global 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-global 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-global div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       ".sk-global 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-global div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       ".sk-global div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       ".sk-global 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-global 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-global 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-global 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-global a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-top-container.sk-global {\n",
       "  /* pydata-sphinx-theme hides overflow, so scrolling is disabled.\n",
       "   We need to set it to !important and add tabindex=\"0\" in the HTML\n",
       "   to allow keyboard-only users to navigate the display. */\n",
       "  overflow-x: scroll !important;\n",
       "  max-width: 100%;\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 td {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table :is(td, th) {\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, .estimator-table th {\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",
       "td.fitted-att-type {\n",
       "    white-space: preserve nowrap;\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",
       "@supports(anchor-name: --doc-link) {\n",
       "    a.param-doc-link,\n",
       "    a.param-doc-link:link,\n",
       "    a.param-doc-link:visited {\n",
       "    anchor-name: --doc-link;\n",
       "    }\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",
       "@supports(position-area: center right) {\n",
       "    .param-doc-description {\n",
       "    position-area: center right;\n",
       "    position: fixed;\n",
       "    margin-left: 0;\n",
       "    }\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",
       "\n",
       ".features {\n",
       "  font-family: monospace;\n",
       "  cursor: pointer;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: .20em;\n",
       "  margin-bottom: 0.5em;\n",
       "  font-size: inherit; /* Needed for jupyter */\n",
       "}\n",
       "\n",
       ".features.fitted {\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       ".features summary {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  margin-bottom: 0;\n",
       "  text-align: center;\n",
       "  align-items: center;\n",
       "  justify-content: center;\n",
       "  gap: 0.5em;\n",
       "  padding: .25em;\n",
       "}\n",
       "\n",
       ".features details[open] > summary {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "  border-radius: .20em 0 0 0;\n",
       "}\n",
       "\n",
       ".features.fitted details[open] > summary {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "  border-radius: .20em 0 0 0;\n",
       "}\n",
       "\n",
       ".features details > summary .arrow::before {\n",
       "  content: \"▸\";\n",
       "  color: grey;\n",
       "}\n",
       "\n",
       ".features details[open] > summary .arrow::before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       ".features details:hover > summary {\n",
       "  margin: 0;\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       ".features.fitted details:hover > summary {\n",
       "  margin: 0;\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       ".features .features-container {\n",
       "  max-width: 15em;\n",
       "  max-height: 10em;\n",
       "  overflow: auto;\n",
       "  scrollbar-width: thin;\n",
       "  padding: .25em 0.1rem;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 0 0 .5em .5em;\n",
       "}\n",
       "\n",
       ".features.fitted .features-container {\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       ".features .image-container {\n",
       "  block-size: 1em;\n",
       "  inline-size: 1em;\n",
       "  padding: 0;\n",
       "  margin: 0%;\n",
       "  display: flex;\n",
       "  justify-content: center;\n",
       "  align-items: center;\n",
       "}\n",
       "\n",
       ".features .copy-paste-icon {\n",
       "  background-size: 1em 1em;\n",
       "  width: 1em;\n",
       "  height: 1em;\n",
       "  filter: grayscale(100%) opacity(60%);\n",
       "}\n",
       "\n",
       ".features .features-container table {\n",
       "  width: 100%;\n",
       "  margin: 0.01em;\n",
       "}\n",
       "\n",
       ".features .features-container table tr:nth-child(odd) {\n",
       "  background-color: #fff;\n",
       "}\n",
       "\n",
       ".features .features-container table tr:nth-child(even) {\n",
       "  background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".features .features-container table tr:hover {\n",
       "  background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".features .features-container table {\n",
       "  table-layout: inherit;\n",
       "}\n",
       "\n",
       ".features .features-container table td {\n",
       "  text-align: left;\n",
       "  padding: 0 0.5em;\n",
       "  border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "  white-space: nowrap;\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       ".total_features {\n",
       "  display: flex;\n",
       "  justify-content: center;\n",
       "  margin-top: 0.5em;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-2\" tabindex=\"0\" class=\"sk-top-container sk-global\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[(&#x27;columntransformer&#x27;,\n",
       "                 ColumnTransformer(transformers=[(&#x27;categories&#x27;,\n",
       "                                                  OneHotEncoder(handle_unknown=&#x27;ignore&#x27;),\n",
       "                                                  Index([&#x27;buying&#x27;, &#x27;maint&#x27;, &#x27;doors&#x27;, &#x27;persons&#x27;, &#x27;lug_boot&#x27;, &#x27;safety&#x27;], dtype=&#x27;object&#x27;))])),\n",
       "                (&#x27;randomforestclassifier&#x27;,\n",
       "                 RandomForestClassifier(class_weight=&#x27;balanced&#x27;,\n",
       "                                        n_estimators=150, 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 sk-global\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>Pipeline</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html\">?<span>Documentation for Pipeline</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('steps',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-steps;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=steps,-list%20of%20tuples\">\n",
       "            steps\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-steps;\">\n",
       "            steps: list of tuples<br><br>List of (name of step, estimator) tuples that are to be chained in<br>sequential order. To be compatible with the scikit-learn API, all steps<br>must define `fit`. All non-last steps must also define `transform`. See<br>:ref:`Combining Estimators &lt;combining_estimators&gt;` for more details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">[(&#x27;columntransformer&#x27;, ...), (&#x27;randomforestclassifier&#x27;, ...)]</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('transform_input',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-transform_input;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=transform_input,-list%20of%20str%2C%20default%3DNone\">\n",
       "            transform_input\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-transform_input;\">\n",
       "            transform_input: list of str, default=None<br><br>The names of the :term:`metadata` parameters that should be transformed by the<br>pipeline before passing it to the step consuming it.<br><br>This enables transforming some input arguments to ``fit`` (other than ``X``)<br>to be transformed by the steps of the pipeline up to the step which requires<br>them. Requirement is defined via :ref:`metadata routing &lt;metadata_routing&gt;`.<br>For instance, this can be used to pass a validation set through the pipeline.<br><br>You can only set this if metadata routing is enabled, which you<br>can enable using ``sklearn.set_config(enable_metadata_routing=True)``.<br><br>.. versionadded:: 1.6</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('memory',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-memory;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=memory,-str%20or%20object%20with%20the%20joblib.Memory%20interface%2C%20default%3DNone\">\n",
       "            memory\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-memory;\">\n",
       "            memory: str or object with the joblib.Memory interface, default=None<br><br>Used to cache the fitted transformers of the pipeline. The last step<br>will never be cached, even if it is a transformer. By default, no<br>caching is performed. If a string is given, it is the path to the<br>caching directory. Enabling caching triggers a clone of the transformers<br>before fitting. Therefore, the transformer instance given to the<br>pipeline cannot be inspected directly. Use the attribute ``named_steps``<br>or ``steps`` to inspect estimators within the pipeline. Caching the<br>transformers is advantageous when fitting is time consuming. See<br>:ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py`<br>for an example on how to enable caching.</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",
       "            style=\"anchor-name: --doc-link-verbose;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=verbose,-bool%2C%20default%3DFalse\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-verbose;\">\n",
       "            verbose: bool, default=False<br><br>If True, the time elapsed while fitting each step will be printed as it<br>is completed.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    \n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Fitted attributes</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                    <tbody>\n",
       "                        <tr>\n",
       "                        <th>Name</th>\n",
       "                        <th>Type</th>\n",
       "                        <th>Value</th>\n",
       "                        </tr>\n",
       "                        \n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-classes_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=classes_,-ndarray%20of%20shape%20%28n_classes%2C%29\">\n",
       "            classes_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-classes_;\">\n",
       "            classes_: ndarray of shape (n_classes,)<br><br>The classes labels. Only exist if the last step of the pipeline is a<br>classifier.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[object](4,)</td>\n",
       "           <td>[&#x27;acc&#x27;,&#x27;good&#x27;,&#x27;unacc&#x27;,&#x27;vgood&#x27;]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-feature_names_in_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=feature_names_in_,-ndarray%20of%20shape%20%28n_features_in_%2C%29\">\n",
       "            feature_names_in_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-feature_names_in_;\">\n",
       "            feature_names_in_: ndarray of shape (`n_features_in_`,)<br><br>Names of features seen during :term:`fit`. Only defined if the<br>underlying estimator exposes such an attribute when fit.<br><br>.. versionadded:: 1.0</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[object](6,)</td>\n",
       "           <td>[&#x27;buying&#x27;,&#x27;maint&#x27;,&#x27;doors&#x27;,&#x27;persons&#x27;,&#x27;lug_boot&#x27;,&#x27;safety&#x27;]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-n_features_in_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=n_features_in_,-int\">\n",
       "            n_features_in_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_features_in_;\">\n",
       "            n_features_in_: int<br><br>Number of features seen during :term:`fit`. Only defined if the<br>underlying first estimator in `steps` exposes such an attribute<br>when fit.<br><br>.. versionadded:: 0.24</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">int</td>\n",
       "           <td>6</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "                    </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div><div class=\"sk-serial\"><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 sk-global\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>columntransformer: ColumnTransformer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for columntransformer: ColumnTransformer</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"columntransformer__\">\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('transformers',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-transformers;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=transformers,-list%20of%20tuples\">\n",
       "            transformers\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-transformers;\">\n",
       "            transformers: list of tuples<br><br>List of (name, transformer, columns) tuples specifying the<br>transformer objects to be applied to subsets of the data.<br><br>name : str<br>    Like in Pipeline and FeatureUnion, this allows the transformer and<br>    its parameters to be set using ``set_params`` and searched in grid<br>    search.<br>transformer : {&#x27;drop&#x27;, &#x27;passthrough&#x27;} or estimator<br>    Estimator must support :term:`fit` and :term:`transform`.<br>    Special-cased strings &#x27;drop&#x27; and &#x27;passthrough&#x27; are accepted as<br>    well, to indicate to drop the columns or to pass them through<br>    untransformed, respectively.<br>columns :  str, array-like of str, int, array-like of int,                 array-like of bool, slice or callable<br>    Indexes the data on its second axis. Integers are interpreted as<br>    positional columns, while strings can reference DataFrame columns<br>    by name.  A scalar string or int should be used where<br>    ``transformer`` expects X to be a 1d array-like (vector),<br>    otherwise a 2d array will be passed to the transformer.<br>    A callable is passed the input data `X` and can return any of the<br>    above. To select multiple columns by name or dtype, you can use<br>    :obj:`make_column_selector`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">[(&#x27;categories&#x27;, ...)]</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('remainder',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-remainder;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=remainder,-%7B%27drop%27%2C%20%27passthrough%27%7D%20or%20estimator%2C%20default%3D%27drop%27\">\n",
       "            remainder\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-remainder;\">\n",
       "            remainder: {&#x27;drop&#x27;, &#x27;passthrough&#x27;} or estimator, default=&#x27;drop&#x27;<br><br>By default, only the specified columns in `transformers` are<br>transformed and combined in the output, and the non-specified<br>columns are dropped. (default of ``&#x27;drop&#x27;``).<br>By specifying ``remainder=&#x27;passthrough&#x27;``, all remaining columns that<br>were not specified in `transformers`, but present in the data passed<br>to `fit` will be automatically passed through. This subset of columns<br>is concatenated with the output of the transformers. For dataframes,<br>extra columns not seen during `fit` will be excluded from the output<br>of `transform`.<br>By setting ``remainder`` to be an estimator, the remaining<br>non-specified columns will use the ``remainder`` estimator. The<br>estimator must support :term:`fit` and :term:`transform`.<br>Note that using this feature requires that the DataFrame columns<br>input at :term:`fit` and :term:`transform` have identical order.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;drop&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('sparse_threshold',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-sparse_threshold;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=sparse_threshold,-float%2C%20default%3D0.3\">\n",
       "            sparse_threshold\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-sparse_threshold;\">\n",
       "            sparse_threshold: float, default=0.3<br><br>If the output of the different transformers contains sparse matrices,<br>these will be stacked as a sparse matrix if the overall density is<br>lower than this value. Use ``sparse_threshold=0`` to always return<br>dense.  When the transformed output consists of all dense data, the<br>stacked result will be dense, and this keyword will be ignored.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.3</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",
       "            style=\"anchor-name: --doc-link-n_jobs;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=n_jobs,-int%2C%20default%3DNone\">\n",
       "            n_jobs\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_jobs;\">\n",
       "            n_jobs: int, default=None<br><br>Number of jobs to run in parallel.<br>``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.<br>``-1`` means using all processors. See :term:`Glossary &lt;n_jobs&gt;`<br>for more 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('transformer_weights',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-transformer_weights;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=transformer_weights,-dict%2C%20default%3DNone\">\n",
       "            transformer_weights\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-transformer_weights;\">\n",
       "            transformer_weights: dict, default=None<br><br>Multiplicative weights for features per transformer. The output of the<br>transformer is multiplied by these weights. Keys are transformer names,<br>values the weights.</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",
       "            style=\"anchor-name: --doc-link-verbose;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=verbose,-bool%2C%20default%3DFalse\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-verbose;\">\n",
       "            verbose: bool, default=False<br><br>If True, the time elapsed while fitting each transformer will be<br>printed as it is completed.</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('verbose_feature_names_out',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-verbose_feature_names_out;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=verbose_feature_names_out,-bool%2C%20str%20or%20Callable%5B%5Bstr%2C%20str%5D%2C%20str%5D%2C%20default%3DTrue\">\n",
       "            verbose_feature_names_out\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-verbose_feature_names_out;\">\n",
       "            verbose_feature_names_out: bool, str or Callable[[str, str], str], default=True<br><br>- If True, :meth:`ColumnTransformer.get_feature_names_out` will prefix<br>  all feature names with the name of the transformer that generated that<br>  feature. It is equivalent to setting<br>  `verbose_feature_names_out=&quot;{transformer_name}__{feature_name}&quot;`.<br>- If False, :meth:`ColumnTransformer.get_feature_names_out` will not<br>  prefix any feature names and will error if feature names are not<br>  unique.<br>- If ``Callable[[str, str], str]``,<br>  :meth:`ColumnTransformer.get_feature_names_out` will rename all the features<br>  using the name of the transformer. The first argument of the callable is the<br>  transformer name and the second argument is the feature name. The returned<br>  string will be the new feature name.<br>- If ``str``, it must be a string ready for formatting. The given string will<br>  be formatted using two field names: ``transformer_name`` and ``feature_name``.<br>  e.g. ``&quot;{feature_name}__{transformer_name}&quot;``. See :meth:`str.format` method<br>  from the standard library for more info.<br><br>.. versionadded:: 1.0<br><br>.. versionchanged:: 1.6<br>    `verbose_feature_names_out` can be a callable or a string to be formatted.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">True</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    \n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Fitted attributes</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                    <tbody>\n",
       "                        <tr>\n",
       "                        <th>Name</th>\n",
       "                        <th>Type</th>\n",
       "                        <th>Value</th>\n",
       "                        </tr>\n",
       "                        \n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-feature_names_in_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=feature_names_in_,-ndarray%20of%20shape%20%28n_features_in_%2C%29\">\n",
       "            feature_names_in_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-feature_names_in_;\">\n",
       "            feature_names_in_: ndarray of shape (`n_features_in_`,)<br><br>Names of features seen during :term:`fit`. Defined only when `X`<br>has feature names that are all strings.<br><br>.. versionadded:: 1.0</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[object](6,)</td>\n",
       "           <td>[&#x27;buying&#x27;,&#x27;maint&#x27;,&#x27;doors&#x27;,&#x27;persons&#x27;,&#x27;lug_boot&#x27;,&#x27;safety&#x27;]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-n_features_in_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=n_features_in_,-int\">\n",
       "            n_features_in_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_features_in_;\">\n",
       "            n_features_in_: int<br><br>Number of features seen during :term:`fit`. Only defined if the<br>underlying transformers expose such an attribute when fit.<br><br>.. versionadded:: 0.24</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">int</td>\n",
       "           <td>6</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-named_transformers_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=named_transformers_,-%3Aclass%3A~sklearn.utils.Bunch\">\n",
       "            named_transformers_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-named_transformers_;\">\n",
       "            named_transformers_: :class:`~sklearn.utils.Bunch`<br><br>Read-only attribute to access any transformer by given name.<br>Keys are transformer names and values are the fitted transformer<br>objects.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">Bunch</td>\n",
       "           <td>{&#x27;categories&#x27;...own=&#x27;ignore&#x27;)}</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-output_indices_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=output_indices_,-dict\">\n",
       "            output_indices_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-output_indices_;\">\n",
       "            output_indices_: dict<br><br>A dictionary from each transformer name to a slice, where the slice<br>corresponds to indices in the transformed output. This is useful to<br>inspect which transformer is responsible for which transformed<br>feature(s).<br><br>.. versionadded:: 1.0</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">dict</td>\n",
       "           <td>{&#x27;ca...es&#x27;: slice(0, 21, None), &#x27;re...er&#x27;: slice(0, 0, None)}</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-sparse_output_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=sparse_output_,-bool\">\n",
       "            sparse_output_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-sparse_output_;\">\n",
       "            sparse_output_: bool<br><br>Boolean flag indicating whether the output of ``transform`` is a<br>sparse matrix or a dense numpy array, which depends on the output<br>of the individual transformers and the `sparse_threshold` keyword.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">bool</td>\n",
       "           <td>True</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-transformers_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.compose.ColumnTransformer.html#:~:text=transformers_,-list\">\n",
       "            transformers_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-transformers_;\">\n",
       "            transformers_: list<br><br>The collection of fitted transformers as tuples of (name,<br>fitted_transformer, column). `fitted_transformer` can be an estimator,<br>or `&#x27;drop&#x27;`; `&#x27;passthrough&#x27;` is replaced with an equivalent<br>:class:`~sklearn.preprocessing.FunctionTransformer`. In case there were<br>no columns selected, this will be the unfitted transformer. If there<br>are remaining columns, the final element is a tuple of the form:<br>(&#x27;remainder&#x27;, transformer, remaining_columns) corresponding to the<br>``remainder`` parameter. If there are remaining columns, then<br>``len(transformers_)==len(transformers)+1``, otherwise<br>``len(transformers_)==len(transformers)``.<br><br>.. versionadded:: 1.7<br>    The format of the remaining columns now attempts to match that of the other<br>    transformers: if all columns were provided as column names (`str`), the<br>    remaining columns are stored as column names; if all columns were provided<br>    as mask arrays (`bool`), so are the remaining columns; in all other cases<br>    the remaining columns are stored as indices (`int`).</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">list</td>\n",
       "           <td>[(&#x27;ca...es&#x27;, OneHotEncoder...nown=&#x27;ignore&#x27;), Index([&#x27;buyin...type=&#x27;object&#x27;))]</td>\n",
       "\n",
       "\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 sk-global\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>categories</div></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"columntransformer__categories__\"><pre>Index([&#x27;buying&#x27;, &#x27;maint&#x27;, &#x27;doors&#x27;, &#x27;persons&#x27;, &#x27;lug_boot&#x27;, &#x27;safety&#x27;], dtype=&#x27;object&#x27;)</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 sk-global\" id=\"sk-estimator-id-9\" type=\"checkbox\" ><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>OneHotEncoder</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"columntransformer__categories__\">\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('handle_unknown',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-handle_unknown;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=handle_unknown,-%7B%27error%27%2C%20%27ignore%27%2C%20%27infrequent_if_exist%27%2C%20%27warn%27%7D%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%3D%27error%27\">\n",
       "            handle_unknown\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-handle_unknown;\">\n",
       "            handle_unknown: {&#x27;error&#x27;, &#x27;ignore&#x27;, &#x27;infrequent_if_exist&#x27;, &#x27;warn&#x27;},                      default=&#x27;error&#x27;<br><br>Specifies the way unknown categories are handled during :meth:`transform`.<br><br>- &#x27;error&#x27; : Raise an error if an unknown category is present during transform.<br>- &#x27;ignore&#x27; : When an unknown category is encountered during<br>  transform, the resulting one-hot encoded columns for this feature<br>  will be all zeros. In the inverse transform, an unknown category<br>  will be denoted as None.<br>- &#x27;infrequent_if_exist&#x27; : When an unknown category is encountered<br>  during transform, the resulting one-hot encoded columns for this<br>  feature will map to the infrequent category if it exists. The<br>  infrequent category will be mapped to the last position in the<br>  encoding. During inverse transform, an unknown category will be<br>  mapped to the category denoted `&#x27;infrequent&#x27;` if it exists. If the<br>  `&#x27;infrequent&#x27;` category does not exist, then :meth:`transform` and<br>  :meth:`inverse_transform` will handle an unknown category as with<br>  `handle_unknown=&#x27;ignore&#x27;`. Infrequent categories exist based on<br>  `min_frequency` and `max_categories`. Read more in the<br>  :ref:`User Guide &lt;encoder_infrequent_categories&gt;`.<br>- &#x27;warn&#x27; : When an unknown category is encountered during transform<br>  a warning is issued, and the encoding then proceeds as described for<br>  `handle_unknown=&quot;infrequent_if_exist&quot;`.<br><br>.. versionchanged:: 1.1<br>    `&#x27;infrequent_if_exist&#x27;` was added to automatically handle unknown<br>    categories and infrequent categories.<br><br>.. versionadded:: 1.6<br>   The option `&quot;warn&quot;` was added in 1.6.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;ignore&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('categories',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-categories;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=categories,-%27auto%27%20or%20a%20list%20of%20array-like%2C%20default%3D%27auto%27\">\n",
       "            categories\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-categories;\">\n",
       "            categories: &#x27;auto&#x27; or a list of array-like, default=&#x27;auto&#x27;<br><br>Categories (unique values) per feature:<br><br>- &#x27;auto&#x27; : Determine categories automatically from the training data.<br>- list : ``categories[i]`` holds the categories expected in the ith<br>  column. The passed categories should not mix strings and numeric<br>  values within a single feature, and should be sorted in case of<br>  numeric values.<br><br>The used categories can be found in the ``categories_`` attribute.<br><br>.. versionadded:: 0.20</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;auto&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('drop',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-drop;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=drop,-%7B%27first%27%2C%20%27if_binary%27%7D%20or%20an%20array-like%20of%20shape%20%28n_features%2C%29%2C%20%20%20%20%20%20%20%20%20%20%20%20%20default%3DNone\">\n",
       "            drop\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-drop;\">\n",
       "            drop: {&#x27;first&#x27;, &#x27;if_binary&#x27;} or an array-like of shape (n_features,),             default=None<br><br>Specifies a methodology to use to drop one of the categories per<br>feature. This is useful in situations where perfectly collinear<br>features cause problems, such as when feeding the resulting data<br>into an unregularized linear regression model.<br><br>However, dropping one category breaks the symmetry of the original<br>representation and can therefore induce a bias in downstream models,<br>for instance for penalized linear classification or regression models.<br><br>- None : retain all features (the default).<br>- &#x27;first&#x27; : drop the first category in each feature. If only one<br>  category is present, the feature will be dropped entirely.<br>- &#x27;if_binary&#x27; : drop the first category in each feature with two<br>  categories. Features with 1 or more than 2 categories are<br>  left intact.<br>- array : ``drop[i]`` is the category in feature ``X[:, i]`` that<br>  should be dropped.<br><br>When `max_categories` or `min_frequency` is configured to group<br>infrequent categories, the dropping behavior is handled after the<br>grouping.<br><br>.. versionadded:: 0.21<br>   The parameter `drop` was added in 0.21.<br><br>.. versionchanged:: 0.23<br>   The option `drop=&#x27;if_binary&#x27;` was added in 0.23.<br><br>.. versionchanged:: 1.1<br>    Support for dropping infrequent categories.</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('sparse_output',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-sparse_output;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=sparse_output,-bool%2C%20default%3DTrue\">\n",
       "            sparse_output\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-sparse_output;\">\n",
       "            sparse_output: bool, default=True<br><br>When ``True``, it returns a SciPy sparse matrix/array<br>in &quot;Compressed Sparse Row&quot; (CSR) format.<br><br>.. versionadded:: 1.2<br>   `sparse` was renamed to `sparse_output`</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('dtype',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-dtype;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=dtype,-number%20type%2C%20default%3Dnp.float64\">\n",
       "            dtype\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-dtype;\">\n",
       "            dtype: number type, default=np.float64<br><br>Desired dtype of output.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&lt;class &#x27;numpy.float64&#x27;&gt;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_frequency',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-min_frequency;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=min_frequency,-int%20or%20float%2C%20default%3DNone\">\n",
       "            min_frequency\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-min_frequency;\">\n",
       "            min_frequency: int or float, default=None<br><br>Specifies the minimum frequency below which a category will be<br>considered infrequent.<br><br>- If `int`, categories with a smaller cardinality will be considered<br>  infrequent.<br><br>- If `float`, categories with a smaller cardinality than<br>  `min_frequency * n_samples`  will be considered infrequent.<br><br>.. versionadded:: 1.1<br>    Read more in the :ref:`User Guide &lt;encoder_infrequent_categories&gt;`.</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_categories',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-max_categories;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=max_categories,-int%2C%20default%3DNone\">\n",
       "            max_categories\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-max_categories;\">\n",
       "            max_categories: int, default=None<br><br>Specifies an upper limit to the number of output features for each input<br>feature when considering infrequent categories. If there are infrequent<br>categories, `max_categories` includes the category representing the<br>infrequent categories along with the frequent categories. If `None`,<br>there is no limit to the number of output features.<br><br>.. versionadded:: 1.1<br>    Read more in the :ref:`User Guide &lt;encoder_infrequent_categories&gt;`.</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('feature_name_combiner',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-feature_name_combiner;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=feature_name_combiner,-%22concat%22%20or%20callable%2C%20default%3D%22concat%22\">\n",
       "            feature_name_combiner\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-feature_name_combiner;\">\n",
       "            feature_name_combiner: &quot;concat&quot; or callable, default=&quot;concat&quot;<br><br>Callable with signature `def callable(input_feature, category)` that returns a<br>string. This is used to create feature names to be returned by<br>:meth:`get_feature_names_out`.<br><br>`&quot;concat&quot;` concatenates encoded feature name and category with<br>`feature + &quot;_&quot; + str(category)`.E.g. feature X with values 1, 6, 7 create<br>feature names `X_1, X_6, X_7`.<br><br>.. versionadded:: 1.3</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;concat&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    \n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Fitted attributes</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                    <tbody>\n",
       "                        <tr>\n",
       "                        <th>Name</th>\n",
       "                        <th>Type</th>\n",
       "                        <th>Value</th>\n",
       "                        </tr>\n",
       "                        \n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-categories_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=categories_,-list%20of%20arrays\">\n",
       "            categories_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-categories_;\">\n",
       "            categories_: list of arrays<br><br>The categories of each feature determined during fitting<br>(in order of the features in X and corresponding with the output<br>of ``transform``). This includes the category specified in ``drop``<br>(if any).</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">list</td>\n",
       "           <td>[array([&#x27;high&#x27;... dtype=object), array([&#x27;high&#x27;... dtype=object), array([&#x27;2&#x27;, &#x27;... dtype=object), array([&#x27;2&#x27;, &#x27;... dtype=object), ...]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-drop_idx_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=drop_idx_,-array%20of%20shape%20%28n_features%2C%29\">\n",
       "            drop_idx_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-drop_idx_;\">\n",
       "            drop_idx_: array of shape (n_features,)<br><br>- ``drop_idx_[i]`` is the index in ``categories_[i]`` of the category<br>  to be dropped for each feature.<br>- ``drop_idx_[i] = None`` if no category is to be dropped from the<br>  feature with index ``i``, e.g. when `drop=&#x27;if_binary&#x27;` and the<br>  feature isn&#x27;t binary.<br>- ``drop_idx_ = None`` if all the transformed features will be<br>  retained.<br><br>If infrequent categories are enabled by setting `min_frequency` or<br>`max_categories` to a non-default value and `drop_idx[i]` corresponds<br>to an infrequent category, then the entire infrequent category is<br>dropped.<br><br>.. versionchanged:: 0.23<br>   Added the possibility to contain `None` values.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">NoneType</td>\n",
       "           <td>None</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-feature_names_in_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=feature_names_in_,-ndarray%20of%20shape%20%28n_features_in_%2C%29\">\n",
       "            feature_names_in_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-feature_names_in_;\">\n",
       "            feature_names_in_: ndarray of shape (`n_features_in_`,)<br><br>Names of features seen during :term:`fit`. Defined only when `X`<br>has feature names that are all strings.<br><br>.. versionadded:: 1.0</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[object](6,)</td>\n",
       "           <td>[&#x27;buying&#x27;,&#x27;maint&#x27;,&#x27;doors&#x27;,&#x27;persons&#x27;,&#x27;lug_boot&#x27;,&#x27;safety&#x27;]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-n_features_in_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.preprocessing.OneHotEncoder.html#:~:text=n_features_in_,-int\">\n",
       "            n_features_in_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_features_in_;\">\n",
       "            n_features_in_: int<br><br>Number of features seen during :term:`fit`.<br><br>.. versionadded:: 1.0</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">int</td>\n",
       "           <td>6</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "                    </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div>\n",
       "        <div class=\"features fitted\">\n",
       "          <details>\n",
       "            <summary>\n",
       "              <div class=\"arrow\"></div>\n",
       "              <div>21 features</div>\n",
       "              <div class=\"image-container\" title=\"Copy all output features\">\n",
       "                <i class=\"copy-paste-icon\"\n",
       "                  onclick=\"\n",
       "                  event.stopPropagation();\n",
       "                  event.preventDefault();\n",
       "                  copyFeatureNamesToClipboard(this);\n",
       "                  \"\n",
       "                >\n",
       "                </i>\n",
       "              </div>\n",
       "            </summary>\n",
       "            <div class=\"features-container\">\n",
       "                <table class=\"features-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr>\n",
       "          <td>buying_high</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>buying_low</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>buying_med</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>buying_vhigh</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>maint_high</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>maint_low</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>maint_med</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>maint_vhigh</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>doors_2</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>doors_3</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>doors_4</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>doors_5more</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>persons_2</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>persons_4</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>persons_more</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>lug_boot_big</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>lug_boot_med</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>lug_boot_small</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>safety_high</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>safety_low</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>safety_med</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </div>\n",
       "          </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually sk-global\" id=\"sk-estimator-id-10\" type=\"checkbox\" ><label for=\"sk-estimator-id-10\" 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.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"randomforestclassifier__\">\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('n_estimators',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-n_estimators;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=n_estimators,-int%2C%20default%3D100\">\n",
       "            n_estimators\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_estimators;\">\n",
       "            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\">150</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",
       "            style=\"anchor-name: --doc-link-random_state;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-random_state;\">\n",
       "            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 &lt; n_features``).<br>See :term:`Glossary &lt;random_state&gt;` for details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">42</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\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",
       "            style=\"anchor-name: --doc-link-class_weight;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-class_weight;\">\n",
       "            class_weight: {&quot;balanced&quot;, &quot;balanced_subsample&quot;}, 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 &quot;balanced&quot; 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 &quot;balanced_subsample&quot; mode is the same as &quot;balanced&quot; 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\">&#x27;balanced&#x27;</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",
       "            style=\"anchor-name: --doc-link-criterion;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-criterion;\">\n",
       "            criterion: {&quot;gini&quot;, &quot;entropy&quot;, &quot;log_loss&quot;}, default=&quot;gini&quot;<br><br>The function to measure the quality of a split. Supported criteria are<br>&quot;gini&quot; for the Gini impurity and &quot;log_loss&quot; and &quot;entropy&quot; 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",
       "            style=\"anchor-name: --doc-link-max_depth;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=max_depth,-int%2C%20default%3DNone\">\n",
       "            max_depth\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-max_depth;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-min_samples_split;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-min_samples_split;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-min_samples_leaf;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-min_samples_leaf;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-min_weight_fraction_leaf;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-min_weight_fraction_leaf;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-max_features;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-max_features;\">\n",
       "            max_features: {&quot;sqrt&quot;, &quot;log2&quot;, None}, int or float, default=&quot;sqrt&quot;<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 &quot;sqrt&quot;, then `max_features=sqrt(n_features)`.<br>- If &quot;log2&quot;, 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 `&quot;auto&quot;` to `&quot;sqrt&quot;`.<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",
       "            style=\"anchor-name: --doc-link-max_leaf_nodes;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=max_leaf_nodes,-int%2C%20default%3DNone\">\n",
       "            max_leaf_nodes\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-max_leaf_nodes;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-min_impurity_decrease;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-min_impurity_decrease;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-bootstrap;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=bootstrap,-bool%2C%20default%3DTrue\">\n",
       "            bootstrap\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-bootstrap;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-oob_score;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=oob_score,-bool%20or%20callable%2C%20default%3DFalse\">\n",
       "            oob_score\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-oob_score;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-n_jobs;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=n_jobs,-int%2C%20default%3DNone\">\n",
       "            n_jobs\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_jobs;\">\n",
       "            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>&lt;n_jobs&gt;` for more 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('verbose',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-verbose;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=verbose,-int%2C%20default%3D0\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-verbose;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-warm_start;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=warm_start,-bool%2C%20default%3DFalse\">\n",
       "            warm_start\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-warm_start;\">\n",
       "            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 &lt;warm_start&gt;` 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('ccp_alpha',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-ccp_alpha;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-ccp_alpha;\">\n",
       "            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",
       "            style=\"anchor-name: --doc-link-max_samples;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=max_samples,-int%20or%20float%2C%20default%3DNone\">\n",
       "            max_samples\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-max_samples;\">\n",
       "            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 irrespective of<br>  `sample_weight`.<br>- If int, then draw `max_samples` samples.<br>- If float, then draw `max_samples * X.shape[0]` unweighted samples<br>  or `max_samples * sample_weight.sum()` weighted samples.<br><br>.. versionadded:: 0.22<br><br>.. versionchanged:: 1.9<br>    Float `max_samples` is relative to `sample_weight.sum()` instead of<br>    `X.shape[0]` for weighted 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('monotonic_cst',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-monotonic_cst;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/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\"\n",
       "            style=\"position-anchor: --doc-link-monotonic_cst;\">\n",
       "            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 &gt; 2`),<br>  - multioutput classifications (i.e. when `n_outputs_ &gt; 1`).<br><br>The constraints hold over the probability of the positive class.<br><br>Read more in the :ref:`User Guide &lt;monotonic_cst_gbdt&gt;`.<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",
       "    \n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Fitted attributes</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                    <tbody>\n",
       "                        <tr>\n",
       "                        <th>Name</th>\n",
       "                        <th>Type</th>\n",
       "                        <th>Value</th>\n",
       "                        </tr>\n",
       "                        \n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-classes_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=classes_,-ndarray%20of%20shape%20%28n_classes%2C%29%20or%20a%20list%20of%20such%20arrays\">\n",
       "            classes_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-classes_;\">\n",
       "            classes_: ndarray of shape (n_classes,) or a list of such arrays<br><br>The classes labels (single output problem), or a list of arrays of<br>class labels (multi-output problem).</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[object](4,)</td>\n",
       "           <td>[&#x27;acc&#x27;,&#x27;good&#x27;,&#x27;unacc&#x27;,&#x27;vgood&#x27;]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-estimator_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=estimator_,-%3Aclass%3A~sklearn.tree.DecisionTreeClassifier\">\n",
       "            estimator_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-estimator_;\">\n",
       "            estimator_: :class:`~sklearn.tree.DecisionTreeClassifier`<br><br>The child estimator template used to create the collection of fitted<br>sub-estimators.<br><br>.. versionadded:: 1.2<br>   `base_estimator_` was renamed to `estimator_`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">DecisionTreeClassifier</td>\n",
       "           <td>DecisionTreeClassifier()</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-estimators_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=estimators_,-list%20of%20DecisionTreeClassifier\">\n",
       "            estimators_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-estimators_;\">\n",
       "            estimators_: list of DecisionTreeClassifier<br><br>The collection of fitted sub-estimators.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">list</td>\n",
       "           <td>[DecisionTreeC...te=1608637542), DecisionTreeC...te=1273642419), DecisionTreeC...te=1935803228), DecisionTreeC...ate=787846414), ...]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-estimators_samples_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=estimators_samples_,-list%20of%20arrays\">\n",
       "            estimators_samples_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-estimators_samples_;\">\n",
       "            estimators_samples_: list of arrays<br><br>The subset of drawn samples (i.e., the in-bag samples) for each base<br>estimator. Each subset is defined by an array of the indices selected.<br><br>.. versionadded:: 1.4</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">list</td>\n",
       "           <td>[array([ 602, ...,  610,  703]), array([ 518, ...,   31, 1109]), array([1109, ...,  577,  379]), array([ 580, ...,  570, 1172]), ...]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-feature_importances_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=feature_importances_,-ndarray%20of%20shape%20%28n_features%2C%29\">\n",
       "            feature_importances_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-feature_importances_;\">\n",
       "            feature_importances_: ndarray of shape (n_features,)<br><br>The impurity-based feature importances.<br>The higher, the more important the feature.<br>The importance of a feature is computed as the (normalized)<br>total reduction of the criterion brought by that feature.  It is also<br>known as the Gini importance.<br><br>Warning: impurity-based feature importances can be misleading for<br>high cardinality features (many unique values). See<br>:func:`sklearn.inspection.permutation_importance` as an alternative.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[float64](21,)</td>\n",
       "           <td>[0.06,0.05,0.04,...,0.09,0.09,0.07]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-n_classes_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=n_classes_,-int%20or%20list\">\n",
       "            n_classes_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_classes_;\">\n",
       "            n_classes_: int or list<br><br>The number of classes (single output problem), or a list containing the<br>number of classes for each output (multi-output problem).</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">int</td>\n",
       "           <td>4</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-n_features_in_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=n_features_in_,-int\">\n",
       "            n_features_in_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_features_in_;\">\n",
       "            n_features_in_: int<br><br>Number of features seen during :term:`fit`.<br><br>.. versionadded:: 0.24</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">int</td>\n",
       "           <td>21</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-n_outputs_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.ensemble.RandomForestClassifier.html#:~:text=n_outputs_,-int\">\n",
       "            n_outputs_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_outputs_;\">\n",
       "            n_outputs_: int<br><br>The number of outputs when ``fit`` is performed.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">int</td>\n",
       "           <td>1</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "                    </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div></div></div><script>/*  Authors: The scikit-learn developers\n",
       " SPDX-License-Identifier: BSD-3-Clause\n",
       "*/\n",
       "\n",
       "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",
       "\n",
       "    const parent = element.parentElement;\n",
       "    if (!parent || !parent.nextElementSibling) {\n",
       "        console.warn('Expected copy-paste icon is missing from the DOM structure');\n",
       "        return;\n",
       "    }\n",
       "\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",
       " * Copy the list of feature names formatted as a Python list.\n",
       " *\n",
       " * @param {HTMLElement} element - The copy button inside a `.features` block; its siblings\n",
       " *   contain a `details` element and a table containing feature named.\n",
       " * @returns {boolean} Always returns `false` so callers can prevent the default click behavior.\n",
       " */\n",
       "function copyFeatureNamesToClipboard(element) {\n",
       "    var detailsElem = element.closest('.features').querySelector('details');\n",
       "    var wasOpen = detailsElem.open;\n",
       "    detailsElem.open = true;\n",
       "    var content = element.closest('.features').querySelector('tbody')\n",
       "                  .innerText.trim();\n",
       "    if (!wasOpen) detailsElem.open = false;\n",
       "    const rows = content.split('\\n').map(row => `    \"${row}\"`);\n",
       "    const formattedText = `[\\n${rows.join(',\\n')},\\n]`;\n",
       "    const originalHTML = element.innerHTML.replace('âœ”', '');\n",
       "    const originalStyle = element.style;\n",
       "    const copyMark = document.createElement('span');\n",
       "    copyMark.innerHTML = 'âœ”';\n",
       "    copyMark.style.color = 'blue';\n",
       "    copyMark.style.fontSize = '1em';\n",
       "\n",
       "    navigator.clipboard.writeText(formattedText)\n",
       "        .then(() => {\n",
       "            element.style.display = 'none';\n",
       "            element.parentElement.appendChild(copyMark);\n",
       "\n",
       "            setTimeout(() => {\n",
       "                copyMark.remove();\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 1000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'orange';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 1000);\n",
       "        });\n",
       "    return false;\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": [
       "Pipeline(steps=[('columntransformer',\n",
       "                 ColumnTransformer(transformers=[('categories',\n",
       "                                                  OneHotEncoder(handle_unknown='ignore'),\n",
       "                                                  Index(['buying', 'maint', 'doors', 'persons', 'lug_boot', 'safety'], dtype='object'))])),\n",
       "                ('randomforestclassifier',\n",
       "                 RandomForestClassifier(class_weight='balanced',\n",
       "                                        n_estimators=150, random_state=42))])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Split first; the encoder is fitted only to the training rows.\n",
    "X = cars.drop(columns=\"acceptability\")\n",
    "y = cars[\"acceptability\"]\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y, test_size=0.25, stratify=y, random_state=42\n",
    ")\n",
    "encoder = ColumnTransformer([(\"categories\", OneHotEncoder(handle_unknown=\"ignore\"), X.columns)])\n",
    "model = make_pipeline(\n",
    "    encoder,\n",
    "    RandomForestClassifier(n_estimators=150, class_weight=\"balanced\", random_state=42)\n",
    ")\n",
    "model.fit(X_train, y_train)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "72783395",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.9676\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         acc       0.89      0.99      0.94        96\n",
      "        good       0.94      1.00      0.97        17\n",
      "       unacc       1.00      0.96      0.98       303\n",
      "       vgood       0.93      0.88      0.90        16\n",
      "\n",
      "    accuracy                           0.97       432\n",
      "   macro avg       0.94      0.96      0.95       432\n",
      "weighted avg       0.97      0.97      0.97       432\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAHWCAYAAABt8WNQAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVolJREFUeJzt3Qd4FFXXwPEzoSUBQu+99yqIdAQBEZAqVYpSLKgIKiKCoqjAq2BDUVFREUEEAakiHUUEERBBeu+d0Fv2e87l23U3CbDJbrKZ7P/nM5LM3J25md3sntxzi+VwOBwCAABgQyGBrgAAAEB8EcgAAADbIpABAAC2RSADAABsi0AGAADYFoEMAACwLQIZAABgWwQyAADAtghkAACAbRHIwNauX78ulmXJ4MGDA10VIEnYsWOH+Z34/PPP71j2xIkTpux7770X531AUkEgA680a9bMvJE5tzRp0kixYsVkwIABcu7cOe6imzNnznjcq+ibHk9qDhw4YOo2ZsyYQFclqNnpebBTXZG8pQx0BWAfGrxcvnzZfK0fxj/++KP07t1b1q1bJ7/88kugq5fk9OjRw6u/ioFAyZo1q3iz3J635YBAoEUG8ZIxY0Z59NFHpV27drJw4UL5999/uZMAgERHIAOfaHrJ2czspK027qmU1KlTS9GiReXll192teio9evXm+OTJ0+WiRMnSvHixSU0NFQqV64sS5cujXGtgwcPmsApQ4YMkilTJunVq5dcuHAh1nppTv+JJ56QPHnymOsXKFBA+vfv75EGc7++tpwUKVJE0qVLJ82bN5ejR4+aMp999pmpu9arTp06sn37dr++Yr7++mvz84aFhZmfq3HjxvLHH394lLnnnnukXr16snPnTmnSpImkT59eOnToYI5du3ZNhg8fLqVLlzZ1zJw5s7Rv31727NnjcY73339fypUrZ36+3LlzS8uWLU1Lmvr1118lX7585uunn37a9bw99dRTrsdreW/TYlqnkSNHmuvpz5U3b17TOqXPn1PKlCk9Xh+FCxeWF154weP5dO/rMWnSJClTpoykSpVKZs+efctre3Neb+vobZk73X/3n2PChAnmd0bLVqpUSebMmeMq583z4O3P53S768Wl70v0crerq9ZF/9B5+OGHY5xHf/+1dUd/jwG/cQBeaNq0qSNNmjQx9rdv317bmx1btmy55WPPnDnjmDFjhiNr1qyOPn36uPavW7fOPFbPMWDAAMehQ4cc+/fvdzRs2NCRIUMGx+nTp11lIyMjHUWKFHGUKFHCsWrVKsfZs2cd33//vaNLly7mHC+//LKr7Pnz5x2lSpVy5M+f37FkyRJTdu7cuY7s2bM7qlWr5rh69arH9Vu3bu0YPHiw4+jRo45///3XXKNBgwaOL774wvHSSy85jhw54ti6das5Z9WqVe94r7Teet4ePXrcttybb77psCzLMWzYMMexY8ccO3fudLRq1cqROnVqx/Lly13ltM533XWX4/777zc/u5b97rvvHDdu3DDPi97XyZMnm+tu377d0aRJE0euXLnMz6M++eQTR6pUqUwZvY8nTpxwzJo1y9GpUyfXNfS+a50//PDDWOvaokULc9z9OYnN9evXHY0bN3ZkzJjR8dVXX5m66vM6fvx4x6uvvhrrY7RO+vxonbt16+barz+LXrNly5aOJ554wrF3717znK1cufK2dbjTeb2pozdlvL3/zp9D7+GTTz7pOHDggLnfvXr1coSEhDjmzZvn9fMQl/vmzfWOHz9uyr777rtx3ne7uvbt29e8X+h9c6f3Uh8zf/78O/58gLcIZBCvQEbftMeNG+dIkSKFecP0xogRI8w59EPCPZCoX7++R7lNmzaZ/Z9++qlr36hRo8y+NWvWeJR95513YgQyo0ePNvsWL17sUfaHH34w+/XDyP369913n0e5L7/80uxv1qyZx/6vv/7a7N+wYYNXgUxs24svvmjKnDx50hEaGupo166dx2MvX77syJMnjwlenPRrfez69es9ymogp/v154oeOOoHsPNaHTp0MEHY7cTlA/R2vv32W3MeDbTiasyYMeaD9uLFix4fyOXKlfOpTtHP600dvSnj7f13/hwVK1b0KBcVFeUoXbq0o3z58j49D7e6b95cL6ECGQ38NUjX33l3+lrOly+fCQIBfyG1BK9duXLF1YTsTO20adNGvv/++xhltfm/fv36plxISIh5zMCBA8053NNQqmnTph7flyxZ0jSh79q1y7Vv0aJFkitXLqlSpYpHWU15RKdltWn73nvvjVE2RYoU5rg7TddEv76qXbu2x/5SpUqZf93rdTuahvj/PxZc24gRI8yxlStXmmb21q1bx+hQrSPEVq9e7ZEG09RYhQoVPMrOmjXLpBcefPBBj/2aotL7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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Evaluate on held-out cars.\n",
    "predictions = model.predict(X_test)\n",
    "print(\"Accuracy:\", round(accuracy_score(y_test, predictions), 4))\n",
    "print(classification_report(y_test, predictions, zero_division=0))\n",
    "ConfusionMatrixDisplay.from_predictions(y_test, predictions, cmap=\"Blues\")\n",
    "plt.title(\"Random Forest: car acceptability\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "44b8dfa2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "categories__persons_2         0.099060\n",
      "categories__safety_high       0.087002\n",
      "categories__safety_low        0.085543\n",
      "categories__lug_boot_small    0.077187\n",
      "categories__safety_med        0.073427\n",
      "categories__buying_high       0.056880\n",
      "categories__maint_vhigh       0.053715\n",
      "categories__buying_vhigh      0.053394\n",
      "categories__buying_low        0.052518\n",
      "categories__maint_low         0.049305\n",
      "categories__lug_boot_big      0.048877\n",
      "categories__maint_high        0.041373\n"
     ]
    },
    {
     "data": {
      "image/png": "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W7euDR061D3/8ccf288//+z+vGrVKjczcd9999mdd97pHvvggw/snnvuiSqFuuuuu1yioeSgSpUq1rBhQ5s2bZrt2LHDjVp7AfWkSZPcZ5900kl2xBFHuGBZ7VCC4X3+b7/95gLsBg0a2JFHHmljxoyx0047zbUrT5487jUKclevXu0C87POOsuaNGli119/vQtqVQo1ePBg97qFCxcmbVO7du1s1qxZrl06pvpHiY/ek1Fqn/puy5Yt7s86vlcepL7227ZE55lWm9PTfypVUlKp5OHPP/90bahZs2am9ov+iugav/DCC3bttdf6eo9+l0qWLGnV+oxku1kAAJBtt5v1YppNmza5QfUcl1g0a9bMBa5KGLzR8SlTprjH4/nll1/ciPfy5cutXLly7rE2bdpYnTp1bNCgQeHXKXhVovL444+7n9U1rVu3diPxXqB/7LHHui8vidBsRdOmTe3KK68MP6Z26Njvvvuu+1mzI5oxGTZsmF1yySXuMS9YV0CsWQpPbGKRrE1LliyxGjVquKC/evXq7jV6rGDBggeM3qeH2qd+U/vUnv3799v5559vRYoUcetT/PZXvPNM1ma//bdgwQKXTHgzPFoLobUpak9m9svnn39ubdu2dQmPrnWiGTR9Rf4l1GwKiQUAAMgtiUW2K4VScPjrr7+6UfHIkpvYpEKBrF63du1aFxSrVGb27NluZiEelfL8+OOPbiZCyYaCZH3pM1QKJCtXrrQZM2a4MhmPynT0Ho9G+fW5zzzzTPgxBdoKuDXy7gXGXnITmVRkpE26wAqWNZqvmYDChQuHA+mg1GYlFaKyII3WX3rppa4/V6xYkbRtic4zrTanp/8uuOCCqLKx4447zv75559M7Rf9vl199dWuVC5RUiEDBgywBx98MN3HBwAAyCmy3eLt//77z31PK0h84IEHXKKhQFSBod6jwFj1+oloNkNU+qOAXj8reFbZT6dOndxz+lliS2lUv+/Re8ULyD0avfae85QvXz7Nc/XTJgXsCp5HjBjhZnHOPPNMtzA9MyaiIs/LO6fdu3fbmjVrfLUt0Xmm1eb09F9s1qykRu3LrH7R+WhmRDMhL730Upqv7devn8vkvS+twwEAAMhNst2MhVfKpNkDlbrE2rZtmz366KP29ddfh7ds3bp1qz399NNpBpXemoCuXbsmXKBboUIF9131+pFB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IDASCwAAAACBkVgAAAAACIzEAgAAAEBgJBYAAAAAAiOxAAAAABAYiQUAAACAwEgsAAAAAASWP/ghACTSsP84y1uwCB0EAMgSiwe2pudxyDBjAQAAACAwEgsAAAAAgZFY/P/++ecfW758ueXGdixcuNBWrlx5SD8z1cVeh1T5/QAAAEhVhzyxSNUA7dZbb7UBAwbkynZcd9119txzz+Xq65/sOqTK7wcAAECqOuSJxU033WRPPvmkpZqaNWta1apVs7oZOV6qXn8AAABkwa5QW7ZssRUrVrhg/LDDDgs/vmzZMlu7dq37c9myZV2gnidPnvDz//77r23evNnWrFljM2fOdI/Vr1/fChYs6P68adMmV5JTvXp1K1y4cMKynRIlSlj58uXd8XT8atWqRb3mv//+sw0bNrj2FSpU6ID3FylSxCpWrOhGz0OhkNWuXdtuvvnmqHPxJGvTjh073HlXqlTJihUrZplt7ty5VqZMGXe+niVLlljevHkPOG8/fZOMruu+ffsSvi+tvk32mmTXP5FEfexdSz2ua7R79253nUTXVc+XLFkyqu/8/J4CAADgIM9YbNu2zbp3727lypWz888/3wV0Q4cODT8/fPhw69Gjh/s68cQTXXD6zTffhJ/Xa3///Xf7+uuvw69TQLh9+3a74oorXIB34YUXuuPfeOONtnfv3vB7VT5z7LHHWpMmTey4445zx+/WrZs9+OCD4dcoWDz33HOtVq1adt5557mAcvDgwQeU/eirYcOG1rJly3B5S2ypi582qXzo8MMPt9atW7uA9tJLL3VJV2bq0qWL69dId911V9R5++mbZP766y876qij7JRTTrG6detaq1atos7FT98me02i65+WtPpY1/HKK6+0I4880k4//XTX/nPOOccmTpzoHlMb9Dt47bXXRh0z2e8pAAAADnJicf3119uUKVNs9uzZtmjRIjcCrWTDc++997qRaH0pYFQAfNlll7kgXR566CEXAOox73U1atRw5TGrVq2ypUuX2rx589xIswK9yLp/zShodFqj4fpctUUBZKRbbrnFjZQr0Nao/ttvv+3eN3Xq1KjXjRs3zgW5CxYsiEqMIiVr07p161wyMnr0aPe8gur27dtnySJoP32TzBdffOHObfHixa7v9D0yMfHTt8lek+j6J+KnjydPnmwffvihu5Z//vmnTZo0yb3m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w9xou0ef/+6779r69evd+++44w6rXLly+Hm1p27durZ//3778ssvrU6dOvb888/b22+/7c5Dz3uStWnx4sWufGrOnDnuM66++mo79dRTA/VvWsdM1r/333+/O49169a5MijNwLz//vtJzyXedbnsssvs66+/tk8//TSqfQMHDrTVq1fbM888k+Z5qF36nL1799rkyZNt9+7ddtVVV7nrpv6eMGGClSxZ0vr06WMnn3xy1Hv9/C4MHz7cPvjgAytevLg7JgAAALLRGouRI0faGWec4YJaBY7VqlWzK6+8Mvx8hw4dXOCpryuuuMJGjx5tF110Ufj5zp07W/369V2g7L1OwfzHH39sbdu2dcHjnXfeadWrV7dTTjklHOTKoEGD7JZbbrELLrjALr30UreOQLMM8+fPj0o8LrnkEmvWrJkLWFUec+KJJ9rmzZvDr5k1a5bdfvvtNmXKFFf2c80114RLoRYuXBh+XbI27dmzx/XFxo0b7bbbbrOzzz7b7rvvPjfyn1HJjpmsf5UMnH/++a6kSa9RUuXnXOJdl1atWtnnn3/uSqs8Sg6U3Bx99NFJz0X9rM/XNVAfKwlVW08//XSXEOr6qJ3nnnuurVq1yne/y0svvWS9e/d256rfBV33Tz75JMP9DgAAkBvkCYVCIUsB+/btc4GggkQtlPVs377dihSJfx+ANWvW2OGHH+6Cf80MSJs2bdyflSiIZg6UoGjh7eWXXx5+r4J+jVgrYNSod6VKldyIvLcGYMuWLe59nTp1sqFDh7r2aYRfAbkCUi8Qrl27tl133XUuQJdzzjnHzWb89ttvUW1t3769G+EfPHiwrzYtWLDAzXxo9N6bsdGlUjlRRmv903vMeP2rpECzOl4g7udc4l0XadeunZUrV84F7l5iqVmH//77z4oVK5bmuaif1f8TJ04MP1azZk13fpoJ8c6tYsWKbvZDSZHf3wX9Ht57773h34VNmza591188cXudyEe9WFkqZeSTb2nWp+R3McCAOAb97FAqlFMoyoQxUOq6skWpVAqzdHIcseOHaMej0wqdGIvv/yyK5dau3atCxTz5s3rZgK8wDeWRrRXrFjhymMUFCrY1Jcey58/f7g8SMdr2bJl+H0qgdHMhEej4ArINYrtUZmUAlytO4iUrFzJT5tUvqVAWQFwr169rHnz5m4mJ8gC4mTHPFj9m4jKsDQjoPcWLVrUhg0b5mY3kiUVnhNOOCHqZyV+kY/lyZPHJRZKVPy21bvOkb8L+suksrC0aHbrwQcf9NVuAACAnChlEott27a572llQiph0YiydiVSEFmgQAE766yzbMeOHQnfo5kH6du37wG7MnkBtfea2IA28mev3Cn2NUpA/vnnn6jHFCSnxU+blLT8+uuvbi3Ac88950bcVbqk2v8yZcpYRiQ75sHq30RUdqagXTMVKlkaP368/fDDD77PR+2LpEQi3mPepJyftqZ1ndOitUA6buyMBQAAQG6RMomFFtEqCFTtvP4cS6PIKnvRWgXV68u///7r1g1E0gh7vOMquNSC43hq1Kjhvs+bNy8q4FQJkNZQiEb6vVFv78/eTIvKoTJyrmm1SVQmpJIcfWkGQaPmSgiCjIwnOqbWFPjp34yeS+x1kXz58lmPHj3cTMXy5cvdrEhaxwjKT1sjr3Pk74J+TmvWQjt+5YRdvwAAALL94m0FvCqDeuCBB2zlypXuMdXQv/baa+FZAAWiSjy857RIOpbWBChIjTyuauO1fiJy8fQff/xhI0aMcH8uXbq0WwOg3Yt27tzpHtM6Au+zRCPrat8jjzwSnl3RzkPffPONWxeQ3nNN1iYF+NqBSeVI3oi5Alf1QUaldUy//ZuRc4l3XTw9e/Z0O0a98MILUQv1DwY/bS1VqpRb+/Hoo4+Gfxe0s1iQRfMAAAC5QcokFqIkQrMHGllu0qSJGzH2ynAU+GrRbbdu3axp06Zuga0WVMeW22gEfNy4cXbMMce4UWmNuuu4mnnQbkPaDUglKnqdN1MhqrvXFrd6rkGDBva///3PvSdynYCCX32mXtOwYUN392klIxnZAjZZm7SYXKVBCoaPP/54d75aLxDkBnNpHdNv/2bkXBJdF2+GQOVW2sK2e/fudrD5aatmcLQuQ79/+l3QNY7dshYAAAApuitUJC2m1ayFbsQWu15BOxVpsbWCZAV+uidBvXr1otYdqJZeOyBpZuG4446zwoULu8cVvC5atMitH4h3x2gF0n/++acbyVfAq2BSi7X79+8f9Tode8OGDe5zY9eEeO/XNqaRZs+e7WYHYsu8krVJtfr6vAoVKvi+y3UyaR0zWf9q9yS1WYlfrGTnkui6KJlRf2r7Wb/i9bNmWzSzpEXqnpkzZ7odsGLbk6ytmtXR8bzfBZXFqZwr0SL2RDsosCsUACA92BUK2XlXqJRMLLKCAlDRiLp3vwPtUKTFzhrdx8Hhra3Qjfl0b4ucgsQCAJARJBZINdlyu9msplFt3WtCnaeZC5XCDBkyJOWSCgXiXbp0ifuc7qOgxcna/Ske3Uk6s2Y9MoNuaDdp0iQ777zzopKKtM4xFc8DAAAAzFgcQGVAKtXRKHoq7vKjBcWRd4mO5N2gLVG7lSQFuQ9GZtP9P9QerVdRQuTnHFPxPOJhxgIAkBHMWCDVUAoFZKO/hAAAADkhpkmpXaEAAAAAZE8kFgAAAAACI7EAAAAAEBiJBQAAAIDASCwAAAAABEZiAQAAACAwEgsAAAAAgZFYAAAAAAiMxAIAAABAYCQWAAAAAAIjsQAAAAAQGIkFAAAAgMBILAAAAAAERmIBAAAAIDASCwAAAACBkVgAAAAACCx/8EMASKRh/3GWt2AROghAtrd4YOusbgKAFMeMBQAAAIDASCwAAAAABEZicZBMnjzZfvvtN8tq33//vf3xxx858nz9nFtG2nWo+gwAACAnyfZrLCZNmmTFihWzpk2bWip56qmnrGrVqnbsscdmaTseeeQRO/74461x48Y57nz9nFtG2nWo+gwAACAnyfaJxeOPP2516tRJucTi9NNPtzJlylhukarnm6rtAgAAyGmyPLEIhUI2Y8YMW7p0qTVs2NBq164dfm7atGm2YMEC9+eyZctakyZN7PDDDw8/P2XKFFuxYoXt37/f3n//ffdY69atrXjx4u6406dPt2XLllmtWrXijj5v2bLFJk6caCVKlHCJyZ9//mn58uWzE044Ifya3bt3288//2zr16+3Ro0auSQmtmxGgatGxX/55RcrXLiwtWjRwpo1a2ZFikTvBuSnTfPmzbO5c+da5cqV7ZhjjnHtyQwbNmxw/bxv3z5r3ry5FSxYMPzcuHHjrEaNGlavXr3wYzrn/Pnzu76YNWuW6+dWrVpFHfP333+3//77zz0ee75ev1SvXj38uSeddJIVLVo03dcgmU2bNiX8jHjXwe9npnVcAAAApFBisXLlSuvQoYP9888/dtxxx7kkonPnzvboo4+GA9fx48e7P69atcqmTp1qgwcPth49erjHVDuvx7dt22afffaZe0xB8/bt261du3a2du1aa9CggauXV0Kg16hsSvTYueee6xKWKlWq2MKFC61kyZKuHV6AOX/+fDvvvPMsb968LhH48ccf7corr7QXXnghqmxmx44dLvA++uij7cQTT3SJRWwJjtqZrE033HCDS5BOO+00W716tfvcUaNGWfny5QP1s4Lod99917VPScthhx1m3333nUte5K677rLLL788KrF47rnnXLvUF+vWrbM2bdq4hKhChQrh11x99dWuv5VYxJ6v+mXnzp0u8dBxdW337NnjEhbvGH6uQTJaQ6HXJ/qM2Hb5/cxkxwUAAEAKJRbdu3d3I8UK4DV6rBH9MWPGhJ/v2bOn+/J8+eWX1qVLF5eMKBi8/vrr7YsvvnAB+qBBg8Kv06yFgujXXnvNBee7du2ys88+2wW7AwcOdK+56aabXAD/4Ycfutco0D7rrLNcMOlRoK/AcvTo0W70XrMNGrk+//zz7YILLgi/TiPeGtU/4ogjEp7rVVddlWabli9fbi+99JL9/fffVr9+ffcefZ6SlqB0HCVh+nwF+0p8+vXrZ8OHD/f1/jPPPNNq1qxpb7/9tt1+++3hc9aM0ptvvpnwfZp9UXJYqVIlF5hrxunFF1+0Bx980Pc1SCbZZ8Ty+5npPa6up748mzdv9n0OAAAAOUH+rJyt0GzEV1995ZIKyZMnj1144YVRr9NouQI8jfSrJEWBtoLvk08+Oe5xNdKvBGTAgAH2ySefuGRFXwqMFUTKmjVr3Ci+RqUVXIqCbS3YjfzcCRMm2LfffuuSClHwqRkMzSpEJhaaiUgrqfDTJs0iKMnSiLqXWKQnwE6L2qqkQgoVKmQ333yzS9iUFKjP/dDr33jjjXBi8frrr7syI++48bRv394F5lKgQAE79dRT3YyJ32vgR1qfESs9n5me44qubaKkAwAAIDfIssTi33//dd+PPPLIhK/RCP6dd97p1l6obEcBngJhBeqJLF682H1X2crMmTOjnlMgLFrPIVpXECny5yVLlrjvKoGKpDUgqruP5AWgQdqkcqdXXnnF+vbt674U8F5xxRXWsmVLCyr2PJXQKEFToB25ZiUtKj+777773DoSJTwqrdJsS1piF01rXYc+0+818COtz4iVns9Mz3FFM0C6bpEzFtWqVfN5FgAAANlfliUWpUqVCs8MKNCNpbKSW265xT744ANX+iQKhkeOHOlG+xPxZj+0buCUU06J+xovaNy4caOrs49c4KwSKylXrpz7rkXbWoDs0c/ec55ko/5+2uTNCqhk6q+//nIlYZq9eeutt+ziiy+2IHResT9rdqR06dLuZ43eawF8JJVMeWs/RGsL2rZta8OGDXNlW1rX0rVr1wy3yc81yGwH8zOVeEQuiAcAAMhtsuwGeZqpUMCuwDmSNyqshEO17ZELij/++OMDkgoFvwqCPXq9RqBffvnlAz5TAbGobEmjyVoY7VGp1U8//RT+Wc+rfSpd8iiYHjt2rKvRTw8/bVKwq0XnSlI0Q6MRcJXfaIYgKO36FNlHOictVNYMkCjI9nbfErXj119/PeA4WqytRG/IkCHWqVOncMKUEX6uQWbLis8EAADILbJsxkIB9KuvvurWJyiJ0AJh1bDrS6P1Kn1S8KtdmK699lpbtGiRW/gcu/2q6uO1cHvo0KEuydDCbY2qa3Rd24XqZ41Ia42DFl3ffffdboReO09phkAlKwo4VYakbUm92Qd913E1W6CEQomQjqvSIS0aT++5JmuTEgzV9StgVyIyZ84cF/D2798/cF/v3bvXLRRXaZVKsbS2wtttS/R4t27dXJ+rrEuLurXNbiytL9HIvtaFaDvZIPxcg8yWFZ8JAACQW2TprlBaP6CF2QpkFURr552HH344aqRd28tqwa0CXi26feyxx9z2oR4tRNaCZK1fUAKg7U+1PkELvHVcbRGrgFnv0wyAR4G01jVoFkRB9NNPP+2+dA8MjwJ9feZ7773njq8dqa655hr3eR59Vuw6jHg3ZkvWJi2C1l3EFfTrfFV6pPt0BL37sz5XgbTKdJQMKIDWOXlrO0Rb/Cq4/vzzz23r1q32xBNPuF2kIs/TC8yVHOm6qJ+TnW9sv2htRmTZm59rkOzckn1GbLv8fKaf4wIAACBanlBaCxZyMJUeafTdG6nWDIIWZuseFZdddllWNy8l6Velbt26riRKsyzZ8Rocqs/UjIg+p1qfkZa3YPQN+gAgO1o8sHVWNwFAFvBiGlXdJCuDz/I7b2cVLZDWLkcXXXSR28ZWZVYake7YsaOlEs0gaCYhHm/dROzMgkc3tYtcgB2E7uWh0i39UvXq1eugX4O0zjvIuWWX6w4AAJDd5NoZC1FJ0qeffupKqFSGpR2ZdD+JVKI7dmt3rIwkFrp7dmbdKbp3795urYaSiqZNm9rBvgZpnXfQczsU150ZCwA5DTMWQO60OR0zFrk6sQBS4S8hAABATohpsmy7WQAAAAA5B4kFAAAAgMBILAAAAAAERmIBAAAAIDASCwAAAACBkVgAAAAACIzEAgAAAEBgJBYAAAAAAiOxAAAAABAYiQUAAACAwEgsAAAAAARGYgEAAAAgMBILAAAAAIGRWAAAAAAIjMQCAAAAQGAkFgAAAAACI7EAAAAAEFj+4IcAkEjD/uMsb8EidBCALLV4YGuuAICDjhkLAAAAAIGRWAAAAAAIjMTiILjiiivs7rvvtpwsFc6xY8eO9vDDD2d6O/0cFwAAADkosbjsssvsvvvus1SzefNm27p1q+VkGTnHzL5emzZtsm3btmV6O/0cFwAAADlo8bYCwFQM4N9++23Lmzdb52wH5Ryz4nrlhmsBAACQCrI04lLQd8opp1i1atXsggsusFmzZoWfu/32261cuXLuq169eta9e3dbsWJF+PmbbrrJvv76a3vllVfCr1uwYIF77q233rKTTjrJqlatas2bN7fPPvss6nP37Nljd9xxh9WsWdOaNGli99xzj/Xs2dNuvfXW8Gv2799vjz/+uDVq1MiqVKli559/vk2fPv2Akpm77rrLbrzxRqtVq5a1b9/ePd67d+8DSmmStennn3+2Vq1aWfXq1e3kk0+2YcOGBe5ftU/ndN1119nRRx9tdevWtYEDB9q6devs6quvtho1arjzf++996Lel6zv452jPkslR/q8hg0bWv369e2hhx6yUCiU9HrF88Ybb7g26zrEfu4ll1wS/lkzC4k+M147/Vx7P8cFAABAiiQWTz31lAv6FNT98MMPLvBU0Ot58MEHbc6cOe7rk08+sZ07d9qFF14YDu4GDBhgLVq0cEGv9zoFi4MGDbL+/fvbAw88YD/99JPdcsst1qNHD/viiy/Cx1Y5joLpV1991UaOHGkrV650geyWLVvCr3nkkUfs6aefdp/z/fffu6D8zDPPjAqwNQL/5JNPWqVKlezbb7+14cOHxy2/SdamHTt2uMTl1FNPtUmTJtkLL7xgv/zyi/3222+B+ljte/75511grM/Seffr18+OPfZYa9q0qTuv66+/3vXhwoULffd9vHP0+kJJ2JgxY1zfKTEbMWJEmtcrkdatW9u8efPc74ZH7XjnnXdcEup58cUXE35mvHb6ufZ+jgsAAIBoeUJZMAy7a9cuK1++vBtJVpDtUVPy5MkT9z0aQS5RooT98ccfbiRb2rRpY3Xq1HGBu+zevdsOP/xwe/fdd11g6rn//vtt6tSp9tVXX7ngtGzZsvbyyy9bt27dwu/TTIHeM3ToUPdzmTJl7Nlnn7Vrrrkm3DZ9rj7ziSeecI+dc845tm/fPvvuu++i2qqZC81MDB482FebNHKvxGX58uVWuXJlX/3hh9pXuHBhFxx7lGRoFP7DDz8MP6YZI10LJTt++z7yHL3PKlSokH3++efh93Xp0sWKFy/u+jTe9UpGyZaCe+/9arPauGrVKitWrJivz4xsp59r7/dc4v1O6ysyoVG/VuszkvtYAMhy3McCQEYppilZsqQbRFY8mHJrLGbPnu1GiBXARYoMohcvXuzKTzRyv3btWlcSo68lS5aEg9t4x9VJK/jMly+fC8z1pRmBihUrutf8888/tn37dldu5DnssMPcKL5n0aJFLpg+7bTTotqmnyPLteSYY45Jeq7J2qQyKrXnrLPOciP6Gtk/8cQTM2VtgBKJSAqs4z2m8qggfS8NGjSI+lnJo5KljLr88stdmdmQIUOsYMGCLjlToqCkIiOf6efaZ/RcNCOjmR4AAIDcKksSi71797rvBQoUSHO0WkG71mFoFD9//vxu9FojzImofl5Gjx7tZgAiKaiP/GwdL1JkWxK1Tz97n+FRwJsWP21SAqGSH71m/PjxbnRcMw1jx45Ns1zIj3jJSbzHIieuMtL3fo6bXkoitD5EZVxKttQfsWtT0vOZfq59Ro4rKjHr27fvATMWAAAAuUWWrLHQgmAFc1OmTIn7vNYxqAZfo+bHHXecW8OwevXqA4J6BYiRi3uPPPJId9yZM2eGFwh7X6VLl3avUaCugF5lPZEBY+RMhGYQdOwZM2ZEfZ7WPKjt6eGnTaLXaAG0ynS03kGlOC+99JIdan77PiNir1cyRYsWdcmFZipUBlWqVCk799xzM/z5fq59RinB1PRg5BcAAEBukiWJhWrVe/Xq5Xbk0W5ICu5UfqOfvdIcBZXe6LSCXb0+lkbRFQR7waqCOZXOaJG0Rv71uBbuKij16vpVRqObpmmNw7Jly9wothaNq/zJU6RIEbe2QsdRkK91FArytSZCx08PP23SblP33ntvuNRGC4rXr1/vgvpDzW/fZ0Ts9fJ77wvNWGg3qa5dux4w25Aefq49AAAAstmuUNpp59JLL3VlNwrktd7Cq33X6K92WNJr9JzWBGiLVv05knaV+vfff12i4m1fqp2JtMOU6vP1ei3c1c5G2tUo8rNVpqJFu3rfr7/+6kptVG/v0XGaNWvmFjor0NaC7Q8++OCA9Ql+JGuT1i3oM/R5Cn71mW3btk13EpMZ/PZ9RsS7Xsm0bNnSLRjSbJH6Lyg/1x4AAADZZFeoSPp4LahVYB2PFnnrOdW8a4GxgtLYIFALobXYWqVF3roF7716fSJ6nwJpHVv3q9DouO7FEEmj2npdvOOojl4j6LFBtz5Xx4x3TsnapL7IjCA+Ufu0kFxlV5GPbdy40fWD1nX47fvYc4z3Wbommp2IPd9E1yut89D6DiUCyc4v9jMTXYu0rn16ziWtNishYlcoAKmAXaEA5NhdoSJpt6VESYVEBnIq04lHAXFsUBz73kiTJ092JT7t2rVzawc0ij137lzr1KnTAa9VgJnoOIk6N63gM1lgmllJRaL26RcjltYupLfvY88j3mcluq6JrlciifrZz2fGttPPtU/PuQAAACBFEousoBFqrZnQjkOaIdBuTbpnge6xkEq0PeoJJ5wQ9zmt+1BSlmhLWq0HCbqjVFad28Fsf3a59gAAANlNlpdCZSWVtqjUKVXr69U+LeJO9JwkSix0g7/MuA9GVpzboWj/wb726Zk2BAAASFXZqhQqKylwTdWkwmtf7LqCnCKrzy3Vrz0AAEB2k7pD2gAAAACyDRILAAAAAIGRWAAAAAAIjMQCAAAAQGAkFgAAAAACI7EAAAAAEBiJBQAAAIDASCwAAAAABEZiAQAAACAwEgsAAAAAgZFYAAAAAAiMxAIAAABAYCQWAAAAAAIjsQAAAAAQGIkFAAAAgMBILAAAAAAElj/4IQAk0rD/OMtbsAgdBCBLLB7Ymp4HcMgwYwEAAAAgMBILAAAAAIGRWGTQ+++/b19++aVltbfeessmTJiQa843veeekXYfqj4FAADISVI+sXjvvffsq6++slSTKoE2iQWJBQAAQCrInx0Sizp16th5551nqaRr165WokQJyy2y6/lm13YDAABkNwc9sdi6dauNHj3ali5dao0aNbLzzz/f8uTJ4577/PPPbdq0ae7PZcuWtZNOOslOOOGE8Hs/++wzmzdvnq1du9b+97//ucduvPFGK1eunG3ZssVGjRply5Yts1q1alnbtm2tcOHCUZ+t944ZM8YFli1atLA//vjD8ufPbxdeeGH4Nf/99587zvr1661x48Z2wQUXhNvnzQhUrlzZKlSoYOPHj3ft7N69e9xzTdamffv2uVmOOXPmuGO2bt3aSpUqlSn9PGvWLJs0aZL7jI4dO7rje15++WV3bqecckr4sY8++sgOO+ww1xd63++//+76NpJmipYvX249e/Y84PO8fqlSpYr98MMP7nPbtGlj1atXT/c1iGfixInunHr37h31+Lhx49zv0tVXXx1+bPbs2Wm2IZbfNqX3uAAAALnZQS2F+vPPP61evXr2zDPP2KpVq2zIkCHWrVu3uK/9+++/rVWrVuEEIi0K+OrXr+9mM5QQvPTSSy5w1md4VCOvREYBqgLHc889126//XaX5Hh+/vlnq1u3rn366acuwbjuuuvczMj+/fujAmgF3F26dLEVK1ZYKBSKWwrlp0069p133mlr1qxxScrpp5/uguSglIB16NDBBcw6l6OPPtr++uuvqMTip59+inqPEguvLxRg33zzzbZo0aKo19xyyy3unOOdr/rlpptucv0yf/58++KLL1x/68/puQaJFChQwB1fSVokvX/JkiXhn5XIpdWG2Hb7bVOy4wIAAOAQzlgoiWjWrJkLYvPm/b8cRsGcR6PA+vJcc8017vU33HCDHX744da+fXsbOnSoK4WKTDg0q6BR9AcffDD8mF7bv39/F0Qr+L/11lvd8QYPHuye18h3w4YNo9qnz+ncubMNGzbM/XzHHXe4ROjtt9+OmpXQTMTcuXOtWLFiCc9Vr0+rTYsXL3ZBrRKJqlWruudXrlxp+fLls6AU/C9YsMD1mc69Xbt2dtddd7kZIT+aNGlixx57rL3xxhv28MMPu8cmT57sjtmjR4+E79uzZ4/99ttv4VkZzTi9+uqr9uSTT/q+BomcfPLJbtZnxIgR7rp4vztKVvX75KcNsdLTpvQcV3bt2uW+PJs3b/Z1ngAAADnFQUss/vnnH5s5c6a98MIL4aRCNIofafr06TZlyhRX7qSZAgV/Gv1XkBzPv//+a1OnTnUlU4888oh7vb4U1Ok4XqCtAHT48OHh9x111FEuWPUoqFf7NLPgUcCv8qSxY8dGJRYq30orqfDTptKlS1uRIkVc8K6ReJVAVapUyTKD2uz1l8q4rrrqKrv44otdf0b2fVoUbD/66KMuMdJ7lGydc845Vq1atYTv0QxMZKnXMccc4xIov9cgmUsvvdTefffdcGKhPx9//PEu+fPThljpaVN6jisDBgyISioBAABym4NWCrV69Wr33Rudj6dv377WsmVLF5R7o70Kajds2JDwPUoIROsD9u7d6+rfFUBrpsNLBrzXaF1EpIoVK4b/7JX4xAb3WjegdQWRtKYjLX7aVLJkSVfX/+2337rPVID83HPPudcGFXle3jlpxF0lV+kJ4lXCpRItrYv58MMPXYKSlthkS+sU9Ll+r0Eyl19+uVv7obIuJWqavdBjftsQKz1tSs9xpV+/frZp06bwV2aUuAEAAGQnB23GwhtBV418jRo1Dnhe5UWDBg1yi2O11sArH4kd9Y1cSB15XI3Sa0Q9Hi9Z0PoGLS72aB2FAnzxFjcr2IxclKufI9+TnnNNq01y1llnua/t27e7RcgK3JWMXH/99RaEziuSzkFrFLyESH9WwhPb/5HBc/Hixd0sh2YqlFipXSrlyig/1yCZI4880iVgmqnQ+hslg9rlKSvblEjBggXdFwAAQG510GYsatas6Wr3lTxELob21ljs3LnTjUIXKlQo/FxkWZJHAZ+C4MjjNm3a1B5//PGoEWTNeKgm3ksaVDf/5ptvhp/XwmYt1o4MMlXeojUcHgWuWqir0qf0nmuyNunYXimNSqK02FptVMlYUFqc7M0QqU+VHGhRsrd+Q4mdyr48em3sYm7RTktatPz888/bZZddFihQ9nMN/NAMhRbEa92Lzil2tiEr2gQAAIBDvHhbOwdppFkLXzUroQXQWlvwzjvvWPny5d2IeKdOndxIuXYkUkmURtcjaYRfJVNao6ARdu3QpPcr+Fcwr1IqlU79+OOPrhxFi5A1y/Hss8+6GQStfzjiiCNcGZLWC0SuOXjxxRfd+xX0a3T8448/tlNPPTXhzlVpSdYmJRladK6afq0R0JazqvfXwu6gVMqjrWS1va1Kh5TMaAtZj9Z0qE0a7VdCpW1k1Z+xdIzatWu7Y0QG3xnh9xokozbfdtttbl1EqrQJAAAAhzix0EJtJRMaBVfwrhHnyBvdaXefTz75xO0+pC1StbBZu/Uo+PaoXEgB4IwZM2zbtm3usQYNGrjAXLse6b2aGdGi6cjyFpUk6T4IChxV5qPtVFVyFBlQa9GuRqzVPiUCCvJj72NxxRVXRN0TItGN15K1SbMaCtg1u6DP1IyFzjdegJ8eXvs0kq9kQp+j0f3IvmjevLnrv6+//tqKFi1qffr0cUmcyp1inXHGGW6mQrM5aZ1vvH5R30XuhuTnGiSj89I2xSrvii3N8tOG2Hb7aZOf4wIAACBanpB3Y4YcRms7ypQp48qORCVHCv51XwNtx4oDaVZF600eeughu/baa3PkNThUbVISojK+an1GWt6C//dZAHCoLR7Ymk4HkCkxjTaniRyszZI7b2eVdevWuTKsM8880+28pF2OVAKjcqFUop2YtKYhnh07drjvsXcU92i0XUFyZtBNDFUipVF8jdgf7GuQ1nln9rn5bRMAAAAyLscmFipF0s5LCpZVQqX1EwomkZjWiKh0KHJBfU67BqnYJgAAgJwgx5ZCAdll2hAAACAnxDRshQMAAAAgMBILAAAAAIGRWAAAAAAIjMQCAAAAAIkFAAAAgKzHjAUAAACAwEgsAAAAAARGYgEAAAAgMBILAAAAAIGRWAAAAAAIjMQCAAAAQGAkFgAAAAACI7EAAAAAEBiJBQAAAIDASCwAAAAABEZiAQAAACAwEgsAAAAAgeUPfggAiTTsP87yFixCBwE46BYPbE0vA8hSzFgAAAAACIzEIgts2bLFtm3bZllt8+bNtn379hx5vqnSxwAAALlFjk4sFDinYnDZrVs3u+uuu7K6GXbRRRfZQw89lCPPN1X6GAAAILfI0YnFpZdeavfee6+lmhIlSlixYsUst8ht5wsAAJAbZYvF25p1KFq06AGP7dixw/25ZMmSVqBAgajnt27danv27LGdO3fa2rVr3WOlS5e2fPnyuT+HQiF3jLQCXh2/YMGCljdvXnc8iX393r173euKFy8ed8Ykf/78VqRIEdu1a5f7UpA9ZMgQd8xYfttUuHBhy2w6j/3799thhx0W9fjGjRtdH0R+psqM8uTJ49qp9uq9ugax7VTfq89jzzeyX/Re0c8ZvQbpPc9410vXRmVhaq9Hvzf6vfPOXeejr1KlSmX48wEAAHKqlJ2xUACo2YayZcu6r1q1atmYMWPCz/fv39+OOuoo96UgsVmzZjZjxozw8/369bPvvvvOhg8fHn7dP//8Y/v27bN77rnHypQpY4cffrj7GjhwoAvqPRs2bLC2bdu6AFavU8lQ586drU+fPuHXKKC+8sor3WeXK1fOatasaR9//HHUOeh911xzjZ1zzjnuHFSeE69Mx0+bPvjgA6tevbo7jj7vzjvvdMFwUP/++6+dffbZ7rN1vj179rTdu3eHnz/zzDNdYhBJ5+T1xahRo6xGjRou4I7UtWtXu+GGG+Ker9cv559/vjsXBe+aXYr8XD/XID2SXa9JkyZZlSpVwm34+++/rXz58nbjjTeGX/PAAw+4dgIAACAbJRa33XabSwpGjx7tRpi//fZb+/nnn8PPP/XUU25EWV+bNm2ys846yzp27BgODF944QVr2bKlXXfddeHX1alTxwW4EyZMsOnTp7sRaiUfCpxff/31qM9esmSJLV682NasWWPHHXecffXVV1Htu+OOO+ynn36yWbNmuaBV71EwPXv27KjXvf/++3b99de7UXoF4fEka5POT8G5kg09v2jRIqtYsaLNnz8/cD+PGDHCLrvsMhfIKzEbN26cPf74477frz7XbMInn3wSfmzVqlX25ZdfuiQlkQ8//NB69+7tPldB/Ndff21Dhw5N1zVIj2TX69RTT3UJ3pQpU9zP33//vVWuXNl99+jPSrTiUZKnaxz5BQAAkJukZGKhUpuXXnrJHnvsMRfwqexGo+L6OZbKdxQo3nzzzW70XUFqInrd4MGD3cizRsEV1FaqVMm6d+9u7733nnuNym3efvtte/jhh61atWquxEqzCZox8Si4f+2119xrlKyojEcj2wp+dfxIrVu3DgffGW3T+vXrXVmXji8qp+rbt681bNjQgjrttNPsqquuciViRx99tEtylJT5pTIlJSbDhg0LP/bWW2+50X/NhCSiGYg2bdq4a1u7dm274IILwkG9n2uQHn6ul8qdTjjhBJfUeUmEfqf+++8/93ul38nffvstYWIxYMAAVw7mfandAAAAuUlKrrGYO3euC6RPOumkhK9REHrrrbfatGnTXFCo4FMjzkuXLrVjjjkm4XE1sqygXQFtJCUuonIplWE1adIk/Jxe26hRo/DPmjHQa4499tioYyhQ1WdEOvLII5Oea7I2qWzn8ssvtxNPPNHatWtnLVq0sAsvvNAlIkFFnqeo7zRDoAQncr1BWlTWpONohkHlWm+88Yb16NHjgPOJpNdFUrK0bNky39cgPfxeLyUNSiiU5E2cONGV040fP949pvIprQnxkrtYeq2SPY9mLEguAABAbpKSMxbeQl4lF/FolkIB9hlnnOFG81UqpPIbvU/JRSJeoKtRaa88yvtSghL52d6iYk9kWxK1Tz/HLiJPtCg5PW0SjeD/+OOP1rRpU/dnjd5HPp9Rsefp/eydR7zkILaPFfBrtF8JhcrV5syZ4xKLtKSVdPi5Bunh93opsVD7VRKmkjolNnpM10bJhWZ3vMX/8WZulBxFfgEAAOQmKZlY1K9f3y3a/eabb6Ie9xYzr1ixwiUSquH3dgj65ZdfDghEtcNRZBCs42rxrtZtxPKOrdkBjUzreJEBqMpgPArqteBYgX7k+/VzekfV/bTJ+65SJS1eVr/oz16pVBCR61ZE56CZEq9fNSuiGYxIsetIvFmLN998060L0XoXb7YlI/xcg/Twe71UdqekVWVNzZs3d+VrkYlFojIoAAAApGhiodHf++67z+6//343Cq7SGC3cVTmQaA1ChQoV7JlnnnHlNwr8tE4glurpVTKlBcCaAdDo9IMPPujWamgdgUpktGBatff6PClUqJCrv1dpixZUz5s3zy2+ViITmbBoVya9R4uUFyxY4MqyVIuf3l2L9HnJ2qQAW+s0lFCoXEjtUglP48aNA/a0ucXMOpeFCxe6XZKefPLJqB2ctKOVZkgmT57sXqNFz/HWsWgh9Lp169z1SmvRth9+rkF6+L1e3jqLjz76yJWbiXYbU2Kl2SESCwAAgGy2xkIU3Grb1ZdfftnVvKssRbsiicpRtMOSgsVTTjnFJRpeIqKkxKOgUUGpSqa0SFoBugJK7fbz4osvuuPpz1pErCDW88gjj7iZDo3CazZBC7C1uFgBr0ef5wWsWo+gIN/bScijRbyx99+Id8O4ZG06+eST3QJpjaTrfJRUabvdZOVGyah9t99+u1ssra1dNeOjRdK9evWKatvq1avdVq06lw4dOrj1ILH3gdD5dOrUyT777DP3mrTON16/6PnI8iE/1yAtsZ/p53qJtsBVKZdmXUTJqHYX02xJovUVAAAAMMsTirxZAuJSgFu3bl275ZZb3BfiU/mQAvbYnbFy4zXQ4m23O1SfkZa3YJGsbg6AXGDxwNZZ3QQAOZAX02hNc7I1pCk7Y5GVdE8FzW7ohmwKaJ9++mm3SLxLly6WSrQeQO1K9Jwk2uZWaycSPZdeaoNKlnSfiMj7gRysa5DWeWf2uQEAAMAfEos4VAajtRmXXHKJK6FSGZZ+1k3pUonWl2hNQDwKxrXzUqIAe+rUqW6RdGbQ2gP1k8rWNKtwsK+B1twkOu/MPjcAAAD4QykUkMXThgAAADkhpqFeBAAAAEBgJBYAAAAAAiOxAAAAABAYiQUAAACAwEgsAAAAAARGYgEAAAAgMBILAAAAAIGRWAAAAAAIjMQCAAAAQGAkFgAAAAACI7EAAAAAEBiJBQAAAIDASCwAAAAABEZiAQAAACAwEgsAAAAAgZFYAAAAAAiMxAIAAABAYPmDHwJAIg37j7O8BYvQQQDStHhga3oIQLbHjAUAAACAwEgsAAAAAARGYpFinnjiCXv99dctJzsU55gb+hEAACCV5No1FgMHDrSKFStajx49LJX89NNPVrVqVcvJMnKO6b1euaEfAQAAUkmuTSwmT55sderUsVRz1113WeHChS0ny8g5pur1AgAAQDZPLObPn29vvPGGLV261Bo1amS9e/e2okWLuudeffVV+/rrr92fy5YtayeddJJ1797d8ub9v8qvIUOG2PTp023u3Lm2bNky99jzzz9vlStXdo/puHq8Vq1ads0111i1atWiPvuLL76wjz76yEqUKGEXXHCBe89hhx1mvXr1ihoxHzFihK1fv94aN27snitZsmT4+Yceeshq165tBQsWtC+//NKOOOII+9///meTJk1ybT7mmGPCr03WpnXr1rlznjNnjjuHK664wurXrx+of9W+mjVrWv78+V1Qv3v3bteHp556qr377rs2YcIEdz7XX3+9HXXUUeH3Jet7iT1Hry+KFStm48ePt3379lmXLl3szDPPTHq90iOtazJlyhR7+eWXXT/Lhg0bXD+3bdvWtV8+/fRTmzZtmj366KOB+hYAACAnypZrLBS4KjBUUtGiRQsXWCsQ9ZxwwgnWtWtX96XXqd6+W7du4eebNWtmVapUsXr16oVfV7x4cfvmm2/slFNOsf3791vLli1dcKmkZfbs2eH3Dh8+3Dp06OCC2gYNGrjRdyUECjg9H3/8sQuKlTTouwJSBdg7d+4Mv2bixIl2880322uvvWbNmzd35+EFvzNmzAi/LlmbFISffvrpLlg/++yzXcCuc503b16gPlb7brzxRhs5cqTrT32+zqV169Y2atQo92f1u9q2ceNG330f7xz1WbfccosNHTrUjjvuOHctzjnnHPe6tK5XeiS7Jrqeb775pi1cuND9/MMPP9hnn33m2hR57bdt25bBHgUAAMjZ8oRCoZBlI2quRtIvvPBCN2rtUZCroDqef//916pXr26LFy9236VNmzautGbQoEHh4+rnO+64I2rmQaPWW7Zssffff98F8TVq1HCj9Pfcc497fu3ate6Yl1xyiQtCFYCrfZo1ePjhh91rFIzqfXfffbfddttt7jEFzsuXL7e//vorajS/ffv2bm3A4MGDfbVpwYIFVrduXVu9erWVL1/ePa/ZhV27dqU7+I6k9m3atMmmTp0a7h/Nkug8NIMhe/futQoVKrgZBQX7fvs+8hy9z1Jyos/KkyePe6xVq1Z25JFH2gsvvBD3eiUT+Rl+r4lmg3Rdr776auvTp4+b2fjggw9cMqfSrXLlyrkF4Tp2LPW3vjybN292/VWtz0juYwEgKe5jASBVKaZRhYfiQlXr5KhSKJXDLFmyxAWJkSKTCgXWCrp/+eUXF/grsMyXL58rn/KC21h6btGiRTZ69Gj7/vvvXSCtLz2u44lmSFSK065du/D7FGyefPLJ4Z/1GgXTHTt2DD+mEq3zzz/ffvzxx3AQK5qliEwqMtImjeQruFcgrBmG448/3pVl6Suo0047LfxnBfwq19LsiEdlUvr8FStWBOp70XG9pEJUGqXEKzP4vSaayVA/K7HQd5U8aSZKMye6zkowNLsUz4ABA+zBBx/MlPYCAABkR9kusVC2JIlmJ6RTp06upOWqq65yAWuBAgVccL5169aE7/HKeVTqo0A9krd2QyPYUqpUqajnI3/WzImULl066jVlypRxCVGkZFmfnzZpJF2B77PPPmtXXnmlC/JVFqaRfe81GaWyoUhKguI9puQhSN8n+qzI4wbh95oosejXr59LIP7++2/Xfj323XffudkglXbpPfHofX379j1gxgIAACC3yHaJhTfqrTUEKm+JF0SOGTPGfv/9dxcIyn///Wd79uyJel3k6Lh4QaBq7bWGIh6N2Ms///zjRuo9KvPxFiKrvEYUXEeO0Otn7zm//LTJK+HxSobUL1pr8dxzz4XLtQ4Vv32fEbHXKz38XhPNICkxU0mbrqcSPyUW6kslFt5i8kSJUWxyBAAAkJtku8XbupeBFjFrJyGNCovKg7QY1yvPURDqlefoOS2ujqXSljVr1oR/rlSpkiuN6d+/f9TjKn3SLlDeexRcPvPMM+HRdI1ma8cij0a01b4nn3wyHFDr+a+++sqtw0gPP23SGgvtpOTROgQFwdu3b7dDzW/fZ0Ts9UoPv9dEiZySVb3OW0yv6621H1rMnVZiAQAAkNtlu8RCtHuPFlIriNYiX333dhnS4pI777zTLrroIheUa+emP//884DR5IsvvtglI+edd54r31EwrOMqgNWiYQWi2uHorLPOcgGzRzMDKj3Sdq56TvX4Gp3XOgLPiy++6AJ+bcOqhclnnHGGW/+gz8rIuabVJi3Qfuqpp9wCbi1wVrsUPGv73UPNb99nRLzrlR5+r4mSByUwXhJx+OGHu98vleAlWl8BAACAbLgrlEfNnjlzpgswtf2qV6bk0XasCiQ16q8tTLVF6oknnhh17wMt6lXgqx2ClKB4uyh579VrdezYhdBaL6BFv3p9kyZNXHCqQNTbcUgU3OveCKrXb9iw4QFlW9oeVjX/ei7Szz//7NZNRN7Hwk+b9JzKoLQW49hjjw1UOpSofVrQrEBbCYNH97NQ3yvx8dv3secY77N0bXfs2HHAwvh41yueeP2Y7JqIFpmrlEv3JylSpIh7TAvRVealtS7p3UGBXaEA+MGuUABywq5Q2TaxyCoKmhVwerX6ugeDymZUEsWINjwkFgDSg8QCQKrK0dvNZjWV9ajMR+sYVI6l7Ujvv//+lEsqtGhapT7xeDeFK1SoUNznde8HrWVJVWmdW3ZoPwAAQE5EYpFO2oFJZTq//fabK8k5+uijUzKIVZlQopvWJUssgtxYL6vPzXseAAAAhxalUEAWTxsCAADkhJgmW+4KBQAAACC1kFgAAAAACIzEAgAAAEBgJBYAAAAAAiOxAAAAABAYiQUAAACAwEgsAAAAAARGYgEAAAAgMBILAAAAAIGRWAAAAAAIjMQCAAAAQGAkFgAAAAACI7EAAAAAEBiJBQAAAIDASCwAAAAABEZiAQAAACCw/MEPASCRhv3HWd6CReggAAdYPLA1vQIgR2HGAgAAAEBgJBYAAAAAAiOxyCR//vmnzZ8/P1e24/fff7dFixZZKvLTtlS5dgAAANlZtkssZs2aZQsWLLBUc99999lzzz2XK9tx22232auvvpqS199P21Ll2gEAAGRn2S6x6Nevnw0ePNhSTcOGDa1u3bpZ3Ywc72Bcf64dAABANt0VasWKFbZ06VI76qijrGTJkuHH582b556TsmXLukC9UKFC4efnzJlj69atc499//337rETTzzRihT5v113dMzly5dbrVq17PDDDz/gc/fu3etKY0qUKGG1a9e2uXPnWt68ea1evXpRr9Pj69evd+0rXbp01HN6f/Hixa1q1aquhCZfvnzWpEkT69q1qxUsWPCAz0zWJp2PSnUqV65sVapUscw2bdo0q1ChglWrVi382N9//+3aHXnefvsmLTqGruG+fftcsJ4nT54DXpNW3yZ7TbLrn9G2xbt2mdEfAAAAuckhTSw2btxo3bt3twkTJrgATQH33Xffbbfeeqt7/vPPP7fRo0e7P69atcpWr15tb7zxhl144YXusc8++8wFhwrW165d6x576623XHLSrVs3+/HHH10QqHr51q1b27Bhw+ywww5zr1u4cKGdd955tnnzZhfg79+/3wWNRx99tA0dOtS9Ru1p3769C/SVOOg49957r/uKLK1RgKnXlCpVyk477TQbNGiQK6fRe7zR9E2bNiVt00MPPWRPPPGENWjQwJ2r2vLuu++642aWq6++2i6//HK7/fbbw4/pc4sVKxY+bz99k8xvv/1mderUcW1fsmSJu75ffvmllSlTxnffJntNout/xBFHBGpb7LXLjP4AAADIbQ5pYqEgd/Hixa5GvlKlSrZnzx57++23w8/37dvXfXkUNF511VXuPQqElYRMnjzZBYkK5j2XXHKJ5c+f35YtW2aFCxd2CcyZZ57pgnYFjXLzzTdbjRo1XPKi0emPP/7YOnXq5IJFz0033eRGw//9918rWrSoS4BatWplzZs3t9NPPz38OrVhypQp1qhRo4Tn2qtXrzTbpESif//+7jgadZdx48a5EfnMTCz88NM3yXz77bf2ww8/2KmnnurOVX32wAMPhIN1P32b7DWJrn/QtmVGf+zatct9eZSUAAAA5CaHbI2FRpg/+eQTe/jhh11SIQUKFHCJQyQFZyrVmThxohtFViConxNRyczIkSOtZcuWNn36dJs0aZL98ccfdtJJJ9nYsWPdazZs2OBGqO+5555wyUvHjh2jEgPNMHz66adudFxBrZxzzjl29tlnu1mTSO3atUszqfDTJpXayLZt28LvUxCt2Y1DyU/f+KFzVeAuSoyUIA4fPtx336an/9MrrbZlVn8MGDDAzZx5X5GlZwAAALnBIZuxUHlLKBRy9e2JKBjv3bu3m53QmgMlHnrPypUrE75Hsx8qVdHshldi5PFKZDTjIbGLqyN/9rYkja2hV52/koJIyYJGP23S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03788Uf3b51iBMUKfv5f9v3337u/P506dYr7dywjx/VNi7cBJHbvvfeGihQpEjrnnHNCVapUCZ1wwgmh9evXB35PRo6L5DZv3hw6/fTTQ5UqVQqde+65oaJFi4b69OkT+D033XRTqHLlyu566bV6zUsvvcQlyQS//vpr6PDDDw81adIkdPLJJ4eKFy8eGjNmTKa9Z9GiRaHy5ctro5LQ2LFjuWaZ4KmnngoVLlw4dNZZZ4Vq1KgRatCgQWj58uWB3zN37tzQ0UcfHapZs2aoffv2oXr16oWGDx/ONQto586dodatW4fKlSsXatmyZahkyZKhK664IrRv375A75k1a1aoWrVqoSOPPDLUrl270BFHHOGu2ZIlS7hmAf3999+ub+vXr+/+n6N44Z133knzPa+99lqoTp06odq1a7t/77Zs2ZIpx00PEgsgDd999537yzlx4kT386ZNm9w/oL169Qr0nowcF/7cdtttLihZt26d+3nKlCmhvHnzhj7//PNA71ESof/ReoYNG+ZeM2/ePC5NAApS6tatG+revXtU0l2mTBmX8AV9z+7du0PNmjULPfnkkyQWmeT3338P5cmTJ/Tpp5+6n3fs2BE6/vjjQ506dQr0nu3bt7uAqHPnzqE9e/a4x/R37quvvsqspudaAwYMcIm4l8gpuFSS9+abbwZ6z4UXXhg67bTTwsmGrpcSi2uvvfagn1NO16xZs1Dbtm3Dffvss8+6/l+xYkXC9wwdOjQ0f/589/csUWKRkeOmB4kFkIaePXu6mYRITzzxRKhEiRIJR3r8vCcjx4U/FSpUCD344INRjzVv3jzUtWvXTH2PkkH9w/3xxx9zaQL4+eefXT8q8PSsXr06lC9fvtD7778f+D133HGHu44rV64kscgkd911l5txiKREu0CBAgmTQT/veeONN9w1zKwAB/+PZoE06xrpoosucjOwQd7TqlWr0KWXXhr1mhYtWoR69OhB9weg5ED/xn3zzTdRibdmygcPHpz0/YkSi6DH9YOCbiANWv8QW1PaqFEj27x5s/37778Zfk9Gjovk1qxZ4+pK4/Wt+jyz3iMTJkxw348++mguTQDqY61ZiezH8uXLu3UQifrf73vGjRtnI0eOtJdeeolrlInUx/r7EUk/q9Z+7ty5GX7PxIkT3WOlSpWyr7/+2saPH29r167l2gWkNUizZ89O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",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Inspect which encoded attributes contributed most to predictions.\n",
    "fitted_encoder = model.named_steps[\"columntransformer\"]\n",
    "forest = model.named_steps[\"randomforestclassifier\"]\n",
    "importance = pd.Series(forest.feature_importances_,\n",
    "                       index=fitted_encoder.get_feature_names_out()).sort_values(ascending=False)\n",
    "print(importance.head(12).to_string())\n",
    "importance.head(12).sort_values().plot.barh(figsize=(8, 5), title=\"Top feature importances\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "e7bb05b3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Car: {'buying': 'vhigh', 'maint': 'vhigh', 'doors': '2', 'persons': 'more', 'lug_boot': 'med', 'safety': 'med'}\n",
      "Predicted acceptability: unacc\n",
      "Actual acceptability: unacc\n"
     ]
    }
   ],
   "source": [
    "# Predict one example car.\n",
    "example = X_test.iloc[[0]]\n",
    "print(\"Car:\", example.iloc[0].to_dict())\n",
    "print(\"Predicted acceptability:\", model.predict(example)[0])\n",
    "print(\"Actual acceptability:\", y_test.iloc[0])\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
