From 02b136f0a9e508c0858b3220896253500bcedf82 Mon Sep 17 00:00:00 2001 From: Prayag Thakur <114804510+PrAyAg9@users.noreply.github.com> Date: Sat, 26 Oct 2024 12:04:55 +0530 Subject: [PATCH 1/3] Added Asthtma Prediciton --- .../Ashtma_Attack_Pred.ipynb | 568 ++++++++++++++++++ .../Asthamapred_dataset.csv | 55 ++ .../Ashtma Attack Prediction/README.md | 101 ++++ 3 files changed, 724 insertions(+) create mode 100644 Prediction Models/Ashtma Attack Prediction/Ashtma_Attack_Pred.ipynb create mode 100644 Prediction Models/Ashtma Attack Prediction/Asthamapred_dataset.csv create mode 100644 Prediction Models/Ashtma Attack Prediction/README.md diff --git a/Prediction Models/Ashtma Attack Prediction/Ashtma_Attack_Pred.ipynb b/Prediction Models/Ashtma Attack Prediction/Ashtma_Attack_Pred.ipynb new file mode 100644 index 000000000..1d952a0dc --- /dev/null +++ b/Prediction Models/Ashtma Attack Prediction/Ashtma_Attack_Pred.ipynb @@ -0,0 +1,568 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aZW8c2uAjZhI", + "outputId": "098dffb7-f29d-49da-88c2-2dea1120fc88" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.16.0-rc0\n" + ] + } + ], + "source": [ + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "from tensorflow.keras import layers\n", + "from tensorflow.keras import Sequential\n", + "from tensorflow.keras.layers import Flatten, Dense\n", + "from tensorflow.keras.layers import Conv1D,MaxPooling1D\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.layers import Input\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "from sklearn import metrics\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "print(tf.__version__)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "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", + "
AgeHeightGenderOutdoor TemperatureHumidityPM 2.5PM 10
019155133601623.62
126183132711218.29
222153027852738.29
325160026881826.20
418162026851623.62
\n", + "
" + ], + "text/plain": [ + " Age Height Gender Outdoor Temperature Humidity PM 2.5 PM 10\n", + "0 19 155 1 33 60 16 23.62\n", + "1 26 183 1 32 71 12 18.29\n", + "2 22 153 0 27 85 27 38.29\n", + "3 25 160 0 26 88 18 26.20\n", + "4 18 162 0 26 85 16 23.62" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "asthma=pd.read_csv(\"asthamapred_dataset.csv\")\n", + "X=asthma.drop(columns=['PEFR'])\n", + "X.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 79ms/step - loss: 6678.8521\n", + "RMSE Percentage: 1.8573691809018122\n" + ] + } + ], + "source": [ + "y=asthma['PEFR']\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)\n", + "model = Sequential()\n", + "model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(7, 1)))\n", + "model.add(MaxPooling1D(pool_size=2))\n", + "model.add(Flatten())\n", + "model.add(Dense(1, activation='linear'))\n", + "\n", + "model.compile(loss='mean_squared_error', optimizer='adam')\n", + "\n", + "model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0,validation_data=(X_test, y_test))\n", + "\n", + "mse = model.evaluate(X_test, y_test)\n", + "mse_percent =( mse / int(tf.reduce_mean(y_test))**2) * 100\n", + "x=np.sqrt(mse_percent)\n", + "print(\"RMSE Percentage:\", x)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1_XmJ5M2jxm7", + "outputId": "370a8026-63fd-43b5-d123-ae8fb10e867d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 473ms/step - loss: 3066.3235 - mae: 41.9071 - val_loss: 5111.3110 - val_mae: 58.5285\n", + "Epoch 2/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 82ms/step - loss: 2886.0901 - mae: 42.9304 - val_loss: 4651.0132 - val_mae: 55.4539\n", + "Epoch 3/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 90ms/step - loss: 2984.9177 - mae: 42.2460 - val_loss: 4481.2637 - val_mae: 54.2376\n", + "Epoch 4/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 81ms/step - loss: 2784.7637 - mae: 43.9418 - val_loss: 4675.2202 - val_mae: 55.6406\n", + "Epoch 5/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 90ms/step - loss: 2880.4436 - mae: 42.6021 - val_loss: 4910.6753 - val_mae: 57.2565\n", + "Epoch 6/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 93ms/step - loss: 2773.5842 - mae: 43.5240 - val_loss: 5173.2627 - val_mae: 58.9641\n", + "Epoch 7/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 93ms/step - loss: 2869.4204 - mae: 43.6546 - val_loss: 5417.0161 - val_mae: 60.4732\n", + "Epoch 8/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 90ms/step - loss: 2934.8435 - mae: 42.0037 - val_loss: 5538.6230 - val_mae: 61.2056\n", + "Epoch 9/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 98ms/step - loss: 2947.6016 - mae: 42.5322 - val_loss: 5623.1519 - val_mae: 61.7085\n", + "Epoch 10/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 102ms/step - loss: 3068.3069 - mae: 41.9002 - val_loss: 5496.2891 - val_mae: 60.9756\n", + "Epoch 11/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 111ms/step - loss: 2930.7207 - mae: 42.5918 - val_loss: 5309.0723 - val_mae: 59.8602\n", + "Epoch 12/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 86ms/step - loss: 3172.2332 - mae: 40.5299 - val_loss: 5053.9922 - val_mae: 58.2743\n", + "Epoch 13/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 94ms/step - loss: 3072.4509 - mae: 40.3506 - val_loss: 4745.5474 - val_mae: 56.2430\n", + "Epoch 14/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 76ms/step - loss: 2784.7300 - mae: 43.2323 - val_loss: 4511.3965 - val_mae: 54.6098\n", + "Epoch 15/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 91ms/step - loss: 2884.6406 - mae: 42.5299 - val_loss: 4406.6201 - val_mae: 53.8586\n", + "Epoch 16/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 99ms/step - loss: 2908.4734 - mae: 41.6471 - val_loss: 4371.5747 - val_mae: 53.6159\n", + "Epoch 17/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 104ms/step - loss: 3143.0420 - mae: 40.2395 - val_loss: 4453.5049 - val_mae: 54.2411\n", + "Epoch 18/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 91ms/step - loss: 3120.3223 - mae: 40.2150 - val_loss: 4595.7656 - val_mae: 55.2835\n", + "Epoch 19/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 123ms/step - loss: 2764.2986 - mae: 42.9869 - val_loss: 4718.9614 - val_mae: 56.1586\n", + "Epoch 20/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 115ms/step - loss: 3141.2302 - mae: 40.3943 - val_loss: 4882.1797 - val_mae: 57.2679\n", + "Epoch 21/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 114ms/step - loss: 3137.5779 - mae: 39.8686 - val_loss: 4882.7793 - val_mae: 57.2845\n", + "Epoch 22/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 103ms/step - loss: 2732.3801 - mae: 43.0897 - val_loss: 4851.4121 - val_mae: 57.0891\n", + "Epoch 23/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 90ms/step - loss: 2734.5879 - mae: 43.0481 - val_loss: 4906.3657 - val_mae: 57.4603\n", + "Epoch 24/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 88ms/step - loss: 2850.3699 - mae: 41.6207 - val_loss: 4935.8120 - val_mae: 57.6624\n", + "Epoch 25/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 86ms/step - loss: 3048.0415 - mae: 40.3262 - val_loss: 4920.8911 - val_mae: 57.5767\n", + "Epoch 26/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 92ms/step - loss: 2699.0771 - mae: 43.3855 - val_loss: 4873.3208 - val_mae: 57.2787\n", + "Epoch 27/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 98ms/step - loss: 2810.4873 - mae: 41.9483 - val_loss: 4846.3374 - val_mae: 57.1140\n", + "Epoch 28/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 90ms/step - loss: 2857.3064 - mae: 41.9243 - val_loss: 4835.5347 - val_mae: 57.0553\n", + "Epoch 29/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 89ms/step - loss: 2816.2141 - mae: 41.0199 - val_loss: 4779.4126 - val_mae: 56.6956\n", + "Epoch 30/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 81ms/step - loss: 2779.1694 - mae: 41.7353 - val_loss: 4777.8154 - val_mae: 56.6989\n", + "Epoch 31/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 87ms/step - loss: 2947.0742 - mae: 41.0918 - val_loss: 4759.3306 - val_mae: 56.5894\n", + "Epoch 32/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 107ms/step - loss: 2936.5425 - mae: 40.5920 - val_loss: 4632.5425 - val_mae: 55.7444\n", + "Epoch 33/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 91ms/step - loss: 2719.9607 - mae: 42.3116 - val_loss: 4529.4097 - val_mae: 55.0411\n", + "Epoch 34/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 90ms/step - loss: 2935.8262 - mae: 41.2333 - val_loss: 4526.7314 - val_mae: 55.0358\n", + "Epoch 35/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 86ms/step - loss: 3149.7007 - mae: 38.9118 - val_loss: 4486.4712 - val_mae: 54.7642\n", + "Epoch 36/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 83ms/step - loss: 2858.2236 - mae: 41.4179 - val_loss: 4386.8721 - val_mae: 54.0629\n", + "Epoch 37/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 105ms/step - loss: 2802.3157 - mae: 42.0515 - val_loss: 4303.7163 - val_mae: 53.4683\n", + "Epoch 38/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 76ms/step - loss: 2813.4839 - mae: 41.0744 - val_loss: 4335.2925 - val_mae: 53.7155\n", + "Epoch 39/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 83ms/step - loss: 2898.1125 - mae: 40.6110 - val_loss: 4482.7661 - val_mae: 54.7890\n", + "Epoch 40/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 88ms/step - loss: 2768.7629 - mae: 41.6373 - val_loss: 4576.4956 - val_mae: 55.4560\n", + "Epoch 41/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 71ms/step - loss: 2822.0535 - mae: 40.4955 - val_loss: 4623.6738 - val_mae: 55.7934\n", + "Epoch 42/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 89ms/step - loss: 2710.8362 - mae: 41.2092 - val_loss: 4727.1660 - val_mae: 56.5043\n", + "Epoch 43/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 87ms/step - loss: 2704.9319 - mae: 41.1856 - val_loss: 4882.5132 - val_mae: 57.5350\n", + "Epoch 44/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 78ms/step - loss: 2855.7283 - mae: 39.7750 - val_loss: 4963.5747 - val_mae: 58.0648\n", + "Epoch 45/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 86ms/step - loss: 2597.9631 - mae: 42.4541 - val_loss: 5019.8066 - val_mae: 58.4300\n", + "Epoch 46/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 94ms/step - loss: 2795.7339 - mae: 40.3239 - val_loss: 5035.1655 - val_mae: 58.5354\n", + "Epoch 47/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 79ms/step - loss: 2725.8347 - mae: 41.4939 - val_loss: 4934.8096 - val_mae: 57.9101\n", + "Epoch 48/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 100ms/step - loss: 2751.0461 - mae: 41.3523 - val_loss: 4748.0073 - val_mae: 56.7054\n", + "Epoch 49/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 94ms/step - loss: 3049.7542 - mae: 37.9449 - val_loss: 4540.4707 - val_mae: 55.3100\n", + "Epoch 50/50\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 94ms/step - loss: 2924.0317 - mae: 38.7024 - val_loss: 4397.3408 - val_mae: 54.3130\n" + ] + }, + { + "ename": "PicklingError", + "evalue": "Can't pickle . at 0x000001B12EACA8E0>: it's not found as keras.src.layers.layer.Layer._initializer_tracker..", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mPicklingError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[41], line 7\u001b[0m\n\u001b[0;32m 2\u001b[0m model\u001b[38;5;241m.\u001b[39mcompile(optimizer\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124madam\u001b[39m\u001b[38;5;124m'\u001b[39m, loss\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmse\u001b[39m\u001b[38;5;124m'\u001b[39m, metrics\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmae\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[0;32m 5\u001b[0m history \u001b[38;5;241m=\u001b[39m model\u001b[38;5;241m.\u001b[39mfit(X_train, y_train, epochs\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m50\u001b[39m, validation_data\u001b[38;5;241m=\u001b[39m(X_test, y_test))\n\u001b[1;32m----> 7\u001b[0m \u001b[43mjoblib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdump\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mPEFR_predictor.joblib\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 9\u001b[0m loss, mae \u001b[38;5;241m=\u001b[39m model\u001b[38;5;241m.\u001b[39mevaluate(X_test, y_test)\n\u001b[0;32m 10\u001b[0m y_test_float \u001b[38;5;241m=\u001b[39m tf\u001b[38;5;241m.\u001b[39mcast(y_test, dtype\u001b[38;5;241m=\u001b[39mtf\u001b[38;5;241m.\u001b[39mfloat32)\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\joblib\\numpy_pickle.py:553\u001b[0m, in \u001b[0;36mdump\u001b[1;34m(value, filename, compress, protocol, cache_size)\u001b[0m\n\u001b[0;32m 551\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m is_filename:\n\u001b[0;32m 552\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mopen\u001b[39m(filename, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwb\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[1;32m--> 553\u001b[0m \u001b[43mNumpyPickler\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprotocol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mprotocol\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdump\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 554\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 555\u001b[0m NumpyPickler(filename, protocol\u001b[38;5;241m=\u001b[39mprotocol)\u001b[38;5;241m.\u001b[39mdump(value)\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:481\u001b[0m, in \u001b[0;36m_Pickler.dump\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 479\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mproto \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m4\u001b[39m:\n\u001b[0;32m 480\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mframer\u001b[38;5;241m.\u001b[39mstart_framing()\n\u001b[1;32m--> 481\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 482\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrite(STOP)\n\u001b[0;32m 483\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mframer\u001b[38;5;241m.\u001b[39mend_framing()\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\joblib\\numpy_pickle.py:355\u001b[0m, in \u001b[0;36mNumpyPickler.save\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 352\u001b[0m wrapper\u001b[38;5;241m.\u001b[39mwrite_array(obj, \u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m 353\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mPickler\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:597\u001b[0m, in \u001b[0;36m_Pickler.save\u001b[1;34m(self, obj, save_persistent_id)\u001b[0m\n\u001b[0;32m 593\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m PicklingError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTuple returned by \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m must have \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 594\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtwo to six elements\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m reduce)\n\u001b[0;32m 596\u001b[0m \u001b[38;5;66;03m# Save the reduce() output and finally memoize the object\u001b[39;00m\n\u001b[1;32m--> 597\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave_reduce\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mrv\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:711\u001b[0m, in \u001b[0;36m_Pickler.save_reduce\u001b[1;34m(self, func, args, state, listitems, dictitems, state_setter, obj)\u001b[0m\n\u001b[0;32m 709\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m state \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 710\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m state_setter \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 711\u001b[0m \u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 712\u001b[0m write(BUILD)\n\u001b[0;32m 713\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 714\u001b[0m \u001b[38;5;66;03m# If a state_setter is specified, call it instead of load_build\u001b[39;00m\n\u001b[0;32m 715\u001b[0m \u001b[38;5;66;03m# to update obj's with its previous state.\u001b[39;00m\n\u001b[0;32m 716\u001b[0m \u001b[38;5;66;03m# First, push state_setter and its tuple of expected arguments\u001b[39;00m\n\u001b[0;32m 717\u001b[0m \u001b[38;5;66;03m# (obj, state) onto the stack.\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\joblib\\numpy_pickle.py:355\u001b[0m, in \u001b[0;36mNumpyPickler.save\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 352\u001b[0m wrapper\u001b[38;5;241m.\u001b[39mwrite_array(obj, \u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m 353\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mPickler\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:554\u001b[0m, in \u001b[0;36m_Pickler.save\u001b[1;34m(self, obj, save_persistent_id)\u001b[0m\n\u001b[0;32m 552\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdispatch\u001b[38;5;241m.\u001b[39mget(t)\n\u001b[0;32m 553\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m f \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 554\u001b[0m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Call unbound method with explicit self\u001b[39;00m\n\u001b[0;32m 555\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m 557\u001b[0m \u001b[38;5;66;03m# Check private dispatch table if any, or else\u001b[39;00m\n\u001b[0;32m 558\u001b[0m \u001b[38;5;66;03m# copyreg.dispatch_table\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:966\u001b[0m, in \u001b[0;36m_Pickler.save_dict\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 963\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrite(MARK \u001b[38;5;241m+\u001b[39m DICT)\n\u001b[0;32m 965\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmemoize(obj)\n\u001b[1;32m--> 966\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_batch_setitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:990\u001b[0m, in \u001b[0;36m_Pickler._batch_setitems\u001b[1;34m(self, items)\u001b[0m\n\u001b[0;32m 988\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m tmp:\n\u001b[0;32m 989\u001b[0m save(k)\n\u001b[1;32m--> 990\u001b[0m \u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[43mv\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 991\u001b[0m write(SETITEMS)\n\u001b[0;32m 992\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m n:\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\joblib\\numpy_pickle.py:355\u001b[0m, in \u001b[0;36mNumpyPickler.save\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 352\u001b[0m wrapper\u001b[38;5;241m.\u001b[39mwrite_array(obj, \u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m 353\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mPickler\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:597\u001b[0m, in \u001b[0;36m_Pickler.save\u001b[1;34m(self, obj, save_persistent_id)\u001b[0m\n\u001b[0;32m 593\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m PicklingError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTuple returned by \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m must have \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 594\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtwo to six elements\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m reduce)\n\u001b[0;32m 596\u001b[0m \u001b[38;5;66;03m# Save the reduce() output and finally memoize the object\u001b[39;00m\n\u001b[1;32m--> 597\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave_reduce\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mrv\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:711\u001b[0m, in \u001b[0;36m_Pickler.save_reduce\u001b[1;34m(self, func, args, state, listitems, dictitems, state_setter, obj)\u001b[0m\n\u001b[0;32m 709\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m state \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 710\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m state_setter \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 711\u001b[0m \u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 712\u001b[0m write(BUILD)\n\u001b[0;32m 713\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 714\u001b[0m \u001b[38;5;66;03m# If a state_setter is specified, call it instead of load_build\u001b[39;00m\n\u001b[0;32m 715\u001b[0m \u001b[38;5;66;03m# to update obj's with its previous state.\u001b[39;00m\n\u001b[0;32m 716\u001b[0m \u001b[38;5;66;03m# First, push state_setter and its tuple of expected arguments\u001b[39;00m\n\u001b[0;32m 717\u001b[0m \u001b[38;5;66;03m# (obj, state) onto the stack.\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\joblib\\numpy_pickle.py:355\u001b[0m, in \u001b[0;36mNumpyPickler.save\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 352\u001b[0m wrapper\u001b[38;5;241m.\u001b[39mwrite_array(obj, \u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m 353\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mPickler\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:554\u001b[0m, in \u001b[0;36m_Pickler.save\u001b[1;34m(self, obj, save_persistent_id)\u001b[0m\n\u001b[0;32m 552\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdispatch\u001b[38;5;241m.\u001b[39mget(t)\n\u001b[0;32m 553\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m f \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 554\u001b[0m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Call unbound method with explicit self\u001b[39;00m\n\u001b[0;32m 555\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m 557\u001b[0m \u001b[38;5;66;03m# Check private dispatch table if any, or else\u001b[39;00m\n\u001b[0;32m 558\u001b[0m \u001b[38;5;66;03m# copyreg.dispatch_table\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:966\u001b[0m, in \u001b[0;36m_Pickler.save_dict\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 963\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrite(MARK \u001b[38;5;241m+\u001b[39m DICT)\n\u001b[0;32m 965\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmemoize(obj)\n\u001b[1;32m--> 966\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_batch_setitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:990\u001b[0m, in \u001b[0;36m_Pickler._batch_setitems\u001b[1;34m(self, items)\u001b[0m\n\u001b[0;32m 988\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m tmp:\n\u001b[0;32m 989\u001b[0m save(k)\n\u001b[1;32m--> 990\u001b[0m \u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[43mv\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 991\u001b[0m write(SETITEMS)\n\u001b[0;32m 992\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m n:\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\joblib\\numpy_pickle.py:355\u001b[0m, in \u001b[0;36mNumpyPickler.save\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 352\u001b[0m wrapper\u001b[38;5;241m.\u001b[39mwrite_array(obj, \u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m 353\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mPickler\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:554\u001b[0m, in \u001b[0;36m_Pickler.save\u001b[1;34m(self, obj, save_persistent_id)\u001b[0m\n\u001b[0;32m 552\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdispatch\u001b[38;5;241m.\u001b[39mget(t)\n\u001b[0;32m 553\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m f \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 554\u001b[0m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Call unbound method with explicit self\u001b[39;00m\n\u001b[0;32m 555\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m 557\u001b[0m \u001b[38;5;66;03m# Check private dispatch table if any, or else\u001b[39;00m\n\u001b[0;32m 558\u001b[0m \u001b[38;5;66;03m# copyreg.dispatch_table\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:966\u001b[0m, in \u001b[0;36m_Pickler.save_dict\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 963\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrite(MARK \u001b[38;5;241m+\u001b[39m DICT)\n\u001b[0;32m 965\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmemoize(obj)\n\u001b[1;32m--> 966\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_batch_setitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:990\u001b[0m, in \u001b[0;36m_Pickler._batch_setitems\u001b[1;34m(self, items)\u001b[0m\n\u001b[0;32m 988\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m tmp:\n\u001b[0;32m 989\u001b[0m save(k)\n\u001b[1;32m--> 990\u001b[0m \u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[43mv\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 991\u001b[0m write(SETITEMS)\n\u001b[0;32m 992\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m n:\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\joblib\\numpy_pickle.py:355\u001b[0m, in \u001b[0;36mNumpyPickler.save\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 352\u001b[0m wrapper\u001b[38;5;241m.\u001b[39mwrite_array(obj, \u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m 353\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mPickler\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:554\u001b[0m, in \u001b[0;36m_Pickler.save\u001b[1;34m(self, obj, save_persistent_id)\u001b[0m\n\u001b[0;32m 552\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdispatch\u001b[38;5;241m.\u001b[39mget(t)\n\u001b[0;32m 553\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m f \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 554\u001b[0m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Call unbound method with explicit self\u001b[39;00m\n\u001b[0;32m 555\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m 557\u001b[0m \u001b[38;5;66;03m# Check private dispatch table if any, or else\u001b[39;00m\n\u001b[0;32m 558\u001b[0m \u001b[38;5;66;03m# copyreg.dispatch_table\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:881\u001b[0m, in \u001b[0;36m_Pickler.save_tuple\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 879\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m3\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mproto \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m2\u001b[39m:\n\u001b[0;32m 880\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m element \u001b[38;5;129;01min\u001b[39;00m obj:\n\u001b[1;32m--> 881\u001b[0m \u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[43melement\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 882\u001b[0m \u001b[38;5;66;03m# Subtle. Same as in the big comment below.\u001b[39;00m\n\u001b[0;32m 883\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mid\u001b[39m(obj) \u001b[38;5;129;01min\u001b[39;00m memo:\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\joblib\\numpy_pickle.py:355\u001b[0m, in \u001b[0;36mNumpyPickler.save\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 352\u001b[0m wrapper\u001b[38;5;241m.\u001b[39mwrite_array(obj, \u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m 353\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mPickler\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:554\u001b[0m, in \u001b[0;36m_Pickler.save\u001b[1;34m(self, obj, save_persistent_id)\u001b[0m\n\u001b[0;32m 552\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdispatch\u001b[38;5;241m.\u001b[39mget(t)\n\u001b[0;32m 553\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m f \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 554\u001b[0m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Call unbound method with explicit self\u001b[39;00m\n\u001b[0;32m 555\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m 557\u001b[0m \u001b[38;5;66;03m# Check private dispatch table if any, or else\u001b[39;00m\n\u001b[0;32m 558\u001b[0m \u001b[38;5;66;03m# copyreg.dispatch_table\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py:1063\u001b[0m, in \u001b[0;36m_Pickler.save_global\u001b[1;34m(self, obj, name)\u001b[0m\n\u001b[0;32m 1061\u001b[0m obj2, parent \u001b[38;5;241m=\u001b[39m _getattribute(module, name)\n\u001b[0;32m 1062\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mImportError\u001b[39;00m, \u001b[38;5;167;01mKeyError\u001b[39;00m, \u001b[38;5;167;01mAttributeError\u001b[39;00m):\n\u001b[1;32m-> 1063\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m PicklingError(\n\u001b[0;32m 1064\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCan\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt pickle \u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[38;5;124m: it\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms not found as \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m\n\u001b[0;32m 1065\u001b[0m (obj, module_name, name)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1066\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 1067\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m obj2 \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m obj:\n", + "\u001b[1;31mPicklingError\u001b[0m: Can't pickle . at 0x000001B12EACA8E0>: it's not found as keras.src.layers.layer.Layer._initializer_tracker.." + ] + } + ], + "source": [ + "import joblib\n", + "model.compile(optimizer='adam', loss='mse', metrics=['mae'])\n", + "\n", + "\n", + "history = model.fit(X_train, y_train, epochs=50, validation_data=(X_test, y_test))\n", + "\n", + "joblib.dump(model, 'PEFR_predictor.joblib')\n", + "\n", + "loss, mae = model.evaluate(X_test, y_test)\n", + "y_test_float = tf.cast(y_test, dtype=tf.float32)\n", + "mae_percentage = (int(mae) / tf.math.reduce_variance(y_test_float))*100\n", + "mae_percentage\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 136ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[467.9805 ],\n", + " [531.3571 ],\n", + " [496.45547],\n", + " [514.9509 ],\n", + " [475.6978 ],\n", + " [462.05984],\n", + " [490.24817],\n", + " [449.3226 ],\n", + " [530.9557 ],\n", + " [426.03867],\n", + " [498.93262]], dtype=float32)" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predictions=model.predict(X_test)\n", + "predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "y_train\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "p2xrwNQ6j7Nf", + "outputId": "40f5985a-2e37-4572-abc9-4e84e2e9bd8a" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1.1162505" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mae_percentage.numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f9N2S9ZNk_ny", + "outputId": "b94476e0-14ad-4587-fa6b-4fbf9eecf6f9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RMSE Percentage: 1.8573691809018122\n" + ] + } + ], + "source": [ + "print(\"RMSE Percentage:\", x)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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zJk0a9aMcePGsX79em/GJSIiInJKbicy48ePZ+vWrXzwwQekpqbSu3dvunTpgmVZJ5wZW0RERMSbKtxr6dxzz+W9994jNTWVe+65hx49enDuuedy5pln8uKLL3ojRhEREZFyuT1FwcmsW7eOd955h+nTp3PgwAFPxOUxmqJARETE/7j7+e2RRKZUYWEhQUFBnrqcRyiRERER8T/ufn67XbV08cUXk56e7nr97LPPcvToUdfrQ4cO0aVLl8pFKyIiIlIJbicyc+fOJT8/3/X66aefLjPTdVFREVu2bPFsdCIiIiIn4XYi8+caKA/WSImIiIhUikcmjRQRERHxBbcTGZvNhs1mO26fiIiIiK+4PUWBZVncfPPNOBwOAPLy8rjrrrsIDw8HKNN+RkRERKQ6uJ3IjBgxoszrG2644bhzbrrppqpHJCIiIuImtxOZqVOnejMOERERkQpTY18RERHxW26XyNx6661unffuu+9WOhgRERGRinA7kZk2bRpNmjShW7duGkNGREREagS3E5m7776bjz/+mJ07d3LLLbdwww03UK9ePW/GJiIiInJSbreRee2110hJSeHBBx/kyy+/JDk5maFDhzJ37lyV0IiIiIhPVHr2699//51p06bx/vvvU1RUxIYNG4iIiPB0fFWm2a9FRET8j8dnvz7ujXY7NpsNy7IoLi6u7GVEREREKq1CiUx+fj4ff/wxAwcOpHXr1qxbt45XX32VXbt21cjSGBEREand3G7se8899zBjxgySk5O59dZb+fjjj6lfv743YxMRERE5KbfbyNjtdho3bky3bt1OOlnk559/7rHgPEFtZERERPyPu5/fbpfI3HTTTZrtWkRERGqUCg2IJyIiIlKTaK4lERER8VtKZERERMRvKZERERERv6VERkRERPyWEhkRERHxW0pkRERExG8pkRERERG/pURGRERE/FaNSWSeffZZbDYbo0ePdu3r168fNputzHLXXXf5LkgRERGpUdwe2debli9fzhtvvEHnzp2PO3b77bfzxBNPuF6HhYVVZ2giIiJSg/m8RCYrK4vhw4fz1ltvERsbe9zxsLAwEhISXIsmfhQREZFSPk9kRo4cySWXXMKAAQPKPT59+nTq169Px44dGT9+PDk5OSe9Xn5+PhkZGWUWERERqZ18WrU0Y8YMVq1axfLly8s9fv3119OkSROSkpJYu3Yt48aNY8uWLXz++ecnvOYzzzzDxIkTvRWyiIiI1CA2y7IsX9x49+7d9OzZk3nz5rnaxvTr14+uXbsyadKkct/z7bff0r9/f7Zv306LFi3KPSc/P5/8/HzX64yMDJKTk0lPT1e1lIiIiJ/IyMggOjr6lJ/fPiuRWblyJWlpaXTv3t21r7i4mO+//55XX32V/Px8AgICyrynd+/eACdNZBwOBw6Hw3uBi4iISI3hs0Smf//+rFu3rsy+W265hbZt2zJu3LjjkhiA1atXA5CYmFgdIYqIiEgN57NEJjIyko4dO5bZFx4eTlxcHB07dmTHjh189NFHXHzxxcTFxbF27VrGjBnDOeecU243bREREal7asQ4MuUJDg5m/vz5TJo0iezsbJKTkxkyZAiPPPKIr0MTERGRGsJnjX2ri7uNhURERKTmcPfz2+fjyIiIiIhUlhIZERER8VtKZERERMRvKZERERERv6VERkRERPyWEhkRERHxW0pkRERExG8pkRERERG/pURGRERE/JYSGREREfFbSmRERETEbymREREREb+lREZERET8lhIZERER8VtKZERERMRvKZERERERv6VERkRERPyWEhkRERHxW0pkRERExG8pkRERERG/pURGRERE/JYSGREREfFbSmRERETEbymREREREb+lREZERET8lhIZERER8VtKZERERMRvKZERERERv6VERkRERPyWEhkRERHxW0pkRERExG8F+joAf5edX8T+jDz2Z+STlplHWka+eZ1p1oezC2hcL4xuyTF0axxL5+RookKCfB22iIhIraBEppImfrmBmSv2kJVfdMpzt6dl8e3mNABsNmjZIIJujWPomhxLt8YxtI6PJMBu83bIIiIitY4SmSooTWIiHIE0jHIQHxli1lEhNIx00DAqhNiwILanZfHLrqP8svsIuw/nsi0ti21pWXy6Yg8A4cEBNK0fTsPIY+9tUHqNkus0iHAQHKiaQBERkT+yWZZl+ToIb8rIyCA6Opr09HSioqI8dt19R3PJL3LSMNJBuMP9fPBgVj6rdx1l9W6T2KzZne5WqQ5Ak7gwzmvTkP7tGtKrWT0cgQGVDV9ERKRGc/fzW4mMjxU7LX49kMXuIzmkZeSTlvmHtjaZ+RzIyONAVj6FxWX/mcKDAzindQPOb9uQ89o2pH6Ew6Nx5RUWE2C3ERTg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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.plot(history.history['mae'], label='Training Error')\n", + "plt.plot(history.history['val_mae'], label='Validation Error')\n", + "plt.xlabel('Epoch')\n", + "plt.ylabel('MEAN ABSOLUTE ERROR')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "age=19\n", + "height=155\n", + "gender=1\n", + "hum=60\n", + "temp=33\n", + "pm25=16\n", + "pm10=23.62\n", + "actual_pefr=350\n", + "\n", + "print(hum,temp,pm25,pm10)\n", + "\n", + "params = np.array([age, height, gender, temp, hum, pm25, pm10])\n", + "params=params.reshape(1,7,1)\n", + "print(params)\n", + "print(params.shape)\n", + "\n", + "y=model.predict(params)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "predicted pefr: [[797.0687]]\n", + "[[43.910892]]\n", + "risk\n" + ] + } + ], + "source": [ + "\n", + "predicted_pefr=y+300\n", + "print(\"predicted pefr:\",predicted_pefr)\n", + "perpefr=(actual_pefr/predicted_pefr)*100\n", + "print(perpefr)\n", + "if perpefr>=80:\n", + " print(\"safe\")\n", + "elif perpefr>=50:\n", + " print(\"moderate\")\n", + "else:\n", + " print(\"risk\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Prediction Models/Ashtma Attack Prediction/Asthamapred_dataset.csv b/Prediction Models/Ashtma Attack Prediction/Asthamapred_dataset.csv new file mode 100644 index 000000000..608caf4bb --- /dev/null +++ b/Prediction Models/Ashtma Attack Prediction/Asthamapred_dataset.csv @@ -0,0 +1,55 @@ +Age,Height,Gender,Outdoor Temperature,Humidity,PM 2.5 ,PM 10,PEFR +19,155,1,33,60,16,23.62,524 +26,183,1,32,71,12,18.29,640 +22,153,0,27,85,27,38.29,356 +25,160,0,26,88,18,26.2,402 +18,162,0,26,85,16,23.62,424 +18,150,1,32,64,38,52.8,465 +26,176,1,29,82,22,31.62,540 +33,146,0,24,86,34,47.5,326 +40,178,1,33,65,27,38.3,512 +25,164,0,36,55,28,39.8,399 +20,195,1,29,78,26,36,578 +27,153,0,27,86,18,27,401 +29,149,0,30,62,12,18,460 +26,157,0,31,66,16,23.66,453 +25,140,0,26,89,34,47.5,366 +20,168,1,24,90,20,29,571 +20,174,1,33,64,33,46.1,522 +23,154,0,28,86,21,30.5,432 +17,176,1,27,89,19,27.7,621 +18,155,1,34,63,14,21,531 +19,150,1,30,68,12,18,502 +20,149,0,25,78,18,27,456 +36,160,1,27,73,16,23.66,587 +49,153,1,20,92,20,29,516 +25,164,1,26,88,34,48,486 +29,152,0,24,88,20,35,460 +23,169,1,28,78,26,40,502 +24,154,1,29,67,38,50,412 +27,180,1,32,62,21,36,621 +15,160,0,21,92,36,48,322 +33,145,0,25,90,37,49,302 +65,190,1,24,88,25,40,600 +24,160,0,26,84,21,36,483 +26,169,1,36,59,26,39,513 +32,142,0,22,79,21,35,454 +16,195,1,33,68,25,29,586 +20,146,0,36,64,25,33,450 +25,187,1,34,63,12,24,651 +26,182,1,31,60,13,26,643 +29,162,1,22,83,18,29,586 +27,146,0,24,89,18,32,476 +23,186,1,27,81,14,24,608 +22,144,0,26,76,16,28,466 +33,176,1,32,70,22,35,578 +36,155,0,23,89,26,36,472 +36,169,1,36,52,29,39,565 +25,166,0,25,82,19,29,498 +39,185,1,34,60,18,30,600 +34,166,0,21,95,26,32,420 +29,178,1,25,82,24,35,598 +28,145,0,26,84,15,30,444 +25,177,1,35,56,16,36,599 +36,146,0,24,81,35,51,356 +22,149,0,33,56,24,40,416 diff --git a/Prediction Models/Ashtma Attack Prediction/README.md b/Prediction Models/Ashtma Attack Prediction/README.md new file mode 100644 index 000000000..53e41dc81 --- /dev/null +++ b/Prediction Models/Ashtma Attack Prediction/README.md @@ -0,0 +1,101 @@ +# Asthma-Risk-Prediction +# ABSTRACT: + +Air pollution poses a significant threat to global health, particularly in relation to respiratory conditions, contributing to over 8 million deaths annually. The impact is widespread, with more than 4.2 million deaths attributed to outdoor exposure and an additional 3.8 million linked to indoor pollution. Respiratory symptoms induced by pollutant agents are evident, with a pronounced interference in asthma outcomes, including incidence, prevalence, hospital admissions, emergency department visits, mortality, and asthma attacks. Amidst the ongoing COVID-19 situation, the risk escalates for older adults and individuals with complications like hypertension and diabetes during hospital admissions. Addressing this concern, an essential in-house monitoring framework for predicting asthma risk is proposed. The proposed Asthma Risk Prediction framework utilizes deep learning algorithms to estimate vulnerability based on particulate matter (PM) levels in the living environment and outdoor weather conditions. Employing Convolutional Neural Networks, the framework categorizes predicted peak expiratory flow rate (PEFR) levels into three groups: "Green" (Safe), "Yellow" (Moderate Risk), and "Red" (High Risk). When conditions indicate potential asthma risk, proactive measures such as activating air purifiers and notifying first responders are initiated. The hardware implementation involves PM sensors for detection, with a Raspberry Pi serving as the edge node to predict risk levels and trigger the response system. + +KEYWORDS-edge computing, machine learning, iot, Asthma prediction, particulate matter (PM), peak expiratory flow rates (PEFR), convolutional neural network, Raspberry + +# ALGORITHM: + +Algorithm explaining the proposed system working in real-time Input: PM2.5, PM10, outdoor temperature, humidity. Output: Safe, Moderate or High asthma risk prediction. Data processing stage on the Raspberry Pi: Collect PM2.5, PM10 using SDS011; Collect weather data using Openweather map; Data hosting the input features to server;Real-time stage on the Smartphone: + +while MQTT publishing data: + + do Collect data from Sensor; + CNN prediction; + if PEFR > 80% then + Safe; + else if 50% < PEFR < 80% then + Moderate risk; + else + High risk; + end +end + +# PROPOSED METHODOLOGY + +# Proposed Asthma Prediction Method +• PM sensors to detect the particulate matters. +• The collected data is sent to the edge node raspberry pi +• The CNN algorithm will be running in the raspberry pi which has already been trained with the dataset given previously +• the estimated PEFR levels are categorized into three groups: "Green" (Safe), "Yellow" (Moderate Risk), and "Red “ +• Raspberry pi predicts the level of risk +• If the prevailing conditions are amenable to cause asthma risk then with the help of relay air purifier is switched on and informs the first responsible persons (FRP) + +# DATASET DETAILS + +![image](https://github.com/user-attachments/assets/5751b23b-09f3-405f-8c4f-5635cfc1f17f) + + +The dataset utilized is real-time and includes both features and one label. It comprises the individual's age, height, and gender, along with the room's temperature, humidity, particulate matter information, and the predicted Peak Expiratory Flow Rate. + +The humidity and temperature are recorded from the readings of DHT11 sensor and the pm2.5 and pm10 values from the sds011 air quality sensor + +Out of the dataset 80% of the data is used for training and 20% is used for testing. + +# DEEP LEARNING ALGORITHM + + +The deep learning algorithm which we have used is 1DCNN. + +One-dimensional convolution neural networks(1D CNN) are often used for time series data analysis, where the data is sequenced and ordered over time. Asthma is a chronic respiratory disease that can be characterized by symptoms that change over time, such as wheezing and shortness of breath. + +1D CNN is effective for asthma prediction because they are designed to learn spatial temporal patterns in sequential data. They can capture both short-term and long-term dependencies in the time series data, which is important for asthma prediction as the symptoms can vary over different time scales. + +In addition,1D CNN can be used to automatically extract relevant features from the raw input data, which can help to improve the accuracy of the prediction. + +![image](https://github.com/user-attachments/assets/3fa7ed85-0af9-4a62-9cc2-e8fac7f6e3c7) + +# MODEL VALIDATION : + + + + In this work, we used two criteria RMSE and MAE ,These are used to evaluate the performance of the model + + +• MEAN ABSOLUTE ERROR: + + MAE is the absolute difference between the target and predicted variables. + + ![image](https://github.com/user-attachments/assets/9213f1cd-ffc2-4ea8-b437-9a774d58b3a2) + + +MAE ranges from 0 to positive infinity, Apparently it is expected to achieve MAE value as small +as possible (close to 0),meaning that the predicted value is equal to the target + + +• ROOT MEAN SQUARE ERROR: + +RMSE is the standard deviation,which indicated the difference between real and predicted variables + +![image](https://github.com/user-attachments/assets/96967f56-a4c0-4e01-8dcc-dc149d154349) + +# RESULTS + +• Plot between RMSE and epoch +![image](https://github.com/user-attachments/assets/2f9e172c-46f8-4e43-a1af-9b9a9bbc1ac1) + +• Plot between MAE and epochs +![image](https://github.com/user-attachments/assets/0ce8b834-bfbc-4daa-9180-9148c0651cdf) + +• Mean Absolute Error +![image](https://github.com/user-attachments/assets/a19d26ff-409e-4ccf-93aa-146a05aac0c7) + +• Root Mean Squared Error +![image](https://github.com/user-attachments/assets/4217b126-94d4-4c5a-b238-7d13b4a156de) + +• Prediction of PEFR value +![image](https://github.com/user-attachments/assets/5a809d3e-f5e2-43e8-b9cd-b38ef1059942) + +# CONCLUSION AND FUTURE PLANS +In this project, we introduce a convolutional neural network-based approach to predict asthma development risk. By leveraging basic PM and weather data, we forecast PEFR readings. Through unbiased evaluations, we observe significant performance improvements with our proposed method. This model employs sensors, an edge device, and an IoT platform. It offers an accurate means of forecasting asthma likelihood, providing individuals the ability to monitor their condition anytime, anywhere. Our future plans involve product development and the creation of a mobile application. This app will collect user data such as height, weight, age, and sex, while the product itself monitors environmental conditions. Its portability ensures easy accessibility for asthma risk assessment regardless of location or time. Hence, this tool presents a highly effective solution for asthma risk monitoring. From 88d2341b17477249eaeed395487c6056f371e299 Mon Sep 17 00:00:00 2001 From: Prayag Thakur <114804510+PrAyAg9@users.noreply.github.com> Date: Sat, 26 Oct 2024 12:08:06 +0530 Subject: [PATCH 2/3] Update README.md --- .../Ashtma Attack Prediction/README.md | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/Prediction Models/Ashtma Attack Prediction/README.md b/Prediction Models/Ashtma Attack Prediction/README.md index 53e41dc81..4e2365d56 100644 --- a/Prediction Models/Ashtma Attack Prediction/README.md +++ b/Prediction Models/Ashtma Attack Prediction/README.md @@ -1,27 +1,47 @@ -# Asthma-Risk-Prediction -# ABSTRACT: +# Asthma Risk Prediction System -Air pollution poses a significant threat to global health, particularly in relation to respiratory conditions, contributing to over 8 million deaths annually. The impact is widespread, with more than 4.2 million deaths attributed to outdoor exposure and an additional 3.8 million linked to indoor pollution. Respiratory symptoms induced by pollutant agents are evident, with a pronounced interference in asthma outcomes, including incidence, prevalence, hospital admissions, emergency department visits, mortality, and asthma attacks. Amidst the ongoing COVID-19 situation, the risk escalates for older adults and individuals with complications like hypertension and diabetes during hospital admissions. Addressing this concern, an essential in-house monitoring framework for predicting asthma risk is proposed. The proposed Asthma Risk Prediction framework utilizes deep learning algorithms to estimate vulnerability based on particulate matter (PM) levels in the living environment and outdoor weather conditions. Employing Convolutional Neural Networks, the framework categorizes predicted peak expiratory flow rate (PEFR) levels into three groups: "Green" (Safe), "Yellow" (Moderate Risk), and "Red" (High Risk). When conditions indicate potential asthma risk, proactive measures such as activating air purifiers and notifying first responders are initiated. The hardware implementation involves PM sensors for detection, with a Raspberry Pi serving as the edge node to predict risk levels and trigger the response system. +## Table of Contents +1. [Abstract](#abstract) +2. [Algorithm](#algorithm) +3. [Proposed Methodology](#proposed-methodology) +4. [Dataset Details](#dataset-details) +5. [Deep Learning Algorithm](#deep-learning-algorithm) +6. [Model Validation](#model-validation) +7. [Results](#results) +8. [Conclusion and Future Plans](#conclusion-and-future-plans) -KEYWORDS-edge computing, machine learning, iot, Asthma prediction, particulate matter (PM), peak expiratory flow rates (PEFR), convolutional neural network, Raspberry +## Abstract +Air pollution poses a significant threat to global health, particularly in relation to respiratory conditions, contributing to over 8 million deaths annually. The impact is widespread, with more than 4.2 million deaths attributed to outdoor exposure and an additional 3.8 million linked to indoor pollution. Respiratory symptoms induced by pollutant agents are evident, with a pronounced interference in asthma outcomes, including incidence, prevalence, hospital admissions, emergency department visits, mortality, and asthma attacks. Amidst the ongoing COVID-19 situation, the risk escalates for older adults and individuals with complications like hypertension and diabetes during hospital admissions. Addressing this concern, an essential in-house monitoring framework for predicting asthma risk is proposed. -# ALGORITHM: +The proposed Asthma Risk Prediction framework utilizes deep learning algorithms to estimate vulnerability based on particulate matter (PM) levels in the living environment and outdoor weather conditions. Employing Convolutional Neural Networks, the framework categorizes predicted peak expiratory flow rate (PEFR) levels into three groups: "Green" (Safe), "Yellow" (Moderate Risk), and "Red" (High Risk). When conditions indicate potential asthma risk, proactive measures such as activating air purifiers and notifying first responders are initiated. The hardware implementation involves PM sensors for detection, with a Raspberry Pi serving as the edge node to predict risk levels and trigger the response system. -Algorithm explaining the proposed system working in real-time Input: PM2.5, PM10, outdoor temperature, humidity. Output: Safe, Moderate or High asthma risk prediction. Data processing stage on the Raspberry Pi: Collect PM2.5, PM10 using SDS011; Collect weather data using Openweather map; Data hosting the input features to server;Real-time stage on the Smartphone: +**Keywords:** edge computing, machine learning, IoT, asthma prediction, particulate matter (PM), peak expiratory flow rates (PEFR), convolutional neural network, Raspberry Pi -while MQTT publishing data: +## Algorithm +The algorithm explaining the proposed system works in real-time: +- **Input:** PM2.5, PM10, outdoor temperature, humidity. +- **Output:** Safe, Moderate, or High asthma risk prediction. - do Collect data from Sensor; - CNN prediction; - if PEFR > 80% then - Safe; - else if 50% < PEFR < 80% then - Moderate risk; - else - High risk; - end -end +**Data Processing Stage on the Raspberry Pi:** +- Collect PM2.5, PM10 using SDS011. +- Collect weather data using OpenWeatherMap. +- Host input features to the server. +**Real-time Stage on the Smartphone:** +```plaintext +while MQTT publishing data: + do + Collect data from Sensor; + CNN prediction; + if PEFR > 80% then + Safe; + else if 50% < PEFR < 80% then + Moderate risk; + else + High risk; + end +end +``` # PROPOSED METHODOLOGY # Proposed Asthma Prediction Method From 058d1d90894a99d53d7c74fcbd266ab4eb194c3e Mon Sep 17 00:00:00 2001 From: Prayag Thakur <114804510+PrAyAg9@users.noreply.github.com> Date: Sat, 26 Oct 2024 12:12:31 +0530 Subject: [PATCH 3/3] Add files via upload --- .../app/Asthma Risk Prediction.ipynb | 108 ++++++++++ .../app/Asthma Risk Prediction.py | 85 ++++++++ .../Ashtma Attack Prediction/app/main.py | 193 ++++++++++++++++++ .../Ashtma Attack Prediction/app/main1.py | 167 +++++++++++++++ 4 files changed, 553 insertions(+) create mode 100644 Prediction Models/Ashtma Attack Prediction/app/Asthma Risk Prediction.ipynb create mode 100644 Prediction Models/Ashtma Attack Prediction/app/Asthma Risk Prediction.py create mode 100644 Prediction Models/Ashtma Attack Prediction/app/main.py create mode 100644 Prediction Models/Ashtma Attack Prediction/app/main1.py diff --git a/Prediction Models/Ashtma Attack Prediction/app/Asthma Risk Prediction.ipynb b/Prediction Models/Ashtma Attack Prediction/app/Asthma Risk Prediction.ipynb new file mode 100644 index 000000000..43c05e320 --- /dev/null +++ b/Prediction Models/Ashtma Attack Prediction/app/Asthma Risk Prediction.ipynb @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "be5b3365", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['PEFR_predictor.joblib']" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.tree import DecisionTreeClassifier as dtc\n", + "import joblib\n", + "\n", + "data=pd.read_csv(\"PEFR_Data_set.csv\")\n", + "data.shape\n", + "X=data.drop(columns=['Age','Height','PEFR'])\n", + "y=data['PEFR']\n", + "model=dtc()\n", + "model.fit(X,y)\n", + "joblib.dump(model, 'PEFR_predictor.joblib')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "39c29fa3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Enter Gender 1-Male 0-Female1\n", + "Enter Temperature C:22\n", + "Enter Humidity %:33\n", + "Enter PM 2.5 Value:44\n", + "Enter PM 10 Value:22\n", + "Enter Actual PEFR value334\n", + "512\n", + "65.234375\n", + "MODERATE\n" + ] + } + ], + "source": [ + "\n", + "model = joblib.load('PEFR_predictor.joblib')\n", + "g=int(input(\"Enter Gender 1-Male 0-Female\"))\n", + "p=float(input('Enter Temperature C:'))\n", + "q=float(input('Enter Humidity %:'))\n", + "r=float(input('Enter PM 2.5 Value:'))\n", + "s=float(input('Enter PM 10 Value:'))\n", + "prediction = model.predict([[g,p,q,r,s]])\n", + "predicted_pefr = prediction[0]\n", + "actual_pefr = float(input(\"Enter Actual PEFR value\"))\n", + "print(predicted_pefr)\n", + "perpefr = (actual_pefr/predicted_pefr)*100\n", + "print(perpefr)\n", + "if perpefr >= 80:\n", + " print('SAFE')\n", + "elif perpefr >= 50:\n", + " print('MODERATE')\n", + "else:\n", + " print('RISK')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66e1edfe", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Prediction Models/Ashtma Attack Prediction/app/Asthma Risk Prediction.py b/Prediction Models/Ashtma Attack Prediction/app/Asthma Risk Prediction.py new file mode 100644 index 000000000..e1991761d --- /dev/null +++ b/Prediction Models/Ashtma Attack Prediction/app/Asthma Risk Prediction.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[1]: + + +import pandas as pd +from sklearn.tree import DecisionTreeClassifier as dtc +import joblib +import requests +from bs4 import BeautifulSoup + + +# In[2]: + + +data=pd.read_csv("PEFR_Data_set.csv") +data.shape +X=data.drop(columns=['Age','Height','PEFR']) +y=data['PEFR'] +model=dtc() +model.fit(X,y) + +#joblib.dump(model, 'PEFR_predictor.joblib') + + +# In[3]: + + +#model = joblib.load('PEFR_predictor.joblib') + + +# In[5]: + +city = input("Enter City:") +url = f'https://www.iqair.com/in-en/india/tamil-nadu/{city}' +r = requests.get(url) + +soup = BeautifulSoup(r.content,'html.parser') +aqi_dict = [] +s = soup.find_all(class_ = "mat-tooltip-trigger pollutant-concentration-value") + + +for x in s: + aqi_dict.append(x.text) + +pm2 = aqi_dict[0] +pm10 = aqi_dict[1] + +t = soup.find('div', class_="weather__detail") +y = t.text +temp_index = y.find('Temperature')+11 +degree_index = y.find('°') +temp = y[temp_index : degree_index] + +hum_index = y.find('Humidity')+8 +perc_index = y.find('%') +hum = y[hum_index:perc_index] +''' +print(pm2) +print(pm10) +print(temp) +print(hum) +''' + +# In[6]: + +g=int(input("Enter Gender (1-Male/0-Female): ")) +p=temp +q=hum +r=pm2 +s=pm10 +prediction = model.predict([[g,p,q,r,s]]) +predicted_pefr = prediction[0] + +actual_pefr = float(input("Enter Actual PEFR value: ")) + +perpefr = (actual_pefr/predicted_pefr)*100 +if perpefr >= 80: + print('SAFE') +elif perpefr >= 50: + print('MODERATE') +else: + print('RISK') + diff --git a/Prediction Models/Ashtma Attack Prediction/app/main.py b/Prediction Models/Ashtma Attack Prediction/app/main.py new file mode 100644 index 000000000..90e5a7183 --- /dev/null +++ b/Prediction Models/Ashtma Attack Prediction/app/main.py @@ -0,0 +1,193 @@ +from kivymd.app import MDApp +from kivymd.uix.screen import Screen +from kivymd.uix.label import MDLabel +from kivymd.uix.button import MDRectangleFlatButton +from kivy.lang import Builder +from kivy.core.window import Window +import joblib +#Window.size=(320,600) +username_input=""" +MDTextField: + hint_text: "Enter Gender 1-Male 0-Female: " + hint_text_size:30 + helper_text: "must be an integer" + helper_text_mode: "on_focus" + icon_right: "language-python" + icon_right_color: app.theme_cls.primary_color + pos_hint:{'center_x': 0.5, 'center_y': 0.8} + size_hint_x:.5 + size_hint_y:.1 + font_size:'20sp' + width:400 +""" +username_input1 = """ +MDTextField: + hint_text: "Enter Temperature C: " + hint_text_size:30 + helper_text: "must be an integer" + helper_text_mode: "on_focus" + icon_right: "android" + icon_right_color: app.theme_cls.primary_color + pos_hint:{'center_x': 0.5, 'center_y': 0.7} + size_hint_x:.5 + size_hint_y:.1 + font_size:'20sp' + width:400 +""" +username_input2 = """ +MDTextField: + hint_text: "Enter Humidity %: " + hint_text_size:30 + helper_text: "must be an integer" + helper_text_mode: "on_focus" + icon_right: "android" + icon_right_color: app.theme_cls.primary_color + pos_hint:{'center_x': 0.5, 'center_y': 0.6} + size_hint_x:.5 + size_hint_y:.1 + font_size:'20sp' + width:400 +""" +username_input3 = """ +MDTextField: + hint_text: "Enter PM 2.5 Value: " + hint_text_size:30 + helper_text: "must be an integer" + helper_text_mode: "on_focus" + icon_right: "android" + icon_right_color: app.theme_cls.primary_color + pos_hint:{'center_x': 0.5, 'center_y': 0.5} + size_hint_x:.5 + size_hint_y:.1 + font_size:'20sp' + width:400 +""" +username_input4 = """ +MDTextField: + hint_text: "Enter PM 10 Value: " + hint_text_size:30 + helper_text: "must be an integer" + helper_text_mode: "on_focus" + icon_right: "android" + icon_right_color: app.theme_cls.primary_color + pos_hint:{'center_x': 0.5, 'center_y': 0.4} + size_hint_x:.5 + size_hint_y:.1 + font_size:'20sp' + width:400 +""" +username_input5 = """ +MDTextField: + hint_text: "Enter Actual PEFR value: " + hint_text_size:30 + helper_text: "must be an integer" + helper_text_mode: "on_focus" + icon_right: "android" + icon_right_color: app.theme_cls.primary_color + pos_hint:{'center_x': 0.5, 'center_y': 0.3} + size_hint_x:.5 + size_hint_y:.1 + font_size:'20sp' + width:400 +""" +def predicter(g,p,q,r,s,actual_pefr): + model = joblib.load('decision_tree_model.joblib') + prediction = model.predict([[g,p,q,r,s]]) + predicted_pefr = prediction[0] + print(predicted_pefr) + perpefr = (actual_pefr/predicted_pefr)*100 + print(perpefr) + if perpefr >= 80: + print('SAFE') + re='SAFE' + elif perpefr >= 50: + print('MODERATE') + re='MODERATE' + else: + print('RISK') + re='RISK' + return (re,predicted_pefr,actual_pefr,(perpefr//100)*10) +class DemoApp(MDApp): + + def build(self): + self.screen=Screen() + self.theme_cls.primary_palette = "Green" + self.label = MDLabel(text="ASTHMA RISK PREDICTION", halign="center",theme_text_color='Custom', + text_color=(0,1,0,1),font_style='H4',pos_hint={'center_x': 0.5, 'center_y': 0.9}) + self.username = Builder.load_string(username_input) + self.username1 = Builder.load_string(username_input1) + self.username2 = Builder.load_string(username_input2) + self.username3 = Builder.load_string(username_input3) + self.username4 = Builder.load_string(username_input4) + self.username5 = Builder.load_string(username_input5) + + self.btn = MDRectangleFlatButton(text='Calculate',font_size='20sp', + pos_hint={'center_x': 0.5, 'center_y': 0.1},size_hint=(.2, .1) + ,on_release=self.mul) + self.screen.add_widget(self.label) + self.screen.add_widget(self.username) + self.screen.add_widget(self.username1) + self.screen.add_widget(self.username2) + self.screen.add_widget(self.username3) + self.screen.add_widget(self.username4) + self.screen.add_widget(self.username5) + self.screen.add_widget(self.btn) + return self.screen + def mul(self,obj): + self.screen.remove_widget(self.label) + self.screen.remove_widget(self.username) + self.screen.remove_widget(self.username1) + self.screen.remove_widget(self.username2) + self.screen.remove_widget(self.username3) + self.screen.remove_widget(self.username4) + self.screen.remove_widget(self.username5) + self.screen.remove_widget(self.btn) + r=predicter(float(self.username.text), + float(self.username1.text), + float(self.username2.text), + float(self.username3.text), + float(self.username4.text), + float(self.username5.text)) + self.label1 = MDLabel(text="PREDICTION RESULTS", halign="center",theme_text_color='Custom', + text_color=(0,1,0,1),font_style='H4',pos_hint={'center_x': 0.5, 'center_y': 0.9}) + self.label_1 = MDLabel(text="PREDICTED PEFR: "+str(r[1]), halign="center",theme_text_color='Custom', + text_color=(0,0,1,1),font_style='H5',pos_hint={'center_x': 0.5, 'center_y': 0.7}) + self.label1_ = MDLabel(text="ACTUAL PEFR ENTERED: "+str(r[2]), halign="center",theme_text_color='Custom', + text_color=(1,0,1,1),font_style='H5',pos_hint={'center_x': 0.5, 'center_y': 0.5}) + + + if(r[0]=='SAFE'): + c=(0,1,0,1) + if(r[0]=='MODERATE'): + c=(1,1,0,1) + if(r[0]=='RISK'): + c=(1,0,0,1) + self.label2 = MDLabel(text=str(r[0]), halign="center",theme_text_color='Custom', + text_color=c,font_style='H4',pos_hint={'center_x': 0.5, 'center_y': 0.3}) + + + self.button = MDRectangleFlatButton(text='Back', + pos_hint={'center_x': 0.8, 'center_y': 0.1 }, + on_release=self.back) + + self.screen.add_widget(self.label1) + self.screen.add_widget(self.label_1) + self.screen.add_widget(self.label1_) + self.screen.add_widget(self.label2) + self.screen.add_widget(self.button) + def back(self,obj): + self.screen.add_widget(self.label) + self.screen.add_widget(self.username) + self.screen.add_widget(self.username1) + self.screen.add_widget(self.username2) + self.screen.add_widget(self.username3) + self.screen.add_widget(self.username4) + self.screen.add_widget(self.username5) + self.screen.add_widget(self.btn) + self.screen.remove_widget(self.button) + self.screen.remove_widget(self.label1) + self.screen.remove_widget(self.label2) + self.screen.remove_widget(self.label_1) + self.screen.remove_widget(self.label1_) + self.screen.remove_widget(self.button) +DemoApp().run() diff --git a/Prediction Models/Ashtma Attack Prediction/app/main1.py b/Prediction Models/Ashtma Attack Prediction/app/main1.py new file mode 100644 index 000000000..3b055f702 --- /dev/null +++ b/Prediction Models/Ashtma Attack Prediction/app/main1.py @@ -0,0 +1,167 @@ +from kivymd.app import MDApp +from kivymd.uix.screen import Screen +from kivymd.uix.label import MDLabel +from kivymd.uix.button import MDRectangleFlatButton +from kivy.lang import Builder +from kivy.core.window import Window +import random +import joblib +import requests +from bs4 import BeautifulSoup + +#Window.size=(320,600) +username_input=""" +MDTextField: + + hint_text: "Enter city of locating " + hint_text_size:30 + helper_text: "check the spelling" + helper_text_mode: "on_focus" + icon_right: "language-python" + icon_right_color: app.theme_cls.primary_color + pos_hint:{'center_x': 0.5, 'center_y': 0.8} + size_hint_x:.5 + size_hint_y:.1 + font_size:'15sp' + width:400 +""" +username_input1 = """ +MDTextField: + hint_text: "Enter Gender 1-Male 0-Female: " + hint_text_size:30 + helper_text: "must be an integer" + helper_text_mode: "on_focus" + icon_right: "android" + icon_right_color: app.theme_cls.primary_color + pos_hint:{'center_x': 0.5, 'center_y': 0.7} + size_hint_x:.5 + size_hint_y:.1 + font_size:'15sp' + width:400 +""" +username_input2 = """ +MDTextField: + hint_text: "Enter Actual PEFR value: " + hint_text_size:30 + helper_text: "must be an integer" + helper_text_mode: "on_focus" + icon_right: "android" + icon_right_color: app.theme_cls.primary_color + pos_hint:{'center_x': 0.5, 'center_y': 0.6} + size_hint_x:.5 + size_hint_y:.1 + font_size:'15sp' + width:400 +""" +def predicter(city,g,actual_pefr): + l=['Cuddalore','Tiruppur','Ooty','Krishnagiri','Kattivakkam','Dindigul','Chennai','Arcot','Ariyalur'] + model = joblib.load('decision_tree_model.joblib') + url = f'https://www.iqair.com/in-en/india/tamil-nadu/{city}' + r = requests.get(url) + soup = BeautifulSoup(r.content,'html.parser') + aqi_dict = [] + s = soup.find('table',class_ = "aqi-overview-detail__other-pollution-table") + if(s==None): + city = random.choice(l).lower() + url = 'https://www.iqair.com/in-en/india/tamil-nadu/'+city + r = requests.get(url) + soup = BeautifulSoup(r.content,'html.parser') + aqi_dict = [] + s = soup.find('table',class_ = "aqi-overview-detail__other-pollution-table") + for x in s: + aqi_dict.append(x.text) + aqi = aqi_dict[1] + a=aqi.split(" ") + pm2_index = a.index("PM2.5") + pm2 = a[pm2_index +1][0:2] + if 'PM10' not in aqi_dict : + pm10 = 1.38 * float(pm2) + else: + pm10_index = a.index("PM10") + pm10 = a[pm10_index+ 1][0:2] + t = soup.find('div', class_="weather__detail") + y = t.text + temp_index = y.find('Temperature')+11 + degree_index = y.find('°') + temp = y[temp_index : degree_index] + hum_index = y.find('Humidity')+8 + perc_index = y.find('%') + hum = y[hum_index:perc_index] + p=temp + q=hum + r=pm2 + s=pm10 + prediction = model.predict([[g,p,q,r,s]]) + predicted_pefr = prediction[0] + perpefr = (actual_pefr/predicted_pefr)*100 + if perpefr >= 80: + re='SAFE' + elif perpefr >= 50: + re='MODERATE' + else: + re='RISK' + return (re,predicted_pefr,actual_pefr,(perpefr//100)*10) +class DemoApp(MDApp): + + def build(self): + self.screen=Screen() + self.theme_cls.primary_palette = "Green" + self.label = MDLabel(text="ASTHMA RISK PREDICTION", halign="center",theme_text_color='Custom', + text_color=(0,1,0,1),font_style='H4',pos_hint={'center_x': 0.5, 'center_y': 0.9}) + self.username = Builder.load_string(username_input) + self.username1 = Builder.load_string(username_input1) + self.username2 = Builder.load_string(username_input2) + + self.btn = MDRectangleFlatButton(text='Calculate',font_size='20sp', + pos_hint={'center_x': 0.5, 'center_y': 0.1},size_hint=(.2, .1) + ,on_release=self.mul) + self.screen.add_widget(self.label) + self.screen.add_widget(self.username) + self.screen.add_widget(self.username1) + self.screen.add_widget(self.username2) + self.screen.add_widget(self.btn) + return self.screen + def mul(self,obj): + self.screen.remove_widget(self.label) + self.screen.remove_widget(self.username) + self.screen.remove_widget(self.username1) + self.screen.remove_widget(self.username2) + self.screen.remove_widget(self.btn) + r=predicter(str(self.username.text), + int(self.username1.text), + int(self.username2.text),) + self.label1 = MDLabel(text="PREDICTION RESULTS", halign="center",theme_text_color='Custom', + text_color=(0,1,0,1),font_style='H4',pos_hint={'center_x': 0.5, 'center_y': 0.9}) + self.label_1 = MDLabel(text="PREDICTED PEFR: "+str(r[1]), halign="center",theme_text_color='Custom', + text_color=(0,0,1,1),font_style='H5',pos_hint={'center_x': 0.5, 'center_y': 0.7}) + self.label1_ = MDLabel(text="ACTUAL PEFR ENTERED: "+str(r[2]), halign="center",theme_text_color='Custom', + text_color=(1,0,1,1),font_style='H5',pos_hint={'center_x': 0.5, 'center_y': 0.5}) + if(r[0]=='SAFE'): + c=(0,1,0,1) + if(r[0]=='MODERATE'): + c=(1,1,0,1) + if(r[0]=='RISK'): + c=(1,0,0,1) + self.label2 = MDLabel(text=str(r[0]), halign="center",theme_text_color='Custom', + text_color=c,font_style='H4',pos_hint={'center_x': 0.5, 'center_y': 0.3}) + self.button = MDRectangleFlatButton(text='Back', + pos_hint={'center_x': 0.8, 'center_y': 0.1 }, + on_release=self.back) + self.screen.add_widget(self.label1) + self.screen.add_widget(self.label_1) + self.screen.add_widget(self.label1_) + self.screen.add_widget(self.label2) + self.screen.add_widget(self.button) + def back(self,obj): + self.screen.add_widget(self.label) + self.screen.add_widget(self.username) + self.screen.add_widget(self.username1) + self.screen.add_widget(self.username2) + self.screen.add_widget(self.btn) + self.screen.remove_widget(self.button) + self.screen.remove_widget(self.label1) + self.screen.remove_widget(self.label2) + self.screen.remove_widget(self.label_1) + self.screen.remove_widget(self.label1_) + self.screen.remove_widget(self.button) +DemoApp().run()