DSA_SS24/notebooks/ml_decision_tree.ipynb

1281 lines
128 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Decision Tree Training and Analysis"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import sqlite3\n",
"import os\n",
"from datetime import datetime\n",
"from joblib import dump, load\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.model_selection import GridSearchCV, train_test_split\n",
"from sklearn.metrics import confusion_matrix, accuracy_score\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.impute import SimpleImputer\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"import seaborn as sns"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Import Data from Database"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"\n",
"conn = sqlite3.connect('../features.db')\n",
"c = conn.cursor()\n",
"\n",
"# Get training, validation, and test data\n",
"train = pd.read_sql_query(\"SELECT * FROM train\", conn)\n",
"valid = pd.read_sql_query(\"SELECT * FROM validation\", conn)\n",
"test = pd.read_sql_query(\"SELECT * FROM test\", conn)\n",
"\n",
"# Close the connection\n",
"conn.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Format Data for Machine Learning"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"train_x shape: (3502, 10)\n",
"test_x shape: (438, 10)\n",
"valid_x shape: (438, 10)\n",
"features: ['age', 'gender', 'artial_rate', 'ventricular_rate', 'qrs_duration', 'qt_length', 'qrs_count', 'q_peak', 'r_axis', 't_axis']\n",
"number of classes: 4\n"
]
}
],
"source": [
"# Get the target and features\n",
"train_y = train['y'].map({'GSVT': 0, 'AFIB': 1, 'SR': 2, 'SB': 3})\n",
"train_x = train.drop(columns=['y'])\n",
"\n",
"valid_y = valid['y'].map({'GSVT': 0, 'AFIB': 1, 'SR': 2, 'SB': 3})\n",
"valid_x = valid.drop(columns=['y'])\n",
"\n",
"test_y = test['y'].map({'GSVT': 0, 'AFIB': 1, 'SR': 2, 'SB': 3})\n",
"test_x = test.drop(columns=['y'])\n",
"\n",
"# Drop id column\n",
"train_x = train_x.drop(columns=['id'])\n",
"valid_x = valid_x.drop(columns=['id'])\n",
"test_x = test_x.drop(columns=['id'])\n",
"\n",
"print('train_x shape:', train_x.shape)\n",
"print('test_x shape:', test_x.shape)\n",
"print('valid_x shape:', valid_x.shape)\n",
"\n",
"# Print column names\n",
"print('features:', train_x.columns.to_list())\n",
"feature_names = train_x.columns.to_list()\n",
"\n",
"# Create an imputer object with a mean filling strategy\n",
"imputer = SimpleImputer(strategy='mean')\n",
"\n",
"train_x = imputer.fit_transform(train_x)\n",
"valid_x = imputer.transform(valid_x)\n",
"test_x = imputer.transform(test_x)\n",
"\n",
"# Scale data between 0 and 1\n",
"scaler = MinMaxScaler()\n",
"\n",
"# Fit the scaler to your data and then transform it\n",
"train_x = scaler.fit_transform(train_x)\n",
"valid_x = scaler.transform(valid_x)\n",
"test_x = scaler.transform(test_x)\n",
"\n",
"# Use DecisionTreeClassifier\n",
"num_classes = len(set(valid_y.to_list()))\n",
"print('number of classes:', num_classes)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test Grid for Hyperparameter Analysis"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"param_grid = {\n",
" 'criterion': ['gini', 'entropy'],\n",
" 'max_depth': [None, 10, 20, 30, 40, 50],\n",
" 'min_samples_split': [2, 10, 20],\n",
" 'min_samples_leaf': [1, 5, 10]\n",
"}\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Create a DecisionTreeClassifier object\n",
"model = DecisionTreeClassifier()\n",
"\n",
"# Create the grid search object\n",
"grid_search = GridSearchCV(model, param_grid, cv=3, scoring='accuracy')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-1 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\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",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-1 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-1 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-1 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-1 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-1 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-1 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-1 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-1 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-1 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\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",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\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",
" color: var(--sklearn-color-background);\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",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-1 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=3, estimator=DecisionTreeClassifier(),\n",
" param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
" &#x27;max_depth&#x27;: [None, 10, 20, 30, 40, 50],\n",
" &#x27;min_samples_leaf&#x27;: [1, 5, 10],\n",
" &#x27;min_samples_split&#x27;: [2, 10, 20]},\n",
" scoring=&#x27;accuracy&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=3, estimator=DecisionTreeClassifier(),\n",
" param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
" &#x27;max_depth&#x27;: [None, 10, 20, 30, 40, 50],\n",
" &#x27;min_samples_leaf&#x27;: [1, 5, 10],\n",
" &#x27;min_samples_split&#x27;: [2, 10, 20]},\n",
" scoring=&#x27;accuracy&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: DecisionTreeClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=10, min_samples_leaf=10, min_samples_split=10)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=10, min_samples_leaf=10, min_samples_split=10)</pre></div> </div></div></div></div></div></div></div></div></div>"
],
"text/plain": [
"GridSearchCV(cv=3, estimator=DecisionTreeClassifier(),\n",
" param_grid={'criterion': ['gini', 'entropy'],\n",
" 'max_depth': [None, 10, 20, 30, 40, 50],\n",
" 'min_samples_leaf': [1, 5, 10],\n",
" 'min_samples_split': [2, 10, 20]},\n",
" scoring='accuracy')"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"# Fit the grid search object to the data\n",
"grid_search.fit(train_x, train_y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Results"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best parameters: {'criterion': 'gini', 'max_depth': 10, 'min_samples_leaf': 10, 'min_samples_split': 10}\n",
"Best score: 0.769842911809933\n"
]
}
],
"source": [
"\n",
"# Print the best parameters and the best score\n",
"print(f'Best parameters: {grid_search.best_params_}')\n",
"print(f'Best score: {grid_search.best_score_}')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Save Model"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['../ml_models/best_decision_tree_model_20240621173105.joblib']"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"# Save the best model\n",
"best_model = grid_search.best_estimator_\n",
"\n",
"# Timestamp\n",
"timestamp = datetime.now().strftime('%Y%m%d%H%M%S')\n",
"model_path = f'../ml_models/best_decision_tree_model_{timestamp}.joblib'\n",
"dump(best_model, model_path)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Example Training of best Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"load the best model to get the best hyperparameters from it"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# List directory\n",
"models = os.listdir('../ml_models')\n",
"model_path = [model for model in models if 'joblib' in model and 'best' in model and 'decision_tree' in model][0]\n",
"model_path = f'../ml_models/{model_path}'\n",
"\n",
"# Load the best model\n",
"best_model = load(model_path)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-2 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\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",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-2 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-2 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-2 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-2 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-2 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-2 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-2 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-2 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-2 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\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",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\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",
" color: var(--sklearn-color-background);\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",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-2 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-2 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-2 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(max_depth=10, min_samples_leaf=10, min_samples_split=10)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" checked><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=10, min_samples_leaf=10, min_samples_split=10)</pre></div> </div></div></div></div>"
],
"text/plain": [
"DecisionTreeClassifier(max_depth=10, min_samples_leaf=10, min_samples_split=10)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Example training of a model with the best parameters\n",
"model = DecisionTreeClassifier(**grid_search.best_params_)\n",
"model.fit(train_x, train_y)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model Accuracy: 0.7990867579908676\n"
]
}
],
"source": [
"# Predictions and accuracy\n",
"preds = best_model.predict(test_x)\n",
"accuracy = accuracy_score(test_y, preds)\n",
"print(f\"Model Accuracy: {accuracy}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Evaluate Model Performance"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Optional: Plot confusion matrix\n",
"cm = confusion_matrix(test_y, preds)\n",
"sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\")\n",
"plt.xlabel(\"Predicted\")\n",
"plt.ylabel(\"Actual\")\n",
"plt.title(\"Confusion Matrix\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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++8dxqdNm5bjvF26dJG7u7tGjRqVJYthGA6XL8tvs2bNctiH06dP15UrV9ShQwdJUmRkpDw8PDR58mSH7LNnz1ZKSoo6duyYo9fx8fHJsm+lq/+N/rlPPv74Y/s51blVv359hYeHKz4+PsvrXXudwMBAtW7dWjNnztSxY8eyPMffV6z/53+b4sWLKyIiQpcuXbqpfAAA18CRbgCAU/P19dX06dP16KOPqn79+nrooYdUpkwZJSYm6ssvv9Sdd96pKVOmyNfX1345rfT0dAUHB2vlypU6cOBAluds0KCBJGnYsGF66KGHVLRoUd1///3y8fFR3759FRcXp759+6phw4b6/vvvtXv37hznrVSpksaMGaOhQ4fq4MGD6ty5s0qUKKEDBw5oyZIleuKJJzRo0KA82z+5cfnyZd19993q1q2bdu3apWnTpql58+bq1KmTpKuXTRs6dKhGjRql9u3bq1OnTvbtGjVqpEceeSRHr9OgQQNNnz5dY8aMUUREhAIDA9WmTRvdd999Gj16tKKiotSsWTNt3bpV8+fPdziqnhtubm6aPn267r//ftWtW1dRUVEqV66cdu7cqe3bt2vFihWSri7S17x5c9WqVUv9+vVTxYoVlZycrDVr1ujIkSP264TXqFFDrVu3VoMGDVSyZEmtX79eixYt0rPPPntT+QAAroHSDQBwej169FD58uUVFxen8ePH69KlSwoODlaLFi0cVs/+4IMP9Nxzz2nq1KkyDENt27bVV199leX6z40aNdKrr76qGTNmaPny5crMzNSBAwfk4+OjmJgYnThxQosWLdLChQvVoUMHffXVVwoMDMxx3iFDhqhKlSqaNGmSRo0aJUkKCQlR27Zt7QXXClOmTNH8+fMVExOj9PR0Pfzww5o8ebLDdPCRI0eqTJkymjJligYMGKCSJUvqiSee0NixY3O8CFxMTIwOHTqkcePG6dy5c2rVqpXatGmjl19+WWlpafrggw+0YMEC1a9fX19++aWGDBly099Tu3bttHr1ao0aNUoTJkxQZmamKlWqpH79+tm3qVGjhtavX69Ro0Zp7ty5OnXqlAIDA1WvXj2HUxGef/55ffbZZ1q5cqUuXbqk0NBQjRkzRoMHD77pfACAws9m5MdKKgAAoMCaO3euoqKitG7dumxXiAcAADePc7oBAAAAADAJpRsAAAAAAJNQugEAAAAAMAnndAMAAAAAYBKOdAMAAAAAYBJKNwAAAAAAJnGK63RnZmbqjz/+UIkSJRyuFQoAAAAAgBUMw9C5c+dUvnx5ubld/3i2U5TuP/74QyEhIVbHAAAAAADAweHDh3Xbbbdd936nKN0lSpSQdPWb8fX1tTgNAAAAAMDVpaamKiQkxN5Xr8cpSve1KeW+vr6UbgAAAABAgfFvp0CzkBoAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGCSIlYHcEVhQ760OkKBcjCuo9URAAAAAMAUHOkGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATHJTpXvq1KkKCwuTl5eXmjRporVr115329atW8tms2W5dezY8aZDAwAAAADgDHJduhcsWKDo6GiNGDFCGzduVJ06ddSuXTsdP3482+0XL16sY8eO2W/btm2Tu7u7unbtesvhAQAAAAAoyHJduidOnKh+/fopKipKNWrU0IwZM+Tt7a05c+Zku33JkiVVtmxZ+23VqlXy9vamdAMAAAAACr1cle7Lly9rw4YNioyM/OsJ3NwUGRmpNWvW5Og5Zs+erYceekg+Pj65SwoAAAAAgJMpkpuNT548qYyMDAUFBTmMBwUFaefOnf/6+LVr12rbtm2aPXv2Dbe7dOmSLl26ZP86NTU1NzEBAAAAACgQ8nX18tmzZ6tWrVpq3LjxDbeLjY2Vn5+f/RYSEpJPCQEAAAAAyDu5Kt2lS5eWu7u7kpOTHcaTk5NVtmzZGz42LS1NH330kR5//PF/fZ2hQ4cqJSXFfjt8+HBuYgIAAAAAUCDkqnR7eHioQYMGSkhIsI9lZmYqISFBTZs2veFjP/74Y126dEmPPPLIv76Op6enfH19HW4AAAAAADibXJ3TLUnR0dHq3bu3GjZsqMaNGys+Pl5paWmKioqSJPXq1UvBwcGKjY11eNzs2bPVuXNnlSpVKm+SAwAAAABQwOW6dHfv3l0nTpxQTEyMkpKSVLduXS1fvty+uFpiYqLc3BwPoO/atUs//vijVq5cmTepAQAAAABwAjbDMAyrQ/yb1NRU+fn5KSUlpVBMNQ8b8qXVEQqUg3EdrY4AAAAAALmS056ar6uXAwAAAADgSijdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJbqp0T506VWFhYfLy8lKTJk20du3aG25/9uxZPfPMMypXrpw8PT1VpUoVLVu27KYCAwAAAADgLIrk9gELFixQdHS0ZsyYoSZNmig+Pl7t2rXTrl27FBgYmGX7y5cv65577lFgYKAWLVqk4OBgHTp0SP7+/nmRHwAAAACAAivXpXvixInq16+foqKiJEkzZszQl19+qTlz5mjIkCFZtp8zZ45Onz6tn3/+WUWLFpUkhYWF3VpqAAAAAACcQK6ml1++fFkbNmxQZGTkX0/g5qbIyEitWbMm28d89tlnatq0qZ555hkFBQWpZs2aGjt2rDIyMq77OpcuXVJqaqrDDQAAAAAAZ5Or0n3y5EllZGQoKCjIYTwoKEhJSUnZPmb//v1atGiRMjIytGzZMg0fPlwTJkzQmDFjrvs6sbGx8vPzs99CQkJyExMAAAAAgALB9NXLMzMzFRgYqFmzZqlBgwbq3r27hg0bphkzZlz3MUOHDlVKSor9dvjwYbNjAgAAAACQ53J1Tnfp0qXl7u6u5ORkh/Hk5GSVLVs228eUK1dORYsWlbu7u32sevXqSkpK0uXLl+Xh4ZHlMZ6envL09MxNNAAAAAAACpxcHen28PBQgwYNlJCQYB/LzMxUQkKCmjZtmu1j7rzzTu3du1eZmZn2sd27d6tcuXLZFm4AAAAAAAqLXE8vj46O1ltvvaV3331Xv//+u5566imlpaXZVzPv1auXhg4dat/+qaee0unTp9W/f3/t3r1bX375pcaOHatnnnkm774LAAAAAAAKoFxfMqx79+46ceKEYmJilJSUpLp162r58uX2xdUSExPl5vZXlw8JCdGKFSs0YMAA1a5dW8HBwerfv79eeumlvPsuAAAAAAAogGyGYRhWh/g3qamp8vPzU0pKinx9fa2Oc8vChnxpdYQC5WBcR6sjAAAAAECu5LSnmr56OQAAAAAArorSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACY5KZK99SpUxUWFiYvLy81adJEa9euve62c+fOlc1mc7h5eXnddGAAAAAAAJxFrkv3ggULFB0drREjRmjjxo2qU6eO2rVrp+PHj1/3Mb6+vjp27Jj9dujQoVsKDQAAAACAM8h16Z44caL69eunqKgo1ahRQzNmzJC3t7fmzJlz3cfYbDaVLVvWfgsKCrql0AAAAAAAOINcle7Lly9rw4YNioyM/OsJ3NwUGRmpNWvWXPdx58+fV2hoqEJCQvTAAw9o+/btN3ydS5cuKTU11eEGAAAAAICzyVXpPnnypDIyMrIcqQ4KClJSUlK2j6latarmzJmjTz/9VO+//74yMzPVrFkzHTly5LqvExsbKz8/P/stJCQkNzEBAAAAACgQTF+9vGnTpurVq5fq1q2rVq1aafHixSpTpoxmzpx53ccMHTpUKSkp9tvhw4fNjgkAAAAAQJ4rkpuNS5cuLXd3dyUnJzuMJycnq2zZsjl6jqJFi6pevXrau3fvdbfx9PSUp6dnbqIBAAAAAFDg5OpIt4eHhxo0aKCEhAT7WGZmphISEtS0adMcPUdGRoa2bt2qcuXK5S4pAAAAAABOJldHuiUpOjpavXv3VsOGDdW4cWPFx8crLS1NUVFRkqRevXopODhYsbGxkqTRo0frjjvuUEREhM6ePavx48fr0KFD6tu3b95+JwAAAAAAFDC5Lt3du3fXiRMnFBMTo6SkJNWtW1fLly+3L66WmJgoN7e/DqCfOXNG/fr1U1JSkgICAtSgQQP9/PPPqlGjRt59FwAAAAAAFEA2wzAMq0P8m9TUVPn5+SklJUW+vr5Wx7llYUO+tDpCgXIwrqPVEQAAAAAgV3LaU01fvRwAAAAAAFdF6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATHJTpXvq1KkKCwuTl5eXmjRporVr1+bocR999JFsNps6d+58My8LAAAAAIBTyXXpXrBggaKjozVixAht3LhRderUUbt27XT8+PEbPu7gwYMaNGiQWrRocdNhAQAAAABwJrku3RMnTlS/fv0UFRWlGjVqaMaMGfL29tacOXOu+5iMjAz17NlTo0aNUsWKFW8pMAAAAAAAziJXpfvy5cvasGGDIiMj/3oCNzdFRkZqzZo1133c6NGjFRgYqMcffzxHr3Pp0iWlpqY63AAAAAAAcDa5Kt0nT55URkaGgoKCHMaDgoKUlJSU7WN+/PFHzZ49W2+99VaOXyc2NlZ+fn72W0hISG5iAgAAAABQIJi6evm5c+f06KOP6q233lLp0qVz/LihQ4cqJSXFfjt8+LCJKQEAAAAAMEeR3GxcunRpubu7Kzk52WE8OTlZZcuWzbL9vn37dPDgQd1///32sczMzKsvXKSIdu3apUqVKmV5nKenpzw9PXMTDQAAAACAAidXR7o9PDzUoEEDJSQk2McyMzOVkJCgpk2bZtm+WrVq2rp1qzZv3my/derUSXfddZc2b97MtHEAAAAAQKGWqyPdkhQdHa3evXurYcOGaty4seLj45WWlqaoqChJUq9evRQcHKzY2Fh5eXmpZs2aDo/39/eXpCzjAAAAAAAUNrku3d27d9eJEycUExOjpKQk1a1bV8uXL7cvrpaYmCg3N1NPFQcAAAAAwCnYDMMwrA7xb1JTU+Xn56eUlBT5+vpaHeeWhQ350uoIBcrBuI5WRwAAAACAXMlpT+WQNAAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmuanSPXXqVIWFhcnLy0tNmjTR2rVrr7vt4sWL1bBhQ/n7+8vHx0d169bVe++9d9OBAQAAAABwFrku3QsWLFB0dLRGjBihjRs3qk6dOmrXrp2OHz+e7fYlS5bUsGHDtGbNGv3222+KiopSVFSUVqxYccvhAQAAAAAoyGyGYRi5eUCTJk3UqFEjTZkyRZKUmZmpkJAQPffccxoyZEiOnqN+/frq2LGjXn311Rxtn5qaKj8/P6WkpMjX1zc3cQuksCFfWh2hQDkY19HqCAAAAACQKzntqbk60n358mVt2LBBkZGRfz2Bm5siIyO1Zs2af328YRhKSEjQrl271LJly+tud+nSJaWmpjrcAAAAAABwNrkq3SdPnlRGRoaCgoIcxoOCgpSUlHTdx6WkpKh48eLy8PBQx44d9b///U/33HPPdbePjY2Vn5+f/RYSEpKbmAAAAAAAFAj5snp5iRIltHnzZq1bt06vvfaaoqOj9e233153+6FDhyolJcV+O3z4cH7EBAAAAAAgTxXJzcalS5eWu7u7kpOTHcaTk5NVtmzZ6z7Ozc1NERERkqS6devq999/V2xsrFq3bp3t9p6envL09MxNNAAAAAAACpxcHen28PBQgwYNlJCQYB/LzMxUQkKCmjZtmuPnyczM1KVLl3Lz0gAAAAAAOJ1cHemWpOjoaPXu3VsNGzZU48aNFR8fr7S0NEVFRUmSevXqpeDgYMXGxkq6en52w4YNValSJV26dEnLli3Te++9p+nTp+ftdwIAAAAAQAGT69LdvXt3nThxQjExMUpKSlLdunW1fPly++JqiYmJcnP76wB6Wlqann76aR05ckTFihVTtWrV9P7776t79+55910AAAAAAFAA5fo63VbgOt2FG9fpBgAAAOBsTLlONwAAAAAAyDlKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJrmp0j116lSFhYXJy8tLTZo00dq1a6+77VtvvaUWLVooICBAAQEBioyMvOH2AAAAAAAUFrku3QsWLFB0dLRGjBihjRs3qk6dOmrXrp2OHz+e7fbffvutHn74Ya1evVpr1qxRSEiI2rZtq6NHj95yeAAAAAAACjKbYRhGbh7QpEkTNWrUSFOmTJEkZWZmKiQkRM8995yGDBnyr4/PyMhQQECApkyZol69euXoNVNTU+Xn56eUlBT5+vrmJm6BFDbkS6sjFCgH4zpaHQEAAAAAciWnPTVXR7ovX76sDRs2KDIy8q8ncHNTZGSk1qxZk6PnuHDhgtLT01WyZMncvDQAAAAAAE6nSG42PnnypDIyMhQUFOQwHhQUpJ07d+boOV566SWVL1/eobj/06VLl3Tp0iX716mpqbmJCQAAAABAgZCvq5fHxcXpo48+0pIlS+Tl5XXd7WJjY+Xn52e/hYSE5GNKAAAAAADyRq5Kd+nSpeXu7q7k5GSH8eTkZJUtW/aGj33jjTcUFxenlStXqnbt2jfcdujQoUpJSbHfDh8+nJuYAAAAAAAUCLkq3R4eHmrQoIESEhLsY5mZmUpISFDTpk2v+7hx48bp1Vdf1fLly9WwYcN/fR1PT0/5+vo63AAAAAAAcDa5OqdbkqKjo9W7d281bNhQjRs3Vnx8vNLS0hQVFSVJ6tWrl4KDgxUbGytJev311xUTE6MPPvhAYWFhSkpKkiQVL15cxYsXz8NvBQAAAACAgiXXpbt79+46ceKEYmJilJSUpLp162r58uX2xdUSExPl5vbXAfTp06fr8uXL+s9//uPwPCNGjNDIkSNvLT0AAAAAAAVYrq/TbQWu0124cZ1uAAAAAM7GlOt0AwAAAACAnKN0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmKWJ1ACAvhA350uoIBcrBuI5WRwAAAAAgjnQDAAAAAGAaSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgkpsq3VOnTlVYWJi8vLzUpEkTrV279rrbbt++Xf/3f/+nsLAw2Ww2xcfH32xWAAAAAACcSq5L94IFCxQdHa0RI0Zo48aNqlOnjtq1a6fjx49nu/2FCxdUsWJFxcXFqWzZsrccGAAAAAAAZ5Hr0j1x4kT169dPUVFRqlGjhmbMmCFvb2/NmTMn2+0bNWqk8ePH66GHHpKnp+ctBwYAAAAAwFnkqnRfvnxZGzZsUGRk5F9P4OamyMhIrVmzJs/DAQAAAADgzIrkZuOTJ08qIyNDQUFBDuNBQUHauXNnnoW6dOmSLl26ZP86NTU1z54bAAAAAID8UiBXL4+NjZWfn5/9FhISYnUkAAAAAAByLVelu3Tp0nJ3d1dycrLDeHJycp4ukjZ06FClpKTYb4cPH86z5wYAAAAAIL/kqnR7eHioQYMGSkhIsI9lZmYqISFBTZs2zbNQnp6e8vX1dbgBAAAAAOBscnVOtyRFR0erd+/eatiwoRo3bqz4+HilpaUpKipKktSrVy8FBwcrNjZW0tXF13bs2GH/99GjR7V582YVL15cERERefitAAAAAABQsOS6dHfv3l0nTpxQTEyMkpKSVLduXS1fvty+uFpiYqLc3P46gP7HH3+oXr169q/feOMNvfHGG2rVqpW+/fbbW/8OAAAAAAAooHJduiXp2Wef1bPPPpvtff8s0mFhYTIM42ZeBgAAAAAAp1YgVy8HAAAAAKAwoHQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACYpYnUAAAVT2JAvrY5Q4ByM62h1BAAAADgZjnQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGCSIlYHAABXEjbkS6sjFCgH4zpaHQEAAMBUHOkGAAAAAMAkHOkGADg1Zg84YvYAAAAFC0e6AQAAAAAwCUe6AQCAA2YPZMUMAgDAzaJ0AwAA5AM+zHDEBxkAXAXTywEAAAAAMAmlGwAAAAAAkzC9HAAAAE6JKfuOmLIPFEwc6QYAAAAAwCQ3VbqnTp2qsLAweXl5qUmTJlq7du0Nt//4449VrVo1eXl5qVatWlq2bNlNhQUAAAAAwJnkunQvWLBA0dHRGjFihDZu3Kg6deqoXbt2On78eLbb//zzz3r44Yf1+OOPa9OmTercubM6d+6sbdu23XJ4AAAAAAAKslyX7okTJ6pfv36KiopSjRo1NGPGDHl7e2vOnDnZbv/mm2+qffv2Gjx4sKpXr65XX31V9evX15QpU245PAAAAAAABVmuFlK7fPmyNmzYoKFDh9rH3NzcFBkZqTVr1mT7mDVr1ig6OtphrF27dlq6dGnu0wIAAAAwDYvTZcUCdbhVuSrdJ0+eVEZGhoKCghzGg4KCtHPnzmwfk5SUlO32SUlJ132dS5cu6dKlS/avU1JSJEmpqam5iVtgZV66YHWEAiUv/ruyTx2xT83Bfs177NO8xz41B/s177FP8x771Bx5sV9rjliRB0kKj22j2lkdIU9c+9kwDOOG2xXIS4bFxsZq1KhRWcZDQkIsSAOz+cVbnaDwYZ+ag/2a99ineY99ag72a95jn+Y99qk52K95r7Dt03PnzsnPz++69+eqdJcuXVru7u5KTk52GE9OTlbZsmWzfUzZsmVztb0kDR061GFKemZmpk6fPq1SpUrJZrPlJjKuIzU1VSEhITp8+LB8fX2tjlMosE/NwX7Ne+zTvMc+NQf7Ne+xT/Me+zTvsU/NwX7Ne4Zh6Ny5cypfvvwNt8tV6fbw8FCDBg2UkJCgzp07S7paiBMSEvTss89m+5imTZsqISFBL7zwgn1s1apVatq06XVfx9PTU56eng5j/v7+uYmKHPL19eWXLo+xT83Bfs177NO8xz41B/s177FP8x77NO+xT83Bfs1bNzrCfU2up5dHR0erd+/eatiwoRo3bqz4+HilpaUpKipKktSrVy8FBwcrNjZWktS/f3+1atVKEyZMUMeOHfXRRx9p/fr1mjVrVm5fGgAAAAAAp5Lr0t29e3edOHFCMTExSkpKUt26dbV8+XL7YmmJiYlyc/vrSmTNmjXTBx98oFdeeUUvv/yyKleurKVLl6pmzZp5910AAAAAAFAA3dRCas8+++x1p5N/++23Wca6du2qrl273sxLwSSenp4aMWJElmn8uHnsU3OwX/Me+zTvsU/NwX7Ne+zTvMc+zXvsU3OwX61jM/5tfXMAAAAAAHBT3P59EwAAAAAAcDMo3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNIN5IG9e/dqxYoV+vPPPyVJrE8IFH6rV6++7n1Tp07NxyQA8lNGRoa+//57nT171uoowA2NHj1aFy5cyDL+559/avTo0RYkcl2sXu5i3nvvPc2YMUMHDhzQmjVrFBoaqvj4eIWHh+uBBx6wOp7TOXXqlLp3765vvvlGNptNe/bsUcWKFfXYY48pICBAEyZMsDqi09m4caOKFi2qWrVqSZI+/fRTvfPOO6pRo4ZGjhwpDw8PixM6rz179mj16tU6fvy4MjMzHe6LiYmxKJXzCggI0Ndff60GDRo4jL/55psaPny4UlNTLUrm3DIzM7V3795sf05btmxpUSrAkZeXl37//XeFh4dbHaVQ4X1q3nJ3d9exY8cUGBjoMH7q1CkFBgYqIyPDomSuhyPdLmT69OmKjo7Wvffeq7Nnz9p/0fz9/RUfH29tOCc1YMAAFSlSRImJifL29raPd+/eXcuXL7cwmfN68skntXv3bknS/v379dBDD8nb21sff/yxXnzxRYvTOa+33npL1atXV0xMjBYtWqQlS5bYb0uXLrU6nlMaP368OnTooJ07d9rHJkyYoJiYGH355ZcWJnNev/zyiyIiIlS9enW1bNlSrVu3tt/uuusuq+M5rXfffdfhZ/LFF1+Uv7+/mjVrpkOHDlmYzHnVrFlT+/fvtzpGocL71LxnGIZsNluW8S1btqhkyZIWJHJhBlxG9erVjSVLlhiGYRjFixc39u3bZxiGYWzdutUoVaqUhcmcV1BQkLF582bDMBz36b59+wwfHx8rozktX19fY+/evYZhGEZcXJzRtm1bwzAM48cffzRuu+02K6M5tQoVKhhxcXFWxyh0Xn/9dSM4ONg4cOCAERcXZ/j6+ho//vij1bGcVp06dYyuXbsaO3bsMM6cOWOcPXvW4YabU6VKFSMhIcEwDMP4+eefDW9vb2PmzJnG/fffbzz44IMWp3NOX331lVG3bl3j888/N/744w8jJSXF4Ybc431q3vH39zcCAgIMNzc3+7+v3Xx9fQ03Nzfj6aeftjqmSylidelH/jlw4IDq1auXZdzT01NpaWkWJHJ+aWlpDke4rzl9+rQ8PT0tSOT8DMOwTyn9+uuvdd9990mSQkJCdPLkSSujObUzZ86oa9euVscodF588UWdOnVKDRs2VEZGhlasWKE77rjD6lhOa8+ePVq0aJEiIiKsjlKoHD582L5Ply5dqv/7v//TE088oTvvvFOtW7e2NpyTuvfeeyVJnTp1cjiSaPz/I4tM28093qfmnfj4eBmGoccee0yjRo2Sn5+f/T4PDw+FhYWpadOmFiZ0PZRuFxIeHq7NmzcrNDTUYXz58uWqXr26RamcW4sWLTRv3jy9+uqrkiSbzabMzEyNGzeOqZA3qWHDhhozZowiIyP13Xffafr06ZKu/jEOCgqyOJ3z6tq1q1auXKn//ve/VkdxapMnT84yFhwcLG9vb7Vs2VJr167V2rVrJUnPP/98fsdzek2aNNHevXsp3XmsePHiOnXqlCpUqKCVK1cqOjpa0tXzkq8tAIrcudFCirg5vE/NO71795Z0dZ82a9ZMRYsWtTgRKN0uJDo6Ws8884wuXrwowzC0du1affjhh4qNjdXbb79tdTynNG7cON19991av369Ll++rBdffFHbt2/X6dOn9dNPP1kdzynFx8erZ8+eWrp0qYYNG2Z/871o0SI1a9bM4nTO5e8FMSIiQsOHD9cvv/yiWrVqZfkDTEHMmUmTJmU77u7urp9++sn+e2+z2dinN+G5557TwIEDlZSUlO3Pae3atS1K5tzuuece9e3bV/Xq1dPu3bvtR2m3b9+usLAwa8M5qVatWlkdodDhfWrea9WqlTIzM7V7924Wp7QYq5e7mPnz52vkyJHat2+fJKl8+fIaNWqUHn/8cYuTOa+UlBRNmTJFW7Zs0fnz51W/fn0988wzKleunNXRCpWLFy/K3d2dT2tzIaer6tpsNhYEQoHg5pZ1fVebzcaU3Vt09uxZvfLKKzp8+LCeeuoptW/fXpI0YsQIeXh4aNiwYRYndE4//PCDZs6cqf379+vjjz9WcHCw3nvvPYWHh6t58+ZWx3NKvE/NW7/88ot69OihQ4cOZbmcLf9PzV+Ubhd14cIFnT9/PsslBAAAsMq/raT9z2mngFU++eQTPfroo+rZs6fee+897dixQxUrVtSUKVO0bNkyLVu2zOqITo33qXmjbt26qlKlikaNGqVy5cplWcn87+d6w1yUbhfSpk0bLV68WP7+/g7jqamp6ty5s7755htrgjmx3377Ldtxm80mLy8vVahQgQXVcqBkyZLavXu3SpcurYCAgGwvb3HN6dOn8zFZ4TF69GgNGjQoy8J/f/75p8aPH891um/SkSNH9NlnnykxMVGXL192uG/ixIkWpQKu/n2qWbOm3Nzcrvu36hqm7edevXr1NGDAAPXq1UslSpTQli1bVLFiRW3atEkdOnRQUlKS1RGdDu9T856Pj4+2bNnCOhkFAKXbhbi5uSkpKSnLp4bHjx9XcHCw0tPTLUrmvNzc3OwF8dqv0t8LY9GiRdW9e3fNnDlTXl5elmR0Bu+++64eeugheXp6au7cuTcs3dcWB0HuuLu769ixY1l+/0+dOqXAwECmmN2EhIQEderUSRUrVtTOnTtVs2ZNHTx4UIZhqH79+rxBvEn79u1TfHy8fv/9d0lSjRo11L9/f1WqVMniZM7l73/zr/2t+vtbPqbt3xpvb2/t2LFDYWFhDqV7//79qlGjhi5evGh1RKfD+9S816ZNG7344ov2U0pgHRZScwF//4R7x44dDp++ZmRkaPny5QoODrYimtNbsmSJXnrpJQ0ePFiNGzeWJK1du1YTJkzQiBEjdOXKFQ0ZMkSvvPKK3njjDYvTFlx/L9J9+vSxLkghdu3N9T9t2bJFJUuWtCCR8xs6dKgGDRqkUaNGqUSJEvrkk08UGBionj178gbnJq1YsUKdOnVS3bp1deedd0qSfvrpJ91+++36/PPPdc8991ic0HkcOHBAZcqUsf8beats2bLau3dvloXofvzxR1WsWNGaUE6K96nmYXHKAiR/LwsOK9hsNsPNzc1wc3MzbDZblpu3t7cxe/Zsq2M6pUaNGhnLly/PMr58+XKjUaNGhmEYxpIlS4yKFSvmdzSn9c4772Q7np6ebgwZMiR/wxQC/v7+RkBAgOHm5mb/97Wbr6+v4ebmZjz99NNWx3RKxYsXN/bu3WsYxtX9vG3bNsMwDGPz5s1GaGiohcmcV926dY2XXnopy/hLL71k1KtXz4JEhV9mZqbVEZzS2LFjjRo1ahi//PKLUaJECeOHH34w3n//faNMmTLG5MmTrY7nVHifap7s9ue1/ezm5mZ1PJfCkW4XcODAARmGoYoVK2rt2rX2T74lycPDQ4GBgXJ3d7cwofPaunVrtgv7hIaGauvWrZKuLmJx7Nix/I7mtJ5//nl9+eWXmjVrlgICAiRJu3btUo8ePXTq1CnFxsZanNC5xMfHyzAMPfbYYxo1apTDoikeHh4KCwtT06ZNLUzovHx8fOzncZcrV0779u3T7bffLkk6efKkldGc1u+//66FCxdmGX/ssccUHx+f/4EKiT59+mjq1Kny8fFxGD948KAeffRR/fDDDxYlc15DhgxRZmam7r77bl24cEEtW7aUp6enBg0apOeee87qeE6F96nmYZZLwUHpdgHXSuE/r82HW1etWjXFxcVp1qxZ8vDwkCSlp6crLi5O1apVkyQdPXpUQUFBVsZ0Kps2bdIjjzyiWrVq6Z133tHu3bv14osvqnPnzpo2bZrV8ZzOtan74eHhatasGZdcy0N33HGHfvzxR1WvXl333nuvBg4cqK1bt2rx4sW64447rI7nlMqUKaPNmzercuXKDuObN29mFeNbsGXLFtWuXVvvv/++/UO2d999V88//7zatGljcTrnZLPZNGzYMA0ePFh79+7V+fPnVaNGDRUvXtzqaE6H96nm4YoPBQel2wXt2LEj25V2O3XqZFEi5zV16lR16tRJt912m/28mK1btyojI0NffPGFJGn//v16+umnrYzpVCpVqqSffvpJL7zwgtq3by93d3e9++67evjhh62O5tTq1aunP//8U3/++afDuM1mk6enp/1DI+TcxIkTdf78eUnSqFGjdP78eS1YsECVK1dm5fKb1K9fPz3xxBPav3+/mjVrJunqOd2vv/66oqOjLU7nvNauXauXX35ZrVu31sCBA7V37159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AKujuDxKtwupW7euw9fp6enavHmztm3bpt69e1sTCoCpri1Mc9ddd2nJkiXZFhqgoGjUqJGio6P13nvvKSgoSJKUnJyswYMHq3HjxhanA2CG+Ph4GYahxx57TKNGjZKfn5/9vmsfDl873QS5U7lyZY0ePVo//fSTGjRoIB8fH4f7uQxb/uGcbmjkyJE6f/683njjDaujADDJgAEDcrxgIlcygFX27t2rBx980H5dWUk6fPiwKleurKVLl7LaLlBIXblyRfPnz1ebNm3sv/u4dVyGreCgdEN79+5V48aNdfr0aaujADDJXXfdpY0bN+rKlSuqWrWqJGn37t1yd3dX/fr17dvZbDZONYGlDMPQqlWrtHPnTklS9erVFRkZyVU2gELO29tbv//+u0JDQ62OAuQ5ppdDa9askZeXl9UxAJjo/vvvV4kSJfTuu+8qICBAknTmzBlFRUWpRYsWGjhwoMUJgatsNpvatm2rtm3bXnebWrVqadmyZRwRAwqRxo0ba9OmTZTuPBQdHZ3jbZnlZi5Ktwvp0qWLw9eGYejYsWNav349KxsChdyECRO0cuVKe+GWri5eM2bMGLVt25bSDady8OBBpaenWx0DQB56+umnNXDgQB05ciTb849r165tUTLntWnTphzPcoO5KN0u5O8LU0hXr9tbtWpVjR49+oZHFAA4v9TUVJ04cSLL+IkTJ3Tu3DkLEgEA8JeHHnpIUvaLe9lsNq7TfROY5VZwcE43ALiAXr166YcfftCECRPsq0D/+uuvGjx4sFq0aKF3333X4oRAzpUoUUJbtmxRxYoVrY4CII8cOnTohvcz7Tz3goODtXLlSt1+++0O49u2bVPbtm31xx9/WJTM9XCk24WsW7dOmZmZatKkicP4r7/+Knd3dzVs2NCiZADMNmPGDA0aNEg9evSwT8stUqSIHn/8cY0fP97idAAAV3etVO/YsUOJiYm6fPmy/T6bzUbpvgnMcis4ONLtQho3bqwXX3xR//nPfxzGFy9erNdff12//vqrRckA5Je0tDTt27dPklSpUqUs58wBzoAj3UDhs3//fj344IPaunWrbDabrlWUa+cbM70895jlVnC4WR0A+WfHjh0OiyZcU69ePe3YscOCRADym4+Pj2rXrq3atWtTuAEABUb//v0VHh6u48ePy9vbW9u2bdP333+vhg0b6ttvv7U6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",
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot the feature importance\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"feature_importances = model.feature_importances_\n",
"# Sort the feature importances in descending order\n",
"sorted_idx = np.argsort(feature_importances)[::-1]\n",
"\n",
"plt.figure(figsize=(10, 6))\n",
"plt.title(\"Feature Importances\")\n",
"plt.bar(range(len(feature_importances)), feature_importances[sorted_idx], align=\"center\")\n",
"plt.xticks(range(len(feature_importances)), np.array(feature_names)[sorted_idx], rotation=90)\n",
"plt.xlim([-1, len(feature_importances)])\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABBfUlEQVR4nO3de5iVVd038O8wwHAGFUFFcjJP4bEgDfHQgURFezFT8hCKSnng0aRMMRXNFC0PWKmYiljpo3nqoVTMUJ6yMFOCtFdNTcS04eABEHMQZr9/+DI5MRrgzL1h5vO5rn1d7rXX2vt3cwet63uve90VpVKpFAAAAAAoUJtyFwAAAABA6yOUAgAAAKBwQikAAAAACieUAgAAAKBwQikAAAAACieUAgAAAKBwQikAAAAACieUAgAAAKBwQikAAAAACieUAmhCFRUVOffcc+vfT548ORUVFZkzZ07ZagIAaC5HH310qqur12jM9OnTU1FRkenTpzdLTcD6QygFrFdWhjwrX23btk2fPn1y9NFH56WXXip3eQAAze7f50MdOnTINttsk9GjR2fevHnlLg9gtbUtdwEAa+Pb3/52PvzhD+ett97Kww8/nMmTJ+ehhx7KE088kQ4dOpS7PACAZvfu+dBDDz2Uq6++Ovfcc0+eeOKJdOrUqZAarr322tTV1a3RmL322iv//Oc/0759+2aqClhfCKWA9dJ+++2XAQMGJEmOO+649OzZMxdffHGmTJmSQw89tMzVAQA0v3+fD2200Ua57LLL8j//8z857LDDVum/dOnSdO7cuUlraNeu3RqPadOmjYuIQBK37wEtxJ577pkkee655+rbnnrqqXzxi1/MhhtumA4dOmTAgAGZMmXKKmNff/31nHrqqamurk5VVVU233zzjBgxIgsXLkySLFu2LOecc0769++f7t27p3Pnztlzzz3z4IMPFnNwAACr4TOf+UyS5Pnnn8/RRx+dLl265Lnnnsv++++frl275ogjjkiS1NXVZcKECdl+++3ToUOH9O7dO1/96lfz2muvrfKd9957b/bee+907do13bp1yyc+8YncfPPN9Z83tqfULbfckv79+9eP2XHHHXPFFVfUf/5ee0rddttt6d+/fzp27JiePXvmyCOPXGV7hpXH9dJLL2XYsGHp0qVLNt5443zjG9/IihUrPsgfH1AGQimgRVi5kfgGG2yQJPnLX/6ST37yk3nyySdzxhln5NJLL03nzp0zbNiw3HXXXfXj3njjjey55575wQ9+kH322SdXXHFFjj/++Dz11FP5+9//niRZvHhxrrvuunzqU5/KxRdfnHPPPTcLFizIkCFDMmvWrKIPFQCgUSsvzm200UZJkuXLl2fIkCHp1atXLrnkkhx88MFJkq9+9as57bTTMmjQoFxxxRUZOXJkbrrppgwZMiRvv/12/fdNnjw5Q4cOzauvvpqxY8fmoosuyi677JKpU6e+Zw33339/DjvssGywwQa5+OKLc9FFF+VTn/pUfve7371v7ZMnT86hhx6aysrKjB8/PqNGjcqdd96ZPfbYI6+//nqDvitWrMiQIUOy0UYb5ZJLLsnee++dSy+9ND/60Y/W5o8NKCO37wHrpUWLFmXhwoV566238oc//CHnnXdeqqqqcsABByRJTjnllHzoQx/KH//4x1RVVSVJTjzxxOyxxx45/fTTc9BBByVJvve97+WJJ57InXfeWd+WJGeddVZKpVKSd4KuOXPmNNj3YNSoUdluu+3ygx/8INdff31Rhw0AUO/d86Hf/e53+fa3v52OHTvmgAMOyIwZM1JbW5tDDjkk48ePrx/z0EMP5brrrstNN92Uww8/vL7905/+dPbdd9/cdtttOfzww7No0aKcfPLJ2XXXXTN9+vQGt9utnCM15u677063bt1y3333pbKycrWO4+23387pp5+eHXbYIb/5zW/qf2uPPfbIAQcckMsvvzznnXdeff+33norw4cPz9lnn50kOf744/Pxj388119/fU444YTV+8MD1glWSgHrpcGDB2fjjTdO375988UvfjGdO3fOlClTsvnmm+fVV1/NAw88kEMPPTRLlizJwoULs3DhwrzyyisZMmRInnnmmfql4HfccUd23nnnBoHUShUVFUmSysrK+kCqrq4ur776apYvX54BAwZk5syZxR00AMC7vHs+9KUvfSldunTJXXfdlT59+tT3+feQ5rbbbkv37t3zuc99rn6OtHDhwvTv3z9dunSp357g/vvvz5IlS3LGGWessv/TyjlSY3r06JGlS5fm/vvvX+3jePTRRzN//vyceOKJDX5r6NCh2W677XL33XevMub4449v8H7PPffM3/72t9X+TWDdYKUUsF668sors80222TRokWZNGlSfvOb39SviHr22WdTKpVy9tln119B+3fz589Pnz598txzz9UvZX8/N954Yy699NI89dRTDZa1f/jDH26aAwIAWEMr50Nt27ZN7969s+2226ZNm3+tO2jbtm0233zzBmOeeeaZLFq0KL169Wr0O+fPn5/kX7cC7rDDDmtU04knnpif/exn2W+//dKnT5/ss88+OfTQQ7Pvvvu+55gXXnghSbLtttuu8tl2222Xhx56qEFbhw4dsvHGGzdo22CDDRrdEwtYtwmlgPXSrrvuWv+0mWHDhmWPPfbI4Ycfnqeffrr+scTf+MY3MmTIkEbHb7XVVqv9Wz/96U9z9NFHZ9iwYTnttNPSq1ev+v0O3r2xOgBAkd49H2pMVVVVg5AqeWfVd69evXLTTTc1Oubfw5411atXr8yaNSv33Xdf7r333tx777254YYbMmLEiNx4440f6LtXWt3bAoF1n1AKWO+tDIg+/elP54c//GGOOeaYJO88onjw4MHvO/YjH/lInnjiifftc/vtt2fLLbfMnXfe2WC5+rhx4z548QAABfrIRz6SX//61xk0aFA6duz4vv2S5Iknnliji3lJ0r59+xx44IE58MADU1dXlxNPPDHXXHNNzj777Ea/a4sttkiSPP300/VPEFzp6aefrv8caHnsKQW0CJ/61Key6667ZsKECenWrVs+9alP5Zprrsk//vGPVfouWLCg/r8PPvjgzJ49u8ET+VZauYnnyqtx797U8w9/+ENmzJjR1IcBANCsDj300KxYsSLnn3/+Kp8tX768/kl3++yzT7p27Zrx48fnrbfeatDv/TY6f+WVVxq8b9OmTXbaaackSW1tbaNjBgwYkF69emXixIkN+tx777158sknM3To0NU6NmD9Y6UU0GKcdtppOeSQQzJ58uRceeWV2WOPPbLjjjtm1KhR2XLLLTNv3rzMmDEjf//73zN79uz6MbfffnsOOeSQHHPMMenfv39effXVTJkyJRMnTszOO++cAw44oP7pfEOHDs3zzz+fiRMnpl+/fnnjjTfKfNQAAKtv7733zle/+tWMHz8+s2bNyj777JN27drlmWeeyW233ZYrrrgiX/ziF9OtW7dcfvnlOe644/KJT3wihx9+eDbYYIPMnj07b7755nveinfcccfl1VdfzWc+85lsvvnmeeGFF/KDH/wgu+yySz760Y82OqZdu3a5+OKL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Wu4SAAAAeA9WSgEAAABQOKEUAAAAAIUTSgEAAABQOKEUAAAAAIUTSgEAAABQOKEUAAAAAIUTSgEAAABQOKEUAAAAAIUTSgEAAABQOKEUAAAAAIUTSgEAAABQOKEUAAAAAIUTSgEAAABQOKEUAAAAAIUTSgEAAABQuLKHUldeeWWqq6vToUOH7LbbbnnkkUfet//rr7+ek046KZtuummqqqqyzTbb5J577imoWgAAAACaQtty/vitt96aMWPGZOLEidltt90yYcKEDBkyJE8//XR69eq1Sv9ly5blc5/7XHr16pXbb789ffr0yQsvvJAePXoUXzwAAAAAa62sodRll12WUaNGZeTIkUmSiRMn5u67786kSZNyxhlnrNJ/0qRJefXVV/P73/8+7dq1S5JUV1cXWTIAAAAATaBst+8tW7Ysjz32WAYPHvyvYtq0yeDBgzNjxoxGx0yZMiUDBw7MSSedlN69e2eHHXbIhRdemBUrVhRVNgAAAABNoGwrpRYuXJgVK1akd+/eDdp79+6dp556qtExf/vb3/LAAw/kiCOOyD333JNnn302J554Yt5+++2MGzeu0TG1tbWpra2tf7948eKmOwgAAAAA1krZNzpfE3V1denVq1d+9KMfpX///hk+fHi+9a1vZeLEie85Zvz48enevXv9q2/fvgVWDADQPDwsBgBY35UtlOrZs2cqKyszb968Bu3z5s3LJpts0uiYTTfdNNtss00qKyvr2z760Y+mpqYmy5Yta3TM2LFjs2jRovrXiy++2HQHAQBQBisfFjNu3LjMnDkzO++8c4YMGZL58+c32n/lw2LmzJmT22+/PU8//XSuvfba9OnTp+DKAQD+pWy377Vv3z79+/fPtGnTMmzYsCTvrISaNm1aRo8e3eiYQYMG5eabb05dXV3atHknT/vrX/+aTTfdNO3bt290TFVVVaqqqprlGAAAysHDYmhJqs+4u9wl8C5zLhpa7hKAVqSst++NGTMm1157bW688cY8+eSTOeGEE7J06dL6CdaIESMyduzY+v4nnHBCXn311Zxyyin561//mrvvvjsXXnhhTjrppHIdAgBAoYp6WExtbW0WL17c4AUA0JTKtlIqSYYPH54FCxbknHPOSU1NTXbZZZdMnTq1fvPzuXPn1q+ISpK+ffvmvvvuy6mnnpqddtopffr0ySmnnJLTTz+9XIcAAFCooh4WM378+Jx33nlNXj8AwEplDaWSZPTo0e95u9706dNXaRs4cGAefvjhZq4KAKDlePfDYiorK9O/f/+89NJL+d73vveeodTYsWMzZsyY+veLFy/2wBgAoEmVPZQCAGD1re3DYtq1a/eeD4tpbG9O+3ICAM2trHtKAQCwZt79sJiVVj4sZuDAgY2OGTRoUJ599tnU1dXVt/2nh8UAADQ3oRQAwHrGw2IAgJbA7XsAAOsZD4sBAFoCoRQAwHrIw2IAgPWd2/cAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCtS13AQAArcWKFSsyefLkTJs2LfPnz09dXV2Dzx944IEyVQYAUDyhFABAQU455ZRMnjw5Q4cOzQ477JCKiopylwQAUDZCKQCAgtxyyy352c9+lv3337/cpQAAlJ09pQAACtK+fftstdVW5S4DAGCdIJQCACjI17/+9VxxxRUplUrlLgUAoOzcvgcAUJCHHnooDz74YO69995sv/32adeuXYPP77zzzjJVBgBQPKEUAEBBevTokYMOOqjcZQAArBOEUgAABbnhhhvKXQIAwDpDKAUAULAFCxbk6aefTpJsu+222XjjjctcEQBA8Wx0DgBQkKVLl+aYY47Jpptumr322it77bVXNttssxx77LF58803y10eAEChVnul1J///OfV/tKddtpprYoBAGjJxowZk//93//NL37xiwwaNCjJO5ufn3zyyfn617+eq6++uswVAgAUZ7VDqV122SUVFRXv+QjjlZ9VVFRkxYoVTVYgAEBLcccdd+T222/Ppz71qfq2/fffPx07dsyhhx4qlAIAWpXVDqWef/755qwDAKDFe/PNN9O7d+9V2nv16uX2PQCg1VntUGqLLbZozjoAAFq8gQMHZty4cfnxj3+cDh06JEn++c9/5rzzzsvAgQPLXB0AQLFWO5SaMmXKan/p5z//+bUqBgCgJbviiisyZMiQbL755tl5552TJLNnz06HDh1y3333lbk6AIBirXYoNWzYsNXqZ08pAIDG7bDDDnnmmWdy00035amnnkqSHHbYYTniiCPSsWPHMlcHAFCs1Q6l6urqmrMOAIBWoVOnThk1alS5ywAAKLvVDqUAAFhzU6ZMyX777Zd27dr9x+0QbIEAALQmax1KLV26NP/7v/+buXPnZtmyZQ0+O/nkkz9wYQAALcGwYcNSU1OTXr16ve92CLZAAABam7UKpf70pz9l//33z5tvvpmlS5dmww03zMKFC9OpU6f06tVLKAUA8P+9ewsE2yEAAPxLm7UZdOqpp+bAAw/Ma6+9lo4dO+bhhx/OCy+8kP79++eSSy5p6hoBAFqs119/vdwlAACUxVqFUrNmzcrXv/71tGnTJpWVlamtrU3fvn3z3e9+N2eeeWZT1wgA0CJcfPHFufXWW+vfH3LIIdlwww3Tp0+fzJ49u4yVAQAUb61CqXbt2qVNm3eG9urVK3Pnzk2SdO/ePS+++GLTVQcA0IJMnDgxffv2TZLcf//9+fWvf52pU6dmv/32y2mnnVbm6gAAirVWe0p97GMfyx//+MdsvfXW2XvvvXPOOedk4cKF+clPfpIddtihqWsEAGgRampq6kOpX/7ylzn00EOzzz77pLq6OrvttluZqwMAKNZarZS68MILs+mmmyZJLrjggmywwQY54YQTsmDBglxzzTVNWiAAQEuxwQYb1K8qnzp1agYPHpwkKZVKnrwHALQ6a7VSasCAAfX/3atXr0ydOrXJCgIAaKm+8IUv5PDDD8/WW2+dV155Jfvtt1+Sd55svNVWW5W5OgCAYq1VKPX8889n+fLl2XrrrRu0P/PMM2nXrl2qq6ubojYAgBbl8ssvT3V1dV588cV897vfTZcuXZIk//jHP3LiiSeWuToAgGKtVSh19NFH55hjjlkllPrDH/6Q6667LtOnT2+K2gAAWpR27drlG9/4xirtp556ahmqAQAor7UKpf70pz9l0KBBq7R/8pOfzOjRoz9wUQAALcWUKVOy3377pV27dpkyZcr79v385z9fUFUAAOW3VqFURUVFlixZskr7okWLbNIJAPAuw4YNS01NTXr16pVhw4a9Z7+KigrzKACgVVmrp+/ttddeGT9+fIOJ04oVKzJ+/PjsscceTVYcAMD6rq6uLr169ar/7/d6CaQAgNZmrVZKXXzxxdlrr72y7bbbZs8990yS/Pa3v83ixYvzwAMPNGmBAAAAALQ8a7VSql+/fvnzn/+cQw89NPPnz8+SJUsyYsSIPPXUU9lhhx2aukYAgBbh5JNPzve///1V2n/4wx/ma1/7WvEFAQCU0VqtlEqSzTbbLBdeeGFT1gIA0KLdcccdjW52vvvuu+eiiy7KhAkTii8KAKBM1mqlVPLO7XpHHnlkdt9997z00ktJkp/85Cd56KGHmqw4AICW5JVXXkn37t1Xae/WrVsWLlxYhooAAMpnrUKpO+64I0OGDEnHjh0zc+bM1NbWJnnn6XtWTwEANG6rrbbK1KlTV2m/9957s+WWW5ahIgCA8lmr2/e+853vZOLEiRkxYkRuueWW+vZBgwblO9/5TpMVBwDQkowZMyajR4/OggUL8pnPfCZJMm3atFx66aVu3QMAWp21CqWefvrp7LXXXqu0d+/ePa+//voHrQkAoEU65phjUltbmwsuuCDnn39+kqS6ujpXX311RowYUebqAACKtVah1CabbJJnn3021dXVDdofeughS88BAN7HCSeckBNOOCELFixIx44d06VLl3KXBABQFmu1p9SoUaNyyimn5A9/+EMqKiry8ssv56abbsrXv/71nHDCCU1dIwBAi7F8+fL8+te/zp133plSqZQkefnll/PGG2+UuTIAgGKt1UqpM844I3V1dfnsZz+bN998M3vttVeqqqpy2mmn5bjjjmvqGgEAWoQXXngh++67b+bOnZva2tp87nOfS9euXXPxxRentrY2EydOLHeJAACFWauVUhUVFfnWt76VV199NU888UQefvjhLFiwIN27d8+HP/zhpq4RAKBFOOWUUzJgwIC89tpr6dixY337QQcdlGnTppWxMgCA4q3RSqna2tqce+65uf/+++tXRg0bNiw33HBDDjrooFRWVubUU09trloBANZrv/3tb/P73/8+7du3b9BeXV2dl156qUxVAQCUxxqFUuecc06uueaaDB48OL///e9zyCGHZOTIkXn44Ydz6aWX5pBDDkllZWVz1QoAsF6rq6vLihUrVmn/+9//nq5du5ahIgCA8lmj2/duu+22/PjHP87tt9+eX/3qV1mxYkWWL1+e2bNn50tf+pJACgDgfeyzzz6ZMGFC/fuKioq88cYbGTduXPbff//yFQYAUAZrtFLq73//e/r3758k2WGHHVJVVZVTTz01FRUVzVIcAEBLcskll2TfffdNv3798tZbb+Xwww/PM888k549e+a///u/y10eAECh1iiUWrFiRYM9ENq2bZsuXbo0eVEAAC1R3759M3v27Nx6662ZPXt23njjjRx77LE54ogjGmx8DgDQGqxRKFUqlXL00UenqqoqSfLWW2/l+OOPT+fOnRv0u/POO5uuQgCAFuDtt9/Odtttl1/+8pc54ogjcsQRR5S7JACAslqjUOqoo45q8P7II49s0mIAAFqqdu3a5a233ip3GQAA64w1CqVuuOGG5qoDAKDFO+mkk3LxxRfnuuuuS9u2azQNAwBoccyGAAAK8sc//jHTpk3Lr371q+y44462QAAAWjWhFABAQXr06JGDDz643GUAAKwThFIAAM2srq4u3/ve9/LXv/41y5Yty2c+85mce+65nrgHALRqbcpdAABAS3fBBRfkzDPPTJcuXdKnT598//vfz0knnVTusgAAykooBQDQzH784x/nqquuyn333Zef//zn+cUvfpGbbropdXV15S4NAKBshFIAAM1s7ty52X///evfDx48OBUVFXn55ZfLWBUAQHkJpQAAmtny5cvToUOHBm3t2rXL22+/XaaKAADKz0bnAADNrFQq5eijj05VVVV921tvvZXjjz8+nTt3rm+78847y1EeAEBZCKUAAJrZUUcdtUrbkUceWYZKAADWHUIpAIBmdsMNN5S7BACAdY49pQAAAAAonFAKAAAAgMIJpQAAAAAonFAKAAAAgMIJpQAAAAAonFAKAAAAgMIJpQAAAAAo3DoRSl155ZWprq5Ohw4dsttuu+WRRx5ZrXG33HJLKioqMmzYsOYtEAAAAIAmVfZQ6tZbb82YMWMybty4zJw5MzvvvHOGDBmS+fPnv++4OXPm5Bvf+Eb23HPPgioFAAAAoKmUPZS67LLLMmrUqIwcOTL9+vXLxIkT06lTp0yaNOk9x6xYsSJHHHFEzjvvvGy55ZYFVgsAAABAUyhrKLVs2bI89thjGTx4cH1bmzZtMnjw4MyYMeM9x337299Or169cuyxx/7H36itrc3ixYsbvAAA1ne2PwAA1ndlDaUWLlyYFStWpHfv3g3ae/funZqamkbHPPTQQ7n++utz7bXXrtZvjB8/Pt27d69/9e3b9wPXDQBQTrY/AABagrLfvrcmlixZki9/+cu59tpr07Nnz9UaM3bs2Cxa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evXqlQ4dOqS6ujrDhw/P/Pnz89hjj6WioiIPP/xwo9//2c9+Nl/4whdSUVHxvq9zzz23wKPm3WbMmJHKysoMHTq0QfucOXMaPVdHHnlkg89nzZrVaP/27dtnq622yne+853Ymm79sGDBgpxwwgn50Ic+lKqqqmyyySYZMmRIfve73yVJqqur689vp06dsuOOO+a6664rc9V8UGty3isrK7PZZpvl2GOPzWuvvVbmyqF8zJ8wf+LdzKFaH/On4qwTT9+jefztb3/LoEGD0qNHj1x44YXZcccdU1VVlccffzw/+tGP0qdPnwwcODCf/exnc8ABB+S+++5Ljx49MmfOnEyZMiVLly5N//79s/POO2fSpEn55Cc/2eD758yZkwcffDC/+MUvctVVV9W333rrrTnnnHPy9NNP17d16dKlsOOmoeuvvz7/9V//leuvvz4vv/xyNttsswaf//rXv872229f/75jx47v+30r+9fW1uahhx7Kcccdl0033TTHHntss9RP0zn44IOzbNmy3Hjjjdlyyy0zb968TJs2La+88kp9n29/+9sZNWpU3nzzzdx2220ZNWpU+vTpk/3226+MlfNBrMl5X7FiRf7617/mK1/5Sk4++eT85Cc/KWPlUB7mTyTmTzRkDtX6mD8VqESLNWTIkNLmm29eeuONNxr9vK6urnTXXXeV2rZtW3r77bff83u+//3vl7p161ZaunRpg/Zx48aVNttss9Ly5csbtN9www2l7t27f+D6+eCWLFlS6tKlS+mpp54qDR8+vHTBBRfUf/b888+XkpT+9Kc/NTr23z9/r/6f/exnSyeeeGIzHQFN5bXXXislKU2fPv09+2yxxRalyy+/vEHbhhtuWDr11FObuTqay9qe9/PPP7/Ur1+/Zq4O1k3mT5g/8W7mUK2P+VOx3L7XQr3yyiv51a9+lZNOOimdO3dutE9FRUU22WSTLF++PHfdddd7LiE+4ogjUltbm9tvv72+rVQq5cYbb8zRRx+dysrKZjkGPrif/exn2W677bLtttvmyCOPzKRJk5p0qfijjz6axx57LLvttluTfSfNo0uXLunSpUt+/vOfp7a29j/2r6uryx133JHXXnst7du3L6BCmsOanvckeemll/KLX/zC32taJfMnEvMnGjKHan3MnwpWzkSM5vPwww+XkpTuvPPOBu0bbbRRqXPnzqXOnTuXvvnNb5ZKpVLpzDPPLLVt27a04YYblvbdd9/Sd7/73VJNTU2DcV/60pdKe++9d/37adOmlZKUnnnmmVV+25W+dcfuu+9emjBhQqlUKpXefvvtUs+ePUsPPvhgqVT615W7jh071v9vonPnzqWZM2c2+Pzfr/St7N+uXbtSktJXvvKVchwaa+H2228vbbDBBqUOHTqUdt9999LYsWNLs2fPrv98iy22KLVv377UuXPnUtu2bUtJShtuuGGjf89Zf6zJee/QoUMpSWm33XYrvfbaa+UrGsrE/IlSyfyJVZlDtT7mT8WxUqqVeeSRRzJr1qz6e9qT5IILLkhNTU0mTpyY7bffPhMnTsx2222Xxx9/vH7cMccck9/85jd57rnnkiSTJk3K3nvvna222qosx8F/9vTTT+eRRx7JYYcdliRp27Zthg8fnuuvv75Bv1tvvTWzZs2qf/Xr1+99v3dl/9mzZ+dnP/tZ/ud//idnnHFGsx0HTefggw/Oyy+/nClTpmTffffN9OnT8/GPfzyTJ0+u73Paaadl1qxZeeCBB7Lbbrvl8ssv9/d8Pbcm5/3Pf/5zpk2bliQZOnRoVqxYUaaqYd1i/tR6mD/RGHOo1sf8qUDlTsVoHgsXLixVVFSUxo8f3+jne++9d+mUU05p9LPa2tpSv379SiNGjKhvW7FiRWmLLbYonXXWWaVFixaVOnbsWPrxj3/c6HhX+tYNp512WilJqbKysv7Vpk2bUseOHUuvv/56k+2JMH78+FLbtm1L//znP5v3gGgWxx57bOlDH/pQqVRa9d74uXPnlrp37176y1/+UqbqaC7vd95LpVJpxowZpSSl+++/vwzVQfmYP2H+xOoyh2p9zJ+ah5VSLdRGG22Uz33uc/nhD3+YpUuXrtHY9u3b5yMf+UiDcW3atMnIkSNz44035uabb0779u3zxS9+sanLpoksX748P/7xj3PppZc2uIo3e/bsbLbZZvnv//7vJvutysrKLF++PMuWLWuy76Q4/fr1e89/I/r27Zvhw4dn7NixBVdFc3u/856kfq+bf/7zn0WVBOsE86fWzfyJNWEO1fqYPzWPtuUugOZz1VVXZdCgQRkwYEDOPffc7LTTTmnTpk3++Mc/5qmnnkr//v3zy1/+Mrfccku+9KUvZZtttkmpVMovfvGL3HPPPbnhhhsafN/IkSPz7W9/O2eeeWYOO+yw//joW8rnl7/8ZV577bUce+yx6d69e4PPDj744Fx//fXZd9991+q7X3nlldTU1GT58uV5/PHHc8UVV+TTn/50unXr1hSl00xeeeWVHHLIITnmmGOy0047pWvXrnn00Ufz3e9+N//n//yf9xx3yimnZIcddsijjz6aAQMGFFgxTWF1z/uSJUtSU1OTUqmUF198Md/85jez8cYbZ/fddy9j9VAe5k+tl/kTjTGHan3MnwpW3oVaNLeXX365NHr06NKHP/zhUrt27UpdunQp7brrrqXvfe97paVLl5aee+650qhRo0rbbLNNqWPHjqUePXqUPvGJT5RuuOGGRr9vn332KSUpPfLII+/5m5afl98BBxxQ2n///Rv97A9/+EMpSWn27Nlrtfx85auysrK0+eabl0aNGlWaP39+Mx0JTeWtt94qnXHGGaWPf/zjpe7du5c6depU2nbbbUtnnXVW6c033yyVSo0vQy6V3nk8+n777VdwxTSF1T3v7/67vfHGG5f233//9/y3AVoD86fWyfyJxphDtT7mT8WqKJWa8PmmAAAAALAa7CkFAAAAQOGEUgAAAAAUTigFAAAAQOGEUgAAAAAUTigFAAAAQOGEUgAAAAAUTigFAAAAQOGEUgAAAAAUTigFtCoVFRX5+c9/Xu4yAADWG+ZPQHMRSgEtSk1NTf7rv/4rW265ZaqqqtK3b98ceOCBmTZtWrlLAwBYJ5k/AeXSttwFADSVOXPmZNCgQenRo0e+973vZccdd8zbb7+d++67LyeddFKeeuqpcpcIALBOMX8CyslKKaDFOPHEE1NRUZFHHnkkBx98cLbZZptsv/32GTNmTB5++OFGx5x++unZZptt0qlTp2y55ZY5++yz8/bbb9d/Pnv27Hz6059O165d061bt/Tv3z+PPvpokuSFF17IgQcemA022CCdO3fO9ttvn3vuuaeQYwUAaArmT0A5WSkFtAivvvpqpk6dmgsuuCCdO3de5fMePXo0Oq5r166ZPHlyNttsszz++OMZNWpUunbtmm9+85tJkiOOOCIf+9jHcvXVV6eysjKzZs1Ku3btkiQnnXRSli1blt/85jfp3Llz/u///b/p0qVLsx0jAEBTMn8Cyk0oBbQIzz77bEqlUrbbbrs1GnfWWWfV/3d1dXW+8Y1v5JZbbqmfVM2dOzennXZa/fduvfXW9f3nzp2bgw8+ODvuuGOSZMstt/yghwEAUBjzJ6Dc3L4HtAilUmmtxt16660ZNGhQNtlkk3Tp0iVnnXVW5s6dW//5mDFjctxxx2Xw4MG56KKL8txzz9V/dvLJJ+c73/lOBg0alHHjxuXPf/7zBz4OAICimD8B5SaUAlqErbfeOhUVFWu0GeeMGTNyxBFHZP/9988vf/nL/OlPf8q3vvWtLFu2rL7Pueeem7/85S8ZOnRoHnjggfTr1y933XVXkuS4447L3/72t3z5y1/O448/ngEDBuQHP/hBkx8bAEBzMH8Cyq2itLbxOMA6Zr/99svjjz+ep59+epV9EV5//fX06NEjFRUVueuuuzJs2LBceumlueqqqxpcvTvuuONy++235/XXX2/0Nw477LAsXbo0U6ZMWeWzsWPH5u6773bFDwBYb5g/AeVkpRTQYlx55ZVZsWJFdt1119xxxx155pln8uSTT+b73/9+Bg4cuEr/rbfeOnPnzs0tt9yS5557Lt///vfrr+IlyT//+c+MHj0606dPzwsvvJDf/e53+eMf/5iPfvSjSZKvfe1rue+++/L8889n5syZefDBB+s/AwBYH5g/AeVko3Ogxdhyyy0zc+bMXHDBBfn617+ef/zjH9l4443Tv3//XH311av0//znP59TTz01o0ePTm1tbYYOHZqzzz475557bpKksrIyr7zySkaMGJF58+alZ8+e+cIXvpDzzjsvSbJixYqcdNJJ+fvf/55u3bpl3333zeWXX17kIQMAfCDmT0A5uX0PAAAAgMK5fQ8AAACAwgmlAAAAACicUAoAAACAwgmlAAAAACicUAoAAACAwgmlAAAAACicUAoAAACAwgmlAAAAACicUAoAAACAwgmlAAAAACicUAoAAACAwgmlAAAAACjc/wPnlwQ0Fl7OfwAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1200x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot recall and precision\n",
"# Calculate the recall and precision\n",
"recall = cm.diagonal() / cm.sum(axis=1)\n",
"precision = cm.diagonal() / cm.sum(axis=0)\n",
"\n",
"# plot in a bar chart\n",
"fig, ax = plt.subplots(1, 2, figsize=(12, 6))\n",
"ax[0].bar(range(num_classes), recall)\n",
"ax[0].set_xticks(range(num_classes))\n",
"ax[0].set_xticklabels(['GSVT', 'AFIB', 'SR', 'SB'])\n",
"ax[0].set_xlabel('Class')\n",
"ax[0].set_ylabel('Recall')\n",
"ax[0].set_title('Recall')\n",
"\n",
"ax[1].bar(range(num_classes), precision)\n",
"ax[1].set_xticks(range(num_classes))\n",
"ax[1].set_xticklabels(['GSVT', 'AFIB', 'SR', 'SB'])\n",
"ax[1].set_xlabel('Class')\n",
"ax[1].set_ylabel('Precision')\n",
"ax[1].set_title('Precision')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
}
],
"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.12.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}