{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "be5e2cf3-4e08-4dda-b5e9-42cc43821aee", "metadata": {}, "outputs": [], "source": [ "import os\n", "import glob\n", "import numpy as np\n", "from tqdm import tqdm\n", "import itertools\n", "import matplotlib.pyplot as plt\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import classification_report, accuracy_score, confusion_matrix\n", "from sklearn.preprocessing import LabelEncoder\n", "from sklearn.utils import shuffle\n", "from sklearn.utils import class_weight\n", "import keras\n", "from keras.models import Sequential\n", "from keras.layers import Dense, Dropout, Activation, Flatten\n", "from keras.layers import Convolution2D, Conv2D, MaxPooling2D, GlobalAveragePooling2D\n", "from keras.utils import to_categorical\n", "import numpy as np\n", "import tensorflow as tf\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Conv1D, Flatten, Dropout\n", "from tensorflow.keras.utils import to_categorical\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "import warnings\n", "warnings.filterwarnings('ignore', category=FutureWarning)\n", "import matplotlib.pyplot as plt\n", "import zipfile\n", "from IPython.display import clear_output\n", "import glob\n", "import pandas as pd\n", "import os" ] }, { "cell_type": "code", "execution_count": 3, "id": "0a41fca8-0f28-461f-98a6-6314d41481f3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Age Sex Height Weight Pregnancy status Murmur Outcome\n", "0 2 1 0.434483 0.125346 0 0 1\n", "1 2 1 0.468966 0.099539 0 1 1\n", "3 2 0 0.434483 0.125346 0 1 1\n", "4 2 0 0.358621 0.082028 0 1 1\n", "6 2 1 0.393103 0.107834 0 0 1\n", "Number of data sample rows: 759\n" ] } ], "source": [ "from numpy import nan\n", "from sklearn.preprocessing import MinMaxScaler\n", "df = pd.read_csv(os.path.join('training_data.csv'))\n", "\n", "# Now drop the columns\n", "columns_to_drop = [\n", " \"Patient ID\", \"Recording locations\", \"Murmur locations\", \"Most audible location\",\n", " \"Systolic murmur timing\", \"Systolic murmur shape\", \"Systolic murmur grading\",\n", " \"Systolic murmur pitch\", \"Systolic murmur quality\", \"Diastolic murmur timing\",\n", " \"Diastolic murmur shape\", \"Diastolic murmur grading\", \"Diastolic murmur pitch\",\n", " \"Diastolic murmur quality\", \"Campaign\", \"Additional ID\", \"Recording locations:\",\n", "]\n", "df.drop(columns=columns_to_drop, inplace=True, errors='ignore')\n", "\n", "scaler = MinMaxScaler()\n", "columns_to_normalize = ['Weight', 'Height']\n", "data_to_normalize = df[columns_to_normalize]\n", "normalized_data = scaler.fit_transform(data_to_normalize)\n", "df_normalized = pd.DataFrame(normalized_data, columns=columns_to_normalize)\n", "df[columns_to_normalize] = df_normalized\n", "\n", "\n", "df['Pregnancy status'] = df['Pregnancy status'].apply(lambda x: 1 if x else 0)\n", "sex2int = {'Male': 0, 'Female': 1}\n", "df['Sex'] = df['Sex'].apply(lambda x: sex2int[x] if x in sex2int else -1)\n", "df = df[df['Sex'] != -1]\n", "\n", "age2int = {'Neonate': 0, 'Infant': 1, 'Child': 2, 'Adolescent': 3}\n", "df['Age'] = df['Age'].apply(lambda x: age2int[x] if x in age2int else -1)\n", "df = df[df['Age'] != -1]\n", "\n", "df = df[df['Murmur'] != 'Unknown']\n", "df['Murmur'] = df['Murmur'].apply(lambda x: 0 if x == 'Absent' else (1 if x == 'Present' else 2))\n", "\n", "outcome2int = {'Normal': 0, 'Abnormal': 1}\n", "df['Outcome'] = df['Outcome'].apply(lambda x: outcome2int[x] if x in outcome2int else -1)\n", "df = df[df['Outcome'] != -1]\n", "\n", "df = df.select_dtypes(include=[np.number])\n", "df.dropna(inplace=True)\n", "\n", "\n", "print(df.head())\n", "print(\"Number of data sample rows:\", df.shape[0])" ] }, { "cell_type": "code", "execution_count": 6, "id": "499b212d-8acb-4ce5-a1e1-ec62d9f1142b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Age Sex Height Weight Pregnancy status Murmur Outcome\n", "0 2 1 0.446520 0.118830 0 0 1\n", "1 2 1 0.457870 0.120511 0 1 1\n", "2 2 0 0.423518 0.131510 0 1 1\n", "3 2 0 0.356813 0.071461 0 1 1\n", "4 2 1 0.396024 0.102232 0 0 1\n", "Number of data sample rows after SMOTE: 768\n", "Example input\n", " Age 2.00000\n", "Sex 1.00000\n", "Height 0.44652\n", "Weight 0.11883\n", "Pregnancy status 0.00000\n", "Murmur 0.00000\n", "Name: 0, dtype: float64\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "from sklearn.preprocessing import MinMaxScaler, StandardScaler\n", "from sklearn.model_selection import train_test_split\n", "from tensorflow.keras.utils import to_categorical\n", "from sklearn.utils import resample\n", "from imblearn.over_sampling import SMOTE\n", "\n", "\n", "noise_scale = 0.01\n", "\n", "numerical_cols = ['Weight', 'Height']\n", "for col in numerical_cols:\n", " df[col] += np.random.normal(loc=0.0, scale=noise_scale, size=df[col].shape)\n", "\n", "# Apply SMOTE for data aug\n", "smote = SMOTE()\n", "X = df.drop('Outcome', axis=1)\n", "y = df['Outcome']\n", "\n", "X_sm, y_sm = smote.fit_resample(X, y)\n", "df_sm = pd.DataFrame(X_sm, columns=X.columns)\n", "df_sm['Outcome'] = y_sm\n", "\n", "\n", "scaler = StandardScaler()\n", "X_scaled = scaler.fit_transform(df_sm.drop('Outcome', axis=1))\n", "X_scaled = X_scaled.reshape(X_scaled.shape[0], X_scaled.shape[1], 1)\n", "y_encoded = to_categorical(df_sm['Outcome'])\n", "\n", "# Split data into training and test sets\n", "X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_encoded, test_size=0.1, random_state=42)\n", "\n", "# augmented data\n", "print(df_sm.head())\n", "print(\"Number of data sample rows after SMOTE:\", df_sm.shape[0])\n", "print(\"Example input\\n\", df_sm.drop('Outcome', axis=1).loc[0])" ] }, { "cell_type": "code", "execution_count": 7, "id": "9a680377-7bdd-4da6-8c5b-eb9fb1336250", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/cogniveon/src/HeartMurmurClassification/.venv/lib/python3.12/site-packages/keras/src/layers/convolutional/base_conv.py:107: 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" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step - accuracy: 0.5140 - loss: 0.6888 - val_accuracy: 0.6403 - val_loss: 0.6672\n", "Epoch 2/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 758us/step - accuracy: 0.6529 - loss: 0.6446 - val_accuracy: 0.6547 - val_loss: 0.6523\n", "Epoch 3/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 757us/step - accuracy: 0.6820 - loss: 0.5970 - val_accuracy: 0.6835 - val_loss: 0.6649\n", "Epoch 4/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 830us/step - accuracy: 0.6451 - loss: 0.6134 - val_accuracy: 0.6547 - val_loss: 0.6601\n", "Epoch 5/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step - accuracy: 0.6527 - loss: 0.6077 - val_accuracy: 0.6475 - val_loss: 0.6574\n", "Epoch 6/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 875us/step - accuracy: 0.6605 - loss: 0.6117 - val_accuracy: 0.6187 - val_loss: 0.6709\n", "Epoch 7/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 822us/step - accuracy: 0.6460 - loss: 0.6094 - val_accuracy: 0.6259 - val_loss: 0.6673\n", "Epoch 8/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 827us/step - accuracy: 0.6691 - loss: 0.6166 - val_accuracy: 0.6331 - val_loss: 0.6621\n", "Epoch 9/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 809us/step - accuracy: 0.6584 - loss: 0.5825 - val_accuracy: 0.6403 - val_loss: 0.6667\n", "Epoch 10/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 860us/step - accuracy: 0.6752 - loss: 0.5976 - val_accuracy: 0.6187 - val_loss: 0.6591\n", "Epoch 11/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 807us/step - accuracy: 0.6603 - loss: 0.6061 - val_accuracy: 0.6187 - val_loss: 0.6664\n", "Epoch 12/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 845us/step - accuracy: 0.6561 - loss: 0.5776 - val_accuracy: 0.6259 - val_loss: 0.6739\n", "Epoch 13/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 817us/step - accuracy: 0.6700 - loss: 0.5976 - val_accuracy: 0.5971 - val_loss: 0.6730\n", "Epoch 14/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 919us/step - accuracy: 0.6622 - loss: 0.5886 - val_accuracy: 0.6475 - val_loss: 0.6471\n", "Epoch 15/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 901us/step - accuracy: 0.6307 - loss: 0.6162 - val_accuracy: 0.6259 - val_loss: 0.6728\n", "Epoch 16/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - accuracy: 0.7153 - loss: 0.5660 - val_accuracy: 0.6187 - val_loss: 0.6775\n", "Epoch 17/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 862us/step - accuracy: 0.6509 - loss: 0.5898 - val_accuracy: 0.6547 - val_loss: 0.6607\n", "Epoch 18/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 827us/step - accuracy: 0.6680 - loss: 0.5865 - val_accuracy: 0.6115 - val_loss: 0.6673\n", "Epoch 19/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 805us/step - accuracy: 0.7013 - loss: 0.5647 - val_accuracy: 0.6403 - val_loss: 0.6851\n", "Epoch 20/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 821us/step - accuracy: 0.6532 - loss: 0.5964 - val_accuracy: 0.6403 - val_loss: 0.6621\n", "Epoch 21/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 894us/step - accuracy: 0.6963 - loss: 0.5668 - val_accuracy: 0.6403 - val_loss: 0.6617\n", "Epoch 22/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 806us/step - accuracy: 0.6953 - loss: 0.5799 - val_accuracy: 0.6187 - val_loss: 0.6875\n", "Epoch 23/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 839us/step - accuracy: 0.6900 - loss: 0.5655 - val_accuracy: 0.6619 - val_loss: 0.6612\n", "Epoch 24/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 800us/step - accuracy: 0.6564 - loss: 0.5771 - val_accuracy: 0.6403 - val_loss: 0.6714\n", "Epoch 25/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 854us/step - accuracy: 0.6492 - loss: 0.5895 - val_accuracy: 0.6403 - val_loss: 0.6660\n", "Epoch 26/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 823us/step - accuracy: 0.6741 - loss: 0.5800 - val_accuracy: 0.6043 - val_loss: 0.6837\n", "Epoch 27/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 981us/step - accuracy: 0.6954 - loss: 0.5519 - val_accuracy: 0.6475 - val_loss: 0.6633\n", "Epoch 28/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 835us/step - accuracy: 0.6696 - loss: 0.6009 - val_accuracy: 0.6403 - val_loss: 0.6640\n", "Epoch 29/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 813us/step - accuracy: 0.7001 - loss: 0.5766 - val_accuracy: 0.6043 - val_loss: 0.6851\n", "Epoch 30/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 859us/step - accuracy: 0.6787 - loss: 0.5600 - val_accuracy: 0.6187 - val_loss: 0.6747\n", "Epoch 31/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.6745 - loss: 0.5595 - val_accuracy: 0.6403 - val_loss: 0.6796\n", "Epoch 32/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.6875 - loss: 0.5671 - val_accuracy: 0.6115 - val_loss: 0.6778\n", "Epoch 33/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 875us/step - accuracy: 0.7172 - loss: 0.5561 - val_accuracy: 0.6331 - val_loss: 0.6794\n", "Epoch 34/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 878us/step - accuracy: 0.6928 - loss: 0.5613 - val_accuracy: 0.5971 - val_loss: 0.6941\n", "Epoch 35/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 819us/step - accuracy: 0.6808 - loss: 0.5736 - val_accuracy: 0.6403 - val_loss: 0.6599\n", "Epoch 36/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 828us/step - accuracy: 0.6721 - loss: 0.5741 - val_accuracy: 0.5899 - val_loss: 0.6916\n", "Epoch 37/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 888us/step - accuracy: 0.7092 - loss: 0.5700 - val_accuracy: 0.5971 - val_loss: 0.6824\n", "Epoch 38/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 912us/step - accuracy: 0.6687 - loss: 0.5851 - val_accuracy: 0.6259 - val_loss: 0.6897\n", "Epoch 39/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 851us/step - accuracy: 0.6743 - loss: 0.5730 - val_accuracy: 0.6403 - val_loss: 0.6697\n", "Epoch 40/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 859us/step - accuracy: 0.6599 - loss: 0.5979 - val_accuracy: 0.6259 - val_loss: 0.6921\n", "Epoch 41/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 840us/step - accuracy: 0.7042 - loss: 0.5661 - val_accuracy: 0.6475 - val_loss: 0.6761\n", "Epoch 42/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 859us/step - accuracy: 0.6773 - loss: 0.5497 - val_accuracy: 0.6187 - val_loss: 0.6829\n", "Epoch 43/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 864us/step - accuracy: 0.6886 - loss: 0.5754 - val_accuracy: 0.6475 - val_loss: 0.6664\n", "Epoch 44/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - accuracy: 0.6558 - loss: 0.5854 - val_accuracy: 0.5755 - val_loss: 0.6825\n", "Epoch 45/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 826us/step - accuracy: 0.6811 - loss: 0.5827 - val_accuracy: 0.6259 - val_loss: 0.6745\n", "Epoch 46/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 819us/step - accuracy: 0.6928 - loss: 0.5798 - val_accuracy: 0.6331 - val_loss: 0.6697\n", "Epoch 47/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 840us/step - accuracy: 0.6635 - loss: 0.5640 - val_accuracy: 0.6259 - val_loss: 0.6800\n", "Epoch 48/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 876us/step - accuracy: 0.7028 - loss: 0.5463 - val_accuracy: 0.6259 - val_loss: 0.6808\n", "Epoch 49/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 863us/step - accuracy: 0.6815 - loss: 0.5471 - val_accuracy: 0.6763 - val_loss: 0.6747\n", "Epoch 50/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 813us/step - accuracy: 0.7056 - loss: 0.5460 - val_accuracy: 0.6043 - val_loss: 0.6732\n", "Epoch 51/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 871us/step - accuracy: 0.6699 - loss: 0.5527 - val_accuracy: 0.6259 - val_loss: 0.6639\n", "Epoch 52/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 851us/step - accuracy: 0.6865 - loss: 0.5431 - val_accuracy: 0.5827 - val_loss: 0.6947\n", "Epoch 53/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 880us/step - accuracy: 0.7055 - loss: 0.5520 - val_accuracy: 0.6691 - val_loss: 0.6790\n", "Epoch 54/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 862us/step - accuracy: 0.6601 - loss: 0.5539 - val_accuracy: 0.6115 - val_loss: 0.6750\n", "Epoch 55/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 892us/step - accuracy: 0.6870 - loss: 0.5535 - val_accuracy: 0.6115 - val_loss: 0.6940\n", "Epoch 56/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 877us/step - accuracy: 0.7203 - loss: 0.5570 - val_accuracy: 0.5971 - val_loss: 0.6825\n", "Epoch 57/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 876us/step - accuracy: 0.6761 - loss: 0.5497 - val_accuracy: 0.6403 - val_loss: 0.6792\n", "Epoch 58/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 914us/step - accuracy: 0.6850 - loss: 0.5713 - val_accuracy: 0.5899 - val_loss: 0.6808\n", "Epoch 59/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 887us/step - accuracy: 0.6847 - loss: 0.5699 - val_accuracy: 0.6331 - val_loss: 0.6751\n", "Epoch 60/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 924us/step - accuracy: 0.6914 - loss: 0.5308 - val_accuracy: 0.6259 - val_loss: 0.6936\n", "Epoch 61/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 923us/step - accuracy: 0.6931 - loss: 0.5340 - val_accuracy: 0.5971 - val_loss: 0.6811\n", "Epoch 62/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 881us/step - accuracy: 0.6754 - loss: 0.5450 - val_accuracy: 0.5971 - val_loss: 0.6735\n", "Epoch 63/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 844us/step - accuracy: 0.6801 - loss: 0.5640 - val_accuracy: 0.6115 - val_loss: 0.6779\n", "Epoch 64/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 857us/step - accuracy: 0.6908 - loss: 0.5368 - val_accuracy: 0.6403 - val_loss: 0.6759\n", "Epoch 65/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 980us/step - accuracy: 0.6560 - loss: 0.5869 - val_accuracy: 0.6403 - val_loss: 0.6796\n", "Epoch 66/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 867us/step - accuracy: 0.6885 - loss: 0.5651 - val_accuracy: 0.5899 - val_loss: 0.6890\n", "Epoch 67/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 865us/step - accuracy: 0.6884 - loss: 0.5416 - val_accuracy: 0.6331 - val_loss: 0.6653\n", "Epoch 68/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 903us/step - accuracy: 0.6798 - loss: 0.5628 - val_accuracy: 0.6619 - val_loss: 0.6721\n", "Epoch 69/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 899us/step - accuracy: 0.7162 - loss: 0.5363 - val_accuracy: 0.6331 - val_loss: 0.6724\n", "Epoch 70/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 866us/step - accuracy: 0.6774 - loss: 0.5539 - val_accuracy: 0.6187 - val_loss: 0.6847\n", "Epoch 71/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 896us/step - accuracy: 0.7058 - loss: 0.5358 - val_accuracy: 0.6187 - val_loss: 0.6825\n", "Epoch 72/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 851us/step - accuracy: 0.6792 - loss: 0.5781 - val_accuracy: 0.6115 - val_loss: 0.6763\n", "Epoch 73/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 901us/step - accuracy: 0.7162 - loss: 0.5427 - val_accuracy: 0.5971 - val_loss: 0.6926\n", "Epoch 74/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 875us/step - accuracy: 0.6971 - loss: 0.5410 - val_accuracy: 0.5971 - val_loss: 0.6893\n", "Epoch 75/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 896us/step - accuracy: 0.6957 - loss: 0.5440 - val_accuracy: 0.6115 - val_loss: 0.6837\n", "Epoch 76/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 878us/step - accuracy: 0.6985 - loss: 0.5571 - val_accuracy: 0.5540 - val_loss: 0.6833\n", "Epoch 77/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 858us/step - accuracy: 0.7319 - loss: 0.5332 - val_accuracy: 0.5971 - val_loss: 0.6736\n", "Epoch 78/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 871us/step - accuracy: 0.6926 - loss: 0.5482 - val_accuracy: 0.6043 - val_loss: 0.6939\n", "Epoch 79/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 945us/step - accuracy: 0.7198 - loss: 0.5172 - val_accuracy: 0.6187 - val_loss: 0.6728\n", "Epoch 80/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 915us/step - accuracy: 0.6939 - loss: 0.5527 - val_accuracy: 0.5971 - val_loss: 0.6927\n", "Epoch 81/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.7257 - loss: 0.5143 - val_accuracy: 0.6475 - val_loss: 0.6905\n", "Epoch 82/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 797us/step - accuracy: 0.7362 - loss: 0.5186 - val_accuracy: 0.5468 - val_loss: 0.7176\n", "Epoch 83/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 826us/step - accuracy: 0.6970 - loss: 0.5480 - val_accuracy: 0.6043 - val_loss: 0.6709\n", "Epoch 84/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 802us/step - accuracy: 0.6887 - loss: 0.5634 - val_accuracy: 0.6043 - val_loss: 0.6917\n", "Epoch 85/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 817us/step - accuracy: 0.7044 - loss: 0.5404 - val_accuracy: 0.5827 - val_loss: 0.7027\n", "Epoch 86/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 853us/step - accuracy: 0.7029 - loss: 0.5226 - val_accuracy: 0.5755 - val_loss: 0.6922\n", "Epoch 87/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 797us/step - accuracy: 0.7021 - loss: 0.5481 - val_accuracy: 0.5683 - val_loss: 0.7086\n", "Epoch 88/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 810us/step - accuracy: 0.6886 - loss: 0.5334 - val_accuracy: 0.6187 - val_loss: 0.6981\n", "Epoch 89/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 803us/step - accuracy: 0.7225 - loss: 0.5191 - val_accuracy: 0.5755 - val_loss: 0.6921\n", "Epoch 90/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 846us/step - accuracy: 0.7311 - loss: 0.5138 - val_accuracy: 0.5755 - val_loss: 0.6973\n", "Epoch 91/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 814us/step - accuracy: 0.7425 - loss: 0.5038 - val_accuracy: 0.5612 - val_loss: 0.7220\n", "Epoch 92/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 809us/step - accuracy: 0.6943 - loss: 0.5257 - val_accuracy: 0.6043 - val_loss: 0.6896\n", "Epoch 93/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 806us/step - accuracy: 0.6973 - loss: 0.5225 - val_accuracy: 0.5899 - val_loss: 0.6951\n", "Epoch 94/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 824us/step - accuracy: 0.6944 - loss: 0.5219 - val_accuracy: 0.5971 - val_loss: 0.6913\n", "Epoch 95/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 805us/step - accuracy: 0.7329 - loss: 0.5238 - val_accuracy: 0.5827 - val_loss: 0.7017\n", "Epoch 96/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 833us/step - accuracy: 0.6984 - loss: 0.5337 - val_accuracy: 0.5755 - val_loss: 0.6819\n", "Epoch 97/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 825us/step - accuracy: 0.7147 - loss: 0.5203 - val_accuracy: 0.5899 - val_loss: 0.6892\n", "Epoch 98/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 878us/step - accuracy: 0.6892 - loss: 0.5300 - val_accuracy: 0.5899 - val_loss: 0.7167\n", "Epoch 99/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 879us/step - accuracy: 0.7202 - loss: 0.5175 - val_accuracy: 0.6115 - val_loss: 0.6922\n", "Epoch 100/100\n", "\u001b[1m18/18\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 820us/step - accuracy: 0.7134 - loss: 0.5336 - val_accuracy: 0.5971 - val_loss: 0.7082\n" ] } ], "source": [ "model = Sequential([\n", " Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(X_train.shape[1], 1)),\n", " Conv1D(filters=64, kernel_size=3, activation='relu'),\n", " Dropout(0.10),\n", " Flatten(),\n", " Dense(128, activation='relu'),\n", " Dense(y_train.shape[1], activation='softmax')\n", "])\n", "\n", "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n", "\n", "history = model.fit(X_train, y_train, epochs=100, validation_split=0.2)" ] }, { "cell_type": "code", "execution_count": 8, "id": "0788ebb8-757f-4180-af39-603f61762b95", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step - accuracy: 0.6268 - loss: 0.7269 \n", "Test Accuracy: 63.64%\n" ] } ], "source": [ "# Evaluate the model\n", "test_loss, test_acc = model.evaluate(X_test, y_test)\n", "print(f\"Test Accuracy: {test_acc * 100:.2f}%\")" ] }, { "cell_type": "code", "execution_count": 9, "id": "f74da01a-3768-4101-9a06-0650872e533e", "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",
       "│ conv1d (Conv1D)                 │ (None, 4, 32)          │           128 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ conv1d_1 (Conv1D)               │ (None, 2, 64)          │         6,208 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dropout (Dropout)               │ (None, 2, 64)          │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ flatten (Flatten)               │ (None, 128)            │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense (Dense)                   │ (None, 128)            │        16,512 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_1 (Dense)                 │ (None, 2)              │           258 │\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", "│ conv1d (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m128\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ conv1d_1 (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m6,208\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m16,512\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m) │ \u001b[38;5;34m258\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Total params: 69,320 (270.79 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m69,320\u001b[0m (270.79 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Trainable params: 23,106 (90.26 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m23,106\u001b[0m (90.26 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: 46,214 (180.53 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m46,214\u001b[0m (180.53 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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EZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSGNwQERGRSWFwQ0RERCaFwQ0RERGZFAY3REREZFIY3BAREZFJYXBDREREJoXBDREREZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSGNwQERGRSWFwQ0RERCaFwQ0RERGZFAY3REREZFIY3BAREZFJYXBDREREJoXBDREREZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSGNwQERGRSWFwQ0RERCaFwQ0RERGZFAY3REREZFIY3BAREZFJYXBDREREJoXBDREREZkUBjdERERkUhjcEBERkUlhcENEREQmhcENERERmRQGN0RERGRSqkRws3z5cvj5+cHa2hrBwcGIiIgodt1Vq1ahc+fOcHJygpOTE0JDQ0tcn4iIiP5bjB7cbNq0CTNmzMD8+fNx5swZBAYGonfv3khISChy/QMHDmDo0KHYv38/wsPD4evri2eeeQb37t2r5JITERFRVSSTJEkyZgGCg4PRtm1bLFu2DACgVCrh6+uLKVOmYNasWU/dXqFQwMnJCcuWLcPIkSOfun5aWhocHR2RmpoKBweHcpefiIiIKp4+12+j1tzk5ubi9OnTCA0NVS+Ty+UIDQ1FeHh4qfbx+PFj5OXlwdnZucjXc3JykJaWpvMgIiIi02XU4CYpKQkKhQIeHh46yz08PBAXF1eqfcycORPe3t46AZK2xYsXw9HRUf3w9fUtd7mJiIio6jJ6zk15fPrpp9i4cSO2bdsGa2vrIteZPXs2UlNT1Y/Y2NhKLiURERFVJnNjHtzV1RVmZmaIj4/XWR4fHw9PT88St/3iiy/w6aefYu/evWjRokWx61lZWcHKysog5SUiIqKqz6g1N5aWlggKCkJYWJh6mVKpRFhYGEJCQord7rPPPsNHH32EXbt2oU2bNpVRVCIiIqomjFpzAwAzZszAqFGj0KZNG7Rr1w5LlixBZmYmxowZAwAYOXIkfHx8sHjxYgDA//3f/2HevHlYv349/Pz81Lk59vb2sLe3N9r7ICIioqrB6MHN4MGDkZiYiHnz5iEuLg4tW7bErl271EnGMTExkMs1FUwrVqxAbm4uXnrpJZ39zJ8/HwsWLKjMohMREVEVZPRxbiobx7khIiKqfqrN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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.summary()\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "plt.plot(history.history['accuracy'], label='Accuracy')\n", "plt.plot(history.history['val_accuracy'], label='Validation Accuracy')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Accuracy')\n", "plt.ylim([0, 1])\n", "plt.legend(loc='lower right')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 10, "id": "9c29a12b-9fda-49b3-bd85-fa699e1f61a2", "metadata": {}, "outputs": [], "source": [ "model.save('patient_outcome_classifier.keras')" ] } ], "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.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }