Final 1D CNN model

parent b4e7d56a
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"gpuType": "V28",
"machine_shape": "hm"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"accelerator": "TPU"
},
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "WXK1h7IS5ua0"
},
"outputs": [],
"source": [
"#Import Libraries\n",
"\n",
"import pandas as pd\n",
"from matplotlib import pyplot as plt\n",
"import numpy as np\n",
"%matplotlib inline\n",
"\n",
"import tensorflow as tf\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense\n",
"from tensorflow.keras.layers import Flatten\n",
"from sklearn.model_selection import train_test_split\n",
"import time\n",
"\n",
"\n",
"#Data Balancing libraries\n",
"from imblearn.under_sampling import NearMiss\n",
"from imblearn.over_sampling import ADASYN\n",
"\n",
"from imblearn.over_sampling import SMOTE\n",
"from imblearn.under_sampling import RandomUnderSampler\n",
"\n",
"\n",
"from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, roc_curve, auc\n",
"\n",
"\n",
"#apply standardization\n",
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"#Visual libraries\n",
"import seaborn as sns\n",
"\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.metrics import classification_report"
]
},
{
"cell_type": "code",
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')"
],
"metadata": {
"id": "gMaEA-55nDU4",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "0e7b85ff-b94d-47cd-c19e-465d699b6151"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"data = pd.read_csv('/content/drive/MyDrive/ML Model Attack/disease_preprocess4.csv')"
],
"metadata": {
"id": "x4Zf0N4xnD64"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"data.head()"
],
"metadata": {
"id": "kY7U0J9yV4C_",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 226
},
"outputId": "125f7b87-de08-4dff-b74c-8df1f324905e"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" GeneralHealth Checkup Exercise HeartDisease Depression Diabetes \\\n",
"0 1 2 0 0 0 0 \n",
"1 5 1 0 1 0 1 \n",
"2 5 1 1 0 0 1 \n",
"3 1 1 1 1 0 1 \n",
"4 4 1 0 0 0 0 \n",
"\n",
" Arthritis Gender AgeCategory BMI SmokingHistory \\\n",
"0 1 1 10 -2.159696 1 \n",
"1 0 1 10 -0.051548 0 \n",
"2 0 1 8 0.742649 0 \n",
"3 0 0 11 0.015913 0 \n",
"4 0 0 12 -0.652562 1 \n",
"\n",
" AlcoholConsumption FriedPotatoConsumption \n",
"0 -0.621527 0.664502 \n",
"1 -0.621527 -0.267579 \n",
"2 -0.133707 1.130543 \n",
"3 -0.621527 0.198462 \n",
"4 -0.621527 -0.733620 "
],
"text/html": [
"\n",
" <div id=\"df-6b4bdf68-71e1-44eb-ab27-e682f65e2955\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>GeneralHealth</th>\n",
" <th>Checkup</th>\n",
" <th>Exercise</th>\n",
" <th>HeartDisease</th>\n",
" <th>Depression</th>\n",
" <th>Diabetes</th>\n",
" <th>Arthritis</th>\n",
" <th>Gender</th>\n",
" <th>AgeCategory</th>\n",
" <th>BMI</th>\n",
" <th>SmokingHistory</th>\n",
" <th>AlcoholConsumption</th>\n",
" <th>FriedPotatoConsumption</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>10</td>\n",
" <td>-2.159696</td>\n",
" <td>1</td>\n",
" <td>-0.621527</td>\n",
" <td>0.664502</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>10</td>\n",
" <td>-0.051548</td>\n",
" <td>0</td>\n",
" <td>-0.621527</td>\n",
" <td>-0.267579</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>0.742649</td>\n",
" <td>0</td>\n",
" <td>-0.133707</td>\n",
" <td>1.130543</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>11</td>\n",
" <td>0.015913</td>\n",
" <td>0</td>\n",
" <td>-0.621527</td>\n",
" <td>0.198462</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>12</td>\n",
" <td>-0.652562</td>\n",
" <td>1</td>\n",
" <td>-0.621527</td>\n",
" <td>-0.733620</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-6b4bdf68-71e1-44eb-ab27-e682f65e2955')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-6b4bdf68-71e1-44eb-ab27-e682f65e2955 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-6b4bdf68-71e1-44eb-ab27-e682f65e2955');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-dc2fbf8f-511f-455a-a2ea-2047b18fa5d9\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-dc2fbf8f-511f-455a-a2ea-2047b18fa5d9')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-dc2fbf8f-511f-455a-a2ea-2047b18fa5d9 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "data"
}
},
"metadata": {},
"execution_count": 23
}
]
},
{
"cell_type": "code",
"source": [
"data.columns"
],
"metadata": {
"id": "PyUC2rneV_CL",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "12c4b3d2-d37e-47dd-a1ab-752b49a90c05"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Index(['GeneralHealth', 'Checkup', 'Exercise', 'HeartDisease', 'Depression',\n",
" 'Diabetes', 'Arthritis', 'Gender', 'AgeCategory', 'BMI',\n",
" 'SmokingHistory', 'AlcoholConsumption', 'FriedPotatoConsumption'],\n",
" dtype='object')"
]
},
"metadata": {},
"execution_count": 24
}
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "F_PjX618F5l6",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "21e3a0f5-d7d7-4470-b4c3-045d6638d145"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" GeneralHealth Checkup Exercise Depression Diabetes Arthritis \\\n",
"192601 5 1 1 0 0 0 \n",
"196337 5 1 0 0 0 0 \n",
"99888 5 1 1 0 0 0 \n",
"282228 4 3 1 0 0 0 \n",
"216188 3 1 1 0 0 0 \n",
"\n",
" Gender AgeCategory BMI SmokingHistory AlcoholConsumption \\\n",
"192601 1 5 -0.368920 1 0.841932 \n",
"196337 1 11 -0.333656 1 -0.499572 \n",
"99888 1 8 1.898681 0 -0.377617 \n",
"282228 0 11 0.728850 0 2.427347 \n",
"216188 0 7 0.314887 0 -0.621527 \n",
"\n",
" FriedPotatoConsumption \n",
"192601 1.596584 \n",
"196337 0.198462 \n",
"99888 0.198462 \n",
"282228 0.198462 \n",
"216188 -0.267579 \n",
"192601 0\n",
"196337 0\n",
"99888 0\n",
"282228 0\n",
"216188 0\n",
"Name: HeartDisease, dtype: int64\n"
]
}
],
"source": [
"# define target variable and features\n",
"\n",
"# Defining the features (X) and the target (y)\n",
"\n",
"X = data.drop('HeartDisease', axis=1) # Features\n",
"y = data['HeartDisease'] # Target variable\n",
"\n",
"# Performing the train-test split\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
"\n",
"X_train.shape, X_test.shape, y_train.shape, y_test.shape\n",
"\n",
"print(X_train.head())\n",
"print(y_train.head())"
]
},
{
"cell_type": "markdown",
"source": [
"### Perform Scaling"
],
"metadata": {
"id": "W-F1vvzXWN2B"
}
},
{
"cell_type": "code",
"source": [
"#apply standardization\n",
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"# Create a StandardScaler instance\n",
"scaler = StandardScaler()\n",
"\n",
"\n",
"# Fit the scaler on the training data and transform it\n",
"X_train_scaled = scaler.fit_transform(X_train)\n",
"\n",
"# Use the same scaler to transform the test data\n",
"X_test_scaled = scaler.transform(X_test)"
],
"metadata": {
"id": "Odb4wSf-WBJo"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# Print the count of each class in the before resample data\n",
"print(y_train.value_counts())"
],
"metadata": {
"id": "FnYSi2n4WWLy",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "41359b8c-c3fb-426f-efa3-8cdb2dcbc303"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"HeartDisease\n",
"0 227109\n",
"1 19974\n",
"Name: count, dtype: int64\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"### SMOTE and Random Combined"
],
"metadata": {
"id": "UQ2gbEX8Wn_K"
}
},
{
"cell_type": "code",
"source": [
"# Resample the training data\n",
"\n",
"from imblearn.over_sampling import SMOTE\n",
"from imblearn.under_sampling import RandomUnderSampler\n",
"from imblearn.combine import SMOTEENN # A hybrid method\n",
"\n",
"\n",
"# Apply SMOTE to oversample the minority class\n",
"smote=SMOTE(sampling_strategy='auto', random_state=23)\n",
"X_train_smote, y_train_smote = smote.fit_resample(X_train_scaled, y_train)\n",
"\n",
"# Apply Random undersampling to the majority class\n",
"under_sampler = RandomUnderSampler(sampling_strategy='auto', random_state=23)\n",
"X_train_combined, y_train_combined = under_sampler.fit_resample(X_train_smote, y_train_smote)\n",
"\n",
"# Train and evaluate your machine learning model using X_train_combined and y_train_combined\n",
"# Evaluate the model on X_test_scaled and y_test"
],
"metadata": {
"id": "L6y3LLIWWY3R"
},
"execution_count": 34,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# Print the count of each class in the resampled data\n",
"print(y_train_combined.value_counts())"
],
"metadata": {
"id": "JHUux-UyW4HS",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "7ce14d32-61d9-4fe1-9e0c-ad1c4ee6b537"
},
"execution_count": 36,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"HeartDisease\n",
"0 227109\n",
"1 227109\n",
"Name: count, dtype: int64\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# Visualization of target variable after resampling\n",
"\n",
"g = sns.countplot(x= y_train_combined,data=data, palette=\"muted\")\n",
"g.set_ylabel(\"Patients\", fontsize=14)\n",
"g.set_xlabel(\"Heart Disease\", fontsize=14)"
],
"metadata": {
"id": "APcWMC2SW-Vs",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 578
},
"outputId": "bd8a4ead-dae6-4dc3-fd01-59de31482b3e"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"<ipython-input-17-42433e52f457>:3: FutureWarning: \n",
"\n",
"Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n",
"\n",
" g = sns.countplot(x= y_train_combined,data=data, palette=\"muted\")\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 0, 'Heart Disease')"
]
},
"metadata": {},
"execution_count": 17
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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AAAarjoXtF599VVJ0l133eW2//XXX9fgwYMlSS+//LK8vLzUv39/lZaWyul06pVXXrFrvb29tXz5co0cOVKxsbFq0qSJEhIS9Nxzz9k1kZGRWrFihcaNG6dZs2apdevW+uc//ymn02nXDBw4UPv371dSUpJcLpc6d+6stLQ0twfkz9YLAABouOr8OlqXOtbRAmoP62gBly7W0QIAALjEEbQAAAAMIWgBAAAYQtACAAAwhKAFAABgCEELAADAEIIWAACAIQQtAAAAQwhaAAAAhhC0AAAADCFoAQAAGELQAgAAMISgBQAAYAhBCwAAwBCCFgAAgCEELQAAAEMIWgAAAIYQtAAAAAwhaAEAABhC0AIAADCEoAUAAGAIQQsAAMAQghYAAIAhBC0AAABDCFoAAACGELQAAAAMIWgBAAAYQtACAAAwhKAFAABgCEELAADAEIIWAACAIQQtAAAAQwhaAAAAhhC0AAAADCFoAQAAGELQAgAAMISgBQAAYAhBCwAAwBCCFgAAgCEELQAAAEMIWgAAAIYQtAAAAAwhaAEAABhC0AIAADCEoAUAAGAIQQsAAMAQghYAAIAhBC0AAABDCFoAAACGELQAAAAMIWgBAAAYQtACAAAwhKAFAABgCEELAADAEIIWAACAIQQtAAAAQwhaAAAAhhC0AAAADCFoAQAAGELQAgAAMISgBQAAYAhBCwAAwBCCFgAAgCEELQAAAEMIWgAAAIYQtAAAAAwhaAEAABhS54LW6tWrde+99yosLEwOh0NLly51Gx88eLAcDofbKz4+3q3m0KFDevDBBxUYGKjg4GANGzZMxcXFbjXffvut7rjjDvn7+ys8PFxTp06t0suSJUvUrl07+fv7q1OnTvroo4/cxi3LUlJSklq1aqWAgADFxcXphx9+qJk3AgAA1Ht1LmiVlJQoKipKc+fOPW1NfHy89u7da7/efvttt/EHH3xQW7du1cqVK7V8+XKtXr1ajz76qD1eVFSk3r17q23btsrOzta0adOUkpKif/zjH3bN2rVrNWjQIA0bNkxff/21+vXrp379+mnLli12zdSpUzV79mzNmzdP69evV5MmTeR0OnX8+PEafEcAAEB95VPbDfxanz591KdPnzPW+Pn5KTQ0tNqxbdu2KS0tTRs3blSXLl0kSf/7v/+ru+++W9OnT1dYWJjeeustlZWVaf78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1q2bIiIitHXr1hppFgAAoD7xKGh99NFH6tWrlx566CF7ba1KXbt21ccff6yffvpJzz77rEdNAgAA1EceBa29e/fqpptusre9vb3tW4aS1KxZM/Xp00eLFy8+5zlXr16te++9V2FhYXI4HFq6dKnbuGVZSkpKUqtWrRQQEKC4uDj98MMPbjWHDh3Sgw8+qMDAQAUHB2vYsGEqLi52q/n22291xx13yN/fX+Hh4Zo6dWqVXpYsWaJ27drJ399fnTp10kcffXTevQAAgIbLo6AVFBSkEydO2NvNmjXTzz//7FYTGBio/Pz8c56zpKREUVFRmjt3brXjU6dO1ezZszVv3jytX79eTZo0kdPp1PHjx+2aBx98UFu3btXKlSu1fPlyrV69Wo8++qg9XlRUpN69e6tt27bKzs7WtGnTlJKSon/84x92zdq1azVo0CANGzZMX3/9tfr166d+/fppy5Yt59ULAABouByWZVkXenBsbKxCQ0P1/vvvS5KcTqe++eYbbd26VZdffrmOHTumqKgoeXl5KScn5/ybczj0/vvvq1+/fpJ+uYIUFhamJ554QuPHj5ckFRYWKiQkRKmpqbr//vu1bds2dejQQRs3blSXLl0kSWlpabr77rv1888/KywsTK+++qqeeuopuVwu+fr6SpKefPJJLV261O5z4MCBKikp0fLly+1+brnlFnXu3Fnz5s07p17OReUHCAoLCxUYGHje79G5eiApw9jcQH218Lm7aruFGvGf6YNruwWgzrlufKrR+c/177dHV7R69+6t9PR0HT16VJL0pz/9Sfv27VNUVJR+//vfq2PHjtq5c6cGDx7syWlsu3btksvlUlxcnL0vKChIMTExysrKkiRlZWUpODjYDlmSFBcXJy8vL61fv96u6d69ux2ypF9C4vbt2+2H+rOystzOU1lTeZ5z6aU6paWlKioqcnsBAIBLk0dBa+TIkXrttdfsoHXfffdp2rRpKikp0XvvvSeXy6XExERNmDChRpp1uVySpJCQELf9ISEh9pjL5VLLli3dxn18fNS8eXO3murmOPUcp6s5dfxsvVRnypQpCgoKsl/h4eFn+akBAEB9dUFBKysrSz179tS1116r4cOHa9CgQdqwYYMk6YknntCBAwe0d+9eFRcXa9q0afL29q7RpuuzSZMmqbCw0H7l5eXVdksAAMCQ8w5a3333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6qeffpLD4VB8fPxpazIyMuRwODRixIiL2NnZ3XXXXXI4HBd8XOWrUaNGuvzyy9W5c2cNGzZMaWlpqqioMNAxgLqOL5UGgBryxBNPqGnTpqqoqFBBQYG2bdumt956S/Pnz9ett96qt99+u8qXDKenp9dStwAuBoIWANSQ8ePHKzQ01G3fgQMH9Nhjj+ntt9+W0+nUpk2b1KRJE3v86quvvthtAriIuHUIoE45cuSIkpOTdcMNNyggIEDBwcFyOp368ssvq9RmZ2dr9OjR6tixo4KCghQQEKBOnTrphRde0IkTJ6rUVz4PVVBQoNGjRys8PFw+Pj5KTU2Vw+FQZmamJLndBhw8eLBHP0+LFi305ptvqmfPnsrJydHcuXOr7elUx48f14wZMxQVFaWgoCA1adJEERER+sMf/qBvvvmmyjk++OAD9erVS82aNZO/v786duyo6dOnq7y83K2usLBQL774ou68806FhYXJ19dXYWFhevjhh7Vz584q85rqA2hIuKIFoM44dOiQunfvrq1bt+q2227TiBEjVFRUpA8++EA9evTQkiVL1K9fP7v+tdde07Jly9S9e3fdfffdOnr0qDIyMjRp0iRt3LhR7733XpVzlJaWqmfPniouLtZvfvMb+fj4KCQkRMnJyUpNTdXu3buVnJxs13fu3Nnjn8vLy0tPPfWUVq1apUWLFmnixIlnrE9ISNDixYt14403asiQIfLz81NeXp4+//xzbdy4UVFRUXbtpEmT9MILL+jKK6/Ufffdp6CgIH3xxReaMGGC1q9fryVLlti127ZtU1JSknr06KHf/e53atKkiXJycrRw4UKtWLFCX331ldq2bWu8D6BBsQCgBu3atcuSZF199dVWcnJyta+EhARLkvWnP/3J7dgHHnjAkmS99tprbvvz8/Ot8PBw64orrrCOHTtm79+9e7d18uRJt9qKigpr6NChliTryy+/dBtr27atJclyOp3W0aNHq/R+5513Whfyv8XK4/bu3XvamuPHj1s+Pj6Wl5eXdeLECbee2rZta28XFBRYDofDio6OrvKznTx50jp8+LC9/emnn9o/T3Fxsb2/oqLCGjFihCXJevfdd93mPnjwYJXeVq1aZXl5eVmPPPLIRekDaEgIWgBqVGXQOpfXqUFr//79lre3t9WzZ89q5509e7YlyVq2bNlZe8jOzrYkWSkpKW77K4PWN998U+1xJoOWZVlWSEiIJcnKz8936+nUoFVYWGhJsm677TaroqLijPP95je/sSRZu3fvrjJWGZT69+9/Tj9Dp06drIiIiFrvA7jUcOsQgBFOp1NpaWnVjmVkZKhHjx5u+zZu3Kjy8nKVlpYqJSWlyjE//PCDJCknJ0f33HOPJKmsrExz5szRO++8o5ycHBUXF8uyLPuYPXv2VJnH399fnTp1utAfy7jAwEDdfffd+uijj3TzzTfr97//ve666y517dpVjRo1cqtdt26dmjRpovnz51c7V0BAgHJyctz2ZWRkaObMmVq/fr0OHDigkydP2mO+vr4XrQ+goSBoAagTDh06JElas2aN1qxZc9q6kpIS+98DBgzQsmXLdN1112ngwIFq2bKlGjVqpIKCAs2aNUulpaVVjm/ZsuUFrZXlqdLSUh08eFDe3t5q3rz5GWuXLFmiv/3tb1q4cKGeeuopSb8EnyFDhuhvf/ubGjduLOmX9+zkyZN69tlnTzvXqe/XkiVLNHDgQDVt2lROp1MRERFq3LixHA6H/XzaxegDaEgIWgDqhMDAQEm/rEU1ffr0s9Zv3LhRy5Ytk9Pp1IoVK+Tt7W2PrVu3TrNmzar2uNoIWdIvAfLkyZOKjo6Wj8+Z/9fbuHFjPf/883r++ee1a9cuff7555o3b55mzZqlY8eO6e9//7ukX94zh8OhAwcOnFMPKSkp8vf3V3Z2tq699lq3sXfeeeei9QE0JCzvAKBO6Nq1qxwOh7Kyss6pvnI5gr59+7qFLEn64osvLqiHynlqejmCiooK/fWvf5UkDRo06LyOjYyM1NChQ5WZmammTZvqww8/tMdiYmJ08OBB+7bq2ezcuVPt27evErL27t2rH3/88aL1ATQkBC0AdUJoaKj+8Ic/aO3atZo2bZrbs1aV1q9fr6NHj0qSvQzBr9fX2rp1q6ZMmXJBPVTe0svLy7ug46tz4MABPfTQQ1q1apU6dOigkSNHnrF+//792rJlS5X9hw8fVmlpqfz9/e19jz32mCRp6NChOnjwYJVjXC6Xtm3bZm+3bdtWO3bsUH5+vr3v+PHjGjlyZJV1x0z2ATQk3DoEUGe88sor2r59uyZOnKj/+7//U2xsrIKDg5WXl6dNmzbphx9+0N69e9W4cWN169ZN3bp10+LFi7V3717dcsstys3N1Ycffqi+ffvq3XffPe/z9+zZU++++6769++vPn36yN/fX1FRUbr33nvP6fjp06fbX8FTVFSk77//Xl988YWOHz+u2267TW+//bb9XNPp/Pe//9VNN92kqKgo3Xjjjbryyit18OBBffDBBzpx4oTGjx9v18bHx+uZZ57R5MmTdc011yg+Pl5t27bVwYMHtWPHDn3xxRd6/vnn1b59e0nSmDFjNGbMGN10000aMGCATp48qZUrV8qyLEVFRbktQmqyD6BBqeVPPQK4xFQu7+B0Ok9b8/nnn1e7jpZlWdbRo0etqVOnWtHR0VaTJk2sgIAAKzIy0urXr5+1YMECtzWo9u3bZw0dOtQKCwuz/P39rU6dOllz5861fvzxR0uSlZCQ4Db3r5dS+LUTJ05YEydOtNq0aWP5+PhUO0d1Kpd3qHz5+PhYzZo1s6KioqyhQ4daaWlpVnl5ebXH/rqnw4cPWykpKVb37t2tVq1aWb6+vlZYWJgVHx9vffzxx9XOsXLlSuvee++1rrjiCqtRo0ZWaGioFRsba02ePNnKzc216yoqKqx58+ZZN9xwg+Xv72+FhoZaw4YNs/bt21dlaQuTfQANicOyqrk+DwAAAI/xjBYAAIAhBC0AAABDCFoAAACGELQAAAAMIWgBAAAYQtACAAAwhKAFAABgCEELAADAEIIWAACAIQQtAAAAQwhaAAAAhhC0AAAADPl/2iXrrdB670YAAAAASUVORK5CYII=\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"### Model Training"
],
"metadata": {
"id": "JtTol09RXES7"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "0rkXxtX4bqOH"
},
"outputs": [],
"source": [
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout, BatchNormalization\n",
"from tensorflow.keras.optimizers import Adam\n",
"from tensorflow.keras.losses import BinaryCrossentropy\n",
"\n",
"input_shape = (X_train_combined.shape[1], 1)\n",
"model = Sequential()\n",
"\n",
"# Add Convolutional and Pooling layers\n",
"model.add(Conv1D(filters=128, kernel_size=3, activation='relu', input_shape=input_shape))\n",
"model.add(BatchNormalization()) # Add batch normalization\n",
"model.add(MaxPooling1D(pool_size=2))\n",
"model.add(Conv1D(filters=256, kernel_size=3, activation='relu'))\n",
"model.add(BatchNormalization()) # Add batch normalization\n",
"model.add(MaxPooling1D(pool_size=2))\n",
"\n",
"model.add(Flatten())\n",
"\n",
"# Add Dense layers\n",
"model.add(Dense(units=512, activation='relu'))\n",
"model.add(BatchNormalization()) # Add batch normalization\n",
"model.add(Dropout(0.5))\n",
"model.add(Dense(units=256, activation='relu'))\n",
"model.add(BatchNormalization()) # Add batch normalization\n",
"model.add(Dropout(0.5))\n",
"model.add(Dense(units=128, activation='relu'))\n",
"model.add(BatchNormalization()) # Add batch normalization\n",
"model.add(Dropout(0.5))\n",
"model.add(Dense(units=64, activation='relu'))\n",
"model.add(BatchNormalization()) # Add batch normalization\n",
"model.add(Dropout(0.5))\n",
"model.add(Dense(units=1, activation='sigmoid'))\n",
"\n",
"# Compile the model\n",
"model.compile(optimizer=Adam(learning_rate=0.0001), loss='binary_crossentropy', metrics=['accuracy'])\n",
"#model.summary()\n"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"id": "qcpsJFNQbyEw",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "c7e86eea-43e5-4aa7-c771-31eaa5811924"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 1/12\n",
"11356/11356 - 88s - loss: 0.4864 - accuracy: 0.7573 - val_loss: 0.6373 - val_accuracy: 0.7009 - 88s/epoch - 8ms/step\n",
"Epoch 2/12\n",
"11356/11356 - 88s - loss: 0.4821 - accuracy: 0.7601 - val_loss: 0.6567 - val_accuracy: 0.6964 - 88s/epoch - 8ms/step\n",
"Epoch 3/12\n",
"11356/11356 - 88s - loss: 0.4801 - accuracy: 0.7609 - val_loss: 0.6396 - val_accuracy: 0.7078 - 88s/epoch - 8ms/step\n",
"Epoch 4/12\n",
"11356/11356 - 86s - loss: 0.4778 - accuracy: 0.7631 - val_loss: 0.6530 - val_accuracy: 0.6860 - 86s/epoch - 8ms/step\n",
"Epoch 5/12\n",
"11356/11356 - 87s - loss: 0.4759 - accuracy: 0.7636 - val_loss: 0.6473 - val_accuracy: 0.6981 - 87s/epoch - 8ms/step\n",
"Epoch 6/12\n",
"11356/11356 - 88s - loss: 0.4741 - accuracy: 0.7650 - val_loss: 0.6453 - val_accuracy: 0.7141 - 88s/epoch - 8ms/step\n",
"Epoch 7/12\n",
"11356/11356 - 87s - loss: 0.4731 - accuracy: 0.7650 - val_loss: 0.6234 - val_accuracy: 0.7066 - 87s/epoch - 8ms/step\n",
"Epoch 8/12\n",
"11356/11356 - 87s - loss: 0.4713 - accuracy: 0.7663 - val_loss: 0.6355 - val_accuracy: 0.6938 - 87s/epoch - 8ms/step\n",
"Epoch 9/12\n",
"11356/11356 - 88s - loss: 0.4699 - accuracy: 0.7665 - val_loss: 0.6695 - val_accuracy: 0.6788 - 88s/epoch - 8ms/step\n",
"Epoch 10/12\n",
"11356/11356 - 87s - loss: 0.4685 - accuracy: 0.7683 - val_loss: 0.6265 - val_accuracy: 0.7055 - 87s/epoch - 8ms/step\n",
"Epoch 11/12\n",
"11356/11356 - 86s - loss: 0.4662 - accuracy: 0.7695 - val_loss: 0.5914 - val_accuracy: 0.7422 - 86s/epoch - 8ms/step\n",
"Epoch 12/12\n",
"11356/11356 - 87s - loss: 0.4640 - accuracy: 0.7710 - val_loss: 0.6093 - val_accuracy: 0.7021 - 87s/epoch - 8ms/step\n",
"Execution time: 1046.6054677963257 seconds\n"
]
}
],
"source": [
"start_time = time.time()\n",
"history = model.fit(X_train_combined, y_train_combined, epochs=12, validation_split=0.2, verbose=2)\n",
"end_time = time.time()\n",
"execution_time = end_time - start_time\n",
"print(\"Execution time:\", execution_time, \"seconds\")"
]
},
{
"cell_type": "code",
"source": [
"original_model_accuracy = model.evaluate(X_test_scaled, y_test)[1]\n",
"print(\"Original Model Accuracy:\", original_model_accuracy)"
],
"metadata": {
"id": "khGgZyQKXDcl",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "c523f8a5-b34a-402d-8957-b1565a9adad4"
},
"execution_count": 38,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"1931/1931 [==============================] - 5s 3ms/step - loss: 0.3775 - accuracy: 0.8126\n",
"Original Model Accuracy: 0.8126143217086792\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"from sklearn.metrics import confusion_matrix , classification_report\n",
"y_pred = model.predict(X_test_scaled) > 0.5\n",
"print(confusion_matrix(y_test, y_pred))\n",
"print(classification_report(y_test, y_pred))"
],
"metadata": {
"id": "4d3HH7iKXR4i",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "15f54c55-6d45-403e-8887-4984f3531e26"
},
"execution_count": 39,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"1931/1931 [==============================] - 5s 2ms/step\n",
"[[47004 9770]\n",
" [ 1805 3192]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.96 0.83 0.89 56774\n",
" 1 0.25 0.64 0.36 4997\n",
"\n",
" accuracy 0.81 61771\n",
" macro avg 0.60 0.73 0.62 61771\n",
"weighted avg 0.91 0.81 0.85 61771\n",
"\n"
]
}
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"id": "EEdrLiFpvdWz",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 498
},
"outputId": "f5594cab-f4b0-4379-a17e-652564e06a41"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"1931/1931 [==============================] - 5s 2ms/step\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
],
"image/png": "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ffMFvHp1g4WFGa5dTcDq1d9g149hYt3i2rh16180adypTO6ronqcnVjm1xjhNFgj7fxwa69G2jFEepfAFBQUYOXKldi9ezeSkpLUhgwePiz9XxpMYIiKxgSGSJ02Epj3NJTAbK/ACYzezYFZuHAhvvzySwwZMgQZGRkIDAzE4MGDYWRkhODgYF2HR0REJBkfJSCd3iUwO3bswDfffINp06bBxMQEQ4cOxebNm7FgwQL89ddfug6PiIiI9IDeJTDJycniYwQsLCyQkfFsgpu3tzcOHjyoy9CIiIg0QtDQfxWZ3iUwtWrVwt27dwEA9evXx2+//QYAOHv2LBQKhS5DIyIi0gguo5ZO7xKYQYMG4ejRZw9GmzJlCubPnw8XFxeMHDkSY8eO1XF0RERE0nEOjHR6twrpRVFRUYiKioKLiwv69ev3Wm1wFRJR0bgKiUidNlYhveM0QCPthN76RSPtGCK928juRe7u7nB3d9d1GERERBpT0eevaIJeJDD79u0rcd3+/fuXYSRERERlr6LPX9EEvUhgBg4cWKJ6MpkMBQUFZRsMERER6T29SGCKelw8ERFReaXn008Ngl4kMERERBVJRV9BpAl6s4z62LFjcHV1RWZmplpZRkYGmjRpgpMnT+ogMiIiItI3epPArFq1ChMmTICVlZVambW1NSZOnIiVK1fqIDIiIiLN4kZ20ulNAnPhwgX06tWr2HJPT09ER0drMSIiIqKywUcJSKc3CUxKSgoqVapUbLmJiQlSU1O1GBERERHpK71JYGrWrIlLly4VW37x4kVUr15dixERERGVDV09SuDkyZPo168fatSoAZlMhp9//lmlXBAELFiwANWrV0flypXh4eGB69evq9R5+PAhhg8fDisrK9jY2GDcuHF4/PixSp2LFy+iU6dOMDU1Re3atbFs2TK1WEJDQ9GoUSOYmpqiWbNm+PXXX0t1L3qTwPTp0wfz58/HkydP1MpycnIQFBQEb29vHURGRESkWYIgaORVWllZWWjRogXWrVtXZPmyZcuwZs0abNy4EadPn4a5uTm8vLxUfjcPHz4cly9fxuHDh3HgwAGcPHkS77//vliemZkJT09PODk5ITo6GsuXL0dwcDA2bdok1jl16hSGDh2KcePG4fz58xg4cCAGDhz40o6MF+nNs5BSUlLQunVrGBsbw9/fH2+88QYAID4+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AQEBaNiwIeLj45GbmwuFQlFsm8UlKQBgZ2cHAHj48KH4NYAil2zv3LkTBQUFOHToEJydncXjWVlZ7H0hIq1iAkOkR5RKJbZu3YpmzZph/PjxRda5fPkygoODcfbsWQwfPhwzZszA4sWL8cknn6jUEwRBTFwsLCwAPEtSXpzEW9jLc+TIEbz77rvi8S+++ELt2sbGxmLbz/vss8/Y+0JEWsUEhkiP/Pbbb7h9+zbGjRtXbB0fHx8EBwfj22+/xZo1a7B//34sXrxYHN4xNTXF5cuXcfXqVRw5cgQA0KFDBwDAzJkzMXz4cJiamqJp06Zo2rQphg4dijlz5uD9999HfHw87OzsEB4eLs6zed6gQYOwcuVK9OnTB++//z7kcjkOHz6MixcvisuziYi0QiAivfH2228LAISLFy++tF7Dhg0Fa2trITs7W8jJyREWL14suLq6CgqFQrC2thbatm0rrFu3TuWczz//XHB2dhZMTEwEAEJQUJBY9tdffwlvvvmmoFAohCpVqggTJkwQ0tLSBADCqFGjVNoJCwsTWrduLZiZmQlVqlQRhgwZIty6dUtwcnISunTpolK3qGNERJogE4QX+oKJiIiI9ByXURMREZHBYQJDREREBocJDBERERkcJjBERERkcJjAEBERkcFhAkNEREQGhwkMERERGRwmMERERGRwmMAQERGRwWECQ0RERAaHCQwREREZHCYwREREZHCYwBAREZHB+T8DxQLenj1F0gAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
],
"source": [
"#Import the necessary libraries\n",
"import numpy as np\n",
"from sklearn.metrics import confusion_matrix\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"y_pred = model.predict(X_test_scaled) # Replace 'model' with your trained model\n",
"\n",
"# Convert predicted probabilities to binary labels (0 or 1)\n",
"y_pred_binary = (y_pred > 0.5).astype(int)\n",
"\n",
"#compute the confusion matrix.\n",
"cm = confusion_matrix(y_test,y_pred_binary)\n",
"\n",
"#Plot the confusion matrix.\n",
"sns.heatmap(cm,\n",
" annot=True,\n",
" fmt='g',\n",
" xticklabels=['Class 0','Class 1'],\n",
" yticklabels=['Class 0','Class 1'])\n",
"plt.ylabel('Prediction',fontsize=13)\n",
"plt.xlabel('Actual',fontsize=13)\n",
"plt.title('Confusion Matrix',fontsize=17)\n",
"plt.show()"
]
}
]
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment