diff --git a/README.md b/README.md index 918270c..e78e002 100644 --- a/README.md +++ b/README.md @@ -152,11 +152,16 @@ The exact procedure for creating the matrix can be found in the notebook [demogr The following two hypotheses were applied in this project: -1. Using ECG data, a classifier can classify the four disease groupings with an accuracy of 80%. +**Hypotheses 1**: +1. Using ECG data, a classifier can classify the four diagnostic groupings with an accuracy of at least 80%. Result: - For the first hypothesis, an accuracy of 83 % was achieved with the XGBoost classifier. The detailed procedure can be found in the following notebook: [ml_xgboost.ipynb](notebooks/ml_xgboost.ipynb) +- Also a 82 % accuracy was achieved with a Gradient Boosting Tree Classifier. The detailed procedure can be found in the following notebook: [ml_grad_boost_tree.ipynb](notebooks/ml_grad_boost_tree.ipynb) +With those Classifiers, the hypothesis can be proven, that a classifier is able to classify the diagnostic Groups with a accuracy of at least 80%. + +**Hypotheses 2**: 2. Sinus bradycardia occurs significantly more frequently in the 60 to 70 age group than in other age groups. diff --git a/ml_models/best_gbt_model_20240611203442.joblib b/ml_models/best_gbt_model_20240611203442.joblib new file mode 100644 index 0000000..ff08a78 Binary files /dev/null and b/ml_models/best_gbt_model_20240611203442.joblib differ diff --git a/notebooks/ml_grad_boost_tree.ipynb b/notebooks/ml_grad_boost_tree.ipynb new file mode 100644 index 0000000..341b439 --- /dev/null +++ b/notebooks/ml_grad_boost_tree.ipynb @@ -0,0 +1,487 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gradient Boosting Tree (GBT) Training and Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "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", + "import xgboost as xgb\n", + "from sklearn.model_selection import GridSearchCV\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.ensemble import GradientBoostingClassifier\n", + "from sklearn.impute import SimpleImputer\n", + "from sklearn.metrics import accuracy_score\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Import Data from Database" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# connect to the database\n", + "conn = sqlite3.connect('../features.db')\n", + "c = conn.cursor()\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", + "# close the connection\n", + "conn.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Format Data for Machine Learning" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "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']\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']\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']\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", + "# 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", + "# 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", + "\n", + "\n", + "# use xgboost\n", + "dtrain = xgb.DMatrix(train_x, label=train_y)\n", + "dvalid = xgb.DMatrix(valid_x, label=valid_y)\n", + "dtest = xgb.DMatrix(test_x, label=test_y)\n", + "\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": 27, + "metadata": {}, + "outputs": [], + "source": [ + "param_grid = {\n", + " 'n_estimators': [100, 200, 300],\n", + " 'learning_rate': [0.1, 0.2, 0.3],\n", + " 'max_depth': [1, 3, 5],\n", + "}# 'random_stat': 42" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a XGBClassifier object\n", + "model = GradientBoostingClassifier()\n", + "\n", + "# Create the grid search object\n", + "grid_search = GridSearchCV(model, param_grid, cv=3, scoring='accuracy')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: total: 3min 28s\n", + "Wall time: 4min 16s\n" + ] + }, + { + "data": { + "text/html": [ + "
GridSearchCV(cv=3, estimator=GradientBoostingClassifier(),\n",
+       "             param_grid={'learning_rate': [0.1, 0.2, 0.3],\n",
+       "                         'max_depth': [1, 3, 5],\n",
+       "                         'n_estimators': [100, 200, 300]},\n",
+       "             scoring='accuracy')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "GridSearchCV(cv=3, estimator=GradientBoostingClassifier(),\n", + " param_grid={'learning_rate': [0.1, 0.2, 0.3],\n", + " 'max_depth': [1, 3, 5],\n", + " 'n_estimators': [100, 200, 300]},\n", + " scoring='accuracy')" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\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": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best parameters: {'learning_rate': 0.1, 'max_depth': 3, 'n_estimators': 100}\n", + "Best score: 0.796973125095374\n" + ] + } + ], + "source": [ + "# 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", + "#{'eta': 0.1, 'learning_rate': 0.1, 'max_depth': 5, 'min_child_weight': 3, 'n_estimators': 100}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Save Model" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['../ml_models/best_gbt_model_20240611203442.joblib']" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Save the best model\n", + "best_model = grid_search.best_estimator_\n", + "# timestamp\n", + "timestamp = datetime.now().strftime('%Y%m%d%H%M%S')\n", + "model_path = f'../ml_models/best_gbt_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": 37, + "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 'gbt' in model][0]\n", + "model_path = f'../ml_models/{model_path}'\n", + "# load the best model\n", + "best_model = load(model_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
GradientBoostingClassifier()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "GradientBoostingClassifier()" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# example training of a model with the best parameters\n", + "eval_result = {}\n", + "model = GradientBoostingClassifier(**grid_search.best_params_)\n", + "model.fit(train_x, train_y)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model Accuracy: 0.819634703196347\n" + ] + } + ], + "source": [ + "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": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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8OGKjIyUdLPSWK1aNZ08eVLh4eH217Vq1Uo2m00LFixwWtxp8rebb2GfRAAAkN7dLSG8k4ULF2revHmaP3++SpQooR07duj1119XRESE2rZt6+JIHaXpfRL/ufoZAADAVTzSxroV9enTR3379rUPG5cqVUq///67oqKi1LZtW4X9/4r3U6dOOVQST506pbJlyzo1ljS3T+Lly5f16aefavr06dq6dSuVRAAA4DauXr0qDw/HHQo9PT2VnJwsScqXL5/CwsK0evVqe1J46dIlbdq0SV26dHFqLGlm4cr69es1ffp0ff7554qIiFCLFi00cSKbBAMAANdLKz/L17RpUw0fPly5c+dWiRIl9Msvv+iDDz7QSy/dXNRms9n0+uuv65133lGhQoXsW+BERESoefPmTo3F0iQxJiZGs2bN0vTp03Xp0iW1atVKCQkJWrJkiYoXL25laAAAAKluwoQJGjBggF599VWdPn1aERER6ty5swYOHGi/580331RcXJw6deqkCxcuqHr16lqxYoXTt0qybHVz06ZNtX79ejVu3Fht2rRRgwYN5OnpqYwZM2rnzp0PlCSyutm9sLrZvbC62b2wutm9WLm6ufFHm13W99edH3VZ365kWSXx22+/Vffu3dWlSxcVKlTIqjAAAABwB5b9dvOGDRt0+fJllS9fXpUqVdLEiRN15swZq8IBAABuzObCf9Iry5LEypUra+rUqfrrr7/UuXNnffbZZ4qIiFBycrJWrlzJ9jcAACDVeNhcd6RXliWJt/j5+emll17Shg0btHv3bvXu3VvvvvuuQkJC9OSTT1odHgAAgFuyPEn8pyJFimjkyJH6888/9emnn1odDgAAcBM2m81lR3qVppLEWzw9PdW8eXMtXbrU6lAAAADcUprZTBsAAMAq6bjg5zJpspIIAAAAa1FJBAAAbs+DUqIJlUQAAACYUEkEAABuj0KiGUkiAABwe+l5qxpXYbgZAAAAJlQSAQCA26OQaEYlEQAAACZUEgEAgNtjCxwzKokAAAAwoZIIAADcHnVEMyqJAAAAMKGSCAAA3B77JJqRJAIAALfnQY5ownAzAAAATKgkAgAAt8dwsxmVRAAAAJhQSQQAAG6PQqIZlUQAAACYUEkEAABujzmJZveUJC5duvSeO3zyySfvOxgAAACkDfeUJDZv3vyeOrPZbEpKSnqQeAAA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Get the confusion matrix\n", + "cm = confusion_matrix(test_y, preds)\n", + "\n", + "# Create a new figure\n", + "plt.figure(figsize=(8, 6))\n", + "\n", + "labels = ['GSVT', 'AFIB', 'SR', 'SB']\n", + "# Plot the confusion matrix\n", + "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=labels, yticklabels=labels)\n", + "plt.xlabel('Predicted')\n", + "plt.ylabel('Actual')\n", + "plt.title('Confusion Matrix')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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5s2bTcn93//+1+H7JUuWKDMzU507d3bIW758eVWuXNkhb2717t3b/rWvr6+qVq0qLy8vde7c2T5etWpV+fr66sCBA1nWf/rppx32VD/77LMqVqyYVqxYIUn65ptvdPnyZb300ktycfnrT4g+ffrI29tby5cvd3g8d3d3RUZG5ji/u7u7/XEzMjJ0+vRplSxZUlWrVs323ycyMlJubm7275s3by5J9te2ZcsWHTx4UC+99FKWoweu7bk/c+aMvv32W3Xu3Fnnz5+3/3ucPn1abdu21d69e3Xs2DFJV7fpjh07tHfv3hy/JgAAOLwcAOAUGjVqlO1EatcKUOvWrbNdz9vb2/71mTNnNHLkSH388cc6ceKEw3LJycn5mPYv/zyEe+/evTIMQ5UrV852+b+X3tzw8PBQuXLlHMZ8fHx022232Qvm38ezO1f7n5lKliypChUq6NChQ5Kkw4cPS7pa3P/Ozc1NYWFh9vuvCQwMdCjF/yYzM1NvvfWWpk+froMHDyojI8N+X5kyZbIsf/vttzt87+fnJ0n217Z//35JN57lft++fTIMQ8OGDdOwYcOyXebEiRMKDAzUqFGj9Mgjj6hKlSqqUaOG7r//fj3xxBOqVatWjl8jAKDooXQDAJxaZmampKvndZcvXz7L/cWK/fWrrnPnzvr55581aNAg1alTRyVLllRmZqbuv/9+++PcyD/L6zV/L4f/9Pe969fy2mw2ffXVV3J1dc2yfMmSJf81R3aye6wbjRv///xyM/3ztf+bsWPHatiwYXryySc1evRolS5dWi4uLnrppZey/ffJj9d27XEHDhyotm3bZrtMeHi4JKlFixbav3+/PvvsM61atUrvvPOOJk+erJkzZzocZQAAwN9RugEATq1SpUqSJH9/f0VERFx3ubNnzyouLk4jR45UdHS0fTy7Q4WvV66v7Un950zd/9zD+295DcNQaGioqlSpkuP1boW9e/fqnnvusX+fmpqq48eP64EHHpAkBQcHS5J2796tsLAw+3KXL1/WwYMHb7j9/+5623fx4sW65557NGfOHIfxc+fO2Se0y41rPxvbt2+/brZrr6N48eI5yl+6dGlFRkYqMjJSqampatGihUaMGEHpBgBcF+d0AwCcWtu2beXt7a2xY8cqPT09y/3XZhy/tlf0n3tBY2Njs6xz7Vra/yzX3t7eKlu2rH74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283NTfXr11dcXJx9LDMzU3FxcWrSpEm269x9993at2+fMjMz7WN79uxRhQoV5Obmlu067u7u8vb2drgBAAAAAOBscn14eVRUlN5++2299957+v333/Xss88qLS3NPpt5jx49NHToUPvyzz77rM6cOaN+/fppz549Wr58ucaOHavnn38+/14FAAAAAAAFUK4vGdalSxedPHlS0dHRSkxMVJ06dbRy5Ur75GoJCQlycfmrywcFBenrr79W//79VatWLQUGBqpfv34aPHhw/r0KAAAAAAAKIJthGIbVIf5NSkqKfHx8lJycXCgONQ8ZstzqCAXKoXEPWh0BAAAAAHIlpz3V9NnLAQAAAAAoqijdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJiE0g0AAAAAgEko3QAAAAAAmITSDQAAAACASSjdAAAAAACYhNINAAAAAIBJKN0AAAAAAJgkT6V72rRpCgkJkYeHhxo3bqwNGzZcd9l58+bJZrM53Dw8PPIcGAAAAAAAZ5Hr0r1w4UJFRUVp+PDh2rx5s2rXrq22bdvqxIkT113H29tbx48ft98OHz58U6EBAAAAAHAGuS7dkyZNUp8+fRQZGanq1atr5syZ8vT01Ny5c6+7js1mU/ny5e23gICAmwoNAAAAAIAzyFXpvnz5sjZt2qSIiIi/HsDFRREREVq3bt1110tNTVVwcLCCgoL0yCOPaMeOHXlPDAAAAACAk8hV6T516pQyMjKy7KkOCAhQYmJitutUrVpVc+fO1WeffaYPPvhAmZmZatq0qY4e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ihUrsj26ADeWmpqq/v37a/78+bpy5Yqkq39T9ezZU5MnT5aXl5f9Z7VOnTrWBS0CKN1FyAcffKArV66oV69e2rRpk+6//36dOXNGbm5umjdvnv1NDigI0tLS7B8EVapUibINwI7SDau5uLhkmUjNMAwFBQXp448/VpMmTSxK5rxCQ0O1YMECNW3aVKtXr1bnzp21cOFCLVq0SAkJCVq1apXVEZ1WamqqDhw4IOnqqVElS5a0OFHRQ+kuwi5cuKBdu3bp9ttvV9myZa2OAwAF3pQpU/T000/Lw8NDU6ZMueGyffv2vUWpih5KN6z2/fffO3zv4uKicuXKKTw8XMWKMWVSXpQoUUJ79uxRUFCQ+vXrp4sXL2rWrFnas2ePGjdurLNnz1odEcgzSjcAADkUGhqqjRs3qkyZMgoNDb3ucjabzb5XAfmP0g0UPhUrVtTixYvVtGlTVa1aVWPGjFGnTp20e/duNWzYMMsh/YAz4aO4Qi4qKirHy06aNMnEJADg/A4ePJjt17i1mjdvrhIlSlgdA0XM559/nuNl27dvb2KSwqljx47q1q2bKleurNOnT6tdu3aSpC1btig8PNzidMDNoXQXclu2bMnRcv88LwkAcGOjRo3SwIED5enp6TD+559/asKECYqOjrYomfNydXXV8ePH7VfauOb06dPy9/dXRkaGJGnFihVWxEMRd22252tsNpvDTPp//1vq2s8qcm7y5MkKDQ1VQkKCxo8fbz/v+Pjx43ruuecsTgfcHA4vBwAgD3JaEJFzLi4uSkxMzLJN//jjD1WqVEl//vmnRckAR998840GDx6ssWPH2idNW7dunV577TWNHTtW9913n8UJnUt6erqeeeYZDRs27Ian7gDOij3dAADkgWEY2R4lFB8fr9KlS1uQyHldm5TOZrPpnXfecZhZNyMjQz/88IOqVatmVTwgi5deekkzZ85Us2bN7GNt27aVp6ennn76af3+++8WpnM+xYsX16effqphw4ZZHQUwBaW7CLnnnntueBj5t99+ewvTAIBz8vPzk81mk81mU5UqVbIcUpqamqr//ve/FiZ0PpMnT5Z09YOMmTNnytXV1X6fm5ubQkJCNHPmTKviAVns379fvr6+WcZ9fHx06NChW56nMOjQoYOWLVum/v37Wx0FyHeU7iLknxe9T09P19atW7V9+3b17NnTmlAA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", + "text/plain": [ + "
" + ] + }, + "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": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIJElEQVR4nO3de5iVVd038O8wwIAgoOGAIjWZpwhPQRLioQOJSvRSpuQhFJXywJMxZYopaKZoecBKpVTEyh5J0x4KwwzjKRMjNUh7hTwhpoHgARRzkJn9/tHr1MRIiMO9gfl8rmtfl3vda+39u7mD1vXd6153RalUKgUAAAAACtSm3AUAAAAA0PoIpQAAAAAonFAKAAAAgMIJpQAAAAAonFAKAAAAgMIJpQAAAAAonFAKAAAAgMIJpQAAAAAonFAKAAAAgMIJpQBaUEVFRc4777zG91OnTk1FRUUWLVpUtpoAADaW448/PjU1NW9pzOzZs1NRUZHZs2dvlJqAzYdQCtisvBHyvPFq27ZtevXqleOPPz7PPPNMucsDANjo/n0+1KFDh+y6664ZM2ZMli5dWu7yANZb23IXALAhvva1r+Xd7353Xnvttdx3332ZOnVq7rnnnjz88MPp0KFDucsDANjo/nU+dM899+Saa67JHXfckYcffjhbbbVVITVce+21aWhoeEtjDjzwwPz9739P+/btN1JVwOZCKAVslg499ND0798/SXLSSSele/fuueSSSzJ9+vQceeSRZa4OAGDj+/f50Dve8Y5cfvnl+Z//+Z8cddRRa/VftWpVOnXq1KI1tGvX7i2PadOmjR8RgSRu3wO2EAcccECS5PHHH29sW7BgQT796U9n2223TYcOHdK/f/9Mnz59rbEvvfRSxo4dm5qamlRVVWXHHXfMyJEjs3z58iTJ6tWrM378+PTr1y9du3ZNp06dcsABB+TXv/51MScHALAePvKRjyRJnnzyyRx//PHp3LlzHn/88Rx22GHZeuutc8wxxyRJGhoaMmnSpLzvfe9Lhw4d0qNHj3z+85/Piy++uNZn/uIXv8hBBx2UrbfeOl26dMkHPvCB/OhHP2o83tyeUjfffHP69evXOGaPPfbIlVde2Xj8zfaUuuWWW9KvX7907Ngx3bt3z7HHHrvW9gxvnNczzzyT4cOHp3Pnztluu+3y5S9/OfX19W/njw8oA6EUsEV4YyPxbbbZJkny5z//OR/84AfzyCOP5Kyzzspll12WTp06Zfjw4bn99tsbx73yyis54IAD8u1vfzsHH3xwrrzyypx88slZsGBB/vrXvyZJVq5cmeuuuy4f+tCHcskll+S8887LsmXLMmTIkMybN6/oUwUAaNYbP8694x3vSJKsWbMmQ4YMSXV1dS699NIcfvjhSZLPf/7zOeOMMzJo0KBceeWVGTVqVG666aYMGTIkr7/+euPnTZ06NUOHDs0LL7yQcePG5eKLL87ee++dmTNnvmkNd911V4466qhss802ueSSS3LxxRfnQx/6UH73u9+ts/apU6fmyCOPTGVlZSZOnJjRo0fntttuy/7775+XXnqpSd/6+voMGTIk73jHO3LppZfmoIMOymWXXZbvfe97G/LHBpSR2/eAzdKKFSuyfPnyvPbaa/n973+f888/P1VVVfn4xz+eJDn99NPzzne+M3/4wx9SVVWVJDn11FOz//7758wzz8wnP/nJJMk3v/nNPPzww7ntttsa25LknHPOSalUSvKPoGvRokVN9j0YPXp0dt9993z729/O9ddfX9RpAwA0+tf50O9+97t87WtfS8eOHfPxj388c+bMSV1dXY444ohMnDixccw999yT6667LjfddFOOPvroxvYPf/jDOeSQQ3LLLbfk6KOPzooVK/KFL3wh++67b2bPnt3kdrs35kjNmTFjRrp06ZI777wzlZWV63Uer7/+es4888z07ds3v/nNbxq/a//998/HP/7xXHHFFTn//PMb+7/22msZMWJEzj333CTJySefnPe///25/vrrc8opp6zfHx6wSbBSCtgsDR48ONttt1169+6dT3/60+nUqVOmT5+eHXfcMS+88ELuvvvuHHnkkXn55ZezfPnyLF++PM8//3yGDBmSRx99tHEp+E9+8pPstddeTQKpN1RUVCRJKisrGwOphoaGvPDCC1mzZk369++fBx98sLiTBgD4F/86H/rMZz6Tzp075/bbb0+vXr0a+/x7SHPLLbeka9eu+djHPtY4R1q+fHn69euXzp07N25PcNddd+Xll1/OWWedtdb+T2/MkZrTrVu3rFq1Knfdddd6n8f999+f5557LqeeemqT7xo6dGh23333zJgxY60xJ598cpP3BxxwQJ544on1/k5g02ClFLBZuuqqq7LrrrtmxYoVmTJlSn7zm980roh67LHHUiqVcu655zb+gvbvnnvuufTq1SuPP/5441L2dbnxxhtz2WWXZcGCBU2Wtb/73e9umRMCAHiL3pgPtW3bNj169Mhuu+2WNm3+ue6gbdu22XHHHZuMefTRR7NixYpUV1c3+5nPPfdckn/eCti3b9+3VNOpp56aH//4xzn00EPTq1evHHzwwTnyyCNzyCGHvOmYp556Kkmy2267rXVs9913zz333NOkrUOHDtluu+2atG2zzTbN7okFbNqEUsBmad9992182szw4cOz//775+ijj87ChQsbH0v85S9/OUOGDGl2/M4777ze3/XDH/4wxx9/fIYPH54zzjgj1dXVjfsd/OvG6gAARfrX+VBzqqqqmoRUyT9WfVdXV+emm25qdsy/hz1vVXV1debNm5c777wzv/jFL/KLX/wiN9xwQ0aOHJkbb7zxbX32G9b3tkBg0yeUAjZ7bwREH/7wh/Od73wnJ5xwQpJ/PKJ48ODB6xz7nve8Jw8//PA6+9x6663ZaaedcttttzVZrj5hwoS3XzwAQIHe85735Fe/+lUGDRqUjh07rrNfkjz88MNv6ce8JGnfvn2GDRuWYcOGpaGhIaeeemq++93v5txzz232s971rnclSRYuXNj4BME3LFy4sPE4sOWxpxSwRfjQhz6UfffdN5MmTUqXLl3yoQ99KN/97nfzt7/9ba2+y5Yta/zvww8/PPPnz2/yRL43vLGJ5xu/xv3rpp6///3vM2fOnJY+DQCAjerII49MfX19LrjggrWOrVmzpvFJdwcffHC23nrrTJw4Ma+99lqTfuva6Pz5559v8r5NmzbZc889kyR1dXXNjunfv3+qq6szefLkJn1+8Ytf5JFHHsnQoUPX69yAzY+VUsAW44wzzsgRRxyRqVOn5qqrrsr++++fPfbYI6NHj85OO+2UpUuXZs6cOfnrX/+a+fPnN4659dZbc8QRR+SEE05Iv3798sILL2T69OmZPHly9tprr3z84x9vfDrf0KFD8+STT2by5Mnp06dPXnnllTKfNQDA+jvooIPy+c9/PhMnTsy8efNy8MEHp127dnn00Udzyy235Morr8ynP/3pdOnSJVdccUVOOumkfOADH8jRRx+dbbbZJvPnz8+rr776prfinXTSSXnhhRfykY98JDvuuGOeeuqpfPvb387ee++d9773vc2OadeuXS655JKMGjUqBx10UI466qgsXbo0V155ZWpqajJ27NiN+UcClJFQCthifOpTn8p73vOeXHrppRk9enTuv//+nH/++Zk6dWqef/75VFdXZ5999sn48eMbx3Tu3Dm//e1vM2HChNx+++258cYbU11dnY9+9KONG4Mef/zxWbJkSb773e/mzjvvTJ8+ffLDH/4wt9xyS2bPnl2mswUA2DCTJ09Ov3798t3vfjdnn3122rZtm5qamhx77LEZNGhQY78TTzwx1dXVufjii3PBBRekXbt22X333dcZEh177LH53ve+l6uvvjovvfRSevbsmREjRuS8885ba3+rf3X88cdnq622ysUXX5wzzzwznTp1yic/+clccskl6datW0uePrAJqSita+0lAAAAAGwE9pQCAAAAoHBCKQAAAAAKJ5QCAAAAoHBCKQAAAAAKJ5QCAAAAoHBCKQAAAAAK17bcBRStoaEhzz77bLbeeutUVFSUuxwAYBNXKpXy8ssvZ4cddkibNq339zxzKABgfa3v/KnVhVLPPvtsevfuXe4yAIDNzNNPP50dd9yx3GWUjTkUAPBW/af5U6sLpbbeeusk//iD6dKlS5mrAQA2dStXrkzv3r0b5xCtlTkUALC+1nf+1OpCqTeWm3fp0sWECgBYb639ljVzKADgrfpP86fWuzECAAAAAGUjlAIAAACgcEIpAIDNzG9+85sMGzYsO+ywQyoqKvLTn/70P46ZPXt23v/+96eqqio777xzpk6dutHrBABYF6EUAMBmZtWqVdlrr71y1VVXrVf/J598MkOHDs2HP/zhzJs3L1/84hdz0kkn5c4779zIlQIAvLlWt9E5AMDm7tBDD82hhx663v0nT56cd7/73bnsssuSJO9973tzzz335IorrsiQIUM2VpkAAOtkpRQAwBZuzpw5GTx4cJO2IUOGZM6cOWWqCADASikAgC3ekiVL0qNHjyZtPXr0yMqVK/P3v/89HTt2XGtMXV1d6urqGt+vXLlyo9cJALQuVkoBALCWiRMnpmvXro2v3r17l7skAGALI5QCANjC9ezZM0uXLm3StnTp0nTp0qXZVVJJMm7cuKxYsaLx9fTTTxdRKgDQirh9DwBgCzdw4MDccccdTdruuuuuDBw48E3HVFVVpaqqamOXBgC0YlZKAQBsZl555ZXMmzcv8+bNS5I8+eSTmTdvXhYvXpzkH6ucRo4c2dj/5JNPzhNPPJGvfOUrWbBgQa6++ur8+Mc/ztixY8tRPgBAEqEUAMBm5/77788+++yTffbZJ0lSW1ubffbZJ+PHj0+S/O1vf2sMqJLk3e9+d2bMmJG77rore+21Vy677LJcd911GTJkSFnqBwBIkopSqVQqdxFFWrlyZbp27ZoVK1akS5cu5S4HANjEmTv8gz8HAGB9re+8wUopAAAAAAonlAIAAACgcEIpAAAAAAonlAIAAACgcEIpAAAAAAonlAIAAACgcEIpAAAAAAonlAIAAACgcG3LXQAAbG5qzppR7hL4N4suHlruEgCAdTB/2vRsCvMnK6UAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKJxQCgAAAIDCCaUAAAAAKFzbchcAsDmrOWtGuUvg3yy6eGi5SwAAANaDlVIAAAAAFE4oBQAAAEDhhFIAAAAAFE4oBQAAAEDhhFIAAAAAFE4oBQAAAEDhhFIAAAAAFE4oBQAAAEDhhFIAAAAAFE4oBQAAAEDhhFIAAAAAFE4oBQAAAEDhyh5KXXXVVampqUmHDh0yYMCAzJ07d539J02alN122y0dO3ZM7969M3bs2Lz22msFVQsAAABASyhrKDVt2rTU1tZmwoQJefDBB7PXXntlyJAhee6555rt/6Mf/ShnnXVWJkyYkEceeSTXX399pk2blrPPPrvgygEAAAB4O8oaSl1++eUZPXp0Ro0alT59+mTy5MnZaqutMmXKlGb733vvvRk0aFCOPvro1NTU5OCDD85RRx31H1dXAQAAALBpaVuuL169enUeeOCBjBs3rrGtTZs2GTx4cObMmdPsmP322y8//OEPM3fu3Oy777554okncscdd+Szn/1sUWWvl5qzZpS7BP7NoouHlrsEAAAA4F+ULZRavnx56uvr06NHjybtPXr0yIIFC5odc/TRR2f58uXZf//9UyqVsmbNmpx88snrvH2vrq4udXV1je9XrlzZMicAAAAAwAYr+0bnb8Xs2bNz0UUX5eqrr86DDz6Y2267LTNmzMgFF1zwpmMmTpyYrl27Nr569+5dYMUAAAAANKdsK6W6d++eysrKLF26tEn70qVL07Nnz2bHnHvuufnsZz+bk046KUmyxx57ZNWqVfnc5z6Xr371q2nTZu2Mbdy4camtrW18v3LlSsEUAAAAQJmVbaVU+/bt069fv8yaNauxraGhIbNmzcrAgQObHfPqq6+uFTxVVlYmSUqlUrNjqqqq0qVLlyYvAAAAAMqrbCulkqS2tjbHHXdc+vfvn3333TeTJk3KqlWrMmrUqCTJyJEj06tXr0ycODFJMmzYsFx++eXZZ599MmDAgDz22GM599xzM2zYsMZwCgAAAIBNX1lDqREjRmTZsmUZP358lixZkr333jszZ85s3Px88eLFTVZGnXPOOamoqMg555yTZ555Jtttt12GDRuWCy+8sFynAAAAAMAGKGsolSRjxozJmDFjmj02e/bsJu/btm2bCRMmZMKECQVUBgAAAMDGslk9fQ8AAACALUPZV0oBAADQetScNaPcJfBvFl08tNwl0EpZKQUAAABA4YRSAAAAABROKAUAsBm66qqrUlNTkw4dOmTAgAGZO3fuOvtPmjQpu+22Wzp27JjevXtn7Nixee211wqqFgBgbUIpAIDNzLRp01JbW5sJEybkwQcfzF577ZUhQ4bkueeea7b/j370o5x11lmZMGFCHnnkkVx//fWZNm1azj777IIrBwD4JxudAwBsZi6//PKMHj06o0aNSpJMnjw5M2bMyJQpU3LWWWet1f/ee+/NoEGDcvTRRydJampqctRRR+X3v/99oXX/JzY/3rTY+BiAjc1KKQCAzcjq1avzwAMPZPDgwY1tbdq0yeDBgzNnzpxmx+y333554IEHGm/xe+KJJ3LHHXfksMMOK6RmAIDmWCkFALAZWb58eerr69OjR48m7T169MiCBQuaHXP00Udn+fLl2X///VMqlbJmzZqcfPLJ67x9r66uLnV1dY3vV65c2TInAADw/1kpBQCwhZs9e3YuuuiiXH311XnwwQdz2223ZcaMGbngggvedMzEiRPTtWvXxlfv3r0LrBgAaA2slAIA2Ix07949lZWVWbp0aZP2pUuXpmfPns2OOffcc/PZz342J510UpJkjz32yKpVq/K5z30uX/3qV9Omzdq/U44bNy61tbWN71euXCmYAgBalJVSAACbkfbt26dfv36ZNWtWY1tDQ0NmzZqVgQMHNjvm1VdfXSt4qqysTJKUSqVmx1RVVaVLly5NXgAALclKKQCAzUxtbW2OO+649O/fP/vuu28mTZqUVatWNT6Nb+TIkenVq1cmTpyYJBk2bFguv/zy7LPPPhkwYEAee+yxnHvuuRk2bFhjOAUAUDShFADAZmbEiBFZtmxZxo8fnyVLlmTvvffOzJkzGzc/X7x4cZOVUeecc04qKipyzjnn5Jlnnsl2222XYcOG5cILLyzXKQAACKUAADZHY8aMyZgxY5o9Nnv27Cbv27ZtmwkTJmTChAkFVAYAsH7sKQUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4dqWuwDYUtScNaPcJfBvFl08tNwlAAAA8CaslAIAAACgcEIpAAAAAAonlAIAAACgcEIpAAAAAAonlAIAAACgcEIpAAAAAAonlAIAAACgcEIpAAAAAAonlAIAAACgcGUPpa666qrU1NSkQ4cOGTBgQObOnbvO/i+99FJOO+20bL/99qmqqsquu+6aO+64o6BqAQAAAGgJbcv55dOmTUttbW0mT56cAQMGZNKkSRkyZEgWLlyY6urqtfqvXr06H/vYx1JdXZ1bb701vXr1ylNPPZVu3boVXzwAAAAAG6ysodTll1+e0aNHZ9SoUUmSyZMnZ8aMGZkyZUrOOuustfpPmTIlL7zwQu699960a9cuSVJTU1NkyQAAAAC0gLLdvrd69eo88MADGTx48D+LadMmgwcPzpw5c5odM3369AwcODCnnXZaevTokb59++aiiy5KfX19UWUDAAAA0ALKtlJq+fLlqa+vT48ePZq09+jRIwsWLGh2zBNPPJG77747xxxzTO6444489thjOfXUU/P6669nwoQJzY6pq6tLXV1d4/uVK1e23EkAAAAAsEHKvtH5W9HQ0JDq6up873vfS79+/TJixIh89atfzeTJk990zMSJE9O1a9fGV+/evQusGAAAAIDmlC2U6t69eyorK7N06dIm7UuXLk3Pnj2bHbP99ttn1113TWVlZWPbe9/73ixZsiSrV69udsy4ceOyYsWKxtfTTz/dcicBAAAAwAYpWyjVvn379OvXL7NmzWpsa2hoyKxZszJw4MBmxwwaNCiPPfZYGhoaGtv+8pe/ZPvtt0/79u2bHVNVVZUuXbo0eQEAAABQXmW9fa+2tjbXXnttbrzxxjzyyCM55ZRTsmrVqsan8Y0cOTLjxo1r7H/KKafkhRdeyOmnn56//OUvmTFjRi666KKcdtpp5ToFAAAAADZA2TY6T5IRI0Zk2bJlGT9+fJYsWZK99947M2fObNz8fPHixWnT5p+5We/evXPnnXdm7Nix2XPPPdOrV6+cfvrpOfPMM8t1CgAAwNtQc9aMcpfAv1h08dBylwC0ImUNpZJkzJgxGTNmTLPHZs+evVbbwIEDc999923kqgAAAADYmDarp+8BAPAPV111VWpqatKhQ4cMGDAgc+fOXWf/l156Kaeddlq23377VFVVZdddd80dd9xRULUAAGsr+0opAADemmnTpqW2tjaTJ0/OgAEDMmnSpAwZMiQLFy5MdXX1Wv1Xr16dj33sY6murs6tt96aXr165amnnkq3bt2KLx4A4P8TSgEAbGYuv/zyjB49uvHhMJMnT86MGTMyZcqUnHXWWWv1nzJlSl544YXce++9adeuXZKkpqamyJIBANbi9j0AgM3I6tWr88ADD2Tw4MGNbW3atMngwYMzZ86cZsdMnz49AwcOzGmnnZYePXqkb9++ueiii1JfX19U2QAAa7FSCgBgM7J8+fLU19c3Pq34DT169MiCBQuaHfPEE0/k7rvvzjHHHJM77rgjjz32WE499dS8/vrrmTBhQrNj6urqUldX1/h+5cqVLXcSAACxUgoAYIvX0NCQ6urqfO9730u/fv0yYsSIfPWrX83kyZPfdMzEiRPTtWvXxlfv3r0LrBgAaA2EUgAAm5Hu3bunsrIyS5cubdK+dOnS9OzZs9kx22+/fXbddddUVlY2tr33ve/NkiVLsnr16mbHjBs3LitWrGh8Pf300y13EgAAEUoBAGxW2rdvn379+mXWrFmNbQ0NDZk1a1YGDhzY7JhBgwblscceS0NDQ2PbX/7yl2y//fZp3759s2OqqqrSpUuXJi8AgJYklAIA2MzU1tbm2muvzY033phHHnkkp5xySlatWtX4NL6RI0dm3Lhxjf1POeWUvPDCCzn99NPzl7/8JTNmzMhFF12U0047rVynAABgo3MAgM3NiBEjsmzZsowfPz5LlizJ3nvvnZkzZzZufr548eK0afPP3x579+6dO++8M2PHjs2ee+6ZXr165fTTT8+ZZ55ZrlMAABBKAQBsjsaMGZMxY8Y0e2z27NlrtQ0cODD33XffRq4KAGD9uX0PAAAAgMIJpQAAAAAonFAKAAAAgMIJpQAAAAAonFAKAAAAgMIJpQAAAAAonFAKAAAAgMIJpQAAAAAonFAKAAAAgMIJpQAAAAAonFAKAAAAgMK1LXcBAACtRX19faZOnZpZs2blueeeS0NDQ5Pjd999d5kqAwAonlAKAKAgp59+eqZOnZqhQ4emb9++qaioKHdJAABlI5QCACjIzTffnB//+Mc57LDDyl0KAEDZ2VMKAKAg7du3z84771zuMgAANglCKQCAgnzpS1/KlVdemVKpVO5SAADKzu17AAAFueeee/LrX/86v/jFL/K+970v7dq1a3L8tttuK1NlAADFE0oBABSkW7du+eQnP1nuMgAANglCKQCAgtxwww3lLgEAYJMhlAIAKNiyZcuycOHCJMluu+2W7bbbrswVAQAUz0bnAAAFWbVqVU444YRsv/32OfDAA3PggQdmhx12yIknnphXX3213OUBABRqvVdK/elPf1rvD91zzz03qBgAgC1ZbW1t/vd//zc/+9nPMmjQoCT/2Pz8C1/4Qr70pS/lmmuuKXOFAADFWe9Qau+9905FRcWbPsL4jWMVFRWpr69vsQIBALYUP/nJT3LrrbfmQx/6UGPbYYcdlo4dO+bII48USgEArcp6h1JPPvnkxqwDAGCL9+qrr6ZHjx5rtVdXV7t9DwBoddY7lHrXu961MesAANjiDRw4MBMmTMj3v//9dOjQIUny97//Peeff34GDhxY5uoAAIq13qHU9OnT1/tDP/GJT2xQMQAAW7Irr7wyQ4YMyY477pi99torSTJ//vx06NAhd955Z5mrAwAo1nqHUsOHD1+vfvaUAgBoXt++ffPoo4/mpptuyoIFC5IkRx11VI455ph07NixzNUBABRrvUOphoaGjVkHAECrsNVWW2X06NHlLgMAoOzWO5QCAOCtmz59eg499NC0a9fuP26HYAsEAKA12eBQatWqVfnf//3fLF68OKtXr25y7Atf+MLbLgwAYEswfPjwLFmyJNXV1evcDsEWCABAa7NBodQf//jHHHbYYXn11VezatWqbLvttlm+fHm22mqrVFdXC6UAAP6/f90CwXYIAAD/1GZDBo0dOzbDhg3Liy++mI4dO+a+++7LU089lX79+uXSSy9t6RoBALZYL730UrlLAAAoiw0KpebNm5cvfelLadOmTSorK1NXV5fevXvnG9/4Rs4+++yWrhEAYItwySWXZNq0aY3vjzjiiGy77bbp1atX5s+fX8bKAACKt0GhVLt27dKmzT+GVldXZ/HixUmSrl275umnn2656gAAtiCTJ09O7969kyR33XVXfvWrX2XmzJk59NBDc8YZZ5S5OgCAYm3QnlL77LNP/vCHP2SXXXbJQQcdlPHjx2f58uX5wQ9+kL59+7Z0jQAAW4QlS5Y0hlI///nPc+SRR+bggw9OTU1NBgwYUObqAACKtUErpS666KJsv/32SZILL7ww22yzTU455ZQsW7Ys3/3ud1u0QACALcU222zTuKp85syZGTx4cJKkVCp58h4A0Ops0Eqp/v37N/53dXV1Zs6c2WIFAQBsqT71qU/l6KOPzi677JLnn38+hx56aJJ/PNl45513LnN1AADF2qBQ6sknn8yaNWuyyy67NGl/9NFH065du9TU1LREbQAAW5QrrrgiNTU1efrpp/ONb3wjnTt3TpL87W9/y6mnnlrm6gAAirVBodTxxx+fE044Ya1Q6ve//32uu+66zJ49uyVqAwDYorRr1y5f/vKX12ofO3ZsGaoBACivDQql/vjHP2bQoEFrtX/wgx/MmDFj3nZRAABbiunTp+fQQw9Nu3btMn369HX2/cQnPlFQVQAA5bdBoVRFRUVefvnltdpXrFhhk04AgH8xfPjwLFmyJNXV1Rk+fPib9quoqDCPAgBalQ16+t6BBx6YiRMnNpk41dfXZ+LEidl///1brDgAgM1dQ0NDqqurG//7zV4CKQCgtdmglVKXXHJJDjzwwOy222454IADkiS//e1vs3Llytx9990tWiAAAAAAW54NWinVp0+f/OlPf8qRRx6Z5557Li+//HJGjhyZBQsWpG/fvi1dIwDAFuELX/hCvvWtb63V/p3vfCdf/OIXiy8IAKCMNmilVJLssMMOueiii1qyFgCALdpPfvKTZjc732+//XLxxRdn0qRJxRcFAFAmG7RSKvnH7XrHHnts9ttvvzzzzDNJkh/84Ae55557Wqw4AIAtyfPPP5+uXbuu1d6lS5csX768DBUBAJTPBoVSP/nJTzJkyJB07NgxDz74YOrq6pL84+l7Vk8BADRv5513zsyZM9dq/8UvfpGddtqpDBUBAJTPBt2+9/Wvfz2TJ0/OyJEjc/PNNze2Dxo0KF//+tdbrDgAgC1JbW1txowZk2XLluUjH/lIkmTWrFm57LLL3LoHALQ6GxRKLVy4MAceeOBa7V27ds1LL730dmsCANginXDCCamrq8uFF16YCy64IElSU1OTa665JiNHjixzdQAAxdqgUKpnz5557LHHUlNT06T9nnvusfQcAGAdTjnllJxyyilZtmxZOnbsmM6dO5e7JACAstigPaVGjx6d008/Pb///e9TUVGRZ599NjfddFO+9KUv5ZRTTmnpGgEAthhr1qzJr371q9x2220plUpJkmeffTavvPJKmSsDACjWBq2UOuuss9LQ0JCPfvSjefXVV3PggQemqqoqZ5xxRk466aSWrhEAYIvw1FNP5ZBDDsnixYtTV1eXj33sY9l6661zySWXpK6uLpMnTy53iQAAhdmglVIVFRX56le/mhdeeCEPP/xw7rvvvixbtixdu3bNu9/97pauEQBgi3D66aenf//+efHFF9OxY8fG9k9+8pOZNWtWGSsDACjeW1opVVdXl/POOy933XVX48qo4cOH54YbbsgnP/nJVFZWZuzYsRurVgCAzdpvf/vb3HvvvWnfvn2T9pqamjzzzDNlqgoAoDzeUig1fvz4fPe7383gwYNz77335ogjjsioUaNy33335bLLLssRRxyRysrKjVUrAMBmraGhIfX19Wu1//Wvf83WW29dhooAAMrnLd2+d8stt+T73/9+br311vzyl79MfX191qxZk/nz5+czn/mMQAoAYB0OPvjgTJo0qfF9RUVFXnnllUyYMCGHHXZY+QoDACiDt7RS6q9//Wv69euXJOnbt2+qqqoyduzYVFRUbJTiAAC2JJdeemkOOeSQ9OnTJ6+99lqOPvroPProo+nevXv++7//u9zlAQAU6i2FUvX19U32QGjbtm06d+7c4kUBAGyJevfunfnz52fatGmZP39+XnnllZx44ok55phjmmx8DgDQGrylUKpUKuX4449PVVVVkuS1117LySefnE6dOjXpd9ttt7VchQAAW4DXX389u+++e37+85/nmGOOyTHHHFPukgAAyuothVLHHXdck/fHHntsixYDALClateuXV577bVylwEAsMl4S6HUDTfcsLHqAADY4p122mm55JJLct1116Vt27c0DQMA2OKYDQEAFOQPf/hDZs2alV/+8pfZY489bIEAALRqQikAgIJ069Ythx9+eLnLAADYJAilAAA2soaGhnzzm9/MX/7yl6xevTof+chHct5553niHgDQqrUpdwEAAFu6Cy+8MGeffXY6d+6cXr165Vvf+lZOO+20cpcFAFBWQikAgI3s+9//fq6++urceeed+elPf5qf/exnuemmm9LQ0FDu0gAAykYoBQCwkS1evDiHHXZY4/vBgwenoqIizz77bBmrAgAoL6EUAMBGtmbNmnTo0KFJW7t27fL666+XqSIAgPKz0TkAwEZWKpVy/PHHp6qqqrHttddey8knn5xOnTo1tt12223lKA8AoCyEUgAAG9lxxx23Vtuxxx5bhkoAADYdQikAgI3shhtuKHcJAACbHHtKAQAAAFA4oRQAAAAAhRNKAQAAAFA4oRQAAAAAhRNKAQAAAFA4oRQAAAAAhRNKAQAAAFA4oRQAAAAAhRNKAQAAAFA4oRQAAAAAhdskQqmrrroqNTU16dChQwYMGJC5c+eu17ibb745FRUVGT58+MYtEAAAAIAWVfZQatq0aamtrc2ECRPy4IMPZq+99sqQIUPy3HPPrXPcokWL8uUvfzkHHHBAQZUCAAAA0FLKHkpdfvnlGT16dEaNGpU+ffpk8uTJ2WqrrTJlypQ3HVNfX59jjjkm559/fnbaaacCqwUAAACgJZQ1lFq9enUeeOCBDB48uLGtTZs2GTx4cObMmfOm4772ta+luro6J5544n/8jrq6uqxcubLJCwAAAIDyKmsotXz58tTX16dHjx5N2nv06JElS5Y0O+aee+7J9ddfn2uvvXa9vmPixInp2rVr46t3795vu24AAAAA3p6y3773Vrz88sv57Gc/m2uvvTbdu3dfrzHjxo3LihUrGl9PP/30Rq4SAAAAgP+kbTm/vHv37qmsrMzSpUubtC9dujQ9e/Zcq//jjz+eRYsWZdiwYY1tDQ0NSZK2bdtm4cKFec973tNkTFVVVaqqqjZC9QAAAABsqLKulGrfvn369euXWbNmNbY1NDRk1qxZGThw4Fr9d9999zz00EOZN29e4+sTn/hEPvzhD2fevHluzQMAWo2rrroqNTU16dChQwYMGJC5c+eu17ibb745FRUVGT58+MYtEADgPyjrSqkkqa2tzXHHHZf+/ftn3333zaRJk7Jq1aqMGjUqSTJy5Mj06tUrEydOTIcOHdK3b98m47t165Yka7UDAGyppk2bltra2kyePDkDBgzIpEmTMmTIkCxcuDDV1dVvOm7RokX58pe/nAMOOKDAagEAmlf2PaVGjBiRSy+9NOPHj8/ee++defPmZebMmY2bny9evDh/+9vfylwlAMCm4/LLL8/o0aMzatSo9OnTJ5MnT85WW22VKVOmvOmY+vr6HHPMMTn//POz0047FVgtAEDzyr5SKknGjBmTMWPGNHts9uzZ6xw7derUli8IAGATtXr16jzwwAMZN25cY1ubNm0yePDgzJkz503Hfe1rX0t1dXVOPPHE/Pa3vy2iVACAddokQikAANbP8uXLU19f37iq/A09evTIggULmh1zzz335Prrr8+8efPW+3vq6upSV1fX+H7lypUbVC8AwJsp++17AABsPC+//HI++9nP5tprr0337t3Xe9zEiRPTtWvXxpcHygAALc1KKQCAzUj37t1TWVmZpUuXNmlfunRpevbsuVb/xx9/PIsWLcqwYcMa2xoaGpIkbdu2zcKFC/Oe97xnrXHjxo1LbW1t4/uVK1cKpgCAFiWUAgDYjLRv3z79+vXLrFmzMnz48CT/CJlmzZrV7B6du+++ex566KEmbeecc05efvnlXHnllW8aNFVVVaWqqqrF6wcAeINQCgBgM1NbW5vjjjsu/fv3z7777ptJkyZl1apVGTVqVJJk5MiR6dWrVyZOnJgOHTqkb9++TcZ369YtSdZqBwAoklAKAGAzM2LEiCxbtizjx4/PkiVLsvfee2fmzJmNm58vXrw4bdrYOhQA2LQJpQAANkNjxoxp9na9JJk9e/Y6x06dOrXlCwIAeIv8hAYAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABROKAUAAABA4YRSAAAAABRukwilrrrqqtTU1KRDhw4ZMGBA5s6d+6Z9r7322hxwwAHZZpttss0222Tw4MHr7A8AAADApqfsodS0adNSW1ubCRMm5MEHH8xee+2VIUOG5Lnnnmu2/+zZs3PUUUfl17/+debMmZPevXvn4IMPzjPPPFNw5QAAAABsqLKHUpdffnlGjx6dUaNGpU+fPpk8eXK22mqrTJkypdn+N910U0499dTsvffe2X333XPdddeloaEhs2bNKrhyAAAAADZUWUOp1atX54EHHsjgwYMb29q0aZPBgwdnzpw56/UZr776al5//fVsu+22G6tMAAAAAFpYWUOp5cuXp76+Pj169GjS3qNHjyxZsmS9PuPMM8/MDjvs0CTY+ld1dXVZuXJlkxcAwObOnpwAwOau7LfvvR0XX3xxbr755tx+++3p0KFDs30mTpyYrl27Nr569+5dcJUAAC3LnpwAwJagrKFU9+7dU1lZmaVLlzZpX7p0aXr27LnOsZdeemkuvvji/PKXv8yee+75pv3GjRuXFStWNL6efvrpFqkdAKBc7MkJAGwJyhpKtW/fPv369WsyIXpjgjRw4MA3HfeNb3wjF1xwQWbOnJn+/fuv8zuqqqrSpUuXJi8AgM2VPTkBgC1F23IXUFtbm+OOOy79+/fPvvvum0mTJmXVqlUZNWpUkmTkyJHp1atXJk6cmCS55JJLMn78+PzoRz9KTU1N495TnTt3TufOnct2HgAARVjXnpwLFixYr8/4T3tyJv/Yl7Ourq7xvX05AYCWVvZQasSIEVm2bFnGjx+fJUuWZO+9987MmTMbJ1qLFy9Omzb/XNB1zTXXZPXq1fn0pz/d5HMmTJiQ8847r8jSAQA2O2/syTl79uw33ZMz+ce+nOeff36BlQEArU3ZQ6kkGTNmTMaMGdPssdmzZzd5v2jRoo1fEADAJqol9uT81a9+tc49OZN/7MtZW1vb+H7lypUeGAMAtKjN+ul7AACtTRF7cib25QQANr5NYqUUAADr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zNZbb537778/3/jGN/J//s//edNxp59+evr27Zv7778//fv3L7BiWsL6XveXX345S5YsSalUytNPP52vfOUr2W677bLffvuVsXooD/On1sv8ieaYQ7U+5k8FK+9CLTa2Z599tjRmzJjSu9/97lK7du1KnTt3Lu27776lb37zm6VVq1aVHn/88dLo0aNLu+66a6ljx46lbt26lT7wgQ+UbrjhhmY/7+CDDy4lKc2dO/dNv9Py8/L7+Mc/XjrssMOaPfb73/++lKQ0f/78DVp+/sarsrKytOOOO5ZGjx5deu655zbSmdBSXnvttdJZZ51Vev/731/q2rVraauttirttttupXPOOaf06quvlkql5pchl0r/eDz6oYceWnDFtIT1ve7/+nd7u+22Kx122GFv+m8DtAbmT62T+RPNMYdqfcyfilVRKrXg800BAAAAYD3YUwoAAACAwgmlAAAAACicUAoAAACAwgmlAAAAACicUAoAAACAwgmlAAAAACicUAoAAACAwgmlAAAAACicUApoVSoqKvLTn/603GUAAGw2zJ+AjUUoBWxRlixZkv/6r//KTjvtlKqqqvTu3TvDhg3LrFmzyl0aAMAmyfwJKJe25S4AoKUsWrQogwYNSrdu3fLNb34ze+yxR15//fXceeedOe2007JgwYJylwgAsEkxfwLKyUopYItx6qmnpqKiInPnzs3hhx+eXXfdNe973/tSW1ub++67r9kxZ555ZnbddddstdVW2WmnnXLuuefm9ddfbzw+f/78fPjDH87WW2+dLl26pF+/frn//vuTJE899VSGDRuWbbbZJp06dcr73ve+3HHHHYWcKwBASzB/AsrJSilgi/DCCy9k5syZufDCC9OpU6e1jnfr1q3ZcVtvvXWmTp2aHXbYIQ899FBGjx6drbfeOl/5yleSJMccc0z22WefXHPNNamsrMy8efPSrl27JMlpp52W1atX5ze/+U06deqU//t//286d+680c4RAKAlmT8B5SaUArYIjz32WEqlUnbfffe3NO6cc85p/O+ampp8+ctfzs0339w4qVq8eHHOOOOMxs/dZZddGvsvXrw4hx9+ePbYY48kyU477fR2TwMAoDDmT0C5uX0P2CKUSqUNGjdt2rQMGjQoPXv2TOfOnXPOOedk8eLFjcdra2tz0kknZfDgwbn44ovz+OOPNx77whe+kK9//esZNGhQJkyYkD/96U9v+zwAAIpi/gSUm1AK2CLssssuqaioeEubcc6ZMyfHHHNMDjvssPz85z/PH//4x3z1q1/N6tWrG/ucd955+fOf/5yhQ4fm7rvvTp8+fXL77bcnSU466aQ88cQT+exnP5uHHnoo/fv3z7e//e0WPzcAgI3B/Akot4rShsbjAJuYQw89NA899FAWLly41r4IL730Urp165aKiorcfvvtGT58eC677LJcffXVTX69O+mkk3LrrbfmpZdeavY7jjrqqKxatSrTp09f69i4ceMyY8YMv/gBAJsN8yegnKyUArYYV111Verr67PvvvvmJz/5SR599NE88sgj+da3vpWBAweu1X+XXXbJ4sWLc/PNN+fxxx/Pt771rcZf8ZLk73//e8aMGZPZs2fnqaeeyu9+97v84Q9/yHvf+94kyRe/+MXceeedefLJJ/Pggw/m17/+deMxAIDNgfkTUE42Oge2GDvttFMefPDBXHjhhfnSl76Uv/3tb9luu+3Sr1+/XHPNNWv1/8QnPpGxY8dmzJgxqaury9ChQ3PuuefmvPPOS5JUVlbm+eefz8iRI7N06dJ07949n/rUp3L++ecnSerr63Paaaflr3/9a7p06ZJDDjkkV1xxRZGnDADwtpg/AeXk9j0AAAAACuf2PQAAAAAKJ5QCAAAAoHBCKQAAAAAKJ5QCAAAAoHBCKQAAAAAKJ5QCAAAAoHBCKQAAAAAKJ5QCAAAAoHBCKQAAAAAKJ5QCAAAAoHBCKQAAAAAKJ5QCAAAAoHD/D5+7hLVCdNAVAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "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.10.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/ml_xgboost.ipynb b/notebooks/ml_xgboost.ipynb index 530c14f..4c8bc60 100644 --- a/notebooks/ml_xgboost.ipynb +++ b/notebooks/ml_xgboost.ipynb @@ -1,8 +1,15 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Extreme Gradient Boosting (XGBoost) Training and Analysis" + ] + }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -14,6 +21,8 @@ "import xgboost as xgb\n", "from sklearn.model_selection import GridSearchCV\n", "from sklearn.metrics import confusion_matrix\n", + "from sklearn.impute import SimpleImputer\n", + "from sklearn.preprocessing import MinMaxScaler\n", "import seaborn as sns" ] }, @@ -26,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -50,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -323,12 +332,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "load the best model" + "load the best model to get the best hyperparameters from it" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -353,14 +362,14 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[23:05:40] WARNING: C:/Users/administrator/workspace/xgboost-win64_release_1.6.0/src/learner.cc:627: \n", + "[20:16:51] WARNING: C:/Users/administrator/workspace/xgboost-win64_release_1.6.0/src/learner.cc:627: \n", "Parameters: { \"best_iteration\", \"best_ntree_limit\", \"scikit_learn\" } might not be used.\n", "\n", " This could be a false alarm, with some parameters getting used by language bindings but\n", @@ -474,8 +483,8 @@ "[97]\ttrain-merror:0.00029\teval-merror:0.18265\n", "[98]\ttrain-merror:0.00029\teval-merror:0.18265\n", "[99]\ttrain-merror:0.00029\teval-merror:0.18265\n", - "CPU times: total: 15.5 s\n", - "Wall time: 1.2 s\n" + "CPU times: total: 17.6 s\n", + "Wall time: 1.36 s\n" ] } ], @@ -497,7 +506,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -537,7 +546,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 46, "metadata": {}, "outputs": [ {