diff --git a/ML Projects/Heart_Disease_Prediction_ML/README.md b/ML Projects/Heart_Disease_Prediction_ML/README.md new file mode 100644 index 000000000..0b87b57c8 --- /dev/null +++ b/ML Projects/Heart_Disease_Prediction_ML/README.md @@ -0,0 +1,131 @@ +# ๐Ÿ“Š Heart Disease Prediction Using ML and DL + +## ๐Ÿ” Project Overview + +This project focuses on building and evaluating multiple **classification models** on a structured dataset using a complete **end-to-end machine learning pipeline**. The objective was to achieve **strong generalization performance** while maintaining model interpretability and robustness. + +Several classical and advanced machine learning algorithms were implemented, evaluated, and compared. Although **ensemble techniques were explored**, they were **not included in the final solution** due to degraded validation performance. + +--- + +## ๐Ÿง  Models Implemented + +The following classification algorithms were trained and evaluated: + +* Logistic Regression +* Decision Tree Classifier +* Random Forest Classifier +* AdaBoost Classifier +* XGBoost Classifier +* CatBoost Classifier +* LightGBM Classifier + +Each model was tuned with reasonable hyperparameters and evaluated using consistent metrics. + +--- + +## โš™๏ธ Preprocessing Pipeline + +The dataset underwent the following preprocessing steps: + +1. Handling missing values +2. Encoding categorical variables +3. Feature scaling using **StandardScaler** (for numerical features) +4. Train-test split with index alignment preserved + +All preprocessing steps were applied **only on training data** and then transformed on test data to avoid data leakage. + +--- + +## ๐Ÿ“ˆ Evaluation Metrics + +Models were evaluated using: + +* Accuracy +* Precision +* Recall +* F1-Score +* Confusion Matrix + +The final model was selected based on **overall generalization performance**, not just training accuracy. **Random Forest** gave the best performace. + +--- + +## ๐Ÿ† Final Model Selection + +After comparative evaluation, the best-performing model was selected based on: + +* Strong validation/test metrics +* Stable performance across folds +* Lower overfitting tendency +* Interpretability + +--- + +## ๐Ÿงช Reproducibility + +To ensure reproducibility: + +* Random seeds (`random_state`) were fixed +* Consistent preprocessing and evaluation strategy was followed + +--- + +## ๐Ÿ“‚ Project Structure (High-Level) + +``` +โ”œโ”€โ”€ datasets/ +โ”‚ โ”œโ”€โ”€ dataset_raw.csv +โ”‚ โ””โ”€โ”€ test_data.csv +| โ””โ”€โ”€ train_data.csv +โ”œโ”€โ”€ notebooks/ +โ”‚ โ”œโ”€โ”€ model_training.ipynb +โ”‚ โ””โ”€โ”€ preprocessing.ipynb +โ”œโ”€โ”€ models/ +โ”‚ โ”œโ”€โ”€ RandomForest.pkl +| โ””โ”€โ”€ scaling_model.pkl +โ”œโ”€โ”€ README.md +โ””โ”€โ”€ requirements.txt +``` + +--- + +## ๐Ÿš€ Key Takeaways + +* Ensembling is **not always beneficial**; empirical evaluation matters +* Simpler models can outperform complex pipelines when well-tuned +* Proper preprocessing and validation are critical for real-world performance + +--- + +## ๐Ÿ“Œ Future Improvements + +* Advanced hyperparameter optimization (Bayesian Search) +* Feature engineering based on domain knowledge +* Cross-validation-based model selection + +--- + +## ๐Ÿ“Œ How to Run the Project + +1. Clone the repository +```bash +git clone https://github.com/VanshSa017/Heart_Disease_Prediction_ML.git +``` + +2. Install dependencies +```bash +pip install -r requirements.txt +``` + +3. Run the notebook or script +```bash +python preprocessing.ipynb +python model_training.ipynb +``` + +--- + +## โœจ Author Note + +This project was built with a **practical, performance-first mindset**, prioritizing real-world generalization over theoretical complexity. diff --git a/ML Projects/Heart_Disease_Prediction_ML/models/RandomForest.pkl b/ML Projects/Heart_Disease_Prediction_ML/models/RandomForest.pkl new file mode 100644 index 000000000..5f0d9f049 Binary files /dev/null and b/ML Projects/Heart_Disease_Prediction_ML/models/RandomForest.pkl differ diff --git a/ML Projects/Heart_Disease_Prediction_ML/models/scaling_model.pkl b/ML Projects/Heart_Disease_Prediction_ML/models/scaling_model.pkl new file mode 100644 index 000000000..84f3493f1 Binary files /dev/null and b/ML Projects/Heart_Disease_Prediction_ML/models/scaling_model.pkl differ diff --git a/ML Projects/Heart_Disease_Prediction_ML/notebooks/ANN.ipynb b/ML Projects/Heart_Disease_Prediction_ML/notebooks/ANN.ipynb new file mode 100644 index 000000000..1b2755a2d --- /dev/null +++ b/ML Projects/Heart_Disease_Prediction_ML/notebooks/ANN.ipynb @@ -0,0 +1,409 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "b38f2db8", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "40a76dbe", + "metadata": {}, + "outputs": [], + "source": [ + "train_df=pd.read_csv('../datasets/train_dataset.csv',index_col=0)\n", + "test_df=pd.read_csv('../datasets/test_data.csv',index_col=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2eb6e3bc", + "metadata": {}, + "outputs": [], + "source": [ + "X_train=train_df.drop(columns=['target'])\n", + "X_test=test_df.drop(columns=['target'])\n", + "\n", + "y_train=train_df['target']\n", + "y_test=test_df['target']" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "fc1d452a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: keras in c:\\mlcodes\\.venv\\lib\\site-packages (3.12.0)\n", + "Requirement already satisfied: absl-py in c:\\mlcodes\\.venv\\lib\\site-packages (from keras) (2.3.1)\n", + "Requirement already satisfied: numpy in c:\\mlcodes\\.venv\\lib\\site-packages (from keras) (2.2.0)\n", + "Requirement already satisfied: rich in c:\\mlcodes\\.venv\\lib\\site-packages (from keras) (13.9.4)\n", + "Requirement already satisfied: namex in c:\\mlcodes\\.venv\\lib\\site-packages (from keras) (0.1.0)\n", + "Requirement already satisfied: h5py in c:\\mlcodes\\.venv\\lib\\site-packages (from keras) (3.15.1)\n", + "Requirement already satisfied: optree in c:\\mlcodes\\.venv\\lib\\site-packages (from keras) (0.18.0)\n", + "Requirement already satisfied: ml-dtypes in c:\\mlcodes\\.venv\\lib\\site-packages (from keras) (0.5.4)\n", + "Requirement already satisfied: packaging in c:\\mlcodes\\.venv\\lib\\site-packages (from keras) (24.2)\n", + "Requirement already satisfied: typing-extensions>=4.6.0 in c:\\mlcodes\\.venv\\lib\\site-packages (from optree->keras) (4.15.0)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\mlcodes\\.venv\\lib\\site-packages (from rich->keras) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\mlcodes\\.venv\\lib\\site-packages (from rich->keras) (2.19.1)\n", + "Requirement already satisfied: mdurl~=0.1 in c:\\mlcodes\\.venv\\lib\\site-packages (from markdown-it-py>=2.2.0->rich->keras) (0.1.2)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: Ignoring invalid distribution -orch (c:\\mlcodes\\.venv\\lib\\site-packages)\n", + "WARNING: Ignoring invalid distribution -orch (c:\\mlcodes\\.venv\\lib\\site-packages)\n", + "WARNING: Ignoring invalid distribution -orch (c:\\mlcodes\\.venv\\lib\\site-packages)\n", + "\n", + "[notice] A new release of pip is available: 24.3.1 -> 25.3\n", + "[notice] To update, run: python.exe -m pip install --upgrade pip\n" + ] + } + ], + "source": [ + "%pip install keras" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "489beab8", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Dense,Dropout\n", + "from tensorflow.keras.callbacks import EarlyStopping\n", + "from tensorflow.keras.optimizers import Adam" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "2420e6d8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\MLCodes\\.venv\\lib\\site-packages\\keras\\src\\layers\\core\\dense.py:95: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n", + " super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n" + ] + } + ], + "source": [ + "model = Sequential([\n", + " Dense(32, activation='relu', input_shape=(X_train.shape[1],)),\n", + " Dropout(0.3),\n", + " Dense(16, activation='relu'),\n", + " Dropout(0.2),\n", + " Dense(1, activation='sigmoid')\n", + "])\n", + "\n", + "model.compile(\n", + " optimizer=Adam(learning_rate=0.001),\n", + " loss='binary_crossentropy',\n", + " metrics=['accuracy']\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "d2400d84", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 25ms/step - accuracy: 0.5673 - loss: 0.6815 - val_accuracy: 0.6395 - val_loss: 0.6291\n", + "Epoch 2/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.6661 - loss: 0.6081 - val_accuracy: 0.7143 - val_loss: 0.5779\n", + "Epoch 3/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.6831 - loss: 0.5768 - val_accuracy: 0.7619 - val_loss: 0.5326\n", + "Epoch 4/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.7581 - loss: 0.5092 - val_accuracy: 0.7755 - val_loss: 0.4987\n", + "Epoch 5/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.7888 - loss: 0.4828 - val_accuracy: 0.7891 - val_loss: 0.4684\n", + "Epoch 6/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.8092 - loss: 0.4706 - val_accuracy: 0.8095 - val_loss: 0.4507\n", + "Epoch 7/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.7990 - loss: 0.4525 - val_accuracy: 0.8095 - val_loss: 0.4290\n", + "Epoch 8/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8296 - loss: 0.4107 - val_accuracy: 0.8299 - val_loss: 0.4146\n", + "Epoch 9/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8416 - loss: 0.4081 - val_accuracy: 0.8367 - val_loss: 0.4089\n", + "Epoch 10/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8484 - loss: 0.4135 - val_accuracy: 0.8435 - val_loss: 0.4079\n", + "Epoch 11/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.8484 - loss: 0.3642 - val_accuracy: 0.8435 - val_loss: 0.3983\n", + "Epoch 12/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.8279 - loss: 0.4016 - val_accuracy: 0.8435 - val_loss: 0.3936\n", + "Epoch 13/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8518 - loss: 0.3754 - val_accuracy: 0.8367 - val_loss: 0.3899\n", + "Epoch 14/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.8450 - loss: 0.3747 - val_accuracy: 0.8367 - val_loss: 0.3892\n", + "Epoch 15/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8603 - loss: 0.3593 - val_accuracy: 0.8435 - val_loss: 0.3844\n", + "Epoch 16/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8654 - loss: 0.3645 - val_accuracy: 0.8435 - val_loss: 0.3810\n", + "Epoch 17/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8637 - loss: 0.3426 - val_accuracy: 0.8367 - val_loss: 0.3836\n", + "Epoch 18/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.8552 - loss: 0.3497 - val_accuracy: 0.8367 - val_loss: 0.3783\n", + "Epoch 19/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8620 - loss: 0.3499 - val_accuracy: 0.8367 - val_loss: 0.3695\n", + "Epoch 20/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.8535 - loss: 0.3550 - val_accuracy: 0.8367 - val_loss: 0.3723\n", + "Epoch 21/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8620 - loss: 0.3519 - val_accuracy: 0.8367 - val_loss: 0.3751\n", + "Epoch 22/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8586 - loss: 0.3469 - val_accuracy: 0.8367 - val_loss: 0.3747\n", + "Epoch 23/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8671 - loss: 0.3332 - val_accuracy: 0.8435 - val_loss: 0.3779\n", + "Epoch 24/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8586 - loss: 0.3501 - val_accuracy: 0.8503 - val_loss: 0.3790\n", + "Epoch 25/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8790 - loss: 0.3228 - val_accuracy: 0.8571 - val_loss: 0.3663\n", + "Epoch 26/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8535 - loss: 0.3361 - val_accuracy: 0.8435 - val_loss: 0.3754\n", + "Epoch 27/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8671 - loss: 0.3397 - val_accuracy: 0.8435 - val_loss: 0.3731\n", + "Epoch 28/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8756 - loss: 0.3171 - val_accuracy: 0.8503 - val_loss: 0.3701\n", + "Epoch 29/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8586 - loss: 0.3222 - val_accuracy: 0.8503 - val_loss: 0.3736\n", + "Epoch 30/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8756 - loss: 0.3087 - val_accuracy: 0.8503 - val_loss: 0.3673\n", + "Epoch 31/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8825 - loss: 0.3040 - val_accuracy: 0.8503 - val_loss: 0.3733\n", + "Epoch 32/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8671 - loss: 0.3282 - val_accuracy: 0.8503 - val_loss: 0.3738\n", + "Epoch 33/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8773 - loss: 0.3201 - val_accuracy: 0.8435 - val_loss: 0.3778\n", + "Epoch 34/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8603 - loss: 0.3234 - val_accuracy: 0.8503 - val_loss: 0.3758\n", + "Epoch 35/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8671 - loss: 0.3248 - val_accuracy: 0.8571 - val_loss: 0.3702\n", + "Epoch 36/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8927 - loss: 0.2981 - val_accuracy: 0.8571 - val_loss: 0.3727\n", + "Epoch 37/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8825 - loss: 0.2881 - val_accuracy: 0.8639 - val_loss: 0.3764\n", + "Epoch 38/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8790 - loss: 0.3179 - val_accuracy: 0.8639 - val_loss: 0.3691\n", + "Epoch 39/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8739 - loss: 0.3137 - val_accuracy: 0.8571 - val_loss: 0.3775\n", + "Epoch 40/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8773 - loss: 0.2999 - val_accuracy: 0.8571 - val_loss: 0.3837\n", + "Epoch 41/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8807 - loss: 0.3113 - val_accuracy: 0.8571 - val_loss: 0.3740\n", + "Epoch 42/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8842 - loss: 0.3022 - val_accuracy: 0.8571 - val_loss: 0.3735\n", + "Epoch 43/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8739 - loss: 0.2990 - val_accuracy: 0.8571 - val_loss: 0.3793\n", + "Epoch 44/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8825 - loss: 0.2948 - val_accuracy: 0.8571 - val_loss: 0.3762\n", + "Epoch 45/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8671 - loss: 0.3241 - val_accuracy: 0.8571 - val_loss: 0.3762\n", + "Epoch 46/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8773 - loss: 0.3118 - val_accuracy: 0.8571 - val_loss: 0.3814\n", + "Epoch 47/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8773 - loss: 0.2862 - val_accuracy: 0.8571 - val_loss: 0.3817\n", + "Epoch 48/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.8859 - loss: 0.2862 - val_accuracy: 0.8571 - val_loss: 0.3880\n", + "Epoch 49/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8756 - loss: 0.2959 - val_accuracy: 0.8571 - val_loss: 0.3871\n", + "Epoch 50/50\n", + "\u001b[1m19/19\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - accuracy: 0.8910 - loss: 0.2929 - val_accuracy: 0.8707 - val_loss: 0.3792\n", + "\u001b[1m6/6\u001b[0m \u001b[32mโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step\n", + " precision recall f1-score support\n", + "\n", + " 0 0.86 0.84 0.85 77\n", + " 1 0.89 0.90 0.89 107\n", + "\n", + " accuracy 0.88 184\n", + " macro avg 0.87 0.87 0.87 184\n", + "weighted avg 0.87 0.88 0.87 184\n", + "\n" + ] + } + ], + "source": [ + "history = model.fit(\n", + " X_train,\n", + " y_train,\n", + " validation_split=0.2,\n", + " epochs=50,\n", + " batch_size=32,\n", + " verbose=1\n", + ")\n", + "\n", + "es = EarlyStopping(\n", + " monitor='val_loss',\n", + " patience=5,\n", + " restore_best_weights=True\n", + ")\n", + "\n", + "y_pred_prob = model.predict(X_test)\n", + "y_pred = (y_pred_prob > 0.5).astype(int)\n", + "\n", + "from sklearn.metrics import classification_report\n", + "print(classification_report(y_test, y_pred))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "1b3a70be", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Model: \"sequential\"\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"sequential\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“\n",
+       "โ”ƒ Layer (type)                    โ”ƒ Output Shape           โ”ƒ       Param # โ”ƒ\n",
+       "โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ\n",
+       "โ”‚ dense (Dense)                   โ”‚ (None, 32)             โ”‚           544 โ”‚\n",
+       "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n",
+       "โ”‚ dropout (Dropout)               โ”‚ (None, 32)             โ”‚             0 โ”‚\n",
+       "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n",
+       "โ”‚ dense_1 (Dense)                 โ”‚ (None, 16)             โ”‚           528 โ”‚\n",
+       "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n",
+       "โ”‚ dropout_1 (Dropout)             โ”‚ (None, 16)             โ”‚             0 โ”‚\n",
+       "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n",
+       "โ”‚ dense_2 (Dense)                 โ”‚ (None, 1)              โ”‚            17 โ”‚\n",
+       "โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜\n",
+       "
\n" + ], + "text/plain": [ + "โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“\n", + "โ”ƒ\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0mโ”ƒ\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0mโ”ƒ\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0mโ”ƒ\n", + "โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ\n", + "โ”‚ dense (\u001b[38;5;33mDense\u001b[0m) โ”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) โ”‚ \u001b[38;5;34m544\u001b[0m โ”‚\n", + "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n", + "โ”‚ dropout (\u001b[38;5;33mDropout\u001b[0m) โ”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) โ”‚ \u001b[38;5;34m0\u001b[0m โ”‚\n", + "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n", + "โ”‚ dense_1 (\u001b[38;5;33mDense\u001b[0m) โ”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m) โ”‚ \u001b[38;5;34m528\u001b[0m โ”‚\n", + "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n", + "โ”‚ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) โ”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m) โ”‚ \u001b[38;5;34m0\u001b[0m โ”‚\n", + "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n", + "โ”‚ dense_2 (\u001b[38;5;33mDense\u001b[0m) โ”‚ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) โ”‚ \u001b[38;5;34m17\u001b[0m โ”‚\n", + "โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 3,269 (12.77 KB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m3,269\u001b[0m (12.77 KB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 1,089 (4.25 KB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m1,089\u001b[0m (4.25 KB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 0 (0.00 B)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Optimizer params: 2,180 (8.52 KB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m2,180\u001b[0m (8.52 KB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model.summary()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/ML Projects/Heart_Disease_Prediction_ML/notebooks/model_training.ipynb b/ML Projects/Heart_Disease_Prediction_ML/notebooks/model_training.ipynb new file mode 100644 index 000000000..f13a6814b --- /dev/null +++ b/ML Projects/Heart_Disease_Prediction_ML/notebooks/model_training.ipynb @@ -0,0 +1,590 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "65c9ff49", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib as plt\n", + "import seaborn as sns\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2b097ba3", + "metadata": {}, + "outputs": [], + "source": [ + "train_df=pd.read_csv('../datasets/train_dataset.csv',index_col=0)\n", + "test_df=pd.read_csv('../datasets/test_data.csv',index_col=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "448b05ac", + "metadata": {}, + "outputs": [], + "source": [ + "X_train=train_df.drop(columns=['target'])\n", + "X_test=test_df.drop(columns=['target'])\n", + "\n", + "y_train=train_df['target']\n", + "y_test=test_df['target']" + ] + }, + { + "cell_type": "markdown", + "id": "a70c91e7", + "metadata": {}, + "source": [ + "Model Training" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "9f3d4808", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.metrics import accuracy_score, precision_score, roc_auc_score, recall_score, f1_score, classification_report" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "6bf63c47", + "metadata": {}, + "outputs": [], + "source": [ + "def performance(model,X_test=X_test,y_test=y_test):\n", + " y_pred=model.predict(X_test)\n", + "\n", + " print(\"Accuracy :\", accuracy_score(y_test, y_pred))\n", + " print(\"Precision:\", precision_score(y_test, y_pred))\n", + " print(\"Recall :\", recall_score(y_test, y_pred))\n", + " print(\"F1 Score :\", f1_score(y_test, y_pred))\n", + " print(\"\\nClassification Report:\\n\", classification_report(y_test, y_pred))\n" + ] + }, + { + "cell_type": "markdown", + "id": "bb5e8a4f", + "metadata": {}, + "source": [ + "Logistic Regression" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "b2ec04a0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy : 0.8532608695652174\n", + "Precision: 0.9\n", + "Recall : 0.8411214953271028\n", + "F1 Score : 0.8695652173913043\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.80 0.87 0.83 77\n", + " 1 0.90 0.84 0.87 107\n", + "\n", + " accuracy 0.85 184\n", + " macro avg 0.85 0.86 0.85 184\n", + "weighted avg 0.86 0.85 0.85 184\n", + "\n" + ] + } + ], + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "\n", + "lr=LogisticRegression(max_iter=1000)\n", + "lr.fit(X_train,y_train)\n", + "performance(lr)" + ] + }, + { + "cell_type": "markdown", + "id": "e8e10371", + "metadata": {}, + "source": [ + "Decision Tree " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "4da075ee", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy : 0.8641304347826086\n", + "Precision: 0.91\n", + "Recall : 0.8504672897196262\n", + "F1 Score : 0.8792270531400966\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.81 0.88 0.84 77\n", + " 1 0.91 0.85 0.88 107\n", + "\n", + " accuracy 0.86 184\n", + " macro avg 0.86 0.87 0.86 184\n", + "weighted avg 0.87 0.86 0.86 184\n", + "\n" + ] + } + ], + "source": [ + "from sklearn.tree import DecisionTreeClassifier\n", + "\n", + "dt=DecisionTreeClassifier(\n", + " max_depth=5,\n", + " min_samples_split=10,\n", + " random_state=42\n", + ")\n", + "\n", + "dt.fit(X_train,y_train)\n", + "performance(dt)" + ] + }, + { + "cell_type": "markdown", + "id": "ef35d64d", + "metadata": {}, + "source": [ + "Random Forest" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "01185f79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy : 0.8858695652173914\n", + "Precision: 0.9134615384615384\n", + "Recall : 0.8878504672897196\n", + "F1 Score : 0.9004739336492891\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.85 0.88 0.87 77\n", + " 1 0.91 0.89 0.90 107\n", + "\n", + " accuracy 0.89 184\n", + " macro avg 0.88 0.89 0.88 184\n", + "weighted avg 0.89 0.89 0.89 184\n", + "\n" + ] + } + ], + "source": [ + "from sklearn.ensemble import RandomForestClassifier\n", + "\n", + "rf=RandomForestClassifier(\n", + " n_estimators=200,\n", + " max_depth=7,\n", + " random_state=42\n", + ")\n", + "\n", + "rf.fit(X_train,y_train)\n", + "performance(rf)" + ] + }, + { + "cell_type": "markdown", + "id": "6a1c9ade", + "metadata": {}, + "source": [ + "AdaBoostClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "5392ce6a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy : 0.8478260869565217\n", + "Precision: 0.898989898989899\n", + "Recall : 0.8317757009345794\n", + "F1 Score : 0.8640776699029126\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.79 0.87 0.83 77\n", + " 1 0.90 0.83 0.86 107\n", + "\n", + " accuracy 0.85 184\n", + " macro avg 0.84 0.85 0.85 184\n", + "weighted avg 0.85 0.85 0.85 184\n", + "\n" + ] + } + ], + "source": [ + "from sklearn.ensemble import AdaBoostClassifier\n", + "\n", + "ada = AdaBoostClassifier(\n", + " n_estimators=200,\n", + " learning_rate=0.05,\n", + " random_state=42\n", + ")\n", + "\n", + "ada.fit(X_train, y_train)\n", + "\n", + "performance(ada)\n" + ] + }, + { + "cell_type": "markdown", + "id": "969efd36", + "metadata": {}, + "source": [ + "XGBClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "18820198", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy : 0.8804347826086957\n", + "Precision: 0.912621359223301\n", + "Recall : 0.8785046728971962\n", + "F1 Score : 0.8952380952380953\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.84 0.88 0.86 77\n", + " 1 0.91 0.88 0.90 107\n", + "\n", + " accuracy 0.88 184\n", + " macro avg 0.88 0.88 0.88 184\n", + "weighted avg 0.88 0.88 0.88 184\n", + "\n" + ] + } + ], + "source": [ + "from xgboost import XGBClassifier\n", + "\n", + "xgb = XGBClassifier(\n", + " n_estimators=300,\n", + " max_depth=4,\n", + " learning_rate=0.05,\n", + " subsample=0.8,\n", + " colsample_bytree=0.8,\n", + " eval_metric=\"logloss\",\n", + " random_state=42\n", + ")\n", + "\n", + "xgb.fit(X_train, y_train)\n", + "\n", + "performance(xgb)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "0df941ec", + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings('ignore')" + ] + }, + { + "cell_type": "markdown", + "id": "8e5aea94", + "metadata": {}, + "source": [ + "LGBMClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45e7c81b", + "metadata": {}, + "outputs": [], + "source": [ + "from lightgbm import LGBMClassifier\n", + "\n", + "lgbm = LGBMClassifier(\n", + " n_estimators=300,\n", + " learning_rate=0.05,\n", + " max_depth=5,\n", + " random_state=42\n", + ")\n", + "\n", + "lgbm.fit(X_train, y_train)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "81314043", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy : 0.8586956521739131\n", + "Precision: 0.900990099009901\n", + "Recall : 0.8504672897196262\n", + "F1 Score : 0.875\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.81 0.87 0.84 77\n", + " 1 0.90 0.85 0.88 107\n", + "\n", + " accuracy 0.86 184\n", + " macro avg 0.85 0.86 0.86 184\n", + "weighted avg 0.86 0.86 0.86 184\n", + "\n" + ] + } + ], + "source": [ + "performance(lgbm)" + ] + }, + { + "cell_type": "markdown", + "id": "bdb2bcad", + "metadata": {}, + "source": [ + "CatBoostClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "9c64f373", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy : 0.8804347826086957\n", + "Precision: 0.9047619047619048\n", + "Recall : 0.8878504672897196\n", + "F1 Score : 0.8962264150943396\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.85 0.87 0.86 77\n", + " 1 0.90 0.89 0.90 107\n", + "\n", + " accuracy 0.88 184\n", + " macro avg 0.88 0.88 0.88 184\n", + "weighted avg 0.88 0.88 0.88 184\n", + "\n" + ] + } + ], + "source": [ + "from catboost import CatBoostClassifier\n", + "\n", + "cat = CatBoostClassifier(\n", + " iterations=300,\n", + " learning_rate=0.05,\n", + " depth=5,\n", + " verbose=0,\n", + " random_seed=42\n", + ")\n", + "\n", + "cat.fit(X_train, y_train)\n", + "\n", + "performance(cat, X_test, y_test)\n" + ] + }, + { + "cell_type": "markdown", + "id": "4cd152e7", + "metadata": {}, + "source": [ + "VotingClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "82b52f06", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy : 0.8804347826086957\n", + "Precision: 0.912621359223301\n", + "Recall : 0.8785046728971962\n", + "F1 Score : 0.8952380952380953\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.84 0.88 0.86 77\n", + " 1 0.91 0.88 0.90 107\n", + "\n", + " accuracy 0.88 184\n", + " macro avg 0.88 0.88 0.88 184\n", + "weighted avg 0.88 0.88 0.88 184\n", + "\n" + ] + } + ], + "source": [ + "from sklearn.ensemble import VotingClassifier\n", + "\n", + "voting = VotingClassifier(\n", + " estimators=[\n", + " (\"dt\", dt),\n", + " (\"rf\", rf),\n", + " (\"xgb\", xgb)\n", + " ],\n", + " voting=\"soft\"\n", + ")\n", + "\n", + "voting.fit(X_train, y_train)\n", + "\n", + "performance(voting, X_test, y_test)\n" + ] + }, + { + "cell_type": "markdown", + "id": "e53f2d15", + "metadata": {}, + "source": [ + "### FInal Take away:\n", + "Random forest gave the best performance" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "24688b2b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy : 0.8858695652173914\n", + "Precision: 0.9134615384615384\n", + "Recall : 0.8878504672897196\n", + "F1 Score : 0.9004739336492891\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.85 0.88 0.87 77\n", + " 1 0.91 0.89 0.90 107\n", + "\n", + " accuracy 0.89 184\n", + " macro avg 0.88 0.89 0.88 184\n", + "weighted avg 0.89 0.89 0.89 184\n", + "\n" + ] + } + ], + "source": [ + "performance(rf)" + ] + }, + { + "cell_type": "markdown", + "id": "a59417c7", + "metadata": {}, + "source": [ + "Saving the model" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "0b7b44d2", + "metadata": {}, + "outputs": [], + "source": [ + "import pickle as pkl\n", + "\n", + "with open('../models/RandomForest.pkl', 'wb') as f:\n", + " pkl.dump(rf, f)" + ] + }, + { + "cell_type": "markdown", + "id": "030c305c", + "metadata": {}, + "source": [ + "-----------------------------------------------------------------" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/ML Projects/Heart_Disease_Prediction_ML/notebooks/preprocessing.ipynb b/ML Projects/Heart_Disease_Prediction_ML/notebooks/preprocessing.ipynb new file mode 100644 index 000000000..e2cdf07e3 --- /dev/null +++ b/ML Projects/Heart_Disease_Prediction_ML/notebooks/preprocessing.ipynb @@ -0,0 +1,922 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "663d07d1", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import seaborn as sns\n", + "import matplotlib as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "id": "9b98f8f4", + "metadata": {}, + "source": [ + "Load Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50fcacc0", + "metadata": {}, + "outputs": [], + "source": [ + "df=pd.read_csv('../datasets/dataset_raw.csv')\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "7c791882", + "metadata": {}, + "source": [ + "Shape of the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5d049359", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1190, 12)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "markdown", + "id": "48f72af3", + "metadata": {}, + "source": [ + "Standardized the column name" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d5943d32", + "metadata": {}, + "outputs": [], + "source": [ + "df.columns=df.columns.str.strip().str.lower().str.replace(' ','_')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "85bea45b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['age', 'sex', 'chest_pain_type', 'resting_bp_s', 'cholesterol',\n", + " 'fasting_blood_sugar', 'resting_ecg', 'max_heart_rate',\n", + " 'exercise_angina', 'oldpeak', 'st_slope', 'target'],\n", + " dtype='object')" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "478149f0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "age int64\n", + "sex int64\n", + "chest_pain_type int64\n", + "resting_bp_s int64\n", + "cholesterol int64\n", + "fasting_blood_sugar int64\n", + "resting_ecg int64\n", + "max_heart_rate int64\n", + "exercise_angina int64\n", + "oldpeak float64\n", + "st_slope int64\n", + "target int64\n", + "dtype: object" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.dtypes" + ] + }, + { + "cell_type": "markdown", + "id": "b9dc7ea3", + "metadata": {}, + "source": [ + "Checking null value" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "da8d4cf8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "age 0\n", + "sex 0\n", + "chest_pain_type 0\n", + "resting_bp_s 0\n", + "cholesterol 0\n", + "fasting_blood_sugar 0\n", + "resting_ecg 0\n", + "max_heart_rate 0\n", + "exercise_angina 0\n", + "oldpeak 0\n", + "st_slope 0\n", + "target 0\n", + "dtype: int64" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.isnull().sum()" + ] + }, + { + "cell_type": "markdown", + "id": "b811ef8a", + "metadata": {}, + "source": [ + "Conclusion: No imputation required" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2d8f2c1b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sex may be= [1 0]\n", + "fasting_blood_sugar may be= [0 1]\n", + "exercise_angina may be= [0 1]\n" + ] + } + ], + "source": [ + "binary_list=['sex','fasting_blood_sugar','exercise_angina']\n", + "for col in binary_list:\n", + " print(f\"{col} may be= {df[col].unique()}\")" + ] + }, + { + "cell_type": "markdown", + "id": "f1b322ad", + "metadata": {}, + "source": [ + "Removing the duplicate tuples" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "295c4562", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.int64(272)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.duplicated().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5dfff922", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(918, 12)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df=df.drop_duplicates()\n", + "df.shape" + ] + }, + { + "cell_type": "markdown", + "id": "09fcf832", + "metadata": {}, + "source": [ + "Checking the outlier- inter-quartile range" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4dd241e9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Column= age\n", + "Lower bound: 27.5\n", + "Upper bound: 79.5\n", + "Number of outliers: 0 \n", + "\n", + "Column= resting_bp_s\n", + "Lower bound: 90.0\n", + "Upper bound: 170.0\n", + "Number of outliers: 28 \n", + "\n", + "Column= cholesterol\n", + "Lower bound: 32.625\n", + "Upper bound: 407.625\n", + "Number of outliers: 183 \n", + "\n", + "Column= max_heart_rate\n", + "Lower bound: 66.0\n", + "Upper bound: 210.0\n", + "Number of outliers: 2 \n", + "\n", + "Column= oldpeak\n", + "Lower bound: -2.25\n", + "Upper bound: 3.75\n", + "Number of outliers: 16 \n", + "\n" + ] + } + ], + "source": [ + "def detect_outliers_iqr(data, column):\n", + " Q1 = data[column].quantile(0.25)\n", + " Q3 = data[column].quantile(0.75)\n", + " IQR = Q3 - Q1\n", + " \n", + " lower = Q1 - 1.5 * IQR\n", + " upper = Q3 + 1.5 * IQR\n", + " \n", + " outliers = data[(data[column] < lower) | (data[column] > upper)]\n", + " return lower, upper, outliers\n", + "\n", + "\n", + "num_col=['age','resting_bp_s','cholesterol','max_heart_rate','oldpeak']\n", + "for col in num_col:\n", + " lower, upper, income_outliers = detect_outliers_iqr(df, col)\n", + " print('Column=',col)\n", + " print(\"Lower bound:\", lower)\n", + " print(\"Upper bound:\", upper)\n", + " print(\"Number of outliers:\", income_outliers.shape[0],'\\n')" + ] + }, + { + "cell_type": "markdown", + "id": "771fb6ba", + "metadata": {}, + "source": [ + "========================================================================" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "54b1e294", + "metadata": {}, + "outputs": [], + "source": [ + "df_ori=df.copy()" + ] + }, + { + "cell_type": "markdown", + "id": "049ced24", + "metadata": {}, + "source": [ + "Capping the column to reduce the outlier" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "582b7cb8", + "metadata": {}, + "outputs": [], + "source": [ + "# capping the oldpeak column\n", + "df['oldpeak']=df['oldpeak'].clip(-2.25,3.75)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "46b40548", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Column= oldpeak\n", + "Lower bound: -2.25\n", + "Upper bound: 3.75\n", + "Number of outliers: 0 \n", + "\n" + ] + } + ], + "source": [ + "lower, upper, income_outliers = detect_outliers_iqr(df, 'oldpeak')\n", + "print('Column=',col)\n", + "print(\"Lower bound:\", lower)\n", + "print(\"Upper bound:\", upper)\n", + "print(\"Number of outliers:\", income_outliers.shape[0],'\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "4c1cf164", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGwCAYAAABPSaTdAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUWxJREFUeJzt3Qd4VFXCBuAvM5PeC2mkQ0hCCZ2IiIqgFBcba6EouorlFxuuq6xr312w6yLquhYsuFhWEEFAmhTpoUMoCWmk995n/uecIWMGEkggyZ25873Pc7135s5MzlzJ5JtT7QwGgwFEREREKqVRugBEREREXYlhh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVE2ndAEsgV6vR3Z2Ntzd3WFnZ6d0cYiIiKgdxFSBFRUVCA4OhkbTdv0Nww4gg05oaKjSxSAiIqKLkJmZiZCQkDbPM+wAskan+WJ5eHgoXRwiIiJqh/LycllZ0fx3vC0MO4Cp6UoEHYYdIiIi63KhLijsoExERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqqZo2Nm8eTMmT54sJwMSPamXLVtmdl7c19r2+uuvmx4TERFxzvn58+cr8G6IiIjIEikadqqqqjBw4EAsXLiw1fM5OTlm26effirDzJQpU8we9/LLL5s97pFHHummd0BERESWTtF5diZOnCi3tgQGBprd/vHHHzFmzBhERUWZ3S8mEzr7sURERERW1WcnLy8PK1euxL333nvOOdFs5evri8GDB8smrsbGxvO+Vl1dnZx1seVGRERE6mQ1Myh//vnnsgbnlltuMbv/0UcfxZAhQ+Dj44Nt27Zh7ty5sinrrbfeavO15s2bh5deeqkbSk1ERERKszOIJUMtgOiLs3TpUtx0002tno+NjcW1116LBQsWnPd1RL+eBx54AJWVlXB0dGyzZkdsZ6+tUVZWxuUiiIiIrIT4++3p6XnBv99WUbOzZcsWHD9+HN98880FH5uQkCCbsdLS0hATE9PqY0QIaisIERERkbpYRZ+dTz75BEOHDpUjty5k//790Gg08Pf375ayERERkWVTtGZHNDUlJyebbqempsqwIvrfhIWFmaqovvvuO7z55pvnPH/79u3YuXOnHKEl+vOI20888QRmzJgBb2/vbn0vREREZJkUDTt79uyRQaXZnDlz5H7mzJlYtGiRPF6yZAlEt6KpU6ee83zRFCXOv/jii7IPTmRkpAw7za9jCTIyMlBYWNjh5/n5+ZkCHxEREamgg7I1dHC6mKATGxeHmurqDj/X2cUFx5KSGHiIiIhsoYOytRI1OiLoTH/6dQSE9Wr38/IyUrD41afk8xl2iIiILg3DTjcQQSckup/SxSAiIrJJVjEai4iIiOhiMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqikadjZv3ozJkycjODgYdnZ2WLZsmdn5u+++W97fcpswYYLZY4qLizF9+nR4eHjAy8sL9957LyorK7v5nRAREZGlUjTsVFVVYeDAgVi4cGGbjxHhJicnx7T997//NTsvgs6RI0ewdu1arFixQgao+++/vxtKT0RERNZAp+QPnzhxotzOx9HREYGBga2eS0pKwurVq7F7924MGzZM3rdgwQJMmjQJb7zxhqwxIiIiIttm8X12fv31V/j7+yMmJgYPPfQQioqKTOe2b98um66ag44wbtw4aDQa7Ny5s83XrKurQ3l5udlGRERE6mTRYUc0YX3xxRdYv349Xn31VWzatEnWBDU1Ncnzubm5Mgi1pNPp4OPjI8+1Zd68efD09DRtoaGhXf5eiIiIyAabsS7kjjvuMB0PGDAA8fHx6NWrl6ztGTt27EW/7ty5czFnzhzTbVGzw8BDRESkThZds3O2qKgo+Pn5ITk5Wd4WfXny8/PNHtPY2ChHaLXVz6e5H5AYvdVyIyIiInWyqrBz+vRp2WcnKChI3h45ciRKS0uRmJhoesyGDRug1+uRkJCgYEmJiIjIUijajCXmw2mupRFSU1Oxf/9+2edGbC+99BKmTJkia2lSUlLwl7/8Bb1798b48ePl4+Pi4mS/nlmzZuHDDz9EQ0MDZs+eLZu/OBKLiIiIFK/Z2bNnDwYPHiw3QfSjEcfPP/88tFotDh48iBtuuAF9+vSRkwUOHToUW7Zskc1QzRYvXozY2FjZh0cMOb/iiivw0UcfKfiuiIiIyJIoWrNz9dVXw2AwtHl+zZo1F3wNUQP09ddfd3LJiIiISC2sqs8OERERUUcx7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkarplC4AEXWOjIwMFBYWdvh5fn5+CAsL65IyERFZAoYdIpUEndi4ONRUV3f4uc4uLjiWlMTAQ0SqxbBDpAKiRkcEnelPv46AsF7tfl5eRgoWv/qUfD7DDhGplaJ9djZv3ozJkycjODgYdnZ2WLZsmelcQ0MDnn76aQwYMACurq7yMXfddReys7PNXiMiIkI+t+U2f/58Bd4NkfJE0AmJ7tfurSPBiIjIWikadqqqqjBw4EAsXLjwnHPV1dXYu3cvnnvuObn/4YcfcPz4cdxwww3nPPbll19GTk6OaXvkkUe66R0QERGRpVO0GWvixIlya42npyfWrl1rdt97772HESNGyP4JLavc3d3dERgY2OXlJSIiIutjVUPPy8rKZDOVl5eX2f2i2crX1xeDBw/G66+/jsbGxvO+Tl1dHcrLy802IiIiUier6aBcW1sr+/BMnToVHh4epvsfffRRDBkyBD4+Pti2bRvmzp0rm7LeeuutNl9r3rx5eOmll7qp5ERERKQkqwg7orPybbfdBoPBgA8++MDs3Jw5c0zH8fHxcHBwwAMPPCADjaOjY6uvJwJRy+eJmp3Q0NAufAdERESkFJ21BJ309HRs2LDBrFanNQkJCbIZKy0tDTExMa0+RoSgtoIQERERqYvOGoLOyZMnsXHjRtkv50L2798PjUYDf3//bikjERERWTZFw05lZSWSk5NNt1NTU2VYEf1vgoKC8Mc//lEOO1+xYgWampqQm5srHyfOi+aq7du3Y+fOnRgzZowckSVuP/HEE5gxYwa8vb0VfGdERERkKRQNO3v27JFBpVlzP5qZM2fixRdfxPLly+XtQYMGmT1P1PJcffXVsilqyZIl8rFihFVkZKQMOy374xAREZFtUzTsiMAiOh235XznBDEKa8eOHV1QMiIiIlILq5pnh4iIiKijGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVFA07mzdvxuTJkxEcHAw7OzssW7bM7LzBYMDzzz+PoKAgODs7Y9y4cTh58qTZY4qLizF9+nR4eHjAy8sL9957LyorK7v5nRAREZGlUjTsVFVVYeDAgVi4cGGr51977TX861//wocffoidO3fC1dUV48ePR21trekxIugcOXIEa9euxYoVK2SAuv/++7vxXRAREZEl0yn5wydOnCi31ohanXfeeQd/+9vfcOONN8r7vvjiCwQEBMgaoDvuuANJSUlYvXo1du/ejWHDhsnHLFiwAJMmTcIbb7wha4yIiIjItllsn53U1FTk5ubKpqtmnp6eSEhIwPbt2+VtsRdNV81BRxCP12g0siaoLXV1dSgvLzfbiIiISJ0sNuyIoCOImpyWxO3mc2Lv7+9vdl6n08HHx8f0mNbMmzdPBqfmLTQ0tEveAxERESnPYsNOV5o7dy7KyspMW2ZmptJFIiIiIksKO1FRUSgqKjrn/tLSUnmuMwQGBsp9Xl6e2f3idvM5sc/Pzzc739jYKEdoNT+mNY6OjnL0VsuNiIiI1Omiwk5aWhqamppa7QuTlZXVGeVCZGSkDCzr16833Sf61oi+OCNHjpS3xV4ErMTERNNjNmzYAL1eL/v2EBEREXVoNNby5ctNx2vWrJH9XZqJ8COCSURERLtfT8yHk5ycbNYpef/+/bLPTVhYGB5//HH8/e9/R3R0tAw/zz33nBxhddNNN8nHx8XFYcKECZg1a5Ycnt7Q0IDZs2fLkVociUVEREQdDjvNIUNMADhz5kyzc/b29jLovPnmm+1+vT179mDMmDGm23PmzJF78dqLFi3CX/7yFzkXj5g3R9TgXHHFFXKouZOTk+k5ixcvlgFn7NixchTWlClT5Nw8RHRhjXrALf5aLNxdirq9O1FaU4+eXs6I9HPDVX164LIoH/n7TkRkM2FHNA8JopZFzG3j5+d3ST/86quvlvPptEV8yL788stya4uoBfr6668vqRxEtqauoQnbThXhaJY9fCc+hvWpNQDEBhzOElMx5OHDTSmI9HPFPaMiMG1EGHRamxzPQES2OqmgaG4iIuuUXlSFdUn5qKxrFF8p0FCchWlXxOCyfr3g6WyP0yXVOJxdjlWHcpBaWIXnfzyCb/dk4p83D0B8iJfSxSci6r4ZlEX/HLGJ0VDNNT7NPv3004t9WSLqQonpJdiaXCiPvZzt0d+9GotffQBTH0zEkCEhZo996YZ++D7xNN785bis7bn5/W14YXJf3DWy/f3yiIgswUXVS7/00ku47rrrZNgpLCxESUmJ2UZElmdXarEp6MT39MS0hDAEOLXdjOzqqMPMyyOw/smrcf2AIDTpDbKW5/kfD6OxyfwLDhGR6mp2xMgn0YH4zjvv7PwSEVGn25NWjO2njHNjjYzyxYhIn3Y/t4e7I96bNhj9N3nitTXH8MX2dBRV1uPdOwaxHw8RWYWL+qSqr6/H5Zdf3vmlIaJOl1ZYhd9SjEFnVO+OBZ2WgwUeuroXPpg+BPZaO6w8lIOnvj8oa3uIiFQZdu677z6OgCKyAmU1DVh9xLhOXP+eHhgW3vGg09KE/kF4b9oQaDV2WLovSzZpnW9EJRGR1TZj1dbW4qOPPsK6desQHx8v59hp6a233uqs8hHRRRK1LqIGpq5Rj0APJzlvTluSkpLa/briVR5P8MRb20uxeGcGov3dcPeoyE4qNRGRhYSdgwcPYtCgQfL48OHDZuc4ARmRZdibUYKCijo42WswaUAgdJpzK3LLiwvkfsaMGR1+fZ9Rt8P9ijvx8oqjiOrhhivPE6aIiKwu7GzcuLHzS0JEnaakuh47U4vl8VXRPeDuZF772qymUkwgCFz/wLOIiR/a7tfPy0jB4lefwlWTb8PeEkc89OVuvHmdH/xdL/yRIiYjFcvBEBFZ/Dw7RGSZRB+a9Un5shkr3McFMYHuF3yOb3A4QqL7tftnNNcILX32dgROmw8Ex+LujzYj7+tnAP25iwS35OzigmNJSQw8RGTZYUesZ3W+5iqx8jgRKeNEXiWySmug09hhTKx/lzQtm2qE7nsaIX2jsD7HAPSMw3Wv/ID+Xk0XrBES83Mx7BCRRYed5v46zcRq42K1ctF/5+wFQomo+zQZgG0pxokDh0f4yOUfupKoEYqJ6weNTwV+PpyL4+Va9O8dhhBvly79uUREXR523n777Vbvf/HFF1FZWXkxL0lEneBUhQbltY1wddBicFj3rWMVHeCOfsXVOJJdjrVH8zDjsnDYc8JBIrIQnfppJEZ0cF0sImXYObjgWLlWHidE+XZ72Bgd7Qc3R50MW7+dWZaCiMgSdOqn4fbt2+Hk5NSZL0lE7eQx/EbU6+3g7WKPfkEe3f7zHXVajIvzl8cHTpchq6Sm28tARNRpzVi33HLLOaM/cnJysGfPHjz33HMX85JEdAlqGvRwH3qDPL4syhcajTLzXYX7uqJfsIdsztpwLF8uNipmWyYisrqw4+npaXZbo9EgJiYGL7/8slwNnYi619pT1dA6u8NNZ0BvfzdFy3JFbz+cKqhCcXW9nNhQdJQmIrK6sPPZZ591fkmI6KLUNTZh+YkqedzHowkahWcxd7LXyv47vxzNw67UYsQEuMOji0eFERF12aSCiYmJpjV1+vXrh8GDB1/KyxHRRVi6NwvFNXo0VhQhLPTCEwh2h9hAdxzNLsfp0hpsOlGAyQODlS4SEdmwi+qgnJ+fj2uuuQbDhw/Ho48+KrehQ4di7NixKCgwzqxKRF1P9Jf7z5ZT8rh891JoLaR7jJjIUExoKLrrnCqsQnqRseaJiMhqws4jjzyCiooKHDlyBMXFxXITEwqWl5fL4ENE3eO35CKkFFTBSWeHygNrYEl8XB0QH2Kc62fLyULo9Qali0RENuqimrFWr16NdevWIS4uznRf3759sXDhQnZQJupGn29Pk/sxEc44Xm95Q70TIn1wLKccRVX1OJxdBnZVJiKrqdnR6/Wwtz+3w6G4T5wjoq6XWVyN9Ul58nhib1dYItFZWQyFF7afKkIDPx6IyFrCjuiv89hjjyE7O9t0X1ZWFp544gnZb4eIut7inRkQLUNiqHeIxyWNNehS/Xt6yokOaxv0OHlmhmciIosPO++9957snxMREYFevXrJLTIyUt63YMGCzi8lEZmpbWjCN7sz5PHMyyNgycSkgiPP1O6crNBA49z9szsTkW27qK+DoaGh2Lt3r+y3c+zYMXmf6L8zbty4zi4fkc3JyMhAYeH515bamlGDkuoG+Llo4FV9GknHjb+HlkpMdOjv7oj8ijp4jrzNNGVFR/n5+SEsLKzTy0dE6tahsLNhwwbMnj0bO3bsgIeHB6699lq5CWVlZXKunQ8//BCjR4/uqvISqT7oxMbFoaa6+ryP87/tZThHDkHy2sUY8cJi0/2VlZWwRGIo+uW9fLFsfzbcB1+PmQ/dj6aKjk9T4ezigmNJSQw8RNR1Yeedd97BrFmzZNBpbQmJBx54AG+99RbDDtFFEjU6IuhMf/p1BIT1avUxVY3A6mzjAIE7bp0C16lTkLRrE1Z9/i5qa2thqcJ8XOCBKpTrXDHg3vm4Jtq7Q8/Py0jB4lefkteIYYeIuizsHDhwAK+++mqb58Ww8zfeeKNDBSCic4mgExLdr9VzO04VAShGqLczYuKiTUHA0onanQgU4CBcUeLoD9fgCHi7OihdLCKyAR3qoJyXl9fqkPNmOp2OMygTdSG9wYCjOeXyuG+w9XX09UANqpN3iegjh6ITEVlc2OnZs6ecKbktBw8eRFBQUGeUi4hacbqkBhW1jXDUadC7h7Krm1+s0s1fyP3J/Erkl1tusxsR2WjYmTRpEp577rlW+wXU1NTghRdewB/+8IfOLB8RtXAs11ir0yfAHTrtRc0cobiGgjT4a40dsHekFitdHCKyAR3qs/O3v/0NP/zwA/r06SNHZcXExMj7xfBzsVREU1MTnn322a4qK5FNa2jSIzm/0rSquDULt69AfpMLUgurUFBRhx7ujkoXiYhUrENhJyAgANu2bcNDDz2EuXPnyhWXmzsejh8/XgYe8Rgi6nwiGDQ0GeDhpEOQpxOsmYumCX383XAivxK704oxaQCbv4mo63R4UsHw8HD8/PPPKCkpQXJysgw80dHR8Pbu2DBSIuqYY7kVch8T6C6/YFi7YRE+MuyIvjslVfUcmUVEXeaiF9QR4Wb48OGdWxoialVNfRPSi6rkcWyg9Y3Cao1ouor0c5U1VrvTi3Fd30Cli0REKmWdPRyJbMyJ/Aq56KdYcsFHRTUgIyJ85P54bgXKaxqULg4RqRTDDpEVOJln7JgcE2DdHZPPFujphFAfZxnkEtNLlC4OEakUww6Rhauqa0RWaY087h1gnXPrtKd250hOuXyvRESdjWGHyMKlFBhrdQI8HOHh1PYM5taqp5ezHF3WpDdgbwZrd4io8zHsEFk4MVpJiPZXVxNWMzGyrLl251BWGWoampQuEhGpjMWHnYiICPlhePb28MMPy/NXX331OecefPBBpYtN1Cmq6xuRVXKmCctffU1YzcJ9XeToLDGP0KHTZUoXh4hU5qKHnneX3bt3y5mZm4m1ua699lrceuutpvtmzZqFl19+2XTbxcWl28tJ1BVOFVRBTN0pRmF5OquvCauZ+JIyJMwLa47k4cDpUgwJ94JOY/HfxYjISlh82OnRo4fZ7fnz56NXr1646qqrzMJNYGD75+ioq6uTW7PycuN6Q0SW2oSl5lqdZqKZ7rfkIlTWNcqh6P2CPZUuEhGphFV9daqvr8dXX32FP/3pT2YzyC5evBh+fn7o37+/XMaiutq4yGBb5s2bB09PT9MWGhraDaUn6hjRdyWzpNpmwo5WY4dBoV7yeF9GqWk5GiIimwo7y5YtQ2lpKe6++27TfdOmTZMBaOPGjTLofPnll5gxY8Z5X0c8rqyszLRlZmZ2Q+mJOuZUQSXE33s/Nwd4u6hnIsHz6d/TAw5aDYqq6pFefP4vLUREqmnGaumTTz7BxIkTERwcbLrv/vvvNx0PGDAAQUFBGDt2LFJSUmRzV2scHR3lRmTJ1D4KqzWOOi36BXtgX2Yp9qaXIMLXVekiEZEKWE3NTnp6OtatW4f77rvvvI9LSEiQe7FIKZG1qtcDmWdqNqJtoAmrJdGUJVqpM0tqUFDxe986IiLVh53PPvsM/v7+uP7668/7uP3798u9qOEhslY51Rq5hIKvq4PNrQbu4WyP6B7GgMdJBonIZsKOXq+XYWfmzJnQ6X5veRNNVa+88goSExORlpaG5cuX46677sKVV16J+Ph4RctMdClOV2tspmNya4aEe8v9ibwKVNRygVAisoGwI5qvMjIy5CislhwcHOS56667DrGxsXjyyScxZcoU/PTTT4qVlehS2Tk4I7/WziabsJoFeDjJZSRE7dYBTjJIRLbQQVmEmdaGoYoh45s2bVKkTERdxTlqKPSwg5eLPXzdbLcjvZhkUCyAejirDAmRxuUkiIhUW7NDZEuce42Q+yg/2x6JFOHnCg8nHeoa9TiWW6F0cYjIijHsEFkQsfK3c69h8jjKzzabsJpp7Oww8MwkgwcyxSSDSpeIiKwVww6RBTlWVA+tswfsNQYEeTrB1vUL8oBOYycnGSyo+33WdCKijmDYIbIge7KN88oEOemh0fCPu6O9FnFBHvI4pUKrdHGIyEox7BBZkN3ZtXIf5Mw2m2YDQ4wLgmbX2EHr4a90cYjICjHsEFnQWljZFU0wNDUgwFmvdHEshhiRFurjLAblw33I+ScVJSJqDcMOkYVYn5Qv97WZh2HP30wzg0KMHZXdBo5HbSODIBF1DD9SiSzE2qQ8ua9J3qV0USxyGLqrzgCtkxs2pxub+oiI2othh8gClFbXIzHduA4Uw07rw9Cj3Jrk8c/JVa1OMkpE1BaGHSIL8OvxAjnHTpinDo1lxhoeMhfhpoe+vhYZZY3YfqpI6eIQkRVh2CGyoCasYUG2uzzEhThogKojG+Xx4h0ZSheHiKwIww6Rwuob9dh8vEAeD+/JiQTPp2Lfz3K/5kgu8svZd4eI2odhh0hhu1KLUVHXCD83B0T72CtdHIvWUJCKGF97NOoNWLI7U+niEJGVYNghUti6M01Y18T6y464dH4TervI/X93ZaCxicPQiejCGHaIFCRGFa0/Zgw7Y+MClC6OVRgZ4gwfVwfklNVi/THj3EREROfDsEOkoBN5lcgsroGDToPR0X5KF8cqOGjtcOuwEHn81Y50pYtDRFaAYYfIApqwRvXyhYuDTuniWI3pI8IhWvy2nCxEamGV0sUhIgvHsEOkoPVnwg6bsDomzNcFV/XpIY+/3snaHSI6P4YdIoUUVtZhX2apPB4bx9W8O2pGQrjcf5d4GrUNxtmViYhaw7BDpJANx/IhVj3o39MDQZ5iVW/qiDGx/ujp5YzS6gasOJijdHGIyIIx7BApZN3RM01YsWzCuhhajR2mJYTJY3ZUJqLzYdghUoBodhGda4Vr+zLsXKzbhoXCXmuH/ZmlOJxVpnRxiMhCMewQKUAsZFnT0IRADyf0C/ZQujhWq4e7Iyb0D5LHrN0horYw7BAp2IR1TZw/7Dhr8iW58zJjR+Vl+7NQVtOgdHGIyAJxYg8iBWZNFp2ThWs55LzDkpKSzG5rDQaEeuiQWd6If/24A9f3cT3nOX5+fggLM/bvISLbw7BD1M2OZJfLpQ6c7bUY2ctX6eJYjfJi48rwM2bMOOec2+BJ8L3u//Dh+iN4fupD55x3dnHBsaQkBh4iG8WwQ6TQrMlXRPvByV6rdHGsRk1ludxf/8CziIkfanauQQ+szDIAvqG4882l6OFkMJ3Ly0jB4lefQmFhIcMOkY1i2CHqZuuT2IR1KXyDwxES3e+c++MMeTicVY4ceGNwtLHTMhGRwA7KRN0ot6wWh7LK5LpOYlI86jzxPb3kPqWgElV1jUoXh4gsCMMOUTdaf8zYhDUwxEsOm6bOI66nGMqvNwBHcoxNXkREAsMOkRJNWJxIsEsMCPGUezHBoF6sxUFExLBD1H2q6xuxNdk4azIX/uwaffzd4KjToKK2EelF1UoXh4gsBMMOUTfZerIQ9Y16hHg7IybAXeniqJJOq0HfIOOM1KJvFBGRwLBD1M1NWOPiAjhrchca0NPYlJVaWIVyzqhMRBx6TtR1MjIy5Nwugug/suawMeyE6cqxd+/eds0OTB3n7eoga89Ol9TgcHYZOLMOETHsEHVR0ImNi0NNtbHfiENQHwTd9Rb0ddW4d/JNgP78Q6MrKyu7qaTqFN/TU4YdMVt1CPuCE9k8hh2iLiBqdETQmf706wgI64XDpVocLwdCvR1x64Jv23xe0q5NWPX5u6itre3W8qpNVA83uDhoUV3fhOwaNhkS2TqGHaIuJIKOmO331x3pAOrRPyIYIWc60LZGLG1Al06rsUP/YE/sSivGqQouyUFk69hBmaiLlVbXo6iqXs6aHOF37orc1DX69fSAqNMpqNNA5xOidHGISEEMO0Rd7FRhldz39HLmwp/dyMPJ3hQu3QdNULo4RKQgiw47L774ohyi23KLjY01nRf9Gh5++GH4+vrCzc0NU6ZMQV6ecTp+IkuRWmAMO1Gs1VFsGLrrgHGoa+SMykS2yqLDjtCvXz/k5OSYtq1bt5rOPfHEE/jpp5/w3XffYdOmTcjOzsYtt9yiaHmJWqpvArLKakydZql7hfu6wEVrgNbJDb9lGv8/EJHtsfgOyjqdDoGBgefcX1ZWhk8++QRff/01rrnmGnnfZ599hri4OOzYsQOXXXZZm69ZV1cnt2bl5Vw0kLpGbq0GYokmX1cHeDrbK10cm6Oxs0OkWxOOlOmwJqUaf1a6QESkCIuv2Tl58iSCg4MRFRWF6dOny/lLhMTERDQ0NGDcuHGmx4omrrCwMGzfvv28rzlv3jx4enqattDQ0C5/H2SbsquNv2JRPdiEpZQINz0MTQ04WdwgFwglIttj0WEnISEBixYtwurVq/HBBx8gNTUVo0ePRkVFBXJzc+Hg4AAvLy+z5wQEBMhz5zN37lxZM9S8ZWZmdvE7IZuk1SGv1jjHS5Qfm7CU4qQFqk8YvwAt3mn8skREtsWim7EmTpxoOo6Pj5fhJzw8HN9++y2cnZ0v+nUdHR3lRtSVnMLi0Wiwg6uDFgEe/PempIp9P8M17kr8uD8Lf50UC3cnNikS2RKLrtk5m6jF6dOnD5KTk2U/nvr6epSWlpo9RozGaq2PD1F3c+mdIPeRfq5c+FNhdZmHEeKhkzMqL9uXpXRxiKibWVXYEesFpaSkICgoCEOHDoW9vT3Wr19vOn/8+HHZp2fkyJGKlpPIYDDAOdoYdjgKyzKMj3KR+692ZMj/P0RkOyw67Pz5z3+WQ8rT0tKwbds23HzzzdBqtZg6darsWHzvvfdizpw52Lhxo+ywfM8998igc76RWETd4VRJI3TuftDaGRDqffFNrtR5ro4QkzpqcDyvAonpJUoXh4i6kUX32Tl9+rQMNkVFRejRoweuuOIKOaxcHAtvv/02NBqNnExQDCUfP3483n//fViKkpomwM6i8yR1kV3ZxoU8A5wM0Gn5b8ASuDpocMPAYHy75zS+2pGOYRE+SheJiLqJRYedJUuWnPe8k5MTFi5cKDdL9PbOUoQ+tgRb83XoZV8sZ3PlcgG2YfeZsBPsrFe6KNTC9IRwGXZ+PpSL5yfXw8fVQekiEVE34FfOLqLXG5Bd0QiNowvyajXYllIkh71mlXIWV7XLKKpGWmkjDPomBDLsWJSBoV7yS0d9kx7f7eGUE0S2gmGni2g0dvj39f7I/vQRDPRulLPnVtY14n+Jp7E/03wEGanLqsM5cl+bcRiOrMizONMTwuT+610Z8ksJEamfRTdjWTutxg4NBano7a7H5fFh+PVEPpJyKrDpRIGceyU6wF3pIlIXWHXYOKll9YnfgCvjlC4OnZGUlCT3YdDDxd4O6UXV+Gz1DgwObHsOJD8/PzkrOxFZN4adbuKg0+C6voFw1Gllzc6ao3lwd7ZHoIeT0kWjTpRTViP//4pZdWrkrL33KV0km1deXCD3M2bMMN3nPfZ+eAy7AXM/XY2C/73c5nOdXVxwLCmJgYfIyjHsdLPR0X4ora5HWlE1VhzIxozLwtlpWUVWn6nVifGzR1oVhzdbgppK40K/1z/wLGLih8rjigbglxwx8eNw3P/uD3Br5ZMwLyMFi199CoWFhQw7RFaOYUeBVZgn9g/Ckt0ZKKluwG/JhRgbF6B0saiTm7BG9nTCGqULQ2Z8g8MREt3PdPt4XRbSi6uRr/NHbLRxOgsiUid2UFaoSWtsrDHgHM4u5wgtlSioqMPutGJ5nBDC5klrGJklHM0uR0MTR80RqRnDjkJ6ejujX7CHPN5wLB9NHBVi9X45mguxCkF8iCf8XVlpaukifF3kKMm6Rj2O5VQoXRwi6kIMOwq6orcfnO21KK6qx6GsMqWLQ53UX2dCfy5Eaw3E4qwimAoHTpdyvSwiFWPYUZDomHxZlHHKetH8wap06yU6nW9PKZLHok8WWYd+QR7QaexQVFWP0yVsTiZSK4YdhfUL9oSHkw7V9U04dJq1O9Zq7dE8NOoNiA10R6Sfq9LFoXZytNciLsjDVLtDROrEsGMBEw+OiDTW7uxJL0F9I2t3rBGbsKzXwDNNWacKqlBe06B0cYioCzDsWIC4QA/ZUbKmoQkH+e3S6lTUNmDLyUJ5zCYs6+Pr5ogQb2eIHjsH2XeOSJUYdixkHa0REcbanf2nS8GBWdZFjKYTC0tG+bmiT4Cb0sWhizDozDD0w1ll7DtHpEIMOxYiJtBdrpdVVdeE09X832JNVhw0Lvw5cUCgHOFD1kf0s2oehn40xzjjMhGpB/+qWlDfnfgQ47fLk+X832JNo7B+PZ4vj28c1FPp4tAlzGzeXLuzL0PUrrJ6lUhN+FfVggzo6SmHwZY2aOAY2l/p4lA7l4doaDKOwurDVeytWt8gDzjqNCiraUBqYZXSxSGiTsSwY0GcHX4fBusx/Cali0Pt8OP+LLm/aTBrddSwjIv4wiHszeAirkRqwrBjYZqr0p17DUdhdZPSxaHzyCmrwc5U41pYkwcGK10c6qT1sjR2QHZpLYrr2P+KSC0YdiyMj6sDejjqYafRYt2paqWLQ+ex4kCOXAtLjKTr6eWsdHGoE7g56kzNkScr+PFIpBb8bbZAkW7Goa/rUqvRyGGwFmvZmSasGwaxVkdNhoR5y31WtQZa9x5KF4eIOgHDjgXq6aJHU1Upimv0cg4XsjzJ+RU4kl0uO5RfP4ATCapJD3dHhMpJBu3gPmyy0sUhok7AsGOBRJ+BykPr5PHinRlKF4dasXx/ttxf1acHvF0dlC4OdbLBZ2p33AeOR3UDa1eJrB3DjoWqPLBG7jefLMDpEvbdsSQGgwE/HjCGHTZhqVOErwvcdQZoHF3xSwp//4isHcOOhWoszUF/fwfZAXbpXmPfELIMB06XIb2oGs72WlzbN0Dp4lAXEDNh9/EwjoZcfqIKtQ0cGUlkzRh2LNiYCOMIn//tPS1rE8gyLNtnDJ/X9QuAi4NO6eJQFwlz1aOxLB+ltXp8l3ha6eIQ0SVg2LFgI0Oc5HpZaUXVSEznJGeWQIyOa14L6yYuD6H6vnPlu36Qxx/+msIFQomsGMOOBXPSaTDxzEif7/nN0iJsOlGAwso6+Lo64IpoP6WLQ12s8uAv8HLSIKu0xtQpnYisD8OOhfvj0BC5F7UJNfXsN6C07/acNi0PYa/lr4/aGRrrMbmPqzx+/9dk6PVsTiayRvy0tnBidt5QH2dU1jXil6O5ShfHphVV1mFdUp48vm1YqNLFoW4yvpcLPJx0SCmowuoj/B0kskYMOxZOo7HDLYONtTtsylLWsv3ZaNQbEB/iiZhArnBuK1zsNbh7VKQ8XrgxmYMFiKwQw44VmDLEGHa2Jhciu7RG6eLYJPEH7rs9mfL4Vtbq2Jx7Lo+Ai4NWzpr964kCpYtDRB3EsGMFwnxdkBDpY5xz58ywZ+peh7LKcCy3Ag46DW6I50SCtkbMkj09IUwev7eBtTtE1oZhx0pMOdNR+X+JnHNHCf/dZVy2Y2L/QHi62CtdHFLArNFRcNRp5DQQm08WKl0cIuoAzohmJSYNCMILPx7BqcIq7M0oxdBw49o91PWSklOxdK+xv9Qw71rs3bv3ws9JSuqGklF38vdwwp2XhePjral4fc0xXBntJ2daJiLLx7BjJdwcdZg4IBA/7M2SHZUZdrpHRkYGrpj+BNzHzEJ9YQbumvCHDj2/srKyy8pG3e+hq3vJWr7DWeVYfTjXNA8WEVk2hh0r8schITLsrDiYjRcm94WTvVbpIqleQUEBHPuNk8fDegcjeqFxRt0LSdq1Cas+fxe1tbVdXELqTr5ujrj3ikj8a0My3lx7Atf1C4RWTLVMRBaNYceKXBbli2BPJ2SX1cr5Xv7AjrJd7kRxAxz8I6GxM2BkfJ92B8y8jJQuLxsp474ro/D59nQk51fKddKa+9MRkeViB2Urm3Pn5iE9TR2VqeutTq6W+1AXPWvSSPJwsseDV/WSx++sP4H6Rq6ZRWTpGHaszC1n5twRo0HyK9hE0pXE9f0t0zivUZQb/6DR72ZeHo4e7o7ILK7BN2fmXyIiy2XRYWfevHkYPnw43N3d4e/vj5tuugnHjx83e8zVV18tR0S03B588EGoVa8ebhgc5oUmvQE/7uPChF1p8Y4MiC/ttVlJ8HHkcH/6nYuDDrPH9JbHC9af5Lp1RBbOosPOpk2b8PDDD2PHjh1Yu3YtGhoacN1116GqqsrscbNmzUJOTo5pe+2112ALMyr/by/n3OkqdY1NWLwzXR5X7FmudHHIAt0xIhQ9vZyRX1GHz7alKl0cIrLWsLN69Wrcfffd6NevHwYOHIhFixbJocCJiYlmj3NxcUFgYKBp8/DwgJpNjg+Gg1YjZ/QV09dT51t5MAeFlfXwcdag+sQ2pYtDFshRp8WT1/WRxws3JLNZmciCWXTYOVtZWZnc+/j4mN2/ePFi+Pn5oX///pg7dy6qq42dSttSV1eH8vJys82aiBl8x/X1l8diKDp1LlFb9ulvxm/qE3q5Ano2UVDrbhrUEwNDvVBV34TXV5s3sROR5bCasKPX6/H4449j1KhRMtQ0mzZtGr766its3LhRBp0vv/wSM2bMuGBfIE9PT9MWGhpqtU1ZP+7PQkMTO892pt+Si+SkcU72GlzXy0Xp4pCFj5AUc14J3yWexoHMUqWLRETWHHZE353Dhw9jyZIlZvfff//9GD9+PAYMGIDp06fjiy++wNKlS5GS0vY8JyIUiVqi5i0z0/pGU1zZpwf83BxQVFWPTce5CnNn+vdm47+dO4aHwcPRan5FSCFDwrxxy2DjlBAvrzjKfnREFsgqPslnz56NFStWyNqbkJDzT+CVkJAg98nJyW0+xtHRUfbrablZG3utBjcOOjPnzpl1m+jSHc4qw5aThXJWXDFTLlF7/GVCLJzttXKR0OUHOEqSyNJYdNgR35BE0BE1NRs2bEBk5IX/+Ozfv1/ug4LUv2ZNc1PW+qR8lFTVK10cVfj35lNy/4f4IIT6sAmL2ifQ0wkPjzFONDh/1TFU1zcqXSQispawI5quRH+cr7/+Ws61k5ubK7eaGuNEb6Kp6pVXXpGjs9LS0rB8+XLcdddduPLKKxEfHw+16xvsgbggD9Q36bFsPzsqX6rUwiqsPGj8Vv7AlcY/XETtdd/oKIR4OyOnrBYfbjKGZiKyDBYddj744APZp0ZMHChqapq3b775Rp53cHDAunXr5Nw7sbGxePLJJzFlyhT89NNPsBV3DDd2rv5mdyb7ClyiBRtOQm8Aron1l0GSqCPEciLPToqTx//elIL0IvP5wIhIORa9EOiF/niLUVRi4kFbH/r6j5+T5Jw7B0+XyWGwdHG1OmJRR+HxcdFKF4es1IT+gbiitx+2Jhfi2aWH8eW9I+Ss7kSkLIuu2aH2zbkzsX+gPOYaPRdPTPkvanXGxvojPoSBkS6OCDZ/v6k/HHUaGXiWngnQRKQshh0VuP1MU9by/dnsGHkRThVUmvo8PcZaHbpEEX6ueHSs8d/R31cmoZiDB4gUZ9HNWNQ+l0X6ItzXBelF1VhxMAe3DbO+SRKV9MYvx1mrQ21KSkrq8HMmRPhgeYA7judV4PkfD+O9aUO6pGxE1D4MOyqZxVXU7ry2+jgW78xg2OmAfRkl+PlQLkS3iqcmxChdHLIg5cXGyTovNCN7a5xdXLBsUyIe+qFSfgGZNEBs6p8Og8hSMeyohAg476w9KaerP3i6lDUU7ewAP2/VMdOcRbGBHIFFv6upNK6Zd/0DzyImfmi7n5eXkYLFrz4FP001/u/qXliwIRl/W3YYIyJ94Ofm2IUlJqK2MOyohPgQnTQgEMv2Z+OrHel47Y8MOxey4Vg+dqUWy86kc641rl5NdDbf4HCERPe7qOc+ck001h7Nk6Mln/nfIfznrqEcnUWkAHZQVpE7R4bL/Y/7s1FW3aB0cSxaXWOT7Dwq3D0qAsFezkoXiVTIQafBW7cNgoNWg3VJefhqZ4bSRSKySQw7KluQUMyoXNeox3eJHIZ+Pp9uTZNz64gasdljeitdHFIxMUHl0xNj5fHfVxzFibwKpYtEZHMYdlREVI/feZmxdufz7WloEkOM6Bw5ZTVytmThr5Ni4e5kr3SRSOXuuTwCV/XpIb+IzP56L6eIIOpmDDsqc/PgnvBysUdmcQ1+OZKrdHEs0j9WJqG6vgnDwr3l9SLqjhGTb9w6ED3cHXEirxJzfzjE5V2IuhHDjso4O2gxI8FYu/Px1lSli2Nx1iflyaHAGjvgxRv6sbModRsRdBZOGwKtxk72q/tyR7rSRSKyGQw7KnTX5eGyQ2Riegn2ZpQoXRyLUV7bINcrEmaNjkL/np5KF4lsjBh+PvdM/52XfzqKHaeKlC4SkU3g0HMV8nd3wg2DgvF94ml8vOUU3p/e/jlC1Gz+qmPILa9FhK8LHh/HoeakzMzLg10MuDzUCdsyazFr0U68Os4PgW7Gj2I/Pz+EhYV1c0mJ1I9hR6XuGx0pw87qw7lIKahErx5usGWbThTg6zPDfufdEi+b+4iUmnnZTueIgGnzgKA+uO+LROR+9RQMdVVy5uVjSUkMPESdjGFHpcRswOPi/LEuKR8LNyTjrdsHwVYVVtbhyW8PyOO7RoZjZC9fpYtEKtbemZdrGoGNeQbALwxDnv4voutOYMmrf0ZhYSHDDlEnY9hRMbHysgg7YkVvcSxWY7Y1YsTL098flIGnT4Ab/jopTukikY1oz8zLXiF1sga2sA6wd+4D2LEbJVFX4G+Wion1scbE9JArei/cmAxb9MnWVKw/li9nsn33jsFwsmfzFVnWCK3JA4PkCK2cGg18Jz7G+bGIugDDjsqJGh3hh31ZSCusgi3ZnlJkWujz2UlxcnZpIksT4u2CCf0CYQcD3AaMxft7yqBn4CHqVAw7Kjc4zBtXx/SQ3xZfW2P8w28rsySLmWrF+xYTB4q+OkSWqre/G0b4NsGgb8LGtBo89f1BNDbplS4WkWow7NiAuRPj5CR6Px/KRWJ6MdSusq4R932+B0VV9egb5IF/3jyAkweSxQtx1aPwpzfk7+r/9p7Gg1/tRW1Dk9LFIlIFhh0bEBPojtuGhcpjsdK3mqepF9+GH168F0eyy+Hr6oB/3zmUw8zJalQf24K/XO4t+5iJVdLv+mQXSqrqlS4WkdVj2LERc67tA2d7LfZllOKngzlQIxHixAzJYk4dJ3sNPrl7OEJ9XJQuFlGHjOjphC//NALujjrsSivGjQt/w0mulE50SRh2bIS/hxMevKqXPH5lxVGUVTdAbUHnpZ+O4ps9mbIZYMHUIRgU6qV0sYguSkKUL75/6HKEeDsjo7gaN7+/TU4QSkQXh2HHhjxwVRSieriioKIO81e3PpW9tQadf/6chEXb0iC65rz2x4G4tm+A0sUiuuTm5x8fHiXX0xL90B78KhEvLj+Cukb24yHqKE4qaEPEHDPzbh6A2z/agf/uysRNg3rKb5DWTIy2ev7Hw1h8ZikI0Rn5j0NDWn1sRkaGnJ22M9Y3IuoOvm6OWHxfAl5fcxwfbT4lA71YPPSNWwdyIVuiDmDYsTEi3EwdESrDzp+/P4CVj46Gh5M9rJH4hjvn2wNYeTBH1ui8cmN/TB0R1mbQiY2LQ0119UX9rMrKykssLdHFsddq5MzfCZE+ckj6sdwK3LTwNzx0dS88PKY3J8okageGHRv0zMQ4bDlZiMziGsz94RDemzrY6oZmi+UfHvwyEXvSS2CvtcPbtw/CH+KD2358YaEMOtOffh0BYca+S+2RtGsTVn3+Lmprazup5EQXZ2xcAH554ko8t+wwVh3OxYINyXIpmBf+0A9j4/yt7neYqDsx7NggT2d7LJg6GLd+uF3Wiozq5YdpCdaz8ODhrDI88GUiskpr5IiV92cMwejoHu16rgg6F1qvqKW8jJRLKClR5/Jzc8T704fIsPPyT0flF5b7vtgja32enhiLIWHeSheRyCIx7NjwzMpPjY+RyymITo9yBtdIH1h6R+QvtqfjHyuTUN+kR6SfK/5z1zBZdiJbIWpwJg0IwlV9esjanU9/S8XO1GLc8v42DAxwwI0xbnLfnpoePz8/rrBONoFhx4bNGh2FvRklWHMkD7O+2IP/PTQSvf3dYYnyymvx7NJDchV3YVycP968dRA8XayzvxHRpXJ11OGZibEYG6bDH575AE5xV+FAXj0O5BWjPj8V5buWoippM6BvbPM1nF1ccCwpiYGHVI9hx4ZpNHZyJfBp/9mBvRmlmPnpbnzzwGVyYUJLIRZE/D7xNF5ZeRQVtY1w0Grw4MgAXBVkQMqxQ+1+HY6qIrXS1pUjf8VbmNIvDKXukUit1MDBPxJ+f5iDnjc8gVBXPcJc9fCyN8iO/C2baBe/+pTsz8awQ2rHsGPjxEiOj2cOxx8/2IZThVWyH8+X946wiBqefRklcqLA/Zml8nZ8iCeeGOWP668YzFFVRGcJDwvDqOhYuZ6W6Ncmfm+q6puQXKGVm4+rA2ID3WWzr7eLg9LFJepWDDskPwQXz0rAnZ/sQnJ+pQw8oi/MsAhl+vAk51fg7XUnZedpwcVBi8fHReNPoyJx8MB+jqoiusAXGPG7K/rlidmXj+WUI6WwCsVV9diWUiQ3bxd7+Gm1cAzpJ+eqIlI7hh2Sgjyd8e0DI3H3Z7tw8HSZnHhQdGC+f3SUbO7qDgdPl+I/W1Kx8mA2mj9/bxncU44yCfBwMnssR1URnZ9WYyc78YtNzEl1Mr8SJ/IqkFVSg5LqBpRAi8Dpr2Lmj3kYeXg3RvbyxWVRvogL8pDPJVIThh0yq+H5etZl+OsPh7D8QDbmrzqGjcfy8cLkfugb7NElP7OmvgmrDufgv7sysDutxHT/dX0D8MS1feQHLxFdGkedFv2DPeUmgk9GUTUOn8pCalEVquGB9cfy5SZ4OOkwIlIEHx8Mj/CRv4NiFXYia8awQ2bcHHV4945BGNXbFy8sPyKHtP5hwRZMGRKCe0dHIjbw0sOH6FPwW3Ihvt2ejC2pZahuMFbjaO2AK8KccUMfV0R6a1CTk4y9Zy3Qzo7GRJcefKID3OFc3oQtL87Aqx8tRqVLMI4U1ONoQT3KaxuxLilPboK9Boj0tke0jz36+DrIfb/wAISHhyv9VojajWGHziHm57h9eBhG9faT8/CIvjPfJZ6W24gIH4zvH4gxMT1k9Xh75vIQixgeOl2GfZkl2J5ShF2pxahr1JvON5TmovLgL6g6tB6nKovwRTvKyI7GRJemvLgAMOjx9Kypv99pp4FDQC84hQ2AU1g8HIJjAGd3nChqkNvKk8aBAfrqZCTEpGFIlD/6BnnITXwe6LSsASLLxLBDbRJD0BdOG4I/jSrBJ1tPyfl4dqUVy+2VFcbqblHT09PbWY7uEB2JmwwG1DXoUVRVh/zyOqQVVSGn7NxOwb7OGqRuWYZRw+IRPSAYdvF3ABDb+bGjMaldR2svL7a2s6ayXO6vf+BZxMQPbfUxBgNQ2ViPknoNiuvsUFxvh9J6O2hcPLE7s1JuzRx1GrlSe1ygB3r5uyLKzw2RPVwR5uMi1/e6FBeziK/ASROpGcMOXdDQcG8MDR+KnLIaWcuz8Xi+rJ0R1d0i+CDtwq8R5Okkp7IfHOYlZ34tP30Cw178CH1u+YEdjYmaa1oAzJgx46Kef7G1nb7B4R36HUw/cQQf/OMZvPTuJ6i090RSTgWScspRXd8kBzeIrSXR2VkEnig/V4T7uiLYywmBnk7yM0EMjPB3dzxvjdClLOLLSROpGcMOtZv4YLpvdJTcRCfHlPwqObpDzG4sRneIvjgaOzvY6+zg6+og1/ERH269erjC66x5PfZmcbQHUUdrWiyhtlP0ravPOYHrerlgyJABpsk/04urZegRQ93FnF2nCqqQWliFmoYmuRdba8TArx7ujnITNcRi7T4vF3t4OTvIfVlBNhAyEJNuvhO+/kHQ2YkAZZDlEJu8bSea381fl5MmkirDzsKFC/H6668jNzcXAwcOxIIFCzBixAili6XqTo5ihFZXjdIislUdrWmxhNpOTYth7mLdrpbr2eWV1+FUQaUMQGLeH9GsnVtWI/fii1JDk/ExYmuL/83P4og4yD9PGezEZidrksQe2lj0fOBjzF6VD/dNm6HT2snmNHvT/vdjXfOxRiO/rLU8r9No5Gg0ncbO9Dhxn/H1xM/TwP7MOXnfmXPNjxd748/4/b6zHy/KLF6LK9d3HVWEnW+++QZz5szBhx9+iISEBLzzzjsYP348jh8/Dn9/f6WLp3oX057OUVVE1q0jv8Nilqy+DsCV/UUfmjjT/aJGqLCqDjmltXLSw5LqepRWN6C0pgFl1eJ2AzLyirBjz14ERsbBzt5RhqNGvR6Ncv/7hIjiUG9oeZ8ddF6ByK5oAioqYA1EYBOj/LUytP2+FyFJ1mSd2cvb4n47O9hBL8OUtsV9bT1X1+J+DzdX+Pp4y/PNIdFssxOBzHhOPubMfcVFhaisKJevKQOmfL7xWJw37puD5+8h1M/XB/F9IhXrxK6KsPPWW29h1qxZuOeee+RtEXpWrlyJTz/9FM8884zSxVO1S2lPFziqish2+had3YdG/KH0d3eSW1v27t2LoU88jekLRf++GLNzhjPhpqFJD70ecoCECFBin5OegsWvPY1PPvsckb16y8eIoGTcG48bzxzXtzgW9xeVlOKjjz+Vr22n1ckNGh3sNFpA3NZoYafRAVot7OzEfWdui/vPnJfHbd0nn3fuH32R0+qb5DtrfofoOpWiXhDdJx9fTm3C6IF9oASrDzv19fVITEzE3LlzTfdpNBqMGzcO27dvb/U5dXV1cmtWVmbsUFdebmwz7yzNf8hPnzyCupr2h4GC06lyL95XR8OAeO968VvfQRf7PFF7JoLOmFvvhVeP36uvLyTjxCEkrvsRaccOdmikRnOVfW7aCaS4tn/BUj7Pup9nTWVV+/PSju6T++ETb0dIZHS7n1dakION332CNWvWICbGPLRc6DPmYj5Hq06nyr5FNRmH0ORcD/Ep43hma5Xdmb+IOuB42XEUrP33mc+1tloHxGryja1+rp1zbUSAkSHmdyLGGGAnt9PJSdi3ZQ2GjLsFAaFRv5+zM57Xy8IZj42b8XxhTgZSDu9Dr8Gj4NUjoMX5Fpt8DZhui9epra1GdupJXD5qNNzc3c/UihlrxkQx5bHeYHa/2FdW1yItPQPu3r7Q6BxM5TO+n+YmOPMyGm8bn5+TdRrlkYHoTM1/t0XwPS+DlcvKypLXdNu2bWb3P/XUU4YRI0a0+pwXXnjB+P+BGzdu3Lhx42aw9i0zM/O8WcHqa3YuhqgFEn18mokajeLiYvj6+nZqBzGROENDQ5GZmQkPD3bkPR9eq/bjtWo/Xqv24XVqP14ry7pWokanoqICwcHB532c1YcdMWmUVqtFXp5526O4HRjYenWZo6Oj3Fry8vLqsjKK/8n8pWgfXqv247VqP16r9uF1aj9eK8u5Vp6enhd8jNXP7e3g4IChQ4di/fr1ZjU14vbIkSMVLRsREREpz+prdgTRJDVz5kwMGzZMzq0jhp5XVVWZRmcRERGR7VJF2Ln99ttRUFCA559/Xk4qOGjQIKxevRoBAQGKlks0lb3wwgvnNJnRuXit2o/Xqv14rdqH16n9eK2s81rZiV7KSheCiIiIqKtYfZ8dIiIiovNh2CEiIiJVY9ghIiIiVWPYISIiIlVj2OlCCxcuREREBJycnORq7Lt27YIt2bx5MyZPnixnthQzUy9btszsvOgbL0bQBQUFwdnZWa5ndvLkSbPHiJmtp0+fLiekEhM/3nvvvapcPHTevHkYPnw43N3d4e/vj5tuusm0JlCz2tpaPPzww3Kmbzc3N0yZMuWcyTTFwqzXX389XFxc5Os89dRTaGw0X7/Hmn3wwQeIj483TVIm5tJatWqV6TyvUdvmz58vfw8ff/xx0328XkYvvviivDYtt9jYWNN5XidzWVlZciFYcT3EZ/eAAQOwZ88ey/5s78x1quh3S5YsMTg4OBg+/fRTw5EjRwyzZs0yeHl5GfLy8gy24ueffzY8++yzhh9++EGuXbJ06VKz8/Pnzzd4enoali1bZjhw4IDhhhtuMERGRhpqampMj5kwYYJh4MCBhh07dhi2bNli6N27t2Hq1KkGtRk/frzhs88+Mxw+fNiwf/9+w6RJkwxhYWGGyspK02MefPBBQ2hoqGH9+vWGPXv2GC677DLD5Zdfbjrf2Nho6N+/v2HcuHGGffv2yevv5+dnmDt3rkEtli9fbli5cqXhxIkThuPHjxv++te/Guzt7eV1E3iNWrdr1y5DRESEIT4+3vDYY4+Z7uf1+n29xH79+hlycnJMW0FBgek8r9PviouLDeHh4Ya7777bsHPnTsOpU6cMa9asMSQnJ1v0ZzvDThcRi5A+/PDDpttNTU2G4OBgw7x58wy26Oywo9frDYGBgYbXX3/ddF9paanB0dHR8N///lfePnr0qHze7t27TY9ZtWqVwc7OTi4Aq2b5+fnyvW/atMl0bcQf9e+++870mKSkJPmY7du3y9viA1aj0Rhyc3NNj/nggw8MHh4ehrq6OoNaeXt7Gz7++GNeozZUVFQYoqOjDWvXrjVcddVVprDD62UedsQf3tbwOpl7+umnDVdccYWhLZb62c5mrC5QX1+PxMREWXXXTKPRyNvbt29XtGyWIjU1VU4A2fIaifVNRHNf8zUSe1G9KWbGbiYeL67lzp07oWZlZWVy7+PjI/fi31NDQ4PZ9RLV7GFhYWbXS1Qnt5xMc/z48XIxviNHjkBtmpqasGTJEjlbumjO4jVqnWh+Ec0rLa+LwOtlTjSziCb3qKgo2bwimqUEXidzy5cvl5/Jt956q2yuGzx4MP7zn/9Y/Gc7w04XKCwslB/EZ8/gLG6LfwQE03U43zUSe/HL1JJOp5MBQM3XUaztJvpVjBo1Cv3795f3ifcr1oE7e8Has69Xa9ez+ZxaHDp0SPabELOyPvjgg1i6dCn69u3La9QKEQb37t0r+4Sdjdfrd+IP8aJFi+TM+6JfmPiDPXr0aLmaNq+TuVOnTslrFB0djTVr1uChhx7Co48+is8//9yiP9tVsVwEkdq+iR8+fBhbt25VuigWKSYmBvv375e1X99//71cF2/Tpk1KF8viZGZm4rHHHsPatWvlIAlq28SJE03HogO8CD/h4eH49ttvZQdbMv8yJmpk/vnPf8rbomZHfF59+OGH8nfRUrFmpwv4+flBq9We01tf3A4MDFSsXJak+Tqc7xqJfX5+vtl5MbpB9OJX63WcPXs2VqxYgY0bNyIkJMR0v3i/onm0tLT0vNertevZfE4txLfs3r17Y+jQobLGYuDAgXj33Xd5jc4iml/E78+QIUPkt2axiVD4r3/9Sx6Lb9q8Xq0TtTh9+vRBcnIy/12dRYywEjWpLcXFxZma/Sz1s51hp4s+jMUH8fr1683SsLgt+hYQEBkZKf9Rt7xGon1btNc2XyOxFx8w4kO72YYNG+S1FN+81ET04RZBRzTJiPcork9L4t+Tvb292fUSQ9PFB0zL6yWaeFp+iIhv9WJo59kfTmoi/j3U1dXxGp1l7Nix8r2KWrDmTXwjF/1Rmo95vVonhkCnpKTIP+z8d2VONK+fPS3GiRMnZE2YRX+2d0m3Z5JDz0Xv80WLFsme5/fff78cet6yt77aiVEgYhim2MQ/tbfeeksep6enm4Ynimvy448/Gg4ePGi48cYbWx2eOHjwYDnEcevWrXJUiRqHnj/00ENyqOavv/5qNvy1urrabPirGI6+YcMGOfx15MiRcjt7+Ot1110nh6+vXr3a0KNHD1UNf33mmWfkCLXU1FT5b0bcFiM4fvnlF3me1+j8Wo7GEni9jJ588kn5uyf+Xf32229yCLkYOi5GRQq8TubTGOh0OsM//vEPw8mTJw2LFy82uLi4GL766ivTYyzxs51hpwstWLBA/oKI+XbEUHQxn4At2bhxoww5Z28zZ840DVF87rnnDAEBATIYjh07Vs6d0lJRUZH8BXBzc5PDOO+55x4ZotSmteskNjH3TjPxQfF///d/cqi1+HC5+eabZSBqKS0tzTBx4kSDs7Oz/LAWH+INDQ0GtfjTn/4k5/gQv1Pij4n4N9McdAReo46FHV4vo9tvv90QFBQk/1317NlT3m45bwyvk7mffvpJhjvxuR0bG2v46KOPzM5b4me7nfhP19QZERERESmPfXaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoioW6SlpcHOzk6uy3QpIiIi8M4778AaLVq0SC4ySUTdi2GHiGwWwweRbWDYISK6RE1NTXLFZiKyTAw7RNSpxB/91157Db1794ajoyPCwsLwj3/8w3T+1KlTGDNmDFxcXDBw4EBs377d7Pn/+9//0K9fP/lc0WT15ptvnvfnlZaW4r777kOPHj3g4eGBa665BgcOHDCdF8fi57m7u8vzQ4cOxZ49e/Drr7/innvuQVlZmWxeE9uLL74on1NXV4c///nP6NmzJ1xdXZGQkCAff3aN0PLly9G3b19Z1oyMDJSUlOCuu+6Ct7e3fH8TJ07EyZMnO/HqEtHFYNghok41d+5czJ8/H8899xyOHj2Kr7/+GgEBAabzzz77rAwSou9Onz59MHXqVDQ2NspziYmJuO2223DHHXfg0KFDMnyI1xHhoi233nor8vPzsWrVKvn8IUOGYOzYsSguLpbnp0+fjpCQEOzevVuef+aZZ2Bvb4/LL79c9v0RASgnJ0duolzC7NmzZQhbsmQJDh48KH/GhAkTzIJLdXU1Xn31VXz88cc4cuQI/P39cffdd8sgJUKQeL5YZ3nSpEloaGjowitORBfUZeupE5HNKS8vNzg6Ohr+85//nHMuNTXVID5yPv74Y9N9R44ckfclJSXJ29OmTTNce+21Zs976qmnDH379jXdDg8PN7z99tvyeMuWLQYPDw9DbW2t2XN69epl+Pe//y2P3d3dDYsWLWq1vJ999pnB09PT7L709HSDVqs1ZGVlmd0/duxYw9y5c03PE+Xev3+/6fyJEyfkfb/99pvpvsLCQoOzs7Ph22+/bfPnEVHXY80OEXWapKQk2QQkalbaEh8fbzoOCgqSe1Ez0/z8UaNGmT1e3BY1KqJfzNlEE1VlZSV8fX3h5uZm2lJTU5GSkiIfM2fOHNnMNW7cOFnj1Hx/W0SNkvhZotap5Wtu2rTJ7LkODg5m70WUXafTySavZqJcMTEx8hwRKUen4M8mIpVxdna+4GNEE1Iz0U9GuNjOvSLoiMDUsj9Ns+ZRVqIpbNq0aVi5cqVs6nrhhRdk89TNN9/c5mtqtVrZ5CX2LYnQ0/K9NpefiCwbww4RdZro6GgZAtavXy9rUzoqLi4Ov/32m9l94raoZTk7eAiif05ubq6sURGdmdsini+2J554QvYR+uyzz2TYEbUzZ9cYDR48WN4naptGjx7dobKLvkc7d+6U/YGEoqIiHD9+XHZiJiLlsBmLiDqNk5MTnn76afzlL3/BF198IZt9duzYgU8++aRdz3/yySdlUHrllVdw4sQJfP7553jvvfdMHYfPJpqmRo4ciZtuugm//PKLnLhw27ZtshO06ChcU1MjOxuLmp/09HQZnERHZRFMBBGQRE2O+JmFhYWy07EIRaJTsxhV9cMPP8gmsV27dmHevHmyduh8Qe/GG2/ErFmzsHXrVtnENmPGDDmiS9xPRArqhn5BRGRDmpqaDH//+99lR2J7e3tDWFiY4Z///Kepg/K+fftMjy0pKZH3bdy40XTf999/LzskNz/39ddfN3v9lh2UmztFP/LII4bg4GD5nNDQUMP06dMNGRkZhrq6OsMdd9wh73NwcJCPmT17tqGmpsb0/AcffNDg6+sry/HCCy/I++rr6w3PP/+8ISIiQr5mUFCQ4eabbzYcPHjwvB2Ni4uLDXfeeac8Jzomjx8/XnZcbsYOykTKsBP/UTJsEREREXUlNmMRERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBEREdTs/wHhPa5jeeWfxwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.histplot(df['cholesterol'], kde=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "73099f3b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\User\\AppData\\Local\\Temp\\ipykernel_20212\\182116797.py:2: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n", + "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n", + "\n", + "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n", + "\n", + "\n", + " df['cholesterol'].fillna(df['cholesterol'].median(),inplace=True)\n" + ] + } + ], + "source": [ + "df.loc[df['cholesterol']==0, 'cholesterol']= np.nan\n", + "df['cholesterol'].fillna(df['cholesterol'].median(),inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "211ca28a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGwCAYAAABPSaTdAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQbdJREFUeJzt3Qd81PX9x/FPLpe9GSGDhD3CRkBEcSAowwXyt2rRukqrFqviRCuoVXEVbdVKrQraitaFAxVEQGaYsgk7rISQQMjed7//4/sNdyZskkvu7nevZ/vz97u739198yPJvfOdfoZhGAIAAGBSFncXAAAAoCERdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKlZ3V0AT2C32yUzM1MiIiLEz8/P3cUBAABnQU0VWFhYKAkJCWKxnLr+hrAjooNOUlKSu4sBAADqYP/+/dKyZctTPk7YEdE1Oo6LFRkZ6e7iAACAs1BQUKArKxyf46dC2BFxNl2poEPYAQDAu5ypCwodlAEAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKlZ3V0AwJd0SukimRkZpz0nITFRtqVtabQyAYDZEXaARqSCzrNfrDrtORNH92u08gCAL6AZCwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmJpbw87kyZOlX79+EhERIbGxsTJy5EjZtm1brXPKysrkT3/6kzRt2lTCw8Nl9OjRcujQoVrn7Nu3T6666ioJDQ3Vr/PII49IVVVVI381AADAE7k17CxcuFAHmeXLl8vcuXOlsrJSrrzySikuLnae8+CDD8q3334rn332mT4/MzNTrr/+eufjNptNB52KigpZtmyZfPDBBzJ9+nSZOHGim74qAADgSfwMwzDEQ+Tk5OiaGRVqLrnkEsnPz5fmzZvLjBkz5P/+7//0OVu3bpWUlBRJTU2VCy64QH744Qe5+uqrdQhq0aKFPmfq1Kny2GOP6dcLDAw84/sWFBRIVFSUfr/IyMgG/zrhuyIio+TZL1ad9pyJo/tJYUF+o5UJALzV2X5+e1SfHVVYpUmTJnq/Zs0aXdszZMgQ5zmdO3eW5ORkHXYUte/evbsz6ChDhw7VF2Dz5s0nfZ/y8nL9eM0NAACYk8eEHbvdLg888IBcdNFF0q1bN31fVlaWrpmJjo6uda4KNuoxxzk1g47jccdjp+orpJKgY0tKSmqgrwoAALibx4Qd1Xdn06ZN8sknnzT4e02YMEHXIjm2/fv3N/h7AgAA97CKBxg3bpzMmjVLFi1aJC1btnTeHxcXpzse5+Xl1ardUaOx1GOOc1auXFnr9RyjtRznHC8oKEhvAADA/Nxas6P6RqugM3PmTJk/f760adOm1uN9+vSRgIAAmTdvnvM+NTRdDTUfMGCAvq32GzdulOzsbOc5amSX6qjUpUuXRvxqAACAJ7K6u+lKjbT6+uuv9Vw7jj42qh9NSEiI3t91110yfvx43WlZBZj77rtPBxw1EktRQ9VVqLn11lvl5Zdf1q/xl7/8Rb82tTcAAMCtYeftt9/W+8suu6zW/dOmTZPbb79dH7/22mtisVj0ZIJqFJUaafXPf/7Tea6/v79uArvnnnt0CAoLC5PbbrtNnn322Ub+agAAgCfyqHl23IV5dtBYmGcHAHx8nh0AAABXI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTc2vYWbRokVxzzTWSkJAgfn5+8tVXX9V6/Pbbb9f319yGDRtW65zc3FwZM2aMREZGSnR0tNx1111SVFTUyF8JAADwVG4NO8XFxdKzZ0956623TnmOCjcHDx50bh9//HGtx1XQ2bx5s8ydO1dmzZqlA9Qf/vCHRig9AADwBlZ3vvnw4cP1djpBQUESFxd30sfS0tJk9uzZsmrVKunbt6++74033pARI0bIq6++qmuMAACAb/P4Pjs///yzxMbGSqdOneSee+6RI0eOOB9LTU3VTVeOoKMMGTJELBaLrFix4pSvWV5eLgUFBbU2AABgTh4ddlQT1ocffijz5s2Tl156SRYuXKhrgmw2m348KytLB6GarFarNGnSRD92KpMnT5aoqCjnlpSU1OBfCwAA8MFmrDO56aabnMfdu3eXHj16SLt27XRtz+DBg+v8uhMmTJDx48c7b6uaHQIPAADm5NE1O8dr27atNGvWTHbu3Klvq7482dnZtc6pqqrSI7RO1c/H0Q9Ijd6quQEAAHPyqrBz4MAB3WcnPj5e3x4wYIDk5eXJmjVrnOfMnz9f7Ha79O/f340lBQAAnsKtzVhqPhxHLY2Snp4u69at031u1PbMM8/I6NGjdS3Nrl275NFHH5X27dvL0KFD9fkpKSm6X8/YsWNl6tSpUllZKePGjdPNX4zEAgAAbq/ZWb16tfTu3VtviupHo44nTpwo/v7+smHDBrn22mulY8eOerLAPn36yOLFi3UzlMNHH30knTt31n141JDzgQMHyjvvvOPGrwoAAHgSt9bsXHbZZWIYxikfnzNnzhlfQ9UAzZgxw8UlAwAAZuFVfXYAAADOFWEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYGmEHAACYWp3CTtu2beXIkSMn3J+Xl6cfAwAA8Oqws2fPHrHZbCfcX15eLhkZGa4oFwAAgEtYz+Xkb775xnk8Z84ciYqKct5W4WfevHnSunVr15QMAACgscPOyJEj9d7Pz09uu+22Wo8FBATooPO3v/3NFeUCAABo/LBjt9v1vk2bNrJq1Spp1qyZa0oBAADgCWHHIT093fUlAQAA8JSwo6j+OWrLzs521vg4vP/++64oGwAAgHvCzjPPPCPPPvus9O3bV+Lj43UfHgAAANOEnalTp8r06dPl1ltvdX2JAAAA3D3PTkVFhVx44YWuLAcAAIDnhJ3f//73MmPGDNeXBgAAwBOascrKyuSdd96Rn376SXr06KHn2KlpypQpriofAABA44edDRs2SK9evfTxpk2baj1GZ2UAAOD1YWfBggWuLwkAAICn9NkBAAAwdc3OoEGDTttcNX/+/PqUCQAAwL1hx9Ffx6GyslLWrVun++8cv0AoAACA14Wd11577aT3P/3001JUVFTfMgEAAHhmn51bbrmFdbEAAIB5w05qaqoEBwe78iUBAAAavxnr+uuvr3XbMAw5ePCgrF69Wp566qn6lQgAAMDdYScqKqrWbYvFIp06ddIroV955ZWuKhsAAIB7ws60adPq/84AAACeGnYc1qxZI2lpafq4a9eu0rt3b1eVCwAAwH1hJzs7W2666Sb5+eefJTo6Wt+Xl5enJxv85JNPpHnz5q4pHWACWfll8sUvB+TnbdkS2HGgu4sDAD6nTqOx7rvvPiksLJTNmzdLbm6u3tSEggUFBfLnP//Z9aUEvNS0pely4Yvz5JU522TVnqMSMeReWb8/z93FAgCfUqeandmzZ8tPP/0kKSkpzvu6dOkib731Fh2UgWN25RTJ5O+3it0Q6dc6RhKjQ+SrdZny8/YcsRuG9E6OcXcRAcAn1Klmx263S0BAwAn3q/vUY4CvU9MxTPp6s1TY7HJZp+by6R8HyGs39pKS1TP140t2Hpbi8ip3FxMAfEKdws7ll18u999/v2RmZjrvy8jIkAcffFAGDx7syvIBXmnWhoM60ARZLfLstd30wrlqK135mcRHBevang0H8t1dTADwCXUKO2+++abun9O6dWtp166d3tq0aaPve+ONN1xfSsCLVNns8sL31aMU/zSovSQ3Da31eO/k6k79GzLy9LkAAA/ss5OUlCS//PKL7rezdetWfZ/qvzNkyBBXlw/wOot3HpaD+WXSJCxQ/nBJ2xMeb9c8XCKDrVJQViVpWYXSPbH2JJ0AADfW7MyfP193RFY1OKpK/oorrtAjs9TWr18/PdfO4sWLXVxEwLt8seaA3l/bM0GCA/xPeNzi5ye9kqprd9bty9P9ewAAHhJ2Xn/9dRk7dqxERkaedAmJP/7xjzJlyhRXlg/wKvmllfLjlkP6ePR5LU95XpeESAn0t0huSYWuBQIAeEjYWb9+vQwbNuyUj6th52pWZcBXfb/xoFRU2aVji3DplnjiHwUOQVZ/adMsTB+nHy5uxBICgO85p7Bz6NChkw45d7BarZKTk+OKcgFe3YSlanVUU+/pEHYAwAPDTmJiop4p+VQ2bNgg8fHxrigX4HX2HSmR1XuPisVPZFTvxDOe36ppqKg8dKS4QgpKKxuljADgi84p7IwYMUKeeuopKSs7sY9BaWmpTJo0Sa6++mpXlg/wGvO2VvfV6d+mqcRGBp/xfNV5Wc25o6QfoXYHADxi6Plf/vIX+fLLL6Vjx44ybtw46dSpk75fDT9XS0XYbDZ58sknG6qsgEdbsK26CffyzrFn/RzVlJWZV6absnq2rB6hBQBwY9hp0aKFLFu2TO655x6ZMGGCc8is6pswdOhQHXjUOYCvKa2wyfLdR/SxWh7ibLVpGiZLdx6RA0dLpdJmlwD/Os3zCQA4jXOeVLBVq1by/fffy9GjR2Xnzp068HTo0EFiYljUEL4rdfdhPQpLLfbZPjb8rJ+nJh50TDC4P7dE2jY/++cCABpwBmVFhRs1kSAAkQVbc5y1OmcahVWTOrd10zDZkJEv+3NLCTsA0ACoMwfqSdVuLtiWrY8HdTr7/joOiTEhep+ZX+rysgEACDtAve3KKdZ9btSMyBe2b3rOz0+Iqg47OYXlUl5la4ASAoBvc2vYWbRokVxzzTWSkJCgq/O/+uqrE/5injhxop67JyQkRC80umPHjlrn5ObmypgxY/QSFtHR0XLXXXdJUVFRI38l8GU/H6vV6d+2iYQGnnvLcHiwVffbUd39s1g6AgDMFXaKi4ulZ8+eehTXybz88svyj3/8Q6ZOnSorVqyQsLAwPeqr5jw/Kuhs3rxZ5s6dK7NmzdIB6g9/+EMjfhXwdct35+r9wPbN6vwaqmOzkpFHUxYAeEwHZVcYPny43k5G1eqohUfV3D7XXXedvu/DDz/UQ9tVDdBNN90kaWlpMnv2bFm1apX07dtXn/PGG2/oyQ9fffVVXWN0MuXl5XpzUKu4A3Vhtxuyak912Onf9tybsBwSokMkLatQz7kDAPCRPjvp6emSlZWlm65qrqzev39/SU1N1bfVXjVdOYKOos63WCy6JuhUJk+erF/LsSUlJTXwVwOz2ppVqFc6Dw30l24Jp17482zCjpJVUCZicevfIABgOh4bdlTQUY6fpFDddjym9rGxsScsRtqkSRPnOSejJkTMz893bvv372+QrwHmtyK9eiLBPq1ixFqPCQFjQgMkJMBfbHZDrLFtXFhCAIBP/gkZFBSkN6C+Vhzrr3NBPZqwFNVBPyE6WI/sssZVL8MCADB5zU5cXJzeHzpUvbiig7rteEzts7OrR8I4VFVV6RFajnOAhqL6la109Ndp06Ter+doygpI6Fzv1wIAeEHYadOmjQ4s8+bNq9WRWPXFGTBggL6t9nl5ebJmzRrnOfPnzxe73a779gANaWd2keQWV0hwgEV6uGART8cK6NbYds515wAAXt6MpebDUetr1eyUvG7dOt3nJjk5WR544AF57rnn9NpbKvw89dRTeoTVyJEj9fkpKSkybNgwGTt2rB6eXllZqVdjVyO1TjUSC3CV5enVtTrnJcdIoLX+fzc0Dw8Si1ppIjRKT1KY1CTUBaUEALg17KxevVoGDRrkvD1+/Hi9v+2222T69Ony6KOP6rl41Lw5qgZn4MCBeqh5cHD1X8DKRx99pAPO4MGD9Sis0aNH67l5gIa24tgq5/3b1K+/joPq4NwsPEiyC8tl3f48wg4AmCHsXHbZZaetrledNp999lm9nYqqBZoxY0YDlRA4OfV9u+JYzc75Luiv4xAXFewMO9f0pHYSAEzdZwfwZOmHi/VaVmo9rN7J9e+v4xAXWV1rqcIOAMA1CDtAHaw8VqvTKylaggP8XR52NmXkS6XN7rLXBQBfRtgB6sDRhKUW/3Sl6NAAsZcVS3mVXbZlFbr0tQHAVxF2gLr013Fx5+Sa/dSqsnfp47U0ZQGASxB2gHOkhoVn5peJ1eIn57VyXX8dB0fYWU/YAQCXIOwA52j5sVqd7i2jJDTQ9QMaqw5Vzz1FJ2UAcA3CDlDX/joubsI6vmZnV06RFJRVNsh7AIAvIewAdVzp3NWdkx2M0gJpGRMiagqqjQfyG+Q9AMCXEHaAc5CZVyr7c0v1sg59W8U02PuoIe0KTVkAUH+EHaAO8+t0S4ySiOCABg87a/cRdgCgvgg7QF2asFy4RMSZanZYAR0A6oewA5yDFbsd62E1TOdkB1VzpIa2Hy4q18PcAQB1R9gBzlJ2QZnsPlwsfn4i57du2JodtQRF5/gIfbyOpiwAqBfCDnCOQ847x0VKVGjD9ddx6NnS0ZR1tMHfCwDMjLADnGPn5Ibur3N8v531+xl+DgD1QdgBzrFz8gUNNL/O8XonV4edjRn5UsUK6ABQZ4Qd4CzkFlfI9kNF+rhfA/fXcWjbLFwigqxSWmmTbYdYAR0A6oqwA5wFxyrnHWLDpWl4UKO8p8XiJz2SovQxTVkAUHeEHeAspB4LOwPaNeyQ81PPt0MnZQCoK8IOcBZSd1WHnQsbOez8OiKL4ecAUFeEHeAMsgvLZEd2kZ5fp6FWOj+VXsc6Kav3LyqvatT3BgCzIOwAZ7D82KzJKXGREhMW2KjvHRsRLInR1SugbzhA7Q4A1AVhBziD1F2H3dJfx6HnsU7KNGUBQN0QdgAP7a9z4uSChB0AqAvCDnAamXmlsudIiVj8RPo10szJx+uVFKP31OwAQN0QdoCzqNXp3jJaIoMbfj2sk+mWGCn+Fj85VFAuB/NL3VIGAPBmhB3gNJbuPNZfp617mrCU0ECrdGzBCugAUFeEHeAU7HZDFu2oDjuXdGjm1rI4JxdkRBYAnDPruT8F8A1pWQVyuKhcpKpChvbtJGI/9Tw3CYmJsi1tS4OVpVdSlHy8kpodAKgLwg5wCouP1epUHNgkz36WetpzJ47u1yidlNUK6Da7ofvwAADODs1YwCks2p6j95X7N7i7KNI+NlzCAv2lpMImO7JZAR0AzgVhBziJkooqWb2nevHNin3uDzuqJqd7y2OTC9KUBQDnhLADnMTy3UekwmaXljEhYs/PEk/AfDsAUDeEHeAkFm2v7q9zcYfm4imcI7IIOwBwTgg7wEksPNZf59KO7h1yfrKws/1QoRSzAjoAnDXCDnCcXTlFkn64WAL9LTLQg2p24qKCJS4yWOxG9agsAMDZIewAx/lpyyG979+2iYQHedbsDDRlAcC5I+wAx5mXlq33V3RpIZ6mpyPsMCILAM4aYQeoIbe4QlbvzdXHg1M8L+ycl1wddlQZDcNwd3EAwCsQdoAaFmzN1n1iUuIjJTE6RDxNr+RoCQ6wyOGiCtl+qMjdxQEAr0DYAWqYt7W6v84VKbHiiYKs/tKvdRN9vGxX9fB4AMDpEXaAY8qrbLJwW47HNmE5DGjXVO+X7Tri7qIAgFcg7ADHLNlxWIorbNIiMki6J1YvzeCJLmrXzDnLc5XN7u7iAIDHI+wAx3y34aDeD+8WLxYPXlW8a0KkRARbpbCsSjZnFri7OADg8Qg7wLEmrLnH5te5qke8eDKrv0X6t6EpCwDOFmEHPq1TSheJiIyS+N6DpbC8SuxFuXJ5j7b6PsdWUlIinuai9o6wQydlADgTz5oeFmhkmRkZ8uwXq2TO5izZmlUo53VuK5d+sbLWOeOHdRFPc+Gxfjur9uRKWaVNggP83V0kAPBY1OzA51XZ7bI7p1gft28RLt6gY4tw3ZG6rNKuOyoDAE6NsAOft+9IiVTY7BIW5C8JUcHiDfz8/JzD439Kq+5rBAA4OcIOfJ5qvlI6xEboEOEthhyb+FCt5cXSEQBwaoQd+DS/wFDZfbi6CSslLkK8ieq3ExLgLwfzyxiCDgCnQdiBTwtsd77Y7IY0CQuU5hFB4k1Up+SLOzSrtVI7AOBEhB34tKCOFztrdbypCcthCP12AOCMCDvwWftzSyQgMUUfd/KyJiyHQZ1jRWW0jRn5kpVf5u7iAIBHIuzAZ329LkPvW8aESERwgHgj1fTWOylaH3+/sXq5CwBAbUwqCJ9ktxvy6eoD+jglPrLer1dSWqpnWz7jeQ0wG/O1PRPkl315MnNthtw5sI3LXx8AvB1hBz5JTcS3L7dE7OUl0iG2/hMJ2u12PRPzmTTEbMzX9EyQ575L001ZO7MLpX2sdzbJAUBDoRkLPunjVfv1vmLHMgnw9+4fg6bhQXJpx+b6+MtfqpvmAAC/8u7f8kAdHC2ukDmbsvRx2Zb5YgajzkvU+6/XZeomOgDArwg78Dlfrs3Qy0N0TYgU2+E9YgZqCHpEkFUy8kplRXquu4sDAB6FsANT6pTSRXcYPtk26cMf9TkrPn69QToMu2uCwRHd4/Xxp6urm+gAANXooAxTyszIOGmH4QNHS+SLXzLEavGThyc+JxOu/lrM4ub+yfK/1ftl1oZMmTC8s8RGeseipgDQ0KjZgU9ZfyBf7zvHRUiQ1V/MpFdStPRpFSOVNkP+u3yvu4sDAB6DsAOfUVReJbtyivRxj5bVE/GZzV3H5tn574p9UlZpc3dxAMAjEHbgMzZl5IthiCREB3vdop9n68ouLSQxOkRyiyucM0QDgK8j7MAnqJXNVdhRepq0Vkex+lvk9gtb6+N3Fu3WXzcA+DrCDnzCjkOFUlxhk9BAf2nXvP4zJnvyiLOHrr9Q7GVFsiunWDoN+527iwkAbufRo7GefvppeeaZZ2rd16lTJ9m6das+Lisrk4ceekg++eQTKS8vl6FDh8o///lPadGihZtKDE9kGIZeO0rpmRQt/hY/MfOIM2X13lxZuvOIlLe/XCqq7BJo5e8aAL7L438Ddu3aVQ4ePOjclixZ4nzswQcflG+//VY+++wzWbhwoWRmZsr111/v1vLC8+w/Wio5ReV6uHmPxDMv1mkGqqkuLNBf/CNj5eOV+9xdHABwK4+u2VGsVqvExcWdcH9+fr689957MmPGDLn88sv1fdOmTZOUlBRZvny5XHDBBW4oLTzRL/uO6r2aMVlNvucL1Hpf57dpIgu25cgb83fK6D4tJTzI43/cAcA3a3Z27NghCQkJ0rZtWxkzZozs21f9V+qaNWuksrJShgwZ4jy3c+fOkpycLKmpqad9TdXkVVBQUGuDOR0uKpe9R0rE79g8NL6ka0KU2PKy9DWY8uN2dxcHANzGo8NO//79Zfr06TJ79mx5++23JT09XS6++GIpLCyUrKwsCQwMlOjo2h9gqr+Oeux0Jk+eLFFRUc4tKSmpgb8SuMvaY3112sWGS3RooPgS1TepePE0fTx9WbpzNBoA+BqPrtcePny487hHjx46/LRq1Uo+/fRTCQkJqfPrTpgwQcaPH++8rWp2CDzmU1xeJVuzqmvt+iTHiLcoKS3Vo6rOeN5ZrOtVuX+jXNMzQb5dnylPztwoX957kWk6aAOAKcLO8VQtTseOHWXnzp1yxRVXSEVFheTl5dWq3Tl06NBJ+/jUFBQUpDeY2/oDeaKmmYmPCpa4KO9ZJ8put59ylFVN44d1OavXe+qqFPl5a7ZeKuP9Jeky9pK2LiglAHgPj27GOl5RUZHs2rVL4uPjpU+fPhIQECDz5s1zPr5t2zbdp2fAgAFuLSc8gDVINhxbB0utF+WrVC1Ru5Yt5OCcqfr2c99ukOg23WvNy6Pm6wEAM/Pomp2HH35YrrnmGt10pYaVT5o0Sfz9/eXmm2/WfW3uuusu3RzVpEkTiYyMlPvuu08HHUZiITjlUimvskt0SIC0aRYmvspRS6TmGvp2w0FJP1ws7e6cIjf1S9KzLSsTR/dzdzEBwHfDzoEDB3SwOXLkiDRv3lwGDhyoh5WrY+W1114Ti8Uio0ePrjWpIHxbeZVNgntdrY97J0eLxY8+Kn5+fjIkJVb+u3yfHCmukMU7D8ugTrHuLhYANAqPDjtqZuTTCQ4OlrfeektvgMNnqw+If0QzCQvyly7xke4ujscIDbTqhUK/Xp+pm/hUX6bOcVwfAObnVX12gLOp1fnngp36uF+rJs6mGlRr3SxMzm/dRB/PS8vWc/AAgNnxSQDT1epk5peJvShXz5iME/Vv20SSm4RKld2QWRsOil+QORZGBYBTIezAlLU6pb98Q63OKag+TMO6xklksFXySyslYviD+toBgFnxaQDT1eq0iAySsrQF7i6ORwsJ9JdreyZIoL9FAhJSZMKXG/WILQAwI8IOTFerc+9l7UVsle4uksdrGh4kI7rHiWG3yZe/ZMhbx64fAJgNYQemq9W5sR9Lf5ytVk3DpHhR9fpZr/64XS8rAQBmQ9iB6Wp1ggP83V0kr1K+Zb78fmAbffzQZ+tl9Z5cdxcJAFyKsAOv99HyfdTq1HNJiZfGXCgV6aulosou17/+k0S37lZrSQmWlQDgzTx6UkHgTArKKuWN+Tv08QNDOlKrU9clJT5fKZU2u8xcmyEHRSTxd6/KDX2TJCokwHkey0oA8FbU7MCr/WvhLjlaUintmofJDX1aurs4Xi3A36JHaDUNC5TiCpsOPsXlVe4uFgDUG2EHXisrv0zeW5Kujx8b1pl5dVxA1YyN7J3onIPnq3UZzMEDwOvx6QCv9cqcbVJWaZe+rWLkii4t3F0c0wgPssqo3okSEuAvh4sq5Nv1B6XKZnd3sQCgzgg78Err9ufJF78c0Md/ubqLXtUbrhMdGqgDj5p0MCOvVH7YlCXix68LAN6J317wOna7IU9/s1kfjz6vpfRKinZ3kUypeUSQ7sPjb/GT3YeLJWzQWH3tAcDbEHbgdb5en6FrdsIC/eWxYZ3cXRxTS4wJkRHd4kRVnAV3vlSe+y6NZSUAeB3CDryK6jT7wvdb9fG9g9pLbGSwu4tkem2bh8uQlOo+Ue8vTZe/z6se6g8A3oKwA6/ytx+3SU5hubRtFia/v7h61l80vC7xkVK8+AN9/PpPO5yj4ADAGxB24DU2HMiT/yzfq4+fG9lNgqxMINiYyjbOkfFXdNTHf521RT5dvd/dRQKAs0LYgVdQQ5+fmLlRVHcRNUrowvbN3F0kn3Tf5e2d62g9/sUG+WGjmm8ZADwbYQde4d0l6bIpo0BPdvfEiBR3F8dnqSH+T16VIjf2TRI1MOvPn6yVhdtz3F0sADgtwg483q6cIpkyd7s+furqLnpINNwbeF64vrtc1T1eKm2G/PE/q1kpHYBHI+zAo6l5XVRziVqN+5KOzeX/WP/KI6i5d167sZdc2rG5nsX6jmmrZFNGvl4Z/fjV0lk9HYC7seo5PJoa9bNqz1E9p84Lo7oxU7IHCbRaZOotfeR376/Q/0a3vb9Ssort8uwXq077PFZPB9DYqNmBx9qSWaDXv1KevKqLtIwJdXeRcJyQQH957/Z+0jUhUo4UV0jktU9IYVmlu4sFALVQswOPVFZpkwf+t1YqbHY9od3N5ye5u0g+r6S0VDdDnYxfcIREjpoo1phE+WpdptzQp6VeQR0APAFhBx5D9eXIzMjQx6EX3SIhPUeIvSRPPn3kj/K/+wqd5yUkJsq2tC1uLKlvsttP30RVUFYp/569RnKlqXy7IVNG9UoUqz+VxwDcj7ADj6GCjvow3XukWNcOKCMHdJE218yvdR59PjxTZHCAZH/xjLS+603JzCuTOVsOyfBucWKhnxUAN+PPLniU0kqbzE07pI97JEZJm2Zh7i4SzkFlzl65uke8WPxEdmYXyaLtOSwcCsDtCDvwKPPSDklxuU1iQgNkYAdmSfZGSU1C5coucfp4/YF8+WVfnruLBMDHEXbgMYK7XSm7cop1rcDQrnESQH8Pr9UpLkIuPhZWl+w8LFuzCtxdJAA+jD478JhFPkMvGqOPB7ZvJi0ig+s0Ksh5TkmJy8uIc3NecowUlVXJ2v15MnfLIQkNtEpyE6YPAND4CDtwOzWKZ9yMteLnHyDtmodJr6Toeo0KUsYPY5ZeT6Bqd4rKq2RHdpF8t+EgM2ADcAvaCeBWqvOqWg5iX26J2Aqy9Zw6zJJsHurf8squLaRldIieM+mrdRliCacvFoDGRdiBW/1n+V75fmOWBPj7SdGPbzARnQlZLRY9QqtpWKCUVNgk4prHJK+kwt3FAuBDCDtwm40H8uW5WWn6+PHhKVKVvcvdRUIDCQrwl+t6JUh4kFXPsjz2w9V6lmwAaAyEHTSK41fDjmyeKCNemKmbNip2r5YHRvSiU7HJRQQH6MBjLy/RC4eO/3SdXtUeABoaHZTRqLMjK3bDkG/WZcre3BKJCgmQm2//jQSNvZlOxT6gWXiQFP4wRZqPnqibLyeFbZZnr+tKPy0ADYqaHTS6Fem5OuhYLX5yVfd43cQB31GVuUVe/U1PUflG9dl6cfZWZlkG0KAIO2hU6YeLZWV6rj4e3DlWmkcEubtIcINreybI8yO76+N/Ldwt/5i3091FAmBihB00mvzSSpmzOUsf92gZJZ3jI91dJLjRb/sny1NXVzddvvbTdvn3ot3uLhIAkyLsoHFYA2XWhkwpr7JLXGSwXNKhubtLBA9w18A28vCVHfXx89+n6WYtAHA1wg4anOqPEXbJHXK4qEJCAvxlRPc48VcLYAEiMu7yDnLvZe308VNfbZJpS9PdXSQAJkPYQYObsXKfBHe+VFS8Gd4tTg9BBmp6ZGgnGXtxG338zLdb5PWfttNpGYDLEHbQoFbtyZVnvtmijy9s31SSWAgSJ6GGnj8xIkXGX1HdpPX6TzvkiZmbpNJmd3fRAJgAYQcNZn9uifzxP2v0xIHlu1ZIn+QYdxcJHh54/jy4gzxzrZp3R+TjlfvkjmmrdMd2AKgPwg4aRGFZpdz1wSrJLa6QbomRUjRvKhPH4azcdmFreefWvhIa6C9Ldh6Wa99cIpsz891dLABejLADl6uy2eW+j9fK9kNF0iIySN79XT+RqnJ3Fwte5IouLeSzuwdIYnSI7D1SIqP+uUw+WrGXfjwA6oTlIuByagjxz9tyJDjAooNOXFSwu4sED1JSWqrXRzuThMREWbFmnYz/dL3M35otT87cJPPSsuXF67tLbGSwc801tRTJ2bzWtrTqvmMAfA9hBy71n9Q9Mm3pHn085Te9pHvLM3+owbfY7XbnOmmnM3F0P4kODZR3f9dX3luSLq/M2aZDz5WvL5JHh3aWG/sl1Vpz7UyvBcB30YwFl1GTBk78ZrM+VhPFjege7+4iwQQsFj8Ze0lbmfXngbr/V15JpTwxc6OM+udS8Y9t6+7iAfAChB24xOIdOfLg/9aJ6lIxpn+y/GlQe3cXCSbTsUWEfHXvRTLx6i4SEWSVDQfyJWr0szIv7ZCUVtjcXTwAHoywg3pbtvOwjP1wtVTaDLmqR7w8e103Rl6hQVj9LXLnwDYy7+FL5freieLnZ5FNmQUyPXWPrN6bqzvHA8DxCDuol6U7D8udH6ySskq7XNapuUz5TU+WgkCDi40Ilik39pL8mc9Is/BAqaiyy9KdR+SD1L2SdrCAUVsAaiHsoM7mbjkkd06vDjqDOjWXf93aR4Ks/u4uFnxI1cFtcvP5yXqoeniQVYrKq+THLYfk45X7ZV9uibuLB8BDMBoLdfLf5Xtl4tebxG6IWA5uls+nviSf3191yvNLSvjggeuHqKvvK4ufn3SJj5SOseGydn+erN5zVHKKymXm2gxp1TRULmrXrNHKDMAzEXZwTtRaRS98n+YcXn5TvyR5685b5NnPV5z2eeOHdWmkEsKXhqjX/L5S/Xn6tW4iXRMiZVX6UdmQkacnJNx7ZJ+EDfqDZOWXMecT4KNoxsJZUx8WN7+z3Bl0HhjSQSZf313EoFMoPEdooFUu7dRcbr2glbSPDdf3BadcJpe9ukBenbNNL2UCwLcQdnBGqrPnl78ckCtfWyir9x7Vw37fubWPPDCkI6Ou4LHUhIRXdY+X3/RtKZUHt+m+ZW8u2CmXvfKzfJi6hxXVAR9CMxZOSU3Fn1Vkk7CLbpHA1ufp+6qyd8u+uW/K6NeynOfRHweeLD4qRApmPiOfLdsmL83eKumHi2Xi15t1DeVjwzrJ0K5xhHbA5Ag7OKlDBWWS12awNO05rLoTsp9I/zZNpc+g9uJ/89Ba59IfB95gWLc4GZwSK5+s3Cev/7RDh567//uL9G0VIxNGpEifVjHuLiKABkLYQS1qjpIPlu2RL3/JkJAe1UGnddNQubhDc2kSFuju4gH1EuBvkVsHtJaRvRPlXwt3y7tLduum2dFvL5Ph3eLk4aGdpF3z6n4+AMyDsAPZd6REfko7JF+vy5D1B/Kd91dmpslvrhoiyU1C3Vo+wNUiggN0sLnlglYyZe42+WzNAflhU5bM3pwlQ1JayB8uaatrfGjeAsyBsOOD1GyzGzPy9ArSP23Jlm2HCp2PBfj76Qna7ryojQzq8VtJvvVat5YVaEhqKPrL/9dTL0GhRmr9lJatJ8tUW8+kaBl7cRu5skucBFoZywF4M8KOD8gpLJcNB/J0df2aPUdl/YE8Ka/6dSSKWt6hX+sYuaJLnFzXK0GahQe5tbyAOyYoTEhMlJ8WrpD3lqTLF79kyPr9eTJuxlqJCQ2Qa3omyIju8bq2R83n46oBAJkZGWc8T5VrW9oWl7wn4KsIOyaihtLuzinW/W7UtkXvC+VwUfkJ56pf4Be1b6ZrcS7rGCtRoQFuKTPgKRMUPjyim/Ru31If+4VESnC3KyS4y+VyVGLkw9S9epOKEhnRp62evLB3cox0iA2XsKC6/RpVQedMZVImju5Xp9cH8CvCjhfKK6mQXTnFejTJ7pwiHXDUcfqRYt1EdTzV7aBtszA92qRvqybSp3WMvk1/BOD0gchuN2T/0RLZmlUoe44US5mEyvcbs/TmkBgdIvFRwdIiMljCgvx1k1egf/VejWIsqbBJaYVNiiuq9F7dLqm0SdSNL8m0pelSZTekymZIld0uavlSx0+ln/jpWtfoW/8hQ19bJJEhVokMDpDYyCA9nF69p9q3jKneXFXjBJgRYccDVdnscqiwXDKOlsqBoyV6rxY1/PzHJWILbSKWkMhTPtdeUSq2I/vEdnivVDn2uQfkcFW5rKxxXkVlpQQGnL42h/lz4OssFj9p1TRMb3bDkOfG3SLP/etjWbUnVzZlFOha04y8Ur2dK2vTJCkoO3E9uV/XazfEZjPEP6JZrX51J2Wvkqr8Q2I/elBseZliyzu2P3pQjPIifQrNYfBlpgk7b731lrzyyiuSlZUlPXv2lDfeeEPOP/988TQ2uyFHisrlUEG5ZBeWSXZhuRzML/s12OSV6tvqvBM0be2c8lqt8BwdGiAxoYG6SUrvwwLlmVG9ZMrszWcsh5ob58Vv1p3xHADV1IKjVVnb5U+D2jvvO1pcIbsPF0lWvvqZLpPSSpuuXa2w2fVeBaTQQH+9hEVIgNr7S0igv4QFWuWG0aNk7F/fFqvFogcGqL2u1jHU/9X/qn9f/OOhW2XWD3OloKxS8ksr9fsczCuTg3pfqmueyiqtYo1JFFHbcdT7qt8Ru1O/l38v2i3tYsOkbbNwaoPgU0wRdv73v//J+PHjZerUqdK/f395/fXXZejQobJt2zaJjY11W7ne/nmX7MstdgYbtVdB52Q55niGrUrsRUfEXpgjtsLDel9yaK/c99e/S3RI4GlGh5zFiwNwCfUHRp+wJnXqfKxqTlUz1JkU7t0sw/u0O80ZflLuHyL3vv295JVUytGSCsktqZCjxZVSVF6lA1hpvk33P3r++zTnswL9LdK6WaiutYqLDNYj01TTmDqODAmQiGCrHqKv9mp+opMtI1NpM/Trl6n3UM11ldXNdMXlVfq9i8qqpPDYvqi8ujyFZVX6cdV8p8Jc6oqVUlFZJeJnET+Lv/56DHuliK1S/x5U++BAq4y8+ioJCrBIkNVfggPUZqneW4/tnVvN2xYJtvrr5kDHpkKral7Ux+o+fdtPx0tdJpshNqO6bOq2asp0lLX6PrsYhuggaz+2NxzH9uqQqu5TzZCBVj997Rybuubqd7cKtwG6ubP6flUWNCxThJ0pU6bI2LFj5Y477tC3Vej57rvv5P3335fHH3/cbeX6bPV+2X24+IT7DfXDUpov9uKjYi/J0/uy3INy490P6TZ5tYUG+esfwONrWmIjWLUZ8ORRXfq8khJ59YfNLqk5PdvV36ub204ctHD0WPD5cvpbcsNd42RXdpHu46dGZG4/VKS3M7EeCwnqV5Jjr55/0hroc9WsnZxpeITqifjl2jOPXPNWht0mfnabRISHSpC1RjiyWvS1d5537HJXR6ra99W0c+dOqaysOPagrir89fjY7YAAq/Tq1bP631N+/Xd1/Bv/etvx+K/nqH929W9fHfgMWZa6QioqKnRgrX6SRfz08bHbqvYyIFAWP3+ztIxxz7xtXh921AVes2aNTJgwwXmfxWKRIUOGSGpq6kmfU15erjeH/PzqifQKCgpcWrZR3WLkmRfekeE3j9XV12GBVgkNqq7OtvjVrm5+4vp+0vqRR1TFtYjNpgZ9nMgwpKz4DL+YzuYcT30tyu6e1zL7+7nwtew2mzzx4YIzvp36efaUskdaRCIj/KRk5ecyeebr+j5VA5GZVyq7jxTrfXZ+uWQVlOlpKlQttFoZXtXIlFZUD3ioOEMR1Qehap5TtSi6mS7IqpvaUxcvkK59B9au1dC1HdU1KuqD9JNXJ8iYR17Ur+EYNKFrUYxfa1h+mP53mfj001JeaUh5lU3KquxSrmqTVLNhpV3Kqmw6fC1etkLi23fV/R6rjOqO3+r56nNe18aIqqmxV38Qn4EKGX4W1bwouqyq9uXX0Fd9+8CB/RLdPE7X4qiS6895deRXXfOlQkFuTpZENI0Vte6suq86JJzkn1B/FrnoMygoUixnmEHEJiJrdmS65v0iE0TVyZ3p/Q4fzZNI/xP7qdWH43NbXdvTMrxcRkaGjqrLli2rdf8jjzxinH/++Sd9zqRJk2pEXDY2NjY2Njbx4m3//v2nzQpeX7NTF6oWSPXxcVBJPzc3V5o2ber24dgqpSYlJcn+/fslMvLUo65w7ri2DYdr23C4tg2Ha+v911bV6BQWFkpCQsJpz/P6sNOsWTPx9/eXQ4cO1bpf3Y6Lizvpc4KCgvRWU3R0tHgS9c3BD1/D4No2HK5tw+HaNhyurXdf26ioM/ej8/pxh4GBgdKnTx+ZN29erZoadXvAgAFuLRsAAHA/r6/ZUVST1G233SZ9+/bVc+uooefFxcXO0VkAAMB3mSLs3HjjjZKTkyMTJ07Ukwr26tVLZs+eLS1atBBvo5rXJk2adEIzG+qPa9twuLYNh2vbcLi2vnNt/VQvZXcXAgAAoKF4fZ8dAACA0yHsAAAAUyPsAAAAUyPsAAAAUyPsNJJFixbJNddco2d5VLM0f/XVV7UeV/3E1Wiy+Ph4CQkJ0Wt77dixo9Y5apbnMWPG6Ama1CSId911lxQVncXaOiY2efJk6devn0REROgV7keOHKlXu6+prKxM/vSnP+kZssPDw2X06NEnTEK5b98+ueqqqyQ0NFS/ziOPPCJVVa5dw8XbvP3229KjRw/npGBq3qoffvjB+TjX1XVefPFF/XvhgQcecN7H9a2bp59+unrxyhpb586dnY9zXesnIyNDbrnlFn391GdV9+7dZfXq1Z7/WebKdapwat9//73x5JNPGl9++aVex2PmzJm1Hn/xxReNqKgo46uvvjLWr19vXHvttUabNm2M0tJS5znDhg0zevbsaSxfvtxYvHix0b59e+Pmm282fNnQoUONadOmGZs2bTLWrVtnjBgxwkhOTjaKioqc59x9991GUlKSMW/ePGP16tXGBRdcYFx44YXOx6uqqoxu3boZQ4YMMdauXav/rZo1a2ZMmDDB8GXffPON8d133xnbt283tm3bZjzxxBNGQECAvtYK19U1Vq5cabRu3dro0aOHcf/99zvv5/rWjVr7sGvXrsbBgwedW05OjvNxrmvd5ebmGq1atTJuv/12Y8WKFcbu3buNOXPmGDt37vT4zzLCjhscH3bsdrsRFxdnvPLKK8778vLyjKCgIOPjjz/Wt7ds2aKft2rVKuc5P/zwg+Hn56cXQ0W17OxsfZ0WLlzovI7qA/qzzz5znpOWlqbPSU1N1bfVLzOLxWJkZWU5z3n77beNyMhIo7y83A1fheeKiYkx3n33Xa6rixQWFhodOnQw5s6da1x66aXOsMP1rV/YUR+kJ8N1rZ/HHnvMGDhw4Ckf9+TPMpqxPEB6erqeDFFV99Vc66N///6Smpqqb6u9qu5Ts0Q7qPMtFousWLHCLeX2RPn5+XrfpEkTvV+zZo1UVlbWuraqSjs5ObnWtVVVsTUnoRw6dKheyG7z5s2N/jV4IpvNJp988omemVw1Z3FdXUM1p6jmkprXUeH61o9qNlFdBtq2baubS1SzlMJ1rZ9vvvlGfwbdcMMNunmvd+/e8u9//9srPssIOx5AfXMox8/4rG47HlN79c1Vk9Vq1R/qjnN8nVoTTfV5uOiii6Rbt276PnVt1Pppxy/0evy1Pdm1dzzmyzZu3Kj7NahZUO+++26ZOXOmdOnShevqAio8/vLLL7rf2fG4vnWnPlinT5+uZ9FX/c7UB/DFF1+sV8bmutbP7t279TXt0KGDzJkzR+655x7585//LB988IHHf5aZYrkIwPFX8qZNm2TJkiXuLoppdOrUSdatW6drzD7//HO9Bt3ChQvdXSyvt3//frn//vtl7ty5Ehwc7O7imMrw4cOdx6qDvQo/rVq1kk8//VR3mEX9/qBUNTIvvPCCvq1qdtTv3KlTp+rfDZ6Mmh0PEBcXp/fHjwhQtx2PqX12dnatx9XoANWr3XGOLxs3bpzMmjVLFixYIC1btnTer65NRUWF5OXlnfbanuzaOx7zZeqv4Pbt20ufPn10DUTPnj3l73//O9e1nlRzivp5Pu+88/RftWpTIfIf//iHPlZ/CXN9XUPV4nTs2FF27tzJ9209qRFWqma3ppSUFGczoSd/lhF2PECbNm30P/K8efOc96n2YdV+qfpHKGqvfkDVL0mH+fPn66St/nLxVaq/two6qnlFXQ91LWtSH9IBAQG1rq0amq5+OGteW9VcU/MHUP3FrYZFHv+D7evU91t5eTnXtZ4GDx6sr42qNXNs6i9m1b/Eccz1dQ01pHnXrl36g5rv2/pRXQSOn9pj+/btuubM4z/LGqzrM04YdaGGMapNXfYpU6bo47179zqH60VHRxtff/21sWHDBuO666476XC93r176yF/S5Ys0aM4fH3o+T333KOHOf7888+1hpqWlJTUGmqqhqPPnz9fDzUdMGCA3o4fanrllVfq4euzZ882mjdv7vNDTR9//HE9qi09PV1/T6rbasTEjz/+qB/nurpWzdFYCte3bh566CH9+0B93y5dulQPIVdDx9VITYXrWr9pEqxWq/H8888bO3bsMD766CMjNDTU+O9//+s8x1M/ywg7jWTBggU65By/3Xbbbc4he0899ZTRokULPUxv8ODBem6Tmo4cOaK/IcLDw/UwyDvuuEOHKF92smuqNjX3joP6Ibv33nv1sGn1gzlq1CgdiGras2ePMXz4cCMkJET/YlS/MCsrKw1fduedd+o5NQIDA/Uve/U96Qg6Cte1YcMO17dubrzxRiM+Pl5/3yYmJurbNeeB4brWz7fffqvDoPqc6ty5s/HOO+/UetxTP8v81H8art4IAADAveizAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wA6BR7NmzR/z8/PTaT/XRunVref3118UbTZ8+XS9MCaBxEXYA+CzCB+AbCDsAUE82m02v2gzAMxF2ALiU+tB/+eWXpX379hIUFCTJycny/PPPOx/fvXu3DBo0SEJDQ6Vnz56Smppa6/lffPGFdO3aVT9XNVn97W9/O+375eXlye9//3tp3ry5REZGyuWXXy7r1693Pq6O1ftFRETox/v06SOrV6+Wn3/+We644w7Jz8/XzWtqe/rpp/VzysvL5eGHH5bExEQJCwuT/v376/OPrxH65ptvpEuXLrqs+/btk6NHj8rvfvc7iYmJ0V/f8OHDZceOHS68ugDqgrADwKUmTJggL774ojz11FOyZcsWmTFjhrRo0cL5+JNPPqmDhOq707FjR7n55pulqqpKP7ZmzRr5zW9+IzfddJNs3LhRhw/1OipcnMoNN9wg2dnZ8sMPP+jnn3feeTJ48GDJzc3Vj48ZM0Zatmwpq1at0o8//vjjEhAQIBdeeKHu+6MC0MGDB/WmyqWMGzdOh7BPPvlENmzYoN9j2LBhtYJLSUmJvPTSS/Luu+/K5s2bJTY2Vm6//XYdpFQIUs9X6yyPGDFCKisrG/CKAzijBl1THYBPKSgoMIKCgox///vfJzyWnp5uqF857777rvO+zZs36/vS0tL07d/+9rfGFVdcUet5jzzyiNGlSxfn7VatWhmvvfaaPl68eLERGRlplJWV1XpOu3btjH/961/6OCIiwpg+ffpJyztt2jQjKiqq1n179+41/P39jYyMjFr3Dx482JgwYYLzearc69atcz6+fft2fd/SpUud9x0+fNgICQkxPv3001O+H4CGR80OAJdJS0vTTUCqZuVUevTo4TyOj4/Xe1Uz43j+RRddVOt8dVvVqKh+McdTTVRFRUXStGlTCQ8Pd27p6emya9cufc748eN1M9eQIUN0jZPj/lNRNUrqvVStU83XXLhwYa3nBgYG1vpaVNmtVqtu8nJQ5erUqZN+DID7WN343gBMJiQk5IznqCYkB9VPRqlr514VdFRgqtmfxsExyko1hf32t7+V7777Tjd1TZo0STdPjRo16pSv6e/vr5u81L4mFXpqfq2O8gPwbIQdAC7ToUMHHQLmzZuna1POVUpKiixdurTWfeq2qmU5Pngoqn9OVlaWrlFRnZlPRT1fbQ8++KDuIzRt2jQddlTtzPE1Rr1799b3qdqmiy+++JzKrvoerVixQvcHUo4cOSLbtm3TnZgBuA/NWABcJjg4WB577DF59NFH5cMPP9TNPsuXL5f33nvvrJ7/0EMP6aD017/+VbZv3y4ffPCBvPnmm86Ow8dTTVMDBgyQkSNHyo8//qgnLly2bJnuBK06CpeWlurOxqrmZ+/evTo4qY7KKpgoKiCpmhz1nocPH9adjlUoUp2a1aiqL7/8UjeJrVy5UiZPnqxrh04X9K677joZO3asLFmyRDex3XLLLXpEl7ofgBs1Qr8gAD7EZrMZzz33nO5IHBAQYCQnJxsvvPCCs4Py2rVrnecePXpU37dgwQLnfZ9//rnukOx47iuvvFLr9Wt2UHZ0ir7vvvuMhIQE/ZykpCRjzJgxxr59+4zy8nLjpptu0vcFBgbqc8aNG2eUlpY6n3/33XcbTZs21eWYNGmSvq+iosKYOHGi0bp1a/2a8fHxxqhRo4wNGzactqNxbm6uceutt+rHVMfkoUOH6o7LDnRQBtzDT/3HnWELAACgIdGMBQAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAAxMz+H2kCnfs9afREAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.histplot(df['cholesterol'],kde=True)" + ] + }, + { + "cell_type": "markdown", + "id": "5e9fe18b", + "metadata": {}, + "source": [ + "==========================================================================================================\n", + "\n", + "- df_ori: original dataframe\n", + "- df= processed" + ] + }, + { + "cell_type": "markdown", + "id": "591f39aa", + "metadata": {}, + "source": [ + "Encoding- multiclass nominal features" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "21ec30be", + "metadata": {}, + "outputs": [], + "source": [ + "df=pd.get_dummies(\n", + " df,\n", + " columns=['chest_pain_type','resting_ecg','st_slope'],\n", + " drop_first=True\n", + ")\n", + "\n", + "df_ori=pd.get_dummies(\n", + " df_ori,\n", + " columns=['chest_pain_type','resting_ecg','st_slope'],\n", + " drop_first=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "437947ad", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
agesexresting_bp_scholesterolfasting_blood_sugarmax_heart_rateexercise_anginaoldpeaktargetchest_pain_type_2chest_pain_type_3chest_pain_type_4resting_ecg_1resting_ecg_2st_slope_1st_slope_2st_slope_3
0401140289.0017200.00TrueFalseFalseFalseFalseTrueFalseFalse
1490160180.0015601.01FalseTrueFalseFalseFalseFalseTrueFalse
2371130283.009800.00TrueFalseFalseTrueFalseTrueFalseFalse
3480138214.0010811.51FalseFalseTrueFalseFalseFalseTrueFalse
4541150195.0012200.00FalseTrueFalseFalseFalseTrueFalseFalse
\n", + "
" + ], + "text/plain": [ + " age sex resting_bp_s cholesterol fasting_blood_sugar max_heart_rate \\\n", + "0 40 1 140 289.0 0 172 \n", + "1 49 0 160 180.0 0 156 \n", + "2 37 1 130 283.0 0 98 \n", + "3 48 0 138 214.0 0 108 \n", + "4 54 1 150 195.0 0 122 \n", + "\n", + " exercise_angina oldpeak target chest_pain_type_2 chest_pain_type_3 \\\n", + "0 0 0.0 0 True False \n", + "1 0 1.0 1 False True \n", + "2 0 0.0 0 True False \n", + "3 1 1.5 1 False False \n", + "4 0 0.0 0 False True \n", + "\n", + " chest_pain_type_4 resting_ecg_1 resting_ecg_2 st_slope_1 st_slope_2 \\\n", + "0 False False False True False \n", + "1 False False False False True \n", + "2 False True False True False \n", + "3 True False False False True \n", + "4 False False False True False \n", + "\n", + " st_slope_3 \n", + "0 False \n", + "1 False \n", + "2 False \n", + "3 False \n", + "4 False " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "a39945ac", + "metadata": {}, + "source": [ + "Spliting the data" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "bb78b973", + "metadata": {}, + "outputs": [], + "source": [ + "X=df.drop('target',axis=1)\n", + "y=df['target']" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "53797973", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "X_train,X_test,y_train,y_test= train_test_split(X,y,random_state=42,test_size=0.2)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f1e609dc", + "metadata": {}, + "outputs": [], + "source": [ + "X_ori=df_ori.drop('target',axis=1)\n", + "y_ori=df_ori['target']\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "X_train,X_test,y_train,y_test= train_test_split(X_ori,y_ori,random_state=42,test_size=0.2)" + ] + }, + { + "cell_type": "markdown", + "id": "4e6c5346", + "metadata": {}, + "source": [ + "Scaling the values" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "35a044c9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "age int64\n", + "sex int64\n", + "resting_bp_s int64\n", + "cholesterol float64\n", + "fasting_blood_sugar int64\n", + "max_heart_rate int64\n", + "exercise_angina int64\n", + "oldpeak float64\n", + "target int64\n", + "chest_pain_type_2 bool\n", + "chest_pain_type_3 bool\n", + "chest_pain_type_4 bool\n", + "resting_ecg_1 bool\n", + "resting_ecg_2 bool\n", + "st_slope_1 bool\n", + "st_slope_2 bool\n", + "st_slope_3 bool\n", + "dtype: object" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "846e8396", + "metadata": {}, + "outputs": [], + "source": [ + "scale_cols=['age','resting_bp_s','cholesterol','max_heart_rate','oldpeak']" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "91e343ce", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "sc=StandardScaler()\n", + "\n", + "X_train_scale=sc.fit_transform(X_train[scale_cols])\n", + "X_test_scale=sc.transform(X_test[scale_cols])" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "7e2facba", + "metadata": {}, + "outputs": [], + "source": [ + "X_train_scale=pd.DataFrame(\n", + " X_train_scale,\n", + " columns=scale_cols,\n", + " index=X_train.index\n", + ")\n", + "\n", + "X_test_scale=pd.DataFrame(\n", + " X_test_scale,\n", + " columns=scale_cols,\n", + " index=X_test.index\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "09e211a9", + "metadata": {}, + "outputs": [], + "source": [ + "X_train=X_train.drop(columns=scale_cols,axis=1)\n", + "X_test=X_test.drop(columns=scale_cols,axis=1)\n", + "\n", + "X_train=pd.concat([X_train,X_train_scale],axis=1)\n", + "X_test=pd.concat([X_test,X_test_scale],axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "ea271a9f", + "metadata": {}, + "outputs": [], + "source": [ + "train_data=pd.concat([X_train,y_train],axis=1)\n", + "test_data=pd.concat([X_test,y_test],axis=1)" + ] + }, + { + "cell_type": "markdown", + "id": "9127a8b6", + "metadata": {}, + "source": [ + "Saving the dataset and the standard scalar model" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "cbfa64ee", + "metadata": {}, + "outputs": [], + "source": [ + "train_data.to_csv('../datasets/train_dataset.csv')\n", + "test_data.to_csv('../datasets/test_data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "cff9e2c1", + "metadata": {}, + "outputs": [], + "source": [ + "import pickle as pkl\n", + "\n", + "with open('../models/scaling_model.pkl', 'wb') as f:\n", + " pkl.dump(sc, f)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/ML Projects/Heart_Disease_Prediction_ML/requirements.txt b/ML Projects/Heart_Disease_Prediction_ML/requirements.txt new file mode 100644 index 000000000..714fa4a2c --- /dev/null +++ b/ML Projects/Heart_Disease_Prediction_ML/requirements.txt @@ -0,0 +1,8 @@ +pandas +numpy +seaborn +matplotlib +scikit-learn +xgboost +lightgbm +catboost \ No newline at end of file