From a8c7cbde00e68e710f5409e542b2092ef7ac39dd Mon Sep 17 00:00:00 2001 From: Souad Asroubi <45672002+souaddev@users.noreply.github.com> Date: Sun, 21 Jan 2024 00:30:40 +0100 Subject: [PATCH] Created using Colaboratory --- Souad_Asroubi_LABIIFV.ipynb | 4492 +++++++++++++++++++++++++++++++++++ 1 file changed, 4492 insertions(+) create mode 100644 Souad_Asroubi_LABIIFV.ipynb diff --git a/Souad_Asroubi_LABIIFV.ipynb b/Souad_Asroubi_LABIIFV.ipynb new file mode 100644 index 0000000..3deda69 --- /dev/null +++ b/Souad_Asroubi_LABIIFV.ipynb @@ -0,0 +1,4492 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "ijwWli54CEY3" + }, + "source": [ + "# **LAB II: Anomaly Detection in ICS using Data Time Warping**\n", + "**Souad Asroubi**\n", + "\n", + "*Neptun code: R8GZ55*" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q--DmAipnymN" + }, + "source": [ + "#**1. Import libraries**" + ] + }, + { + "cell_type": "code", + "source": [ + "pip install fastdtw" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PQFaMZhFoYMq", + "outputId": "83ac325f-cfc2-4844-97df-6f0b417d2acd" + }, + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting fastdtw\n", + " Downloading fastdtw-0.3.4.tar.gz (133 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m133.4/133.4 kB\u001b[0m \u001b[31m2.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from fastdtw) (1.23.5)\n", + "Building wheels for collected packages: fastdtw\n", + " Building wheel for fastdtw (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for fastdtw: filename=fastdtw-0.3.4-cp310-cp310-linux_x86_64.whl size=512581 sha256=fbefa33b591fcf05fcdb337ef73d7c474fa697a26e4b68784356f9fcd9966e67\n", + " Stored in directory: /root/.cache/pip/wheels/73/c8/f7/c25448dab74c3acf4848bc25d513c736bb93910277e1528ef4\n", + "Successfully built fastdtw\n", + "Installing collected packages: fastdtw\n", + "Successfully installed fastdtw-0.3.4\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "vgn60gmQBk_8" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import tensorflow as tf\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.model_selection import train_test_split\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import LSTM, Dense,Input,Dropout, BatchNormalization\n", + "from tensorflow.keras.callbacks import EarlyStopping\n", + "from sklearn.ensemble import IsolationForest\n", + "from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score, roc_curve, roc_auc_score,accuracy_score,classification_report\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "from scipy.spatial.distance import euclidean\n", + "from sklearn.model_selection import GridSearchCV\n", + "from sklearn.metrics import make_scorer,r2_score\n", + "from sklearn.metrics import mean_squared_error\n", + "from tensorflow.keras.models import Model\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "uTeyG0M6__zi", + "outputId": "a31ef89f-4e32-446d-835f-ae70a9fa2822" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Mounted at /content/drive/\n" + ] + } + ], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive/')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0qJNJiN9o0nM" + }, + "source": [ + "# **2. Dataset Loading**" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "OVK4QEkx62Ta" + }, + "outputs": [], + "source": [ + "dataset_path_normal = '/content/drive/My Drive/swat/SWaT_Dataset_Normal_v0.csv'\n", + "dataset_path_attack = '/content/drive/My Drive/swat/SWaT_Dataset_Attack_v0.csv'" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "204HTa4ysmLu" + }, + "outputs": [], + "source": [ + "SWaT_normal = pd.read_csv(dataset_path_normal)\n", + "SWaT_attack = pd.read_csv(dataset_path_attack)\n", + "\n", + "data = pd.concat([SWaT_normal, SWaT_attack])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 339 + }, + "id": "WPi1LFFAkLaM", + "outputId": "fba11e63-1aa0-46e1-db61-90b12737405e" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(946719, 53)\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " Timestamp FIT101 LIT101 MV101 P101 P102 AIT201 \\\n", + "0 22/12/2015 4:00:00 PM 2.470294 261.5804 2 2 1 244.3284 \n", + "1 22/12/2015 4:00:01 PM 2.457163 261.1879 2 2 1 244.3284 \n", + "2 22/12/2015 4:00:02 PM 2.439548 260.9131 2 2 1 244.3284 \n", + "3 22/12/2015 4:00:03 PM 2.428338 260.2850 2 2 1 244.3284 \n", + "4 22/12/2015 4:00:04 PM 2.424815 259.8925 2 2 1 244.4245 \n", + "\n", + " AIT202 AIT203 FIT201 ... P501 P502 PIT501 PIT502 PIT503 \\\n", + "0 8.19008 306.101 2.471278 ... 1 1 10.02948 0.0 4.277749 \n", + "1 8.19008 306.101 2.468587 ... 1 1 10.02948 0.0 4.277749 \n", + "2 8.19008 306.101 2.467305 ... 1 1 10.02948 0.0 4.277749 \n", + "3 8.19008 306.101 2.466536 ... 1 1 10.02948 0.0 4.277749 \n", + "4 8.19008 306.101 2.466536 ... 1 1 10.02948 0.0 4.277749 \n", + "\n", + " FIT601 P601 P602 P603 Normal/Attack \n", + "0 0.000256 1 1 1 Normal \n", + "1 0.000256 1 1 1 Normal \n", + "2 0.000256 1 1 1 Normal \n", + "3 0.000256 1 1 1 Normal \n", + "4 0.000256 1 1 1 Normal \n", + "\n", + "[5 rows x 53 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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", + "
TimestampFIT101LIT101MV101P101P102AIT201AIT202AIT203FIT201...P501P502PIT501PIT502PIT503FIT601P601P602P603Normal/Attack
022/12/2015 4:00:00 PM2.470294261.5804221244.32848.19008306.1012.471278...1110.029480.04.2777490.000256111Normal
122/12/2015 4:00:01 PM2.457163261.1879221244.32848.19008306.1012.468587...1110.029480.04.2777490.000256111Normal
222/12/2015 4:00:02 PM2.439548260.9131221244.32848.19008306.1012.467305...1110.029480.04.2777490.000256111Normal
322/12/2015 4:00:03 PM2.428338260.2850221244.32848.19008306.1012.466536...1110.029480.04.2777490.000256111Normal
422/12/2015 4:00:04 PM2.424815259.8925221244.42458.19008306.1012.466536...1110.029480.04.2777490.000256111Normal
\n", + "

5 rows × 53 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "print(data.shape)\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GA-3To1PlkZF", + "outputId": "9410e9e8-212c-47d9-e831-b3f36f7c1d72" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Int64Index: 946719 entries, 0 to 449918\n", + "Data columns (total 53 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 Timestamp 946719 non-null object \n", + " 1 FIT101 946719 non-null float64\n", + " 2 LIT101 946719 non-null float64\n", + " 3 MV101 946719 non-null int64 \n", + " 4 P101 946719 non-null int64 \n", + " 5 P102 946719 non-null int64 \n", + " 6 AIT201 946719 non-null float64\n", + " 7 AIT202 946719 non-null float64\n", + " 8 AIT203 946719 non-null float64\n", + " 9 FIT201 946719 non-null float64\n", + " 10 MV201 946719 non-null int64 \n", + " 11 P201 946719 non-null int64 \n", + " 12 P202 946719 non-null int64 \n", + " 13 P203 946719 non-null int64 \n", + " 14 P204 946719 non-null int64 \n", + " 15 P205 946719 non-null int64 \n", + " 16 P206 946719 non-null int64 \n", + " 17 DPIT301 946719 non-null float64\n", + " 18 FIT301 946719 non-null float64\n", + " 19 LIT301 946719 non-null float64\n", + " 20 MV301 946719 non-null int64 \n", + " 21 MV302 946719 non-null int64 \n", + " 22 MV303 946719 non-null int64 \n", + " 23 MV304 946719 non-null int64 \n", + " 24 P301 946719 non-null int64 \n", + " 25 P302 946719 non-null int64 \n", + " 26 AIT401 946719 non-null float64\n", + " 27 AIT402 946719 non-null float64\n", + " 28 FIT401 946719 non-null float64\n", + " 29 LIT401 946719 non-null float64\n", + " 30 P401 946719 non-null int64 \n", + " 31 P402 946719 non-null int64 \n", + " 32 P403 946719 non-null int64 \n", + " 33 P404 946719 non-null int64 \n", + " 34 UV401 946719 non-null int64 \n", + " 35 AIT501 946719 non-null float64\n", + " 36 AIT502 946719 non-null float64\n", + " 37 AIT503 946719 non-null float64\n", + " 38 AIT504 946719 non-null float64\n", + " 39 FIT501 946719 non-null float64\n", + " 40 FIT502 946719 non-null float64\n", + " 41 FIT503 946719 non-null float64\n", + " 42 FIT504 946719 non-null float64\n", + " 43 P501 946719 non-null int64 \n", + " 44 P502 946719 non-null int64 \n", + " 45 PIT501 946719 non-null float64\n", + " 46 PIT502 946719 non-null float64\n", + " 47 PIT503 946719 non-null float64\n", + " 48 FIT601 946719 non-null float64\n", + " 49 P601 946719 non-null int64 \n", + " 50 P602 946719 non-null int64 \n", + " 51 P603 946719 non-null int64 \n", + " 52 Normal/Attack 946719 non-null object \n", + "dtypes: float64(25), int64(26), object(2)\n", + "memory usage: 390.0+ MB\n" + ] + } + ], + "source": [ + "data.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U144t0B-l0Y4" + }, + "source": [ + "#**3. Visualization**" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "f8hXmgkYPAFA", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "df84b135-32a5-4351-b729-81e87f394772" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array(['Normal', 'Attack', 'A ttack'], dtype=object)" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ], + "source": [ + "data['Normal/Attack'].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "fL0TCErLAwWY" + }, + "outputs": [], + "source": [ + "# Remove extra spaces\n", + "data['Normal/Attack'] = data['Normal/Attack'].str.replace(' ', '')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "_xqhphU-_mT9", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 508 + }, + "outputId": "bb8ab8fc-da23-4c3e-d167-ae5a16d41958" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHrCAYAAAAjXPK7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGEUlEQVR4nO3deXQUZfr+/6vJ0kkISdiSgKxhJyAgSAygiEQQA4KgLIOAOOgoOGyKiIosDqLswsgyflRQUSCILIIgwzoossoOYd9JGIQkyJKE5Pn9Mb/UlzYBEgQ6Sb1f59Q5dD13V93ddqcvn6rqdhhjjAAAAGyogLsbAAAAcBeCEAAAsC2CEAAAsC2CEAAAsC2CEAAAsC2CEAAAsC2CEAAAsC2CEAAAsC2CEAAAsC2CEPK1cuXK6fnnn3d3G3/a0KFD5XA47sm+Hn30UT366KPW7dWrV8vhcGju3Ln3ZP/PP/+8ypUrd0/2ld8cPXpUDodDY8aMcXcrtnMv36O4swhCyJMOHTqkv/3tbwoLC5OPj48CAgLUsGFDffTRR7py5Yq727up6dOny+FwWIuPj49Kliyp5s2ba+LEibp48eId2c/p06c1dOhQbdu27Y5s707Kzb3dzOTJk+VwOBQREZHl+J49ezR06FAdPXo0y/tOnz797jaYi2WENIfDoW+//TbTeEaQOHfunBu6g50RhJDnLF68WDVr1tScOXPUqlUrTZo0SSNHjlSZMmU0YMAA9enTx90tZsvw4cP15ZdfasqUKfr73/8uSerbt69q1qypHTt2uNS+8847OQ54p0+f1rBhw3IcNn788Uf9+OOPObpPTt2st08++USxsbF3df+3a+bMmSpXrpw2btyogwcPZhrfs2ePhg0bRhC6heHDh4ufuURu4enuBoCcOHLkiDp27KiyZctq5cqVKlGihDXWq1cvHTx4UIsXL3Zjh9nXokUL1atXz7o9aNAgrVy5Ui1bttRTTz2lvXv3ytfXV5Lk6ekpT8+7+3a9fPmy/Pz85O3tfVf3cyteXl5u3f+NHDlyRD///LPmzZunv/3tb5o5c6aGDBni7rbynNq1a2vbtm367rvv1LZt27u2n0uXLqlgwYJ3bfvIP5gRQp4yatQo/f777/r0009dQlCGihUr3nRG6Pz583r99ddVs2ZN+fv7KyAgQC1atND27dsz1U6aNEnh4eHy8/NT4cKFVa9ePX399dfW+MWLF9W3b1+VK1dOTqdTwcHBevzxx7V169bbfnyPPfaYBg8erGPHjumrr76y1md1/sHy5cvVqFEjBQUFyd/fX1WqVNFbb70l6X/n9Tz44IOSpO7du1uHJDJmJB599FHVqFFDW7Zs0SOPPCI/Pz/rvn88RyhDWlqa3nrrLYWGhqpgwYJ66qmndOLECZeaG52Tdf02b9VbVucIXbp0Sa+99ppKly4tp9OpKlWqaMyYMZlmFRwOh1599VXNnz9fNWrUkNPpVHh4uJYuXZqpp3379un48eOZ1t/IzJkzVbhwYUVHR+uZZ57RzJkzXcanT5+uZ599VpLUpEkT63GtXr1a5cqV0+7du7VmzRprfcbzkZPX5NWrVzV06FBVrlxZPj4+KlGihNq2batDhw7dsG9jjF566SV5e3tr3rx5WdakpqaqSJEi6t69e6axpKQk+fj46PXXX7fW3eq9cTMdO3ZU5cqVsz0rFBMTo7p168rX11fFihXTc889p1OnTrnUPP/88/L399ehQ4f05JNPqlChQurcubOk//eaiImJUfXq1eXr66vIyEjt3LlTkjRt2jRVrFhRPj4+evTRRzPN5v3nP//Rs88+qzJlysjpdKp06dLq169frj8Ej+xjRgh5yqJFixQWFqYGDRrc1v0PHz6s+fPn69lnn1X58uUVHx+vadOmqXHjxtqzZ49Kliwp6X+HZ3r37q1nnnlGffr00dWrV7Vjxw5t2LBBf/nLXyRJL7/8subOnatXX31V1atX12+//aZ169Zp7969euCBB277MXbp0kVvvfWWfvzxR7344otZ1uzevVstW7bU/fffr+HDh8vpdOrgwYP66aefJEnVqlXT8OHD9e677+qll17Sww8/LEkuz9tvv/2mFi1aqGPHjnruuecUEhJy075GjBghh8OhgQMH6uzZs5owYYKioqK0bds2a+YqO7LT2/WMMXrqqae0atUq/fWvf1Xt2rW1bNkyDRgwQKdOndL48eNd6tetW6d58+apZ8+eKlSokCZOnKh27drp+PHjKlq0qEsfjRs31urVq7PV98yZM9W2bVt5e3urU6dOmjJlijZt2mSFukceeUS9e/fWxIkT9dZbb6latWrWfiZMmKC///3v8vf319tvvy1J1vOd3ddkWlqaWrZsqRUrVqhjx47q06ePLl68qOXL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vXvNkCFDsrx8/la93AxXjbHYZQGA/OSuXT6flJRk+vTpY8qUKWN8fHxMWFiYefvtt10uc09PTzeDBw82ISEhxul0mqZNm5rY2FiX7fz222+mU6dOxt/f3wQEBJju3bubixcvutRs377dNGrUyDidTnPfffeZDz74IFM/c+bMMZUrVzbe3t4mPDzcLF682GU8O73cDEGIxS4LAOQnOfn8dhhjjHvnpHKvpKQkBQYGKjExUQEBAe5u555yONzdAe4l/goAyE9y8vnNb40BAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbynEQOnXqlJ577jkVLVpUvr6+qlmzpjZv3myNG2P07rvvqkSJEvL19VVUVJQOHDjgso3z58+rc+fOCggIUFBQkP7617/q999/d6nZsWOHHn74Yfn4+Kh06dIaNWpUpl5iYmJUtWpV+fj4qGbNmlqyZInLeHZ6AQAA9pWjIHThwgU1bNhQXl5e+uGHH7Rnzx6NHTtWhQsXtmpGjRqliRMnaurUqdqwYYMKFiyo5s2b6+rVq1ZN586dtXv3bi1fvlzff/+91q5dq5deeskaT0pKUrNmzVS2bFlt2bJFo0eP1tChQ/Wvf/3Lqvn555/VqVMn/fWvf9Wvv/6qNm3aqE2bNtq1a1eOegEAADZmcmDgwIGmUaNGNxxPT083oaGhZvTo0da6hIQE43Q6zTfffGOMMWbPnj1Gktm0aZNV88MPPxiHw2FOnTpljDFm8uTJpnDhwiY5Odll31WqVLFut2/f3kRHR7vsPyIiwvztb3/Ldi+3kpiYaCSZxMTEbNXnJxKLnRYAyE9y8vmdoxmhhQsXql69enr22WcVHBysOnXq6JNPPrHGjxw5ori4OEVFRVnrAgMDFRERofXr10uS1q9fr6CgINWrV8+qiYqKUoECBbRhwwar5pFHHpG3t7dV07x5c8XGxurChQtWzfX7yajJ2E92evmj5ORkJSUluSwAACD/ylEQOnz4sKZMmaJKlSpp2bJleuWVV9S7d2/NmDFDkhQXFydJCgkJcblfSEiINRYXF6fg4GCXcU9PTxUpUsSlJqttXL+PG9VcP36rXv5o5MiRCgwMtJbSpUvf6ikBAAB5WI6CUHp6uh544AG9//77qlOnjl566SW9+OKLmjp16t3q754aNGiQEhMTreXEiRPubgkAANxFOQpCJUqUUPXq1V3WVatWTcePH5ckhYaGSpLi4+NdauLj462x0NBQnT171mX82rVrOn/+vEtNVtu4fh83qrl+/Fa9/JHT6VRAQIDLAgAA8q8cBaGGDRsqNjbWZd3+/ftVtmxZSVL58uUVGhqqFStWWONJSUnasGGDIiMjJUmRkZFKSEjQli1brJqVK1cqPT1dERERVs3atWuVmppq1SxfvlxVqlSxrlCLjIx02U9GTcZ+stMLAACwuZychb1x40bj6elpRowYYQ4cOGBmzpxp/Pz8zFdffWXVfPDBByYoKMgsWLDA7Nixw7Ru3dqUL1/eXLlyxap54oknTJ06dcyGDRvMunXrTKVKlUynTp2s8YSEBBMSEmK6dOlidu3aZWbNmmX8/PzMtGnTrJqffvrJeHp6mjFjxpi9e/eaIUOGGC8vL7Nz584c9XIzXDXGYpcFAPKTnHx+5/hP4KJFi0yNGjWM0+k0VatWNf/6179cxtPT083gwYNNSEiIcTqdpmnTpiY2Ntal5rfffjOdOnUy/v7+JiAgwHTv3t1cvHjRpWb79u2mUaNGxul0mvvuu8988MEHmXqZM2eOqVy5svH29jbh4eFm8eLFOe7lZghCLHZZACA/ycnnt8MYY9w7J5V7JSUlKTAwUImJibY7X8jhcHcHuJf4KwAgP8nJ5ze/NQYAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGyLIAQAAGzrTwWhDz74QA6HQ3379rXWXb16Vb169VLRokXl7++vdu3aKT4+3uV+x48fV3R0tPz8/BQcHKwBAwbo2rVrLjWrV6/WAw88IKfTqYoVK2r69OmZ9v/xxx+rXLly8vHxUUREhDZu3Ogynp1eAACAfd12ENq0aZOmTZum+++/32V9v379tGjRIsXExGjNmjU6ffq02rZta42npaUpOjpaKSkp+vnnnzVjxgxNnz5d7777rlVz5MgRRUdHq0mTJtq2bZv69u2rHj16aNmyZVbN7Nmz1b9/fw0ZMkRbt25VrVq11Lx5c509ezbbvQAAAJszt+HixYumUqVKZvny5aZx48amT58+xhhjEhISjJeXl4mJibFq9+7daySZ9evXG2OMWbJkiSlQoICJi4uzaqZMmWICAgJMcnKyMcaYN954w4SHh7vss0OHDqZ58+bW7fr165tevXpZt9PS0kzJkiXNyJEjs93LrSQmJhpJJjExMVv1+YnEYqcFAPKTnHx+39aMUK9evRQdHa2oqCiX9Vu2bFFqaqrL+qpVq6pMmTJav369JGn9+vWqWbOmQkJCrJrmzZsrKSlJu3fvtmr+uO3mzZtb20hJSdGWLVtcagoUKKCoqCirJju9/FFycrKSkpJcFgAAkH955vQOs2bN0tatW7Vp06ZMY3FxcfL29lZQUJDL+pCQEMXFxVk114egjPGMsZvVJCUl6cqVK7pw4YLS0tKyrNm3b1+2e/mjkSNHatiwYTd59AAAID/J0YzQiRMn1KdPH82cOVM+Pj53qye3GTRokBITE63lxIkT7m4JAADcRTkKQlu2bNHZs2f1wAMPyNPTU56enlqzZo0mTpwoT09PhYSEKCUlRQkJCS73i4+PV2hoqCQpNDQ005VbGbdvVRMQECBfX18VK1ZMHh4eWdZcv41b9fJHTqdTAQEBLgsAAMi/chSEmjZtqp07d2rbtm3WUq9ePXXu3Nn6t5eXl1asWGHdJzY2VsePH1dkZKQkKTIyUjt37nS5umv58uUKCAhQ9erVrZrrt5FRk7ENb29v1a1b16UmPT1dK1assGrq1q17y14AAIDN/dkzs6+/aswYY15++WVTpkwZs3LlSrN582YTGRlpIiMjrfFr166ZGjVqmGbNmplt27aZpUuXmuLFi5tBgwZZNYcPHzZ+fn5mwIABZu/evebjjz82Hh4eZunSpVbNrFmzjNPpNNOnTzd79uwxL730kgkKCnK5Gu1WvdwKV42x2GUBgPwkJ5/fdzwIXblyxfTs2dMULlzY+Pn5maefftqcOXPG5T5Hjx41LVq0ML6+vqZYsWLmtddeM6mpqS41q1atMrVr1zbe3t4mLCzMfP7555n2PWnSJFOmTBnj7e1t6tevb3755ReX8ez0cjMEIRa7LACQn+Tk89thjDHunZPKvZKSkhQYGKjExETbnS/kcLi7A9xL/BUAkJ/k5POb3xoDAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2RRACAAC2laMgNHLkSD344IMqVKiQgoOD1aZNG8XGxrrUXL16Vb169VLRokXl7++vdu3aKT4+3qXm+PHjio6Olp+fn4KDgzVgwABdu3bNpWb16tV64IEH5HQ6VbFiRU2fPj1TPx9//LHKlSsnHx8fRUREaOPGjTnuBQAA2FeOgtCaNWvUq1cv/fLLL1q+fLlSU1PVrFkzXbp0yarp16+fFi1apJiYGK1Zs0anT59W27ZtrfG0tDRFR0crJSVFP//8s2bMmKHp06fr3XfftWqOHDmi6OhoNWnSRNu2bVPfvn3Vo0cPLVu2zKqZPXu2+vfvryFDhmjr1q2qVauWmjdvrrNnz2a7FwAAYHPmTzh79qyRZNasWWOMMSYhIcF4eXmZmJgYq2bv3r1Gklm/fr0xxpglS5aYAgUKmLi4OKtmypQpJiAgwCQnJxtjjHnjjTdMeHi4y746dOhgmjdvbt2uX7++6dWrl3U7LS3NlCxZ0owcOTLbvfzR1atXTWJiorWcOHHCSDKJiYm39fzkZRKLnRYAyE8SExOz/fn9p84RSkxMlCQVKVJEkrRlyxalpqYqKirKqqlatarKlCmj9evXS5LWr1+vmjVrKiQkxKpp3ry5kpKStHv3bqvm+m1k1GRsIyUlRVu2bHGpKVCggKKioqya7PTyRyNHjlRgYKC1lC5d+vaeGAAAkCfcdhBKT09X37591bBhQ9WoUUOSFBcXJ29vbwUFBbnUhoSEKC4uzqq5PgRljGeM3awmKSlJV65c0blz55SWlpZlzfXbuFUvfzRo0CAlJiZay4kTJ7L5bAAAgLzI83bv2KtXL+3atUvr1q27k/24ldPplNPpdHcbAADgHrmtGaFXX31V33//vVatWqVSpUpZ60NDQ5WSkqKEhASX+vj4eIWGhlo1f7xyK+P2rWoCAgLk6+urYsWKycPDI8ua67dxq14AAIC95SgIGWP06quv6rvvvtPKlStVvnx5l/G6devKy8tLK1assNbFxsbq+PHjioyMlCRFRkZq586dLld3LV++XAEBAapevbpVc/02MmoytuHt7a26deu61KSnp2vFihVWTXZ6AQAANpeTs7BfeeUVExgYaFavXm3OnDljLZcvX7ZqXn75ZVOmTBmzcuVKs3nzZhMZGWkiIyOt8WvXrpkaNWqYZs2amW3btpmlS5ea4sWLm0GDBlk1hw8fNn5+fmbAgAFm79695uOPPzYeHh5m6dKlVs2sWbOM0+k006dPN3v27DEvvfSSCQoKcrka7Va93EpOzjrPb9x9FRMLV40BwO3Kyed3jv4ESspy+fzzz62aK1eumJ49e5rChQsbPz8/8/TTT5szZ864bOfo0aOmRYsWxtfX1xQrVsy89tprJjU11aVm1apVpnbt2sbb29uEhYW57CPDpEmTTJkyZYy3t7epX7+++eWXX1zGs9PLzRCEWOyyAEB+kpPPb4cxxrhrNiq3S0pKUmBgoBITExUQEODudu4ph8PdHeBe4q8AgPwkJ5/f/NYYAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQACDXGTp0qBwOh8tStWrVTHXGGLVo0UIOh0Pz58/PND59+nTdf//98vHxUXBwsHr16mWNrV69Wq1bt1aJEiVUsGBB1a5dWzNnznS5/+7du9WuXTuVK1dODodDEyZMuNMPFW7m6e4GAADISnh4uP79739btz09M39kTZgwQQ6HI8v7jxs3TmPHjtXo0aMVERGhS5cu6ejRo9b4zz//rPvvv18DBw5USEiIvv/+e3Xt2lWBgYFq2bKlJOny5csKCwvTs88+q379+t3ZB4hcgSAEAMiVPD09FRoaesPxbdu2aezYsdq8ebNKlCjhMnbhwgW98847WrRokZo2bWqtv//++61/v/XWWy736dOnj3788UfNmzfPCkIPPvigHnzwQUnSm2+++acfE3IfDo0BAHKlAwcOqGTJkgoLC1Pnzp11/Phxa+zy5cv6y1/+oo8//jjLsLR8+XKlp6fr1KlTqlatmkqVKqX27dvrxIkTN91nYmKiihQpcscfC3IvghAAINeJiIjQ9OnTtXTpUk2ZMkVHjhzRww8/rIsXL0qS+vXrpwYNGqh169ZZ3v/w4cNKT0/X+++/rwkTJmju3Lk6f/68Hn/8caWkpGR5nzlz5mjTpk3q3r37XXtcyH04NAYAyHVatGhh/fv+++9XRESEypYtqzlz5qh48eJauXKlfv311xvePz09XampqZo4caKaNWsmSfrmm28UGhqqVatWqXnz5i71q1atUvfu3fXJJ58oPDz87jwo5ErMCAEAcr2goCBVrlxZBw8e1MqVK3Xo0CEFBQXJ09PTOom6Xbt2evTRRyXJOmeoevXq1jaKFy+uYsWKuRxik6Q1a9aoVatWGj9+vLp27XpvHhByDWaEAAC53u+//65Dhw6pS5cuat++vXr06OEyXrNmTY0fP16tWrWSJDVs2FCSFBsbq1KlSkmSzp8/r3Pnzqls2bLW/VavXq2WLVvqww8/1EsvvXSPHg1yE4IQACDXef3119WqVSuVLVtWp0+f1pAhQ+Th4aFOnTqpePHiWZ4gXaZMGZUvX16SVLlyZbVu3Vp9+vTRv/71LwUEBGjQoEGqWrWqmjRpIul/h8NatmypPn36qF27doqLi5MkeXt7WydMp6SkaM+ePda/T506pW3btsnf318VK1a8F08F7jIOjQEAcp2TJ0+qU6dOqlKlitq3b6+iRYvql19+UfHixbO9jS+++EIRERGKjo5W48aN5eXlpaVLl8rLy0uSNGPGDF2+fFkjR45UiRIlrKVt27bWNk6fPq06deqoTp06OnPmjMaMGaM6depkmpFC3uUwxhh3N5FbJSUlKTAwUImJiQoICHB3O/fUDb6fDPkUfwUA5Cc5+fxmRggAANgWQQgAANgWJ0sDgN1w7NteOPZ9U8wIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA27JFEPr4449Vrlw5+fj4KCIiQhs3bnR3SwAAIBfI90Fo9uzZ6t+/v4YMGaKtW7eqVq1aat68uc6ePevu1gAAgJvl+yA0btw4vfjii+revbuqV6+uqVOnys/PT5999pm7WwMAAG7m6e4G7qaUlBRt2bJFgwYNstYVKFBAUVFRWr9+fab65ORkJScnW7cTExMlSUlJSXe/WcCNeIkD+ZgN3+AZn9vGmFvW5usgdO7cOaWlpSkkJMRlfUhIiPbt25epfuTIkRo2bFim9aVLl75rPQK5QWCguzsAcNfY+A1+8eJFBd7i8efrIJRTgwYNUv/+/a3b6enpOn/+vIoWLSqHw+HGznAvJCUlqXTp0jpx4oQCAgLc3Q6AO4j3t70YY3Tx4kWVLFnylrX5OggVK1ZMHh4eio+Pd1kfHx+v0NDQTPVOp1NOp9NlXVBQ0N1sEblQQEAAfyiBfIr3t33caiYoQ74+Wdrb21t169bVihUrrHXp6elasWKFIiMj3dgZAADIDfL1jJAk9e/fX926dVO9evVUv359TZgwQZcuXVL37t3d3RoAAHCzfB+EOnTooP/+97969913FRcXp9q1a2vp0qWZTqAGnE6nhgwZkunwKIC8j/c3bsRhsnNtGQAAQD6Ur88RAgAAuBmCEAAAsC2CEAAAsC2CEAAAsC2CEAAAsC2CEAAg37nZj2UfPHjwHnaC3I4gBADId6Kjo5WcnJxpfWxsrB599NF73xByrXz/hYpAVm72f4t/xO8SAXmPv7+/nn76aS1cuFCenv/7qNu7d68ee+wxtW/f3s3dITfhCxVhSwUKFJDD4bhpjTFGDodDaWlp96grAHfKlStXFBUVpVKlSmnWrFnavXu3mjZtqs6dO2vcuHHubg+5CEEItrRmzZps1zZu3PgudgLgbklISNCjjz6qSpUqae3ateratatGjx7t7raQyxCEAAD5QlaHvM+cOaPHH39cLVu21AcffGCt55A3MhCEgP/f5cuXdfz4caWkpLisv//++93UEYCcuNEh74yPOYfDwSFvZMLJ0rC9//73v+revbt++OGHLMf5gwnkDatWrXJ3C8iDCEKwvb59+yohIUEbNmzQo48+qu+++07x8fH6xz/+obFjx7q7PQDZxPl8uB0EIdjeypUrtWDBAtWrV08FChRQ2bJl9fjjjysgIEAjR45UdHS0u1sEkEOff/65/P399eyzz7qsj4mJ0eXLl9WtWzc3dYbchi9UhO1dunRJwcHBkqTChQvrv//9rySpZs2a2rp1qztbA3CbRo4cqWLFimVaHxwcrPfff98NHSG3IgjB9qpUqaLY2FhJUq1atTRt2jSdOnVKU6dOVYkSJdzcHYDbcfz4cZUvXz7T+rJly+r48eNu6Ai5FYfGYHt9+vTRmTNnJElDhgzRE088oZkzZ8rb21vTp093b3MAbktwcLB27NihcuXKuazfvn27ihYt6p6mkCsRhGB7zz33nPXvunXr6tixY9q3b5/KlCmT5dQ6gNyvU6dO6t27twoVKqRHHnlE0v++SLVPnz7q2LGjm7tDbsL3CAEA8p2UlBR16dJFMTEx1m+Npaenq2vXrpo6daq8vb3d3CFyC4IQbM8Yo7lz52rVqlU6e/as0tPTXcbnzZvnps4A/Fn79+/X9u3b5evrq5o1a6ps2bLubgm5DIfGYHt9+/bVtGnT1KRJE4WEhNzyx1gB5B2VK1dW5cqV3d0GcjFmhGB7RYoU0VdffaUnn3zS3a0AuINOnjyphQsXZvnTOfwCPTIwIwTbCwwMVFhYmLvbAHAHrVixQk899ZTCwsK0b98+1ahRQ0ePHpUxRg888IC720MuwvcIwfaGDh2qYcOG6cqVK+5uBcAdMmjQIL3++uvauXOnfHx89O233+rEiRNq3Lhxpm+bhr1xaAy2d+XKFT399NP66aefVK5cOXl5ebmM8+3SQN5TqFAhbdu2TRUqVFDhwoW1bt06hYeHa/v27WrdurWOHj3q7haRS3BoDLbXrVs3bdmyRc899xwnSwP5RMGCBa3zgkqUKKFDhw4pPDxcknTu3Dl3toZchiAE21u8eLGWLVumRo0aubsVAHfIQw89pHXr1qlatWp68skn9dprr2nnzp2aN2+eHnroIXe3h1yEIATbK126tAICAtzdBoA7aNy4cfr9998lScOGDdPvv/+u2bNnq1KlSlwxBhecIwTbW7x4sSZNmqSpU6dm+l0iAED+RhCC7RUuXFiXL1/WtWvX5Ofnl+lk6fPnz7upMwC3KywsTJs2bcr0A6sJCQl64IEHdPjwYTd1htyGQ2OwvQkTJri7BQB32NGjR5WWlpZpfXJysk6dOuWGjpBbEYRga6mpqVqzZo0GDx6s8uXLu7sdAH/SwoULrX8vW7ZMgYGB1u20tDStWLGCQ+BwwaEx2F5gYKC2bdtGEALygQIFbvw9wV5eXipXrpzGjh2rli1b3sOukJvxzdKwvTZt2mj+/PnubgPAHZCenq709HSVLVtWZ8+etW6np6crOTlZsbGxhCC44NAYbK9SpUoaPny4fvrpJ9WtW1cFCxZ0Ge/du7ebOgNwu4YNG6ZChQplWp+SkqJZs2apa9eubugKuRGHxmB7Nzsk5nA4uLoEyIM8PDx05swZBQcHu6z/7bffFBwcnOWJ1LAnZoRge0eOHHF3CwDuMGNMlj+Xc/LkSZcTqAGCEHCdjAlSfm8MyJvq1Kkjh8Mhh8Ohpk2bytPz/33MpaWl6ciRI3riiSfc2CFyG4IQIOmLL77Q6NGjdeDAAUlS5cqVNWDAAHXp0sXNnQHIiTZt2kiStm3bpubNm8vf398a8/b2Vrly5VSjRg03dYfciCAE2xs3bpwGDx6sV199VQ0bNpQkrVu3Ti+//LLOnTunfv36ublDANk1ZMgQSVK5cuXUoUMH+fj4SJIuXryob775RuPHj9eWLVs4RwgWTpaG7ZUvX17Dhg3LdBXJjBkzNHToUM4hAvKwtWvX6tNPP9W3336rkiVLqm3btmrXrp0efPBBd7eGXIIZIdjemTNn1KBBg0zrGzRooDNnzrihIwB/RlxcnKZPn65PP/1USUlJat++vZKTkzV//nxVr17d3e0hl+ELFWF7FStW1Jw5czKtnz17tipVquSGjgDcrlatWqlKlSrasWOHJkyYoNOnT2vSpEnubgu5GDNCsL1hw4apQ4cOWrt2rXWO0E8//aQVK1ZkGZAA5F4//PCDevfurVdeeYX/kUG2MCME22vXrp02bNigokWLav78+Zo/f76KFSumjRs36umnn3Z3ewByYN26dbp48aLq1q2riIgI/fOf/9S5c+fc3RZyMU6WBgDkO5cuXdLs2bP12WefaePGjUpLS9O4ceP0wgsvZPnTG7AvghBsq0CBArf84kSHw6Fr167do44A3A2xsbH69NNP9eWXXyohIUGPP/64Fi5c6O62kEsQhGBbCxYsuOHY+vXrNXHiRKWnp+vq1av3sCsAd0taWpoWLVqkzz77jCAEC0EIuE5sbKzefPNNLVq0SJ07d9bw4cNVtmxZd7cFALhLOFkakHT69Gm9+OKLqlmzpq5du6Zt27ZpxowZhCAAyOcIQrC1xMREDRw4UBUrVtTu3bu1YsUKLVq0iN8iAgCb4HuEYFujRo3Shx9+qNDQUH3zzTdq3bq1u1sCANxjnCME2ypQoIB8fX0VFRUlDw+PG9bNmzfvHnYFALiXmBGCbXXt2vWWl88DAPI3ZoQAAIBtcbI0AACwLYIQAACwLYIQAACwLYIQAACwLYIQgHzN4XBo/vz57m4DQC5FEAKQp8XFxenvf/+7wsLC5HQ6Vbp0abVq1UorVqxwd2sA8gC+RwhAnnX06FE1bNhQQUFBGj16tGrWrKnU1FQtW7ZMvXr10r59+9zdIoBcjhkhAHlWz5495XA4tHHjRrVr106VK1dWeHi4+vfvr19++SXL+wwcOFCVK1eWn5+fwsLCNHjwYKWmplrj27dvV5MmTVSoUCEFBASobt262rx5syTp2LFjatWqlQoXLqyCBQsqPDxcS5YsuSePFcDdwYwQgDzp/PnzWrp0qUaMGKGCBQtmGg8KCsryfoUKFdL06dNVsmRJ7dy5Uy+++KIKFSqkN954Q5LUuXNn1alTR1OmTJGHh4e2bdsmLy8vSVKvXr2UkpKitWvXqmDBgtqzZ4/8/f3v2mMEcPcRhADkSQcPHpQxRlWrVs3R/d555x3r3+XKldPrr7+uWbNmWUHo+PHjGjBggLXdSpUqWfXHjx9Xu3btVLNmTUlSWFjYn30YANyMQ2MA8qTb/XWg2bNnq2HDhgoNDZW/v7/eeecdHT9+3Brv37+/evTooaioKH3wwQc6dOiQNda7d2/94x//UMOGDTVkyBDt2LHjTz8OAO5FEAKQJ1WqVEkOhyNHJ0SvX79enTt31pNPPqnvv/9ev/76q95++22lpKRYNUOHDtXu3bsVHR2tlStXqnr16vruu+8kST169NDhw4fVpUsX7dy5U/Xq1dOkSZPu+GMDcO/wo6sA8qwWLVpo586dio2NzXSeUEJCgoKCguRwOPTdd9+pTZs2Gjt2rCZPnuwyy9OjRw/NnTtXCQkJWe6jU6dOunTpkhYuXJhpbNCgQVq8eDEzQ0AexowQgDzr448/VlpamurXr69vv/1WBw4c0N69ezVx4kRFRkZmqq9UqZKOHz+uWbNm6dChQ5o4caI12yNJV65c0auvvqrVq1fr2LFj+umnn7Rp0yZVq1ZNktS3b18tW7ZMR44c0datW7Vq1SprDEDexMnSAPKssLAwbd26VSNGjNBrr72mM2fOqHjx4qpbt66mTJmSqf6pp55Sv3799Oqrryo5OVnR0dEaPHiwhg4dKkny8PDQb7/9pq5duyo+Pl7FihVT27ZtNWzYMElSWlqaevXqpZMnTyogIEBPPPGExo8ffy8fMoA7jENjAADAtjg0BgAAbIsgBAAAbIsgBAAAbIsgBAAAbIsgBAAAbIsgBAAAbIsgBAAAbIsgBAAAbIsgBAAAbIsgBAAAbIsgBAAAbOv/A33pT0L3wgmIAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ], + "source": [ + "# Class distribution (Normal vs. Attack) in SWaT\n", + "class_distribution = data['Normal/Attack'].value_counts()\n", + "fig, ax = plt.subplots()\n", + "bar_plot = class_distribution.plot(kind='bar', color=['blue', 'red'], ax=ax)\n", + "\n", + "plt.title('Class Distribution: Attack vs Normal')\n", + "plt.xlabel('Class')\n", + "for i, count in enumerate(class_distribution):\n", + " ax.text(i, count, str(count), ha='center', va='bottom')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "kyxEk4oou9fg" + }, + "outputs": [], + "source": [ + "# Converting the Timestamp to a datetime and set it as an index\n", + "data['Timestamp'] = pd.to_datetime(data['Timestamp'])\n", + "data= data.set_index('Timestamp')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "xWxdCzno4goe", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 564 + }, + "outputId": "ed9a5d53-91f0-4f58-cad4-c0f2a1a99883" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+IAAAIjCAYAAACH2aHuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACUUklEQVR4nOzdd3gUVdvH8d9ueiEJJYVQI4KAICUUKSog0mJBEEFRqWIBEfTVR9QHEQuPWCiKYEFABUWUoogo0puIaESKKEoRIaEnENIz7x9LlmyyCQnZ7G6W7+e69kr2zJk592xmN3vPOXPGZBiGIQAAAAAA4BRmVwcAAAAAAMDlhEQcAAAAAAAnIhEHAAAAAMCJSMQBAAAAAHAiEnEAAAAAAJyIRBwAAAAAACciEQcAAAAAwIlIxAEAAAAAcCIScQAAAAAAnIhEHECprFmzRiaTSWvWrHF1KHbt379fJpNJs2fPLnbd1157rewDcwMmk0kjRoxwdRglNnDgQAUHB7s6jCL9+eef6tKli0JDQ2UymbR48WKXxlO7dm0NHDjQpTEAZWHgwIGqXbu2q8MAgBIjEQdg1+zZs2UymawPf39/1atXTyNGjFBiYqJD2li2bJnGjRvnkG25W7vLli2TyWRSdHS0cnJyCiw/fPiwxo0bp/j4+ALL5s2bp8mTJ5dpfKVVu3ZtmUwmde7c2e7y9957z3rs/PTTT06OzvUGDBig3377TS+99JI++ugjtWjRoszayj2BZO9x7bXXlkmbl3KM7t+/X4MGDVKdOnXk7++vqKgoXX/99Xruueds6r399tvFOnHmDo4dO6ZHH31U9evXV0BAgCIiItSqVSv95z//0dmzZ10dHgrRqlUrmUwmTZ8+/ZK34cz/X5s2bdK4ceN0+vRpp7QHwDm8XR0AAPc2fvx4xcTEKC0tTRs2bND06dO1bNky7dixQ4GBgaXa9rJlyzRt2rQy/TJTq1YtpaamysfHx6ntzp07V7Vr19b+/fu1atWqAgnr4cOH9fzzz6t27dpq2rSpzbJ58+Zpx44dGjVqVJnF5wj+/v5avXq1EhISFBUVZbNs7ty58vf3V1pamouic53U1FRt3rxZzzzzjFNHHNx1113q0aOHTVl4eLgkac+ePTKbHXfuvaTH6N69e9WyZUsFBARo8ODBql27to4cOaKff/5Zr7zyip5//nlr3bfffltVqlRx+x78kydPqkWLFkpOTtbgwYNVv359nThxQtu3b9f06dP10EMPuf3IjcvRn3/+qa1bt6p27dqaO3euHnrooUvajjP+j+TatGmTnn/+eQ0cOFBhYWFl3h4A5yARB1Ck7t27W3vzhg4dqsqVK+uNN97QkiVLdNddd7k4uovL7c13ppSUFC1ZskQTJkzQrFmzNHfu3EJ7jsuzdu3aaevWrZo/f74effRRa/mhQ4e0fv163X777friiy8c1l5KSoqCgoIctr3CpKWlydfX95IT12PHjkmSQ78wF2ffmzdvrnvuucfuMj8/P4e0cakmTZqks2fPKj4+XrVq1bJZdvTo0TJps6zNnDlTBw8e1MaNG9W2bVubZcnJyfL19XVRZKWXlZWlnJyccr0Phfn4448VERGh119/XXfccYf2799/WQ5tNwxDaWlpCggIcHUowGWLoekASqRTp06SpH379hVZb8GCBYqNjVVAQICqVKmie+65R//++691+cCBAzVt2jRJshlKW5jHHntMlStXlmEY1rJHHnlEJpNJU6dOtZYlJibaDDnMf414cdt99913VadOHfn5+ally5baunVrkfub16JFi5Samqo+ffqoX79+WrhwoU3P8Jo1a9SyZUtJ0qBBg6wxzJ49Wx06dNDXX3+tAwcOWMtzvyRmZGRo7Nixio2NVWhoqIKCgnTddddp9erVBWLIycnRlClT1LhxY/n7+ys8PFzdunW76DDxF198UWazWW+++eZF99Pf31+9evXSvHnzbMo/+eQTVaxYUV27di2wzvbt2zVw4EBdccUV1uHJgwcP1okTJ2zqjRs3TiaTSbt27dLdd9+tihUrqn379oXGEh8fr/DwcHXo0ME6JPjff//V4MGDFRkZKT8/P1199dX64IMPbNbLnePg008/1bPPPqtq1aopMDBQycnJyszM1PPPP6+6devK399flStXVvv27bVixYpC4xg3bpw10XziiSds/n6S9Msvv6h79+4KCQlRcHCwbrzxRv3www8228i9LGTt2rV6+OGHFRERoerVqxfaZnHkv0a8qDbOnDmjUaNGqXbt2vLz81NERIRuuukm/fzzz5JU5DFamL/++kvVq1cvkIRLUkREhE2cO3fu1Nq1a63b7tChgyRLD/T//d//qXHjxgoODlZISIi6d++uX3/9tcA2Dxw4oFtvvVVBQUGKiIjQ6NGj9e2339qdz2LLli3q1q2bQkNDFRgYqBtuuEEbN2686Gv6119/ycvLy+7w/5CQkAInAIvTTu5xv3fvXmvvZ2hoqAYNGqRz587Z1F2xYoXat2+vsLAwBQcH66qrrtLTTz9tU+fo0aMaMmSIIiMj5e/vryZNmmjOnDk2dfLOjTF58mTr596uXbskSW+++aauvvpqBQYGqmLFimrRokWB93x+xf2sytt2cT5zFy9erEaNGsnf31+NGjXSokWLiozDnnnz5umOO+7QzTffrNDQ0EL3ZcuWLerRo4cqVqyooKAgXXPNNZoyZYqkov+PFDZvir35SorzeThu3Dg98cQTkqSYmBhrW/v375dkOWnywgsvWF+72rVr6+mnn1Z6erpN+7Vr19bNN9+sb7/9Vi1atFBAQIDeeecdScU7lgA4Hj3iAErkr7/+kiRVrly50DqzZ8/WoEGD1LJlS02YMEGJiYmaMmWKNm7cqF9++UVhYWF64IEHdPjwYa1YsUIfffTRRdu97rrrNGnSJO3cuVONGjWSJK1fv15ms1nr16/XyJEjrWWSdP3119vdTnHanTdvns6cOaMHHnhAJpNJEydOVK9evfT333/bDHEvzNy5c9WxY0dFRUWpX79+euqpp/TVV1+pT58+kqQGDRpo/PjxGjt2rIYNG6brrrtOktS2bVtVq1ZNSUlJOnTokCZNmiRJ1uGtycnJev/993XXXXfp/vvv15kzZzRz5kx17dpVP/74o80Q9yFDhmj27Nnq3r27hg4dqqysLK1fv14//PBDodcrP/vss3r55Zf1zjvv6P7777/ofkrS3XffrS5duuivv/5SnTp1rK/fHXfcYfe1WrFihf7++28NGjRIUVFR2rlzp959913t3LlTP/zwQ4GTIn369FHdunX18ssv25yEyWvr1q3q2rWrWrRooSVLliggIECJiYm69tprrRPShYeH65tvvtGQIUOUnJxcYEj1Cy+8IF9fX/3f//2f0tPT5evrq3HjxmnChAkaOnSoWrVqpeTkZP3000/6+eefddNNN9mNpVevXgoLC9Po0aOtQ8Vz/347d+7Uddddp5CQED355JPy8fHRO++8ow4dOmjt2rVq3bq1zbYefvhhhYeHa+zYsUpJSbno3+LcuXM6fvy4TVloaGiRx6y9Nh588EF9/vnnGjFihBo2bKgTJ05ow4YN2r17t5o3b65nnnmm0GO0MLVq1dL333+vVatWWU/m2TN58mQ98sgjCg4O1jPPPCNJioyMlCT9/fffWrx4sfr06aOYmBglJibqnXfe0Q033KBdu3YpOjpakqVnv1OnTjpy5IgeffRRRUVFad68eXZPWK1atUrdu3dXbGysnnvuOZnNZs2aNUudOnXS+vXr1apVqyL3KTs7Wx999JEGDBhQ5P6XtJ0777xTMTExmjBhgn7++We9//77ioiI0CuvvCLJcizdfPPNuuaaazR+/Hj5+flp7969Nol9amqqOnTooL1792rEiBGKiYnRggULNHDgQJ0+fdpmFIskzZo1S2lpaRo2bJj8/PxUqVIlvffeexo5cqTuuOMOPfroo0pLS9P27du1ZcsW3X333YXub0k+q6TifeZ+99136t27txo2bKgJEyboxIkTGjRoUIlOUm3ZskV79+7VrFmz5Ovrq169emnu3LkFks4VK1bo5ptvVtWqVa3H0O7du7V06VI9+uijJf7/VZjifB726tVLf/zxhz755BNNmjRJVapUkXThspOhQ4dqzpw5uuOOO/T4449ry5YtmjBhgnbv3l3gRMWePXt011136YEHHtD999+vq666qljHEoAyYgCAHbNmzTIkGd9//71x7Ngx459//jE+/fRTo3LlykZAQIBx6NAhwzAMY/Xq1YYkY/Xq1YZhGEZGRoYRERFhNGrUyEhNTbVub+nSpYYkY+zYsday4cOHG8X9GDp69KghyXj77bcNwzCM06dPG2az2ejTp48RGRlprTdy5EijUqVKRk5OjmEYhrFv3z5DkjFr1qyLtptbt3LlysbJkyet5UuWLDEkGV999dVF40xMTDS8vb2N9957z1rWtm1b47bbbrOpt3Xr1gJx5YqLizNq1apVoDwrK8tIT0+3KTt16pQRGRlpDB482Fq2atUqQ5IxcuTIAtvIfV0MwzAkGcOHDzcMwzAef/xxw2w2G7Nnz77oPhqGYdSqVcuIi4szsrKyjKioKOOFF14wDMMwdu3aZUgy1q5daz2Gtm7dal3v3LlzBbb1ySefGJKMdevWWcuee+45Q5Jx1113Fag/YMAAIygoyDAMw9iwYYMREhJixMXFGWlpadY6Q4YMMapWrWocP37cZt1+/foZoaGh1jhyj98rrriiQGxNmjQx4uLiivV65JV7HL366qs25T179jR8fX2Nv/76y1p2+PBho0KFCsb1119vLct93dq3b29kZWUVuz17j9z3Za1atYwBAwYUq43Q0FDrcVGYwo7RwuzYscMICAgwJBlNmzY1Hn30UWPx4sVGSkpKgbpXX321ccMNNxQoT0tLM7Kzs23K9u3bZ/j5+Rnjx4+3lr3++uuGJGPx4sXWstTUVKN+/fo2r0lOTo5Rt25do2vXrjbvi3PnzhkxMTHGTTfdVOQ+JSQkGOHh4YYko379+saDDz5ozJs3zzh9+rRNvZK0k3vc530/G4Zh3H777UblypWtzydNmmRIMo4dO1ZofJMnTzYkGR9//LG1LCMjw2jTpo0RHBxsJCcnW19DSUZISIhx9OhRm23cdtttxtVXX13k62BPcT+rSvKZ27RpU6Nq1ao2r+93331nSCr2sThixAijRo0a1r9D7vq//PKLTewxMTFGrVq1jFOnTtmsn/fvV9j/kfz/E/Pva97P/OJ+Hr766quGJGPfvn02dePj4w1JxtChQ23K/+///s+QZKxatcpaVqtWLUOSsXz5cpu6xTmWAJQNhqYDKFLnzp0VHh6uGjVqqF+/fgoODtaiRYtUrVo1u/V/+uknHT16VA8//LDN0My4uDjVr19fX3/99SXFER4ervr162vdunWSpI0bN8rLy0tPPPGEEhMT9eeff0qy9Ii3b9++yGHuF9O3b19VrFjR+jy3x/rvv/++6LqffvqpzGazevfubS2766679M033+jUqVOXHJMkeXl5Wa/ZzMnJ0cmTJ5WVlaUWLVpYhw1L0hdffCGTyVRgNmpJBV4XwzA0YsQITZkyRR9//PFFe/bsxXTnnXfqk08+kWQZDVCjRg3ra5Zf3usR09LSdPz4cevQ3rz7kOvBBx8stO3Vq1era9euuvHGG7Vw4ULrddCGYeiLL77QLbfcIsMwdPz4ceuja9euSkpKKtDWgAEDClwrGRYWpp07d1qPrdLIzs7Wd999p549e+qKK66wlletWlV33323NmzYoOTkZJt17r//fnl5eRW7jWHDhmnFihU2jyZNmhS5jr02wsLCtGXLFh0+fLjYbV/M1Vdfrfj4eN1zzz3av3+/pkyZop49eyoyMlLvvfdesbbh5+dnvW4/OztbJ06csA6jzfv3XL58uapVq6Zbb73VWubv719glEd8fLz+/PNP3X333Tpx4oT1GElJSdGNN96odevW2b3jQa7IyEj9+uuvevDBB3Xq1CnNmDFDd999tyIiIvTCCy9YR3BcSjv5j/vrrrtOJ06csB4jufMPLFmypNAYly1bpqioKJu5PHx8fDRy5EidPXtWa9eutanfu3dvay9rrrCwMB06dKhEl+ZIxf+synWxz9wjR44oPj5eAwYMUGhoqLXeTTfdpIYNGxYrpqysLM2fP199+/a1fg526tRJERERmjt3rrXeL7/8on379mnUqFEF5nkozf8Ve0r6eZjfsmXLJFku3crr8ccfl6QC/29jYmIKXDJUnGMJQNkgEQdQpGnTpmnFihVavXq1du3apb///tvutb+5Dhw4IEm66qqrCiyrX7++dfmluO6666xDz9evX68WLVqoRYsWqlSpktavX6/k5GT9+uuvhSaBxVWzZk2b57lfEIuTSH/88cdq1aqVTpw4ob1792rv3r1q1qyZMjIytGDBglLFJUlz5szRNddcY71mOTw8XF9//bWSkpKsdf766y9FR0erUqVKF93ehx9+qGnTpunNN9+85Mn37r77bu3atUu//vqr5s2bp379+hX6hfXkyZN69NFHFRkZqYCAAIWHhysmJkaSbPYhV+6y/NLS0hQXF6dmzZrps88+s5lU6tixYzp9+rTeffddhYeH2zwGDRokqeAEYfbaGT9+vE6fPq169eqpcePGeuKJJ7R9+/bivSj5HDt2TOfOnbP7vmjQoIFycnL0zz//XDSmotStW1edO3e2eeRNbuyx18bEiRO1Y8cO1ahRQ61atdK4ceOKdRJKkhISEmweqamp1mX16tXTRx99pOPHj2v79u16+eWX5e3trWHDhun777+/6LZzcnI0adIk1a1bV35+fqpSpYrCw8O1fft2m2PnwIEDqlOnToFj8Morr7R5nnuCZcCAAQWOk/fff1/p6el2j8m8qlatqunTp+vIkSPas2ePpk6dah3qP3PmzEtu52KfQX379lW7du00dOhQRUZGql+/fvrss89sEqkDBw6obt26BSYdbNCggXV5XvaOhf/85z8KDg5Wq1atVLduXQ0fPrzYQ5aL81lV3P3NjbVu3boF1rX3nrLnu+++07Fjx9SqVSvrZ/O+ffvUsWNHffLJJ9bXLvfyq9xLoMpSST8P8ztw4IDMZnOBYzsqKkphYWHF+hsX51gCUDa4RhxAkVq1alWm90Auifbt2+u9997T33//rfXr1+u6666TyWRS+/bttX79eus9u0ubiBfWC2kUco1yrtzb4kj2vzDOnTtXw4YNu+S4Pv74Yw0cOFA9e/bUE088oYiICHl5eWnChAnWL48l1a5dO8XHx+utt97SnXfeWazkPb/WrVurTp06GjVqlPbt21fktaN33nmnNm3apCeeeEJNmzZVcHCwcnJy1K1bN7tf/Aqb0dfPz089evTQkiVLtHz5ct18883WZbnbueeeewrt4b/mmmsu2s7111+vv/76S0uWLNF3332n999/X5MmTdKMGTM0dOjQQvfRUZwxm7G9Nu68805dd911WrRokb777ju9+uqreuWVV7Rw4UJ17969yO1VrVrV5vmsWbMK3IbMy8tLjRs3VuPGjdWmTRt17NixWHcWePnll/Xf//5XgwcP1gsvvKBKlSrJbDZr1KhRl5Q05K7z6quvFrhmOVdxbz9mMplUr1491atXT3Fxcapbt67mzp2roUOHXlI7F/sMCggI0Lp167R69Wp9/fXXWr58uebPn69OnTrpu+++K9FIilz2joUGDRpoz549Wrp0qZYvX64vvvhCb7/9tsaOHWtzy7n8SvpZdamfuSWR2+t955132l2+du1adezYsdTtFHYSMjs7u0BZST8PS9pmfvb+xmVxLAEoHhJxAA6VOyvynj17CkzKtGfPHptZk0s6zC83wV6xYoW2bt2qp556SpIlYZo+fbqio6MVFBSk2NjYIrfj6OGFuebOnSsfHx999NFHBb68bNiwQVOnTtXBgwdVs2bNImMobNnnn3+uK664QgsXLrSpk38Iep06dfTtt9/q5MmTF02sr7zySk2cOFEdOnRQt27dtHLlSlWoUOFiu1rAXXfdpRdffFENGjQoNNk4deqUVq5cqeeff15jx461ll/K0G+TyaS5c+fqtttuU58+ffTNN99YZ9cODw9XhQoVlJ2dXerbxlWqVEmDBg3SoEGDdPbsWV1//fUaN25ciRPx8PBwBQYGas+ePQWW/f777zKbzapRo0apYnWkqlWr6uGHH9bDDz+so0ePqnnz5nrppZesiXhhx2j+GeWvvvrqItvJPcl35MgRa1lRx3/Hjh2tPc25Tp8+bZ3ASrJ8Bu3atUuGYdhsa+/evTbr5U4uGBIS4tDbC15xxRWqWLGidZ/Kqh2z2awbb7xRN954o9544w29/PLLeuaZZ7R69Wp17txZtWrV0vbt25WTk2PTK/77779Lkt0Z7O0JCgpS37591bdvX2VkZKhXr1566aWXNGbMmEJvDVncz6riyo3V3meFvfdUfrm3lOzbt6/uuOOOAstHjhxpnWQz9++1Y8eOIv9ehR2nub35p0+ftinP3ztdks/DwtqqVauWcnJy9Oeff1pHOkiWu4ecPn262H/jix1LAMoGQ9MBOFSLFi0UERGhGTNm2Nw+5ZtvvtHu3bsVFxdnLcu9Z3H+LyyFiYmJUbVq1TRp0iRlZmaqXbt2kiwJ+l9//aXPP/9c1157rby9iz7HWNJ2i2vu3Lm67rrrrF/28j5ybz+Tey11UTEEBQXZHZaYm9zn7SXasmWLNm/ebFOvd+/eMgzDbo+VvR6ma665RsuWLdPu3bt1yy232AwnLq6hQ4fqueee0+uvv15oHXvxS5aZsi+Fr6+vFi5cqJYtW+qWW27Rjz/+aG2nd+/e+uKLL7Rjx44C6+Xe5/ti8t9SLTg4WFdeeWWB2wIVh5eXl7p06aIlS5ZYbzskWb4wz5s3T+3bt1dISEiJt+to2dnZBY69iIgIRUdH2+x3Ycdo/qHxuT3k69evV2ZmZoH6ude45h1eHBQUZPd94eXlVeDYWbBggc1tESWpa9eu+vfff/Xll19ay9LS0gpcix4bG6s6derotddes97yLq+LHSdbtmyxO5v9jz/+qBMnTlj3qbTt2HPy5MkCZbknwHL/Tj169FBCQoLmz59vrZOVlaU333xTwcHBuuGGGy7aTv73gK+vrxo2bCjDMOz+PXMV97OquKpWraqmTZtqzpw5NsfdihUrrLdZK8qiRYuUkpKi4cOHF/hszr2V2RdffKH09HQ1b95cMTExmjx5coHjMO/+FPYZXqtWLXl5eVnnM8n19ttv2zwvyedhYW316NHD7jpvvPGGJNn8vy1McY4lAGWDHnEADuXj46NXXnlFgwYN0g033KC77rrLevuy2rVra/To0da6uT3XI0eOVNeuXeXl5aV+/foVuf3rrrtOn376qRo3bmzteWjevLmCgoL0xx9/FDksujTtXkzubXFGjBhhd3m1atXUvHlzzZ07V//5z39Up04dhYWFacaMGapQoYKCgoLUunVrxcTEKDY2VvPnz9djjz2mli1bKjg4WLfccotuvvlmLVy4ULfffrvi4uK0b98+zZgxQw0bNrT5gt+xY0fde++9mjp1qv7880/rMMf169erY8eOdmO89tprtWTJEvXo0UN33HGHFi9eXKxbteWqVauWxo0bV2SdkJAQXX/99Zo4caIyMzNVrVo1fffddxe9J31RAgICtHTpUnXq1Endu3fX2rVr1ahRI/3vf//T6tWr1bp1a91///1q2LChTp48qZ9//lnff/+93S+f+TVs2FAdOnRQbGysKlWqpJ9++sl6W69L8eKLL1rv1/vwww/L29tb77zzjtLT0zVx4sRL2qajnTlzRtWrV9cdd9yhJk2aKDg4WN9//722bt1qc5KlsGO0MK+88oq2bdumXr16WS8L+Pnnn/Xhhx+qUqVKNreTi42N1fTp0/Xiiy/qyiuvVEREhDp16qSbb75Z48eP16BBg9S2bVv99ttvmjt3rs3kd5LlFoVvvfWW7rrrLj366KOqWrWq5s6da+29ze1dNJvNev/999W9e3ddffXVGjRokKpVq6Z///1Xq1evVkhIiL766qtC9+mjjz7S3Llzdfvttys2Nla+vr7avXu3PvjgA/n7+1tviVXaduwZP3681q1bp7i4ONWqVUtHjx7V22+/rerVq6t9+/aSLJP3vfPOOxo4cKC2bdum2rVr6/PPP9fGjRs1efLkYo186dKli6KiotSuXTtFRkZq9+7deuuttxQXF1fk+sX9rCqJCRMmKC4uTu3bt9fgwYN18uRJ6z3OL7bNuXPnqnLlymrbtq3d5bfeeqvee+89ff311+rVq5emT5+uW265RU2bNtWgQYNUtWpV/f7779q5c6e+/fZbSYX/HwkNDVWfPn305ptvymQyqU6dOlq6dGmBeSlK8nmY29Yzzzyjfv36ycfHR7fccouaNGmiAQMG6N1339Xp06d1ww036Mcff9ScOXPUs2fPYg21L86xBKCMOH2edgDlgr1bT9lT2K1a5s+fbzRr1szw8/MzKlWqZPTv3996y7NcWVlZxiOPPGKEh4cbJpOpWLcymzZtmiHJeOihh2zKO3fubEgyVq5caVNu75YxhbVb2G2nDMNyq6/nnnuu0LgeeeQRQ5LNranyGzdunCHJ+PXXXw3DsNyip2HDhoa3t7dNjGfPnjXuvvtuIywszObWPDk5OcbLL79s1KpVy/Dz8zOaNWtmLF261BgwYECB2/dkZWUZr776qlG/fn3D19fX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Nm20bt06ZWZmWstWrFihq666iuvDAQAejUQccKRTpxxbDwBcwMvLS7t379auXbvk5eVlt05wcLD69u2rMWPG6MiRIxo4cGCBOnv37lV8fLwSEhKUmpqq+Ph4xcfHKyMjQ5J09913y9fXV0OGDNHOnTs1f/58TZkyRY899ph1GxkZGTbr/fvvv4qPj9fevXvLZN8BAHAGhqYDjuTj49h6AOAiISEhF60zZMgQzZw5Uz169FB0dHSB5UOHDrWZ0K1Zs2aSpH379ql27doKDQ3Vd999p+HDhys2NlZVqlTR2LFjrbcuk6TDhw9b15Ok1157Ta+99ppuuOEG60zuAACUNyTigCMV44trieqhZE4dkDJSpMiGro4EKHdmz55d5PLFixcXKGvTpo0Mwyh0neIkytdcc43Wr19f6PLatWsX2QYAAOURiTjgSNy+zLWmXGP5+X97peBw18YCAAAAFIJrxAFH8i7k3Fb+3pzC6sExTu1zdQQAAABAoUjEAUcKKOY9e4tbDwAAAIDHIRF3G1z/5hHefNN+ef5b+qSllX0sAAAAANwSiTjgKCW5fy63LytbTOwEAAAAN0YiDriCr6+rIwAAAADgIiTigDPk76GtWNE1cQAAAABwORJxoKyMDi58mZm3XtliaDoAAADcF9kAUFZCeHsBAAAAKIhMAXCFnBxXRwAAAADARUjEAVdISXF1BJ6NWdOBEhs4cKBMJpNMJpN8fX115ZVXavz48crKylJaWpoGDhyoxo0by9vbWz179rS7jTVr1qh58+by8/PTlVdeqdmzZ9ssX7dunW655RZFR0fLZDJp8eLFZb5fAAC4IxJxwBXS010dAQAU0K1bNx05ckR//vmnHn/8cY0bN06vvvqqsrOzFRAQoJEjR6pz58521923b5/i4uLUsWNHxcfHa9SoURo6dKi+/fZba52UlBQ1adJE06ZNc9YuAQDglrxdHQBwWSrJPccBlGuGYchITXVJ26aAAJlK8Hnj5+enqKgoSdJDDz2kRYsW6csvv9SYMWM0ffp0SdLGjRt1+vTpAuvOmDFDMTExev311yVJDRo00IYNGzRp0iR17dpVktS9e3d17969lHsFAED5RyIOuELlyq6OAICTGKmp2tM81iVtX/XzNpkCAy95/YCAAJ04caJYdTdv3lygt7xr164aNWrUJbcPAICnYmg64ApM1lbG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p556SsnJyapfv768vLyUnZ2tl156Sf3795dkGbomye7wtdxlCQkJioiIsA3U21uVKlWy1slvwoQJev755x29OwDKKyY/BEosKChIV1555SWt26ZNGy1btsymbMWKFWrTpo31uWEYeuSRR7Ro0SKtWbNGMTExpYoXAFAOlfAkscPXdxMO7xH/7LPPNHfuXM2bN08///yz5syZo9dee816b9KyMmbMGCUlJVkf//zzT5m2B8COHj2kQ4dcHQWAMrBr1y7Fx8fr5MmTSkpKUnx8vOLj463LH3zwQf3999968skn9fvvv+vtt9/WZ599ptGjR1vrDB8+XB9//LHmzZunChUqKCEhQQkJCXavIQcAwC6uEbfviSee0FNPPaV+/fpJkho3bqwDBw5owoQJGjBggPW2KImJiapatap1vcTERDVt2lSSZXjb0aNHbbablZWlkydPWtfPz8/PT35+fo7eHQAlceqUqyO4wEPOlgLuokePHjpw4ID1ebNmzSRZerklKSYmRl9//bVGjx6tKVOmqHr16nr//fetty6TZL0FWocOHWy2PWvWLA0cOLBsdwAA4BnMDu9LdgmHJ+Lnzp2TOd+L4+XlpZwcyz1UY2JiFBUVpZUrV1oT7+TkZG3ZskUPPfSQJMvwttOnT2vbtm2KjY2VJK1atUo5OTlq3bq1o0N2D8xADU9w7pxKPROmw7hLHED5MHv27CKX79+//6Lb6NChg3755ZdClxv8rwMAMGu6pDJIxG+55Ra99NJLqlmzpq6++mr98ssveuONNzR48GBJlklrRo0apRdffFF169ZVTEyM/vvf/yo6Olo9e/aUJDVo0EDdunXT/fffrxkzZigzM1MjRoxQv379mDEdcGfHjrk6AgAAAHiy9HRXR+AQDk/E33zzTf33v//Vww8/rKNHjyo6OloPPPCAxo4da63z5JNPKiUlRcOGDdPp06fVvn17LV++XP7+/tY6c+fO1YgRI3TjjTfKbDard+/emjp1qqPDBeBIWVnuMyTcXeIAAACA45wfaV3eOTwRr1ChgiZPnqzJkycXWsdkMmn8+PEaP358oXUqVaqkefPmOTo8AGWpcmVXR5AHiTgAAIDbobNEUhnMmg7gMla7tqsjAAAAgFvj9mUSiTgAR0pKktv0RHvIhzQAAADy8JDJ2kjEATiOW82ITCIOAADgcTzkltUk4gAc58gReqIBAABQdjxk1nQScQCOk5zs6ggu4IQAAACA+yntd7TsbMfE4WIk4gAcJydH7jMk3F3iAAAAgEN40Nc7EnEAjlO9uqsjAAAAgCdjsjYAyMfLiyHhQDm3efNmeXl5KS4uzqZ8//79MplMio+P17hx42QymYp8SNKECRPUsmVLVahQQREREerZs6f27Nljs920tDQNHz5clStXVnBwsHr37q3ExESbOiNHjlRsbKz8/PzUtGnTMt1/AICb85DvmiTibsOdZpsGLpE7naH0kA9pwNlmzpypRx55ROvWrdPhw4ft1vm///s/HTlyxPqoXr26xo8fb1MmSWvXrtXw4cP1ww8/aMWKFcrMzFSXLl2UkpJi3dbo0aP11VdfacGCBVq7dq0OHz6sXr16FWhz8ODB6tu3b9nsNACg/HCn75ul4O3qAAB4kMqVXR1BHiTicA+GYSjLRTO8evv5WXuni+Ps2bOaP3++fvrpJyUkJGj27Nl6+umnC9QLDg5WcHCw9bmXl5cqVKigqKgom3rLly+3eT579mxFRERo27Ztuv7665WUlKSZM2dq3rx56tSpkyRp1qxZatCggX744Qdde+21kqSpU6dKko4dO6bt27cXe38AAB4oLc3VETgEiTgAxzl6VCTAgK2s9HRNHXCHS9oeOedz+fj7F7v+Z599pvr16+uqq67SPffco1GjRmnMmDElSuaLkpSUJEmqVKmSJGnbtm3KzMxU586drXXq16+vmjVravPmzdZEHAAAT8PQdACOc344qltgaDpQYjNnztQ999wjSerWrZuSkpK0du1ah2w7JydHo0aNUrt27dSoUSNJUkJCgnx9fRUWFmZTNzIyUgkJCQ5pFwDgQTzo6x094gAcx9/fjRJgd4kDlztvPz+NnPO5y9ourj179ujHH3/UokWLLOt6e6tv376aOXOmOnToUOpYhg8frh07dmjDhg2l3hYA4DLm6+vqCByCRByA4wQEuDoCwO2YTKYSDQ93lZkzZyorK0vR0dHWMsMw5Ofnp7feeqtU2x4xYoSWLl2qdevWqXqe2xxGRUUpIyNDp0+ftukVT0xMLHC9OQAAktyo06d0GJoOwHEMN5r930M+pAFnyMrK0ocffqjXX39d8fHx1sevv/6q6OhoffLJJ5e0XcMwNGLECC1atEirVq1STEyMzfLY2Fj5+Pho5cqV1rI9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\n" + }, + "metadata": {} + } + ], + "source": [ + "attack_data = data[data['Normal/Attack'] == 'Attack']\n", + "\n", + "# List of all sensors and actuators in the first stage\n", + "first_stage_features = ['FIT101', 'LIT101', 'MV101', 'P101', 'P102', 'AIT201']\n", + "\n", + "plt.figure(figsize=(12, 6))\n", + "for feature in first_stage_features:\n", + " plt.plot(data.index, data[feature], label=feature)\n", + " plt.scatter(attack_data.index, attack_data[feature], color='red', marker='x', label=None)\n", + "plt.legend()\n", + "plt.xlabel('Timestamp')\n", + "plt.title('Plot with Attack Markers for First-Stage Sensors and Actuators')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OMZnHB7_mJb3" + }, + "source": [ + "#**4. Data Preprocessing**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fpEO-P6iHQwx" + }, + "source": [ + "##Data Cleaning" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "TSBULQS5bqRZ" + }, + "outputs": [], + "source": [ + "# Remove duplicate rows\n", + "data.drop_duplicates(inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "hEZPWhYybmZL", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d25e1636-bb19-4530-e31f-02f381fad0cf" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(928898, 52)" + ] + }, + "metadata": {}, + "execution_count": 14 + } + ], + "source": [ + "# Drop missing values\n", + "data.dropna(inplace=True)\n", + "\n", + "data.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "_S1wJC5jSBLR", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "7764ed3d-1d21-49af-9482-9157c57257c5" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "FIT101 3953\n", + "LIT101 12162\n", + "MV101 3\n", + "P101 2\n", + "P102 2\n", + "AIT201 2338\n", + "AIT202 1763\n", + "AIT203 6868\n", + "FIT201 4989\n", + "MV201 3\n", + "P201 2\n", + "P202 1\n", + "P203 2\n", + "P204 2\n", + "P205 2\n", + "P206 2\n", + "DPIT301 5180\n", + "FIT301 8281\n", + "LIT301 11966\n", + "MV301 3\n", + "MV302 3\n", + "MV303 3\n", + "MV304 3\n", + "P301 2\n", + "P302 2\n", + "AIT401 37\n", + "AIT402 4127\n", + "FIT401 968\n", + "LIT401 15141\n", + "P401 1\n", + "P402 2\n", + "P403 2\n", + "P404 1\n", + "UV401 2\n", + "AIT501 1724\n", + "AIT502 3470\n", + "AIT503 1123\n", + "AIT504 565\n", + "FIT501 1027\n", + "FIT502 1560\n", + "FIT503 499\n", + "FIT504 289\n", + "P501 2\n", + "P502 1\n", + "PIT501 1419\n", + "PIT502 115\n", + "PIT503 1334\n", + "FIT601 6043\n", + "P601 1\n", + "P602 2\n", + "P603 1\n", + "Normal/Attack 2\n", + "dtype: int64" + ] + }, + "metadata": {}, + "execution_count": 15 + } + ], + "source": [ + "data.nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "E50vWibvR_vL" + }, + "outputs": [], + "source": [ + "data = data.loc[:, data.nunique() > 1]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "Vl2lUXtfsKfF", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "8270fbd6-4564-4aed-e500-112342ceba6d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "DatetimeIndex: 928898 entries, 2015-12-22 16:00:00 to 2016-02-01 14:59:59\n", + "Data columns (total 46 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 FIT101 928898 non-null float64\n", + " 1 LIT101 928898 non-null float64\n", + " 2 MV101 928898 non-null int64 \n", + " 3 P101 928898 non-null int64 \n", + " 4 P102 928898 non-null int64 \n", + " 5 AIT201 928898 non-null float64\n", + " 6 AIT202 928898 non-null float64\n", + " 7 AIT203 928898 non-null float64\n", + " 8 FIT201 928898 non-null float64\n", + " 9 MV201 928898 non-null int64 \n", + " 10 P201 928898 non-null int64 \n", + " 11 P203 928898 non-null int64 \n", + " 12 P204 928898 non-null int64 \n", + " 13 P205 928898 non-null int64 \n", + " 14 P206 928898 non-null int64 \n", + " 15 DPIT301 928898 non-null float64\n", + " 16 FIT301 928898 non-null float64\n", + " 17 LIT301 928898 non-null float64\n", + " 18 MV301 928898 non-null int64 \n", + " 19 MV302 928898 non-null int64 \n", + " 20 MV303 928898 non-null int64 \n", + " 21 MV304 928898 non-null int64 \n", + " 22 P301 928898 non-null int64 \n", + " 23 P302 928898 non-null int64 \n", + " 24 AIT401 928898 non-null float64\n", + " 25 AIT402 928898 non-null float64\n", + " 26 FIT401 928898 non-null float64\n", + " 27 LIT401 928898 non-null float64\n", + " 28 P402 928898 non-null int64 \n", + " 29 P403 928898 non-null int64 \n", + " 30 UV401 928898 non-null int64 \n", + " 31 AIT501 928898 non-null float64\n", + " 32 AIT502 928898 non-null float64\n", + " 33 AIT503 928898 non-null float64\n", + " 34 AIT504 928898 non-null float64\n", + " 35 FIT501 928898 non-null float64\n", + " 36 FIT502 928898 non-null float64\n", + " 37 FIT503 928898 non-null float64\n", + " 38 FIT504 928898 non-null float64\n", + " 39 P501 928898 non-null int64 \n", + " 40 PIT501 928898 non-null float64\n", + " 41 PIT502 928898 non-null float64\n", + " 42 PIT503 928898 non-null float64\n", + " 43 FIT601 928898 non-null float64\n", + " 44 P602 928898 non-null int64 \n", + " 45 Normal/Attack 928898 non-null object \n", + "dtypes: float64(25), int64(20), object(1)\n", + "memory usage: 333.1+ MB\n" + ] + } + ], + "source": [ + " data.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "yagabGLwZTnk" + }, + "outputs": [], + "source": [ + "# Convert \"Normal/Attack\" column to binary\n", + "data['Normal/Attack'] = data['Normal/Attack'].apply(lambda x: 1 if x == 'Attack' else 0)\n" + ] + }, + { + "cell_type": "code", + "source": [ + "X = data.drop('Normal/Attack', axis=1)\n", + "y= data['Normal/Attack']\n", + "y = y.reset_index(drop=True)" + ], + "metadata": { + "id": "fO8GY2-OWarg" + }, + "execution_count": 19, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "DrnzIg3F0XX0" + }, + "outputs": [], + "source": [ + "# Numerical and categorical features\n", + "numerical_features = []\n", + "categorical_features = []\n", + "\n", + "for column in X.columns:\n", + " unique_values = X[column].nunique()\n", + " if unique_values > 10:\n", + " numerical_features.append(column)\n", + " else:\n", + " categorical_features.append(column)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "A2cxfgyk-jZ7", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c67a129b-0331-40aa-fb80-39fa61c80011" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['FIT101',\n", + " 'LIT101',\n", + " 'AIT201',\n", + " 'AIT202',\n", + " 'AIT203',\n", + " 'FIT201',\n", + " 'DPIT301',\n", + " 'FIT301',\n", + " 'LIT301',\n", + " 'AIT401',\n", + " 'AIT402',\n", + " 'FIT401',\n", + " 'LIT401',\n", + " 'AIT501',\n", + " 'AIT502',\n", + " 'AIT503',\n", + " 'AIT504',\n", + " 'FIT501',\n", + " 'FIT502',\n", + " 'FIT503',\n", + " 'FIT504',\n", + " 'PIT501',\n", + " 'PIT502',\n", + " 'PIT503',\n", + " 'FIT601']" + ] + }, + "metadata": {}, + "execution_count": 21 + } + ], + "source": [ + "numerical_features" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "id": "CGwpzfln-n69", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "26e7dfa7-6dc1-4cfa-af66-301d17033e19" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['MV101',\n", + " 'P101',\n", + " 'P102',\n", + " 'MV201',\n", + " 'P201',\n", + " 'P203',\n", + " 'P204',\n", + " 'P205',\n", + " 'P206',\n", + " 'MV301',\n", + " 'MV302',\n", + " 'MV303',\n", + " 'MV304',\n", + " 'P301',\n", + " 'P302',\n", + " 'P402',\n", + " 'P403',\n", + " 'UV401',\n", + " 'P501',\n", + " 'P602']" + ] + }, + "metadata": {}, + "execution_count": 22 + } + ], + "source": [ + "categorical_features" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "id": "UyDvz0tc3vYf" + }, + "outputs": [], + "source": [ + "numerical_data = data[numerical_features]\n", + "categorical_data = data[categorical_features]\n", + "\n", + "# Min-Max scaling for numerical features\n", + "scaler = MinMaxScaler()\n", + "numerical_data_scaled = scaler.fit_transform(numerical_data)\n", + "numerical_data_scaled_df = pd.DataFrame(numerical_data_scaled, columns=numerical_data.columns)\n", + "\n", + "# One-hot encoding for categorical features\n", + "encoder = OneHotEncoder(drop='first', sparse_output=False)\n", + "encoder.fit(categorical_data)\n", + "\n", + "categorical_feature_names = encoder.get_feature_names_out(categorical_data.columns)\n", + "categorical_data_encoded = encoder.transform(categorical_data)\n", + "categorical_data_encoded_df = pd.DataFrame(categorical_data_encoded, columns=categorical_feature_names)\n", + "preprocessed_data = pd.concat([numerical_data_scaled_df, categorical_data_encoded_df], axis=1)" + ] + }, + { + "cell_type": "code", + "source": [ + "preprocessed_data.info()" + ], + "metadata": { + "id": "qOzUMsNyRUTx", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "368da410-d8c1-4e44-9180-a497cf2f6f2e" + }, + "execution_count": 24, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "RangeIndex: 928898 entries, 0 to 928897\n", + "Data columns (total 51 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 FIT101 928898 non-null float64\n", + " 1 LIT101 928898 non-null float64\n", + " 2 AIT201 928898 non-null float64\n", + " 3 AIT202 928898 non-null float64\n", + " 4 AIT203 928898 non-null float64\n", + " 5 FIT201 928898 non-null float64\n", + " 6 DPIT301 928898 non-null float64\n", + " 7 FIT301 928898 non-null float64\n", + " 8 LIT301 928898 non-null float64\n", + " 9 AIT401 928898 non-null float64\n", + " 10 AIT402 928898 non-null float64\n", + " 11 FIT401 928898 non-null float64\n", + " 12 LIT401 928898 non-null float64\n", + " 13 AIT501 928898 non-null float64\n", + " 14 AIT502 928898 non-null float64\n", + " 15 AIT503 928898 non-null float64\n", + " 16 AIT504 928898 non-null float64\n", + " 17 FIT501 928898 non-null float64\n", + " 18 FIT502 928898 non-null float64\n", + " 19 FIT503 928898 non-null float64\n", + " 20 FIT504 928898 non-null float64\n", + " 21 PIT501 928898 non-null float64\n", + " 22 PIT502 928898 non-null float64\n", + " 23 PIT503 928898 non-null float64\n", + " 24 FIT601 928898 non-null float64\n", + " 25 MV101_1 928898 non-null float64\n", + " 26 MV101_2 928898 non-null float64\n", + " 27 P101_2 928898 non-null float64\n", + " 28 P102_2 928898 non-null float64\n", + " 29 MV201_1 928898 non-null float64\n", + " 30 MV201_2 928898 non-null float64\n", + " 31 P201_2 928898 non-null float64\n", + " 32 P203_2 928898 non-null float64\n", + " 33 P204_2 928898 non-null float64\n", + " 34 P205_2 928898 non-null float64\n", + " 35 P206_2 928898 non-null float64\n", + " 36 MV301_1 928898 non-null float64\n", + " 37 MV301_2 928898 non-null float64\n", + " 38 MV302_1 928898 non-null float64\n", + " 39 MV302_2 928898 non-null float64\n", + " 40 MV303_1 928898 non-null float64\n", + " 41 MV303_2 928898 non-null float64\n", + " 42 MV304_1 928898 non-null float64\n", + " 43 MV304_2 928898 non-null float64\n", + " 44 P301_2 928898 non-null float64\n", + " 45 P302_2 928898 non-null float64\n", + " 46 P402_2 928898 non-null float64\n", + " 47 P403_2 928898 non-null float64\n", + " 48 UV401_2 928898 non-null float64\n", + " 49 P501_2 928898 non-null float64\n", + " 50 P602_2 928898 non-null float64\n", + "dtypes: float64(51)\n", + "memory usage: 361.4 MB\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "preprocessed_data.head(3)" + ], + "metadata": { + "id": "YJViPEflbnM3", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 193 + }, + "outputId": "97cbb2a0-7de3-46c8-91a5-b67215d1f87a" + }, + "execution_count": 25, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " FIT101 LIT101 AIT201 AIT202 AIT203 FIT201 DPIT301 \\\n", + "0 0.894987 0.160292 0.730144 0.732892 0.073596 0.874201 0.462186 \n", + "1 0.890230 0.159845 0.730144 0.732892 0.073596 0.873249 0.462186 \n", + "2 0.883848 0.159533 0.730144 0.732892 0.073596 0.872796 0.463182 \n", + "\n", + " FIT301 LIT301 AIT401 ... MV303_2 MV304_1 MV304_2 P301_2 P302_2 \\\n", + "0 0.940694 0.182199 0.0 ... 0.0 1.0 0.0 1.0 0.0 \n", + "1 0.940371 0.182199 0.0 ... 0.0 1.0 0.0 1.0 0.0 \n", + "2 0.939886 0.182199 0.0 ... 0.0 1.0 0.0 1.0 0.0 \n", + "\n", + " P402_2 P403_2 UV401_2 P501_2 P602_2 \n", + "0 0.0 0.0 0.0 0.0 0.0 \n", + "1 0.0 0.0 0.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + "[3 rows x 51 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FIT101LIT101AIT201AIT202AIT203FIT201DPIT301FIT301LIT301AIT401...MV303_2MV304_1MV304_2P301_2P302_2P402_2P403_2UV401_2P501_2P602_2
00.8949870.1602920.7301440.7328920.0735960.8742010.4621860.9406940.1821990.0...0.01.00.01.00.00.00.00.00.00.0
10.8902300.1598450.7301440.7328920.0735960.8732490.4621860.9403710.1821990.0...0.01.00.01.00.00.00.00.00.00.0
20.8838480.1595330.7301440.7328920.0735960.8727960.4631820.9398860.1821990.0...0.01.00.01.00.00.00.00.00.00.0
\n", + "

3 rows × 51 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 25 + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Save preprocessed data to drive\n", + "preprocessed_data.to_csv('/content/drive/My Drive/swat/preprocessed_data.csv', index=False)" + ], + "metadata": { + "id": "AiUd3YkKJYUx" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "**Loading preprocessed data for DTW**" + ], + "metadata": { + "id": "YD851RJjUE7u" + } + }, + { + "cell_type": "code", + "source": [ + "SWaT_preprocessed = pd.read_csv('/content/drive/My Drive/swat/preprocessed_data.csv')" + ], + "metadata": { + "id": "nOrAGUB8UEgp" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "sensors=['FIT101','LIT101']" + ], + "metadata": { + "id": "s4Zz3wdCXVcH" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "NvEFFfd2DcYh" + }, + "outputs": [], + "source": [ + "X=SWaT_preprocessed" + ] + }, + { + "cell_type": "markdown", + "source": [ + "#**Applying Data Time WArping (DTW)**" + ], + "metadata": { + "id": "eM43x9M_e_uQ" + } + }, + { + "cell_type": "code", + "source": [ + "from scipy.spatial.distance import euclidean\n", + "from joblib import Parallel, delayed\n", + "from fastdtw import fastdtw" + ], + "metadata": { + "id": "ew_Bo7bL8jz5" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "sampled_data = X.sample(n=5000, random_state=42)\n", + "sampled_data = sampled_data.astype(np.float64)" + ], + "metadata": { + "id": "k2CtuDz0Sjqs" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "sampled_data_dtw=sampled_data[sensors]" + ], + "metadata": { + "id": "A9N2CnJZBnkJ" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "sampled_data_dtw.info()" + ], + "metadata": { + "id": "XyOHwIeVShLF", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "eefbdd80-aff6-4f75-f15f-4500568a07ce" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Int64Index: 5000 entries, 693046 to 870610\n", + "Data columns (total 2 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 FIT101 5000 non-null float64\n", + " 1 LIT101 5000 non-null float64\n", + "dtypes: float64(2)\n", + "memory usage: 117.2 KB\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "columns_for_dtw = sampled_data.columns" + ], + "metadata": { + "id": "u76mPWE3Seny" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def calculate_dtw_distance(seq1, seq2):\n", + " distance, _ = fastdtw(seq1, seq2)\n", + " return distance" + ], + "metadata": { + "id": "ixgC51KCSa81" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def calculate_dtw_parallel(row, df, columns_for_dtw):\n", + " current_seq = row[columns_for_dtw].values.flatten()\n", + " distances = []\n", + "\n", + " for idx, r in df.iterrows():\n", + " if row.name != idx:\n", + " compared_seq = r[columns_for_dtw].values.flatten()\n", + " distance = calculate_dtw_distance(current_seq, compared_seq)\n", + " distances.append(distance)\n", + "\n", + " min_distance = min(distances) if distances else None\n", + " return min_distance" + ], + "metadata": { + "id": "IxpnLm0RSYQ-" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "num_cores = -1\n", + "dtw_distances = Parallel(n_jobs=num_cores)(\n", + " delayed(calculate_dtw_parallel)(row, sampled_data, columns_for_dtw) for _, row in sampled_data.iterrows()\n", + ")" + ], + "metadata": { + "id": "fEbbDr-kSVkV" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "dtw_distances" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CrBEtnfavb0b", + "outputId": "f2225696-85d9-4369-90f5-37f61ed88264" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[0.07605044579640977,\n", + " 0.0495477329171756,\n", + " 0.37347412621044773,\n", + " 0.008202577396307854,\n", + " 0.17133095145771507,\n", + " 0.03603869489792816,\n", + " 0.05144447575660238,\n", + " 0.1330630470737353,\n", + " 1.46712391579157,\n", + " 0.07944405191033709,\n", + " 0.07969480326481905,\n", + " 0.04379260319018782,\n", + " 0.09780761933239872,\n", + " 0.023940932479920574,\n", + " 0.14980362178859066,\n", + " 0.05315864787791641,\n", + " 0.08556108784293237,\n", + " 0.06158766428291798,\n", + " 0.05931444876584384,\n", + " 0.06045459173901696,\n", + " 0.070385593403607,\n", + " 0.05603955738511841,\n", + " 0.13206158318372524,\n", + " 0.06815585208096682,\n", + " 0.0647855349301397,\n", + " 0.055711424794132214,\n", + " 0.05371611055964433,\n", + " 0.05710452389992782,\n", + " 0.07012202955572412,\n", + " 0.09666219294831709,\n", + " 0.12114441213388129,\n", + " 0.06388290783140196,\n", + " 0.03603869489792816,\n", + " 0.05277800495791299,\n", + " 0.08859550138752052,\n", + " 0.07762288690802521,\n", + " 0.3268923494362833,\n", + " 0.1259215579371138,\n", + " 0.15890952499872105,\n", + " 0.028012091359205182,\n", + " 0.08667537157965176,\n", + " 0.08993224373638381,\n", + " 0.10353057393883361,\n", + " 0.10868461079802116,\n", + " 0.05810917813797489,\n", + " 0.1526361743924426,\n", + " 0.0037376974693862546,\n", + " 0.051047579783541686,\n", + " 0.01196410043032244,\n", + " 0.05873845233556235,\n", + " 0.059340408012139106,\n", + " 0.10171634835373101,\n", + " 0.038064686026512196,\n", + " 0.11664264625481609,\n", + " 0.06722022080046125,\n", + " 0.0395776390084299,\n", + " 0.009297787959222759,\n", + " 0.15993249853409336,\n", + " 0.057946814769161886,\n", + " 0.08725261620495478,\n", + " 0.34645434281780196,\n", + " 0.05311063227105442,\n", + " 0.10419838066820532,\n", + " 0.04711989935106324,\n", + " 0.08606005306104628,\n", + " 0.03172724346633617,\n", + " 0.13108067922428507,\n", + " 0.11407335708555998,\n", + " 0.10389577845270903,\n", + " 0.08228700163281,\n", + " 0.16503155086071625,\n", + " 0.6248678842859278,\n", + " 0.31978382728087323,\n", + " 0.07560626326618183,\n", + " 0.14960605734293714,\n", + " 0.09649152936718644,\n", + " 0.10113838011431729,\n", + " 0.09122840443452424,\n", + " 0.1764316391981784,\n", + " 0.13070980941996774,\n", + " 0.024057307529677698,\n", + " 0.027449282237189593,\n", + " 0.09140808284565695,\n", + " 0.034680525019114214,\n", + " 0.07537250101770002,\n", + " 0.10751070686477511,\n", + " 0.11816115364884877,\n", + " 0.07138376465173966,\n", + " 0.05922125635466145,\n", + " 0.025488487180147873,\n", + " 0.06635405085667932,\n", + " 0.12192564330926133,\n", + " 0.07959193512650245,\n", + " 0.04078045886695912,\n", + " 0.03748632087370496,\n", + " 0.12595157241013505,\n", + " 0.11394843941367248,\n", + " 0.054939790782290054,\n", + " 0.0505282648093896,\n", + " 0.06531016028660343,\n", + " 0.09246147785906166,\n", + " 0.14329965097863512,\n", + " 0.07315223196406902,\n", + " 0.08057753773278538,\n", + " 0.1111689190733052,\n", + " 0.04091117379488603,\n", + " 0.004685330495047254,\n", + " 0.415817855398629,\n", + " 0.08123163351483222,\n", + " 0.10149313204770097,\n", + " 0.13675290627635744,\n", + " 0.07605044579640977,\n", + " 0.04820449764579443,\n", + " 0.08929657896637258,\n", + " 0.048078146112649725,\n", + " 0.03171847104173489,\n", + " 0.10098406727356794,\n", + " 0.07292952221703186,\n", + " 0.08541798570415735,\n", + " 0.06422720246619734,\n", + " 0.09063496784463614,\n", + " 0.06840464539407858,\n", + " 0.06474175672323362,\n", + " 0.07252035091468141,\n", + " 0.5161471752374744,\n", + " 0.10921506641364445,\n", + " 0.02578123398310056,\n", + " 0.06440890573031327,\n", + " 0.336001872846432,\n", + " 0.07080950253222422,\n", + " 0.14667428704398253,\n", + " 0.08722404595536039,\n", + " 0.12870460786073903,\n", + " 0.05495306146475719,\n", + " 0.0824558895359414,\n", + " 0.015676119521766507,\n", + " 0.12939788781856051,\n", + " 0.14340716365599548,\n", + " 0.09626742422192264,\n", + " 0.02281218901892714,\n", + " 0.10806596013897664,\n", + " 0.19768813178217354,\n", + " 0.014698578324426864,\n", + " 0.09301131218635715,\n", + " 0.20103384247048495,\n", + " 0.575450772508808,\n", + " 0.028520265165801667,\n", + " 0.07038877382236514,\n", + " 0.04732527379457536,\n", + " 0.07180883296242316,\n", + " 0.09483856572796721,\n", + " 0.11837472623897131,\n", + " 0.10296663821090929,\n", + " 0.011848750116424634,\n", + " 0.06187762072097211,\n", + " 0.07052404380973681,\n", + " 0.09639264410194605,\n", + " 0.09408349582993816,\n", + " 0.032962391974114706,\n", + " 0.07607165586462283,\n", + " 0.08961003495865012,\n", + " 0.04887406364765351,\n", + " 0.0281234639942721,\n", + " 0.04808210021833678,\n", + " 0.05539392215136517,\n", + " 0.1448249372626258,\n", + " 0.07992354154294162,\n", + " 0.1743954624990249,\n", + " 0.06841106459407463,\n", + " 0.09826062917103764,\n", + " 0.0037376974693862546,\n", + " 0.07812469628199104,\n", + " 0.04593162736557996,\n", + " 0.0686822705382446,\n", + " 0.06832584906851921,\n", + " 0.06508831515433708,\n", + " 0.0099436134497917,\n", + " 0.05150408727888715,\n", + " 0.08620738330626794,\n", + " 0.06708920277160217,\n", + " 1.3522523564313986,\n", + " 0.08971156249423017,\n", + " 0.07109306171968419,\n", + " 0.24106762271634286,\n", + " 0.10861682953116064,\n", + " 0.05335056902203361,\n", + " 0.0963643545037473,\n", + " 0.12351609886651846,\n", + " 0.01207136368044337,\n", + " 0.04091117379488603,\n", + " 0.08254894669449704,\n", + " 0.14526815597876583,\n", + " 0.12137905763536316,\n", + " 0.06649102358226372,\n", + " 0.00666774120599066,\n", + " 0.08162381336305825,\n", + " 0.054041560437469424,\n", + " 0.14993773036567778,\n", + " 0.11954429457794893,\n", + " 0.07349662369992932,\n", + " 0.0692481563748457,\n", + " 0.2242444926291005,\n", + " 0.08779930992361541,\n", + " 0.08002698317070801,\n", + " 0.1184171145849782,\n", + " 0.17950945618006453,\n", + " 0.08017805211870555,\n", + " 0.2644967815854756,\n", + " 0.10032720770353819,\n", + " 0.09670255416436783,\n", + " 0.0779682725238615,\n", + " 0.06913849328425638,\n", + " 0.1701504156871701,\n", + " 0.2631963521407931,\n", + " 0.06870422020053311,\n", + " 0.20294048848541932,\n", + " 0.10637800901622667,\n", + " 0.22757462898063496,\n", + " 0.012392072212122369,\n", + " 0.32488719307193803,\n", + " 0.0592027732942976,\n", + " 0.11521955346262495,\n", + " 0.05720857120832393,\n", + " 0.050499463757154445,\n", + " 0.08151476476909393,\n", + " 0.2268774969540564,\n", + " 0.09702263865358969,\n", + " 0.21731602713570627,\n", + " 0.11161849101489027,\n", + " 0.08823915874954755,\n", + " 0.07254563577164891,\n", + " 0.06712318410955345,\n", + " 0.0451372228192901,\n", + " 0.08059179653769961,\n", + " 0.06420505920579257,\n", + " 0.14412184066871814,\n", + " 0.3029188154368082,\n", + " 0.06316490521183907,\n", + " 1.4905728191096927,\n", + " 0.1421617623143347,\n", + " 0.0693065324701119,\n", + " 0.011742476590309886,\n", + " 0.15430752179841206,\n", + " 0.08780528304497269,\n", + " 0.04222328749498924,\n", + " 0.08801635964310672,\n", + " 0.07252035091468141,\n", + " 0.06794299929878696,\n", + " 0.058422033056785685,\n", + " 0.38277157937915485,\n", + " 0.07979754670955404,\n", + " 0.12287360952181281,\n", + " 0.032167792625240055,\n", + " 0.03793180936839334,\n", + " 0.08391478308679959,\n", + " 0.14460614119540477,\n", + " 0.10578240060146445,\n", + " 0.08591442600439075,\n", + " 0.06511339568416803,\n", + " 0.4241187245662166,\n", + " 0.1773377091520932,\n", + " 0.055451654313150134,\n", + " 0.07389113150027643,\n", + " 0.2321245454623897,\n", + " 0.009958696969635139,\n", + " 0.11751121531890787,\n", + " 0.0929201747577583,\n", + " 0.09469125466157963,\n", + " 0.039223916004288956,\n", + " 0.07990406062200722,\n", + " 0.1380584511033091,\n", + " 0.057607405515968116,\n", + " 0.0863000264020439,\n", + " 0.21312861500328348,\n", + " 0.07915558250823224,\n", + " 0.07464378929509947,\n", + " 0.22068113746748746,\n", + " 0.12680613592836568,\n", + " 0.10578718484317061,\n", + " 0.12954395717107192,\n", + " 0.05144447575660238,\n", + " 0.14020467128222536,\n", + " 0.3375980616160323,\n", + " 0.0787204645744524,\n", + " 0.09282948361359551,\n", + " 0.06388290783140196,\n", + " 0.09450754113308595,\n", + " 0.05633192463528543,\n", + " 0.07096107119333966,\n", + " 0.34387472565841165,\n", + " 0.026333224351928322,\n", + " 0.19693764571389005,\n", + " 0.05592097941819714,\n", + " 0.12081370434196678,\n", + " 0.004821692020818049,\n", + " 0.08579003306649013,\n", + " 0.08266756597209707,\n", + " 0.07497778961623089,\n", + " 0.1224687853279082,\n", + " 0.15787935765658032,\n", + " 0.23884000486925777,\n", + " 0.059451463463700435,\n", + " 0.21198050924855774,\n", + " 0.057571500536892875,\n", + " 0.16707427503021888,\n", + " 0.059959946652505466,\n", + " 0.035245377697386726,\n", + " 0.08581461973563251,\n", + " 0.02384613644954503,\n", + " 0.17176412483980955,\n", + " 0.6264456219716233,\n", + " 0.023916626138878398,\n", + " 0.02861654836635588,\n", + " 0.10081887415655551,\n", + " 0.039279438305772574,\n", + " 0.07154973010647725,\n", + " 0.3216204326663946,\n", + " 0.08625098998900509,\n", + " 0.10228025580576418,\n", + " 0.14273541079546334,\n", + " 0.08004748582154944,\n", + " 0.025590798636636325,\n", + " 0.06246321993245729,\n", + " 0.08620149043636606,\n", + " 0.042938961041563306,\n", + " 0.1925394080204862,\n", + " 0.07858871245556907,\n", + " 0.07104862142545401,\n", + " 0.010125883161266381,\n", + " 0.05061258520697559,\n", + " 0.04221110010885802,\n", + " 0.15882374282360406,\n", + " 0.3645517394114684,\n", + " 0.16907705050867203,\n", + " 0.11624191620538099,\n", + " 0.07405657645263261,\n", + " 0.07026505966850846,\n", + " 0.10863770426109413,\n", + " 0.016085949953655775,\n", + " 0.10870438548636156,\n", + " 0.054189581477622484,\n", + " 0.12468883234849863,\n", + " 0.32547031720508457,\n", + " 0.021778937702402794,\n", + " 0.004821692020818049,\n", + " 0.07000505965928375,\n", + " 0.07577268187611394,\n", + " 0.1784628813466563,\n", + " 0.10118019785478627,\n", + " 0.062103659184118185,\n", + " 0.10197013899116376,\n", + " 0.0768924203584332,\n", + " 0.07396962116090858,\n", + " 0.030684071986003786,\n", + " 0.06366480797145219,\n", + " 0.09267744449248316,\n", + " 0.1412184199718709,\n", + " 0.07286043533489486,\n", + " 0.09971913003507533,\n", + " 0.0814487637055527,\n", + " 0.06367199174584227,\n", + " 0.10954155208606844,\n", + " 0.06556898562583086,\n", + " 0.07370590150103047,\n", + " 0.07890163662094127,\n", + " 0.06883442596398834,\n", + " 0.08288675160145516,\n", + " 0.22131272455459405,\n", + " 0.0685927396345189,\n", + " 0.15216569350956724,\n", + " 0.03382847863611339,\n", + " 0.07099301619946333,\n", + " 0.10880159020429259,\n", + " 0.0628275033196031,\n", + " 0.10027803761050783,\n", + " 0.053616254439601406,\n", + " 0.29164037617752614,\n", + " 0.0003349485953715037,\n", + " 0.05896256918837986,\n", + " 0.20980821146780732,\n", + " 0.08414972027210783,\n", + " 0.08629590720504306,\n", + " 0.08092718162443428,\n", + " 0.12479979405268432,\n", + " 0.18511495756056243,\n", + " 0.09274967426970378,\n", + " 0.001315547047493315,\n", + " 0.11549171616846597,\n", + " 0.09465456954650243,\n", + " 0.057704250949748154,\n", + " 0.030313485601459085,\n", + " 0.10802202005527962,\n", + " 0.09702040560597194,\n", + " 0.013539764011727906,\n", + " 0.06843691619788767,\n", + " 0.7929824874817275,\n", + " 0.07150629122940222,\n", + " 0.05285393900690999,\n", + " 0.1250800729184961,\n", + " 0.16337025191767846,\n", + " 0.06939043116444303,\n", + " 0.06427901066784386,\n", + " 0.07714285721081074,\n", + " 0.05649001043973577,\n", + " 0.5950417424914445,\n", + " 0.09555920148166144,\n", + " 0.2132548454889991,\n", + " 0.39104424156121087,\n", + " 0.16250888284656528,\n", + " 0.07537406683069885,\n", + " 0.0505282648093896,\n", + " 3.7162392859041655,\n", + " 0.38800458098555135,\n", + " 0.07354538943241344,\n", + " 0.059959946652505466,\n", + " 0.08331790521342615,\n", + " 0.14770158869081124,\n", + " 0.09168009114032796,\n", + " 0.27380992857742414,\n", + " 0.023091073536203786,\n", + " 0.1980340856851292,\n", + " 0.025590798636636325,\n", + " 0.052043225670437995,\n", + " 0.38001775631392026,\n", + " 0.005370371061884572,\n", + " 0.08600977071311833,\n", + " 0.10318599846080323,\n", + " 0.06837405147385947,\n", + " 0.11129532890257925,\n", + " 0.08006468004260171,\n", + " 0.09908725378063872,\n", + " 0.09119002212586724,\n", + " 0.04810831940312773,\n", + " 0.06018269625140149,\n", + " 0.09054947439890224,\n", + " 0.28547862176466177,\n", + " 0.06544751596326558,\n", + " 0.09330468814995797,\n", + " 0.03986610304887596,\n", + " 0.061275551223963345,\n", + " 0.08880691463743023,\n", + " 0.018307940244512648,\n", + " 0.11365848460095622,\n", + " 0.1365582792380498,\n", + " 0.09559706474299277,\n", + " 0.033219798357359734,\n", + " 0.047830262738493404,\n", + " 0.11069911585883173,\n", + " 0.07536411426809278,\n", + " 0.19418814916329696,\n", + " 0.05564167189830621,\n", + " 0.07907970427589536,\n", + " 0.17585797066424408,\n", + " 0.08425035371484624,\n", + " 0.07278221012775152,\n", + " 0.07112491266609175,\n", + " 0.06934203645531685,\n", + " 0.10886745461188493,\n", + " 0.0678305692599781,\n", + " 0.04921342665148212,\n", + " 0.09184924719923172,\n", + " 0.009167932402510879,\n", + " 0.07911209745428367,\n", + " 0.37117159556884183,\n", + " 0.09540222601972327,\n", + " 0.1019847453522327,\n", + " 0.09511619126763415,\n", + " 0.09079356930076703,\n", + " 0.0493674919408109,\n", + " 0.059362710335376795,\n", + " 0.05431305717414803,\n", + " 0.09680530602979395,\n", + " 0.09871096177084877,\n", + " 0.18661511209083984,\n", + " 0.09439916334951991,\n", + " 0.12872153687946095,\n", + " 1.8131078040024933,\n", + " 0.01875601748017012,\n", + " 0.49730959669187225,\n", + " 0.006368509208984464,\n", + " 0.12939788781856051,\n", + " 0.0819397355430059,\n", + " 0.10474970128949412,\n", + " 0.06870422020053311,\n", + " 0.12028087920338551,\n", + " 0.6530936146930536,\n", + " 0.20767956503673987,\n", + " 0.060354932676906586,\n", + " 0.07565741627130754,\n", + " 0.09413410711358551,\n", + " 0.09404606030830732,\n", + " 0.05388204046328389,\n", + " 0.12338146897788985,\n", + " 0.03569755850205611,\n", + " 0.10246578396498873,\n", + " 0.15391824747760735,\n", + " 0.08296874987887276,\n", + " 0.06707447765933644,\n", + " 0.10431020284214391,\n", + " 0.2200500002573284,\n", + " 0.18326595843261498,\n", + " 0.17627754942514076,\n", + " 0.06352452909313867,\n", + " 0.07908641362474303,\n", + " 0.13252113272148708,\n", + " 0.10367309812638106,\n", + " 0.06760320017722896,\n", + " 0.027990985905402842,\n", + " 0.04232153237605509,\n", + " 0.03242941666938169,\n", + " 0.07764871628677925,\n", + " 0.17133095145771507,\n", + " 0.07583351573962735,\n", + " 0.08188714471002234,\n", + " 0.06667275927389604,\n", + " 0.12383628059139579,\n", + " 1.9116432823212843,\n", + " 0.09300345788024651,\n", + " 0.08984736493568485,\n", + " 0.08617209843594115,\n", + " 0.07183861481246395,\n", + " 0.065386452266242,\n", + " 0.18780391429415133,\n", + " 0.3116123271299842,\n", + " 0.06684811871338713,\n", + " 0.027588725098090516,\n", + " 0.09251981049226318,\n", + " 0.5973317180590497,\n", + " 0.07134576333240873,\n", + " 0.03160422297917384,\n", + " 0.13466969807046159,\n", + " 0.09426148319504186,\n", + " 0.20191645094462998,\n", + " 0.10130148663565218,\n", + " 0.19118552375634376,\n", + " 0.1871971129913322,\n", + " 0.04063735302678703,\n", + " 0.10239016987807983,\n", + " 0.07370812293323517,\n", + " 0.08723368508028045,\n", + " 0.03470014625908914,\n", + " 0.024214215309113968,\n", + " 0.5414909074607985,\n", + " 0.6248678842859278,\n", + " 0.11058731000242487,\n", + " 0.21168421552012628,\n", + " 0.10513596553909164,\n", + " 0.05810419536511477,\n", + " 0.0685927396345189,\n", + " 0.46691015843341865,\n", + " 0.06479613166717482,\n", + " 0.09794423129538127,\n", + " 0.2605529697476167,\n", + " 0.10755157622461553,\n", + " 0.08391478308679959,\n", + " 0.0923225490487598,\n", + " 0.07724336538789564,\n", + " 0.755571090824902,\n", + " 0.05609527091725123,\n", + " 0.08427121164615281,\n", + " 0.1335797256444764,\n", + " 0.16114882255997043,\n", + " 0.1433861222177974,\n", + " 0.04782160070380827,\n", + " 0.1007430928878928,\n", + " 0.10944439697120399,\n", + " 0.1154095936944191,\n", + " 0.11024534426967313,\n", + " 0.09459433505654166,\n", + " 0.0972757873762229,\n", + " 0.05647906827792479,\n", + " 0.04400940628621654,\n", + " 0.0756389184224141,\n", + " 0.045559332408859635,\n", + " 0.051853407918328924,\n", + " 0.0398928673413769,\n", + " 0.012225603076086009,\n", + " 0.0690250603397366,\n", + " 0.19641418402545902,\n", + " 0.2843812729833966,\n", + " 0.05937823819065144,\n", + " 0.13578865465824252,\n", + " 0.007767950531069767,\n", + " 0.2549367845513628,\n", + " 0.06000779703322716,\n", + " 0.09642713765127325,\n", + " 0.043137375986752054,\n", + " 0.10426996309303813,\n", + " 0.0717715860034104,\n", + " 0.0395969950844743,\n", + " 0.07736270802244014,\n", + " 0.02814239322271389,\n", + " 0.6647402814484237,\n", + " 0.09872422110568206,\n", + " 0.07474509490663418,\n", + " 0.04445672894311895,\n", + " 0.1237612018364519,\n", + " 0.08719493321126684,\n", + " 0.005225329009604158,\n", + " 0.10027195702997158,\n", + " 0.047837219190570546,\n", + " 0.04668007146086611,\n", + " 0.1712762113678152,\n", + " 0.09536823781728394,\n", + " 0.07663388105929152,\n", + " 0.4795600912320962,\n", + " 0.061426917599638364,\n", + " 0.0545424200117407,\n", + " 0.6729099993501012,\n", + " 0.09700485345438276,\n", + " 0.05810419536511477,\n", + " 0.07281394690137818,\n", + " 0.19683524407460232,\n", + " 0.09872732075854813,\n", + " 0.04075554189651911,\n", + " 0.11937036298808186,\n", + " 0.19638990919300547,\n", + " 0.10722541680110695,\n", + " 0.07382914148878414,\n", + " 0.09870532374383051,\n", + " 0.053135751162970354,\n", + " 0.053004414217129196,\n", + " 0.04521409441824757,\n", + " 0.009389550301361517,\n", + " 0.08655093237010414,\n", + " 0.14537375710103148,\n", + " 0.07198417269359542,\n", + " 0.06680670166428195,\n", + " 0.5175905361016178,\n", + " 0.07273486755379703,\n", + " 0.012681344557535994,\n", + " 0.036079048012227014,\n", + " 0.06589468986428887,\n", + " 0.09019226582354857,\n", + " 0.06856161399750454,\n", + " 0.15430409471202747,\n", + " 0.13665017576329466,\n", + " 0.06236600768109343,\n", + " 0.4742303506680859,\n", + " 0.3971416500727031,\n", + " 0.10578718484317061,\n", + " 0.15595843239229631,\n", + " 0.08541798570415735,\n", + " 0.16148489389396992,\n", + " 0.13435560220021842,\n", + " 0.13947780389018494,\n", + " 0.12280195222778514,\n", + " 0.5399258263487299,\n", + " 0.05770010034108054,\n", + " 0.07830833114619669,\n", + " 0.07399891488606866,\n", + " 0.08822541488883745,\n", + " 0.05593646377182253,\n", + " 0.08001985186505722,\n", + " 0.07652097542583422,\n", + " 0.045542989119161006,\n", + " 0.15230871536759372,\n", + " 0.05309759781213086,\n", + " 0.07142206159480867,\n", + " 0.11432464953116031,\n", + " 0.1492790059065002,\n", + " 0.08827575699197354,\n", + " 0.14782476019273905,\n", + " 0.07154973010647725,\n", + " 0.07617740671646973,\n", + " 0.08299497510564458,\n", + " 0.040205145785229,\n", + " 0.09592824821515389,\n", + " 0.0941011911585919,\n", + " 0.20856025250853408,\n", + " 0.24602177889094562,\n", + " 0.10916481684152675,\n", + " 0.025488487180147873,\n", + " 0.08147267599559052,\n", + " 0.27100755025909895,\n", + " 0.05649001043973577,\n", + " 0.07464378929509947,\n", + " 0.12069574121892677,\n", + " 0.1988260034748604,\n", + " 0.12351821122814202,\n", + " 0.11480983186408987,\n", + " 0.005282382691762524,\n", + " 0.15448178897631018,\n", + " 0.26117968744733033,\n", + " 0.05718502002865947,\n", + " 0.12649972391973377,\n", + " 0.09494962176268006,\n", + " 0.10089122007840517,\n", + " 0.03841828747912661,\n", + " 0.04792765132951352,\n", + " 0.07865881470262619,\n", + " 0.07974328617355635,\n", + " 0.09418189201130467,\n", + " 0.08547201849201821,\n", + " 0.05709198780484451,\n", + " 0.2014442096500132,\n", + " 0.08069907999410604,\n", + " 0.042156621017918144,\n", + " 0.06108176834473382,\n", + " 0.085572861483259,\n", + " 0.15324157727473625,\n", + " 0.09521936815052057,\n", + " 0.08892120482309883,\n", + " 0.09010819308481831,\n", + " 0.06553440852086158,\n", + " 0.12558381276857714,\n", + " 0.1107570261308634,\n", + " 0.08453563470791939,\n", + " 0.08331554822074302,\n", + " 0.06278518383330452,\n", + " 0.12208425192669248,\n", + " 0.001982016726146396,\n", + " 0.06829691605648563,\n", + " 0.07080534504091168,\n", + " 0.36661249724692363,\n", + " 0.05293352829874497,\n", + " 0.12417216041247436,\n", + " 0.04521436021786984,\n", + " 0.06759622908934629,\n", + " 0.08495235759370347,\n", + " 0.007466466959703274,\n", + " 0.051551431498991045,\n", + " 0.06998881004391024,\n", + " 0.010519076782344443,\n", + " 0.1751572696539891,\n", + " 0.07138376465173966,\n", + " 0.056359822089218026,\n", + " 0.059135429200562556,\n", + " 0.0838171072812898,\n", + " 0.10553323126205179,\n", + " 0.07972336780358426,\n", + " 0.11405857132375052,\n", + " 0.08309334232072703,\n", + " 0.12197415183508654,\n", + " 0.07486942060536307,\n", + " 0.09019555357219164,\n", + " 0.12796344055583359,\n", + " 0.11293263466005642,\n", + " 0.10025553786554149,\n", + " 0.07659918099754458,\n", + " 0.003222669377817511,\n", + " 0.06316490521183907,\n", + " 0.06082937918596436,\n", + " 0.15391824747760735,\n", + " 0.08929657896637258,\n", + " 0.03654939955502355,\n", + " 0.0713387331947293,\n", + " 0.07030141334745556,\n", + " 0.23960680621878255,\n", + " 0.10305279471763294,\n", + " 0.07618571953113427,\n", + " 0.0832219325305779,\n", + " 0.043137375986752054,\n", + " 0.05856572260714389,\n", + " 0.042649123952152077,\n", + " 0.07161704377966041,\n", + " 0.16617710284557768,\n", + " 0.10418088948654503,\n", + " 0.09522115668426553,\n", + " 0.11200401132688537,\n", + " 0.045222874714630906,\n", + " 0.061032036106010656,\n", + " 0.06909173874692055,\n", + " 0.2956933768613176,\n", + " 0.015792847610916306,\n", + " 0.08469844645614127,\n", + " 0.12896639606872817,\n", + " 0.14904084047777721,\n", + " 0.038803688973619355,\n", + " 0.09279233373341739,\n", + " 0.07148536024549294,\n", + " 0.08829631079738633,\n", + " 0.11831241379528962,\n", + " 0.08761256877753464,\n", + " 0.12480725002235302,\n", + " 0.13976430921302763,\n", + " 0.25294278273500526,\n", + " 0.12286783341078981,\n", + " 0.1225945033364101,\n", + " 0.09376949762385357,\n", + " 0.16313811425812264,\n", + " 0.17930234624830507,\n", + " 0.06934658329016306,\n", + " 0.1588088681146511,\n", + " 0.08161286286122302,\n", + " 0.08582525276995887,\n", + " 0.1125799882595986,\n", + " 0.10206797061394328,\n", + " 0.09453413152914623,\n", + " 0.21893495363633841,\n", + " 0.13419720173522265,\n", + " 0.11954429457794893,\n", + " 0.08652555213255933,\n", + " 0.012392072212122369,\n", + " 0.12010949683406469,\n", + " 0.056129071019851734,\n", + " 0.13734103633495423,\n", + " 0.0699317772738751,\n", + " 0.009229721758024487,\n", + " 0.1860526463104855,\n", + " 0.07382914148878414,\n", + " 0.05610769587560345,\n", + " 0.06456638022052673,\n", + " 0.06178187297330143,\n", + " 0.13535494182707838,\n", + " 1.5499261142411531,\n", + " 0.1595828199294611,\n", + " 0.027589790865188757,\n", + " 0.05847206566111797,\n", + " 0.1457252334934187,\n", + " 0.26518366839502694,\n", + " 0.19425323199118097,\n", + " 0.10657778767897431,\n", + " 0.044281735979189024,\n", + " 0.9061431035647035,\n", + " 0.021353965792514085,\n", + " 0.08658042812626625,\n", + " 0.08161415594446383,\n", + " 0.0567432646017058,\n", + " 0.10150897923764568,\n", + " 0.11392527797511474,\n", + " 0.07379019776389051,\n", + " 0.006372446134343263,\n", + " 0.051249051933464955,\n", + " 0.11437948106170089,\n", + " 0.0982766664406534,\n", + " 0.0682216392620858,\n", + " 0.0878059744088047,\n", + " 0.08640579432246585,\n", + " 0.10081912632785019,\n", + " 0.06458478572489684,\n", + " 0.08012959295267161,\n", + " 0.07617740671646973,\n", + " 0.09894087451678604,\n", + " 0.15890952499872105,\n", + " 0.04186264131428448,\n", + " 0.1628689874255495,\n", + " 0.0059959661150177646,\n", + " 0.20571968661891124,\n", + " 0.04176554548289889,\n", + " 0.0686262045666888,\n", + " 0.08380857315195442,\n", + " 0.1887726479559009,\n", + " 0.05200632709075054,\n", + " 0.04906297548831132,\n", + " 0.08020727854755293,\n", + " 0.08451509396544785,\n", + " 0.09104487846907602,\n", + " 0.060395198424797375,\n", + " 0.0025027911967847316,\n", + " 0.021353965792514085,\n", + " 0.0876296595640962,\n", + " 0.027164616819336185,\n", + " 0.06766134038888993,\n", + " 0.0656485759822294,\n", + " 0.044588066071175075,\n", + " 0.11355342895940546,\n", + " 0.050760435042991395,\n", + " 0.10455299577642896,\n", + " 0.08930531413106918,\n", + " 0.05758899026963718,\n", + " 0.08759466772615088,\n", + " 0.10236290128663779,\n", + " 0.058989028652282394,\n", + " 0.10866298692635987,\n", + " 0.05577272993249101,\n", + " 0.08147267599559052,\n", + " 0.04706728499140825,\n", + " 0.08592449153072884,\n", + " 0.6280210972325817,\n", + " 0.6212191825423677,\n", + " 0.05826463139680345,\n", + " 0.1916414112107914,\n", + " 0.17039388665691677,\n", + " 0.11032794845529807,\n", + " 0.09971913003507533,\n", + " 0.05584245734008282,\n", + " 0.3955875659179279,\n", + " 0.14777736974664324,\n", + " 0.05870051260054007,\n", + " 0.12307349948719946,\n", + " 0.05978327514978994,\n", + " 0.1184816120847959,\n", + " 0.047217369000989606,\n", + " 0.222424601108105,\n", + " 0.1031265884326273,\n", + " 0.005145890789434615,\n", + " 0.11717521115230195,\n", + " 0.2590632813135617,\n", + " 0.34418229734089517,\n", + " 0.09997556564527715,\n", + " 0.05547259248935643,\n", + " 0.019208686212966466,\n", + " 0.011329949207841158,\n", + " 0.09261787307872356,\n", + " 0.10148396299810893,\n", + " 0.15922255957211737,\n", + " 0.0932989990282887,\n", + " 0.11024534426967313,\n", + " 0.21198050924855774,\n", + " 0.15495639430595526,\n", + " 0.10877880065827304,\n", + " 0.1936245068785156,\n", + " 0.0036338328921924202,\n", + " 0.17923214237290974,\n", + " 0.08873129731156588,\n", + " 0.0038559254822126965,\n", + " 0.053004414217129196,\n", + " 0.09184924719923172,\n", + " 0.08885123193872435,\n", + " 0.05300070164245045,\n", + " 0.1011963117571116,\n", + " 0.061262638757950724,\n", + " 0.10655093440748832,\n", + " 0.07078551256839416,\n", + " 0.07523695529386278,\n", + " 0.026532556271275244,\n", + " 0.09692207828143587,\n", + " 0.20707294144747848,\n", + " 0.008870920295376818,\n", + " 0.055316812150762534,\n", + " 0.06670260223648582,\n", + " 0.3029188154368082,\n", + " 0.11288960655535572,\n", + " 0.15071527516786132,\n", + " 0.06493061166662523,\n", + " 0.15943337018199275,\n", + " 0.05716766535465012,\n", + " 0.18324296960475048,\n", + " 0.09195793836349422,\n", + " 0.07153476338391644,\n", + " 0.6296423194830026,\n", + " 0.09535687311172392,\n", + " 0.27887276036565833,\n", + " 0.11845564130030806,\n", + " 0.07851755008340743,\n", + " 0.04400940628621654,\n", + " 0.076233571532202,\n", + " 0.007059566666543438,\n", + " 0.11917884565554908,\n", + " 0.08064219726948849,\n", + " 0.40898257745241984,\n", + " 0.04060424948397061,\n", + " 0.149255299699276,\n", + " 0.14031731627221966,\n", + " 0.07952913179809877,\n", + " 0.06358109749960446,\n", + " 0.3477931052140184,\n", + " 0.007767950531069767,\n", + " 0.42096979033396076,\n", + " 0.10229127247248737,\n", + " 0.8467764851337056,\n", + " 0.07402362209112567,\n", + " 0.08722833808309798,\n", + " 0.07333970153996075,\n", + " 0.09682777016140134,\n", + " 0.04765132894822402,\n", + " 0.08130279780164017,\n", + " 0.16834755778720298,\n", + " 0.09424765812939354,\n", + " 0.07793531107959528,\n", + " 0.4007716902939954,\n", + " 0.024680797394238577,\n", + " 0.08380857315195442,\n", + " 0.07180136778314508,\n", + " 0.07588648137545134,\n", + " 0.14412184066871814,\n", + " 0.17454346830477843,\n", + " 0.10398192661159013,\n", + " 0.053127732085155685,\n", + " 0.1292656911270249,\n", + " 0.042156621017918144,\n", + " 0.1561536440596339,\n", + " 0.0662090026003976,\n", + " 0.11262276200746722,\n", + " 0.1817633374063357,\n", + " 0.06558220521514396,\n", + " 0.05439380038830237,\n", + " 0.06668957201226225,\n", + " 0.03231087640625878,\n", + " 0.0407348432980847,\n", + " 0.10091421469319646,\n", + " 0.05458221633690702,\n", + " 0.09450194684741871,\n", + " 0.47756591108726004,\n", + " 0.08819264719842539,\n", + " 0.0627721642151981,\n", + " 0.09896176986658116,\n", + " 0.054939790782290054,\n", + " 0.1563716643019103,\n", + " 0.07148536024549294,\n", + " 0.16885122724272147,\n", + " 0.008869613828460993,\n", + " 0.0616779698693143,\n", + " 0.12085387337555542,\n", + " 0.05372103834693476,\n", + " 0.12226737757359059,\n", + " 0.1814194245138996,\n", + " 0.004121848241023161,\n", + " 0.1102949767521478,\n", + " ...]" + ] + }, + "metadata": {}, + "execution_count": 21 + } + ] + }, + { + "cell_type": "code", + "source": [ + "sampled_data['dtw_distances'] = dtw_distances" + ], + "metadata": { + "id": "Kr6u__nrnTAB" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Save sampled_data + dtw distances to drive\n", + "sampled_data.to_csv('/content/drive/My Drive/swat/sampled_data_with_dtw.csv', index=False)\n", + "sampled_data.to_excel('/content/drive/My Drive/swat/sampled_data_with_dtw.xlsx', index=False)" + ], + "metadata": { + "id": "PKGA1Mv1ngeH" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "sampled_data.head(3)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 193 + }, + "id": "EBIe19NGnUqb", + "outputId": "ca56cf3d-b367-42b6-8340-8f60ae28832d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " FIT101 LIT101 AIT201 AIT202 AIT203 FIT201 DPIT301 \\\n", + "693046 0.906359 0.432890 0.283962 0.841836 0.152735 0.864228 0.441343 \n", + "916789 0.000000 0.456637 0.018093 0.900598 0.021079 0.000000 0.040407 \n", + "292515 0.876537 0.774854 0.972707 0.812241 0.116664 0.000000 0.050010 \n", + "\n", + " FIT301 LIT301 AIT401 ... MV304_2 P301_2 P302_2 P402_2 \\\n", + "693046 0.927162 0.670225 0.999677 ... 0.0 0.0 1.0 1.0 \n", + "916789 0.000000 0.822014 0.999645 ... 0.0 0.0 0.0 1.0 \n", + "292515 0.000000 0.821339 0.999677 ... 0.0 0.0 0.0 1.0 \n", + "\n", + " P403_2 UV401_2 P501_2 P602_2 Normal/Attack_1 dtw_distances \n", + "693046 0.0 1.0 1.0 0.0 0.0 0.076050 \n", + "916789 0.0 1.0 1.0 0.0 1.0 0.049548 \n", + "292515 0.0 1.0 1.0 0.0 0.0 0.373474 \n", + "\n", + "[3 rows x 53 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FIT101LIT101AIT201AIT202AIT203FIT201DPIT301FIT301LIT301AIT401...MV304_2P301_2P302_2P402_2P403_2UV401_2P501_2P602_2Normal/Attack_1dtw_distances
6930460.9063590.4328900.2839620.8418360.1527350.8642280.4413430.9271620.6702250.999677...0.00.01.01.00.01.01.00.00.00.076050
9167890.0000000.4566370.0180930.9005980.0210790.0000000.0404070.0000000.8220140.999645...0.00.00.01.00.01.01.00.01.00.049548
2925150.8765370.7748540.9727070.8122410.1166640.0000000.0500100.0000000.8213390.999677...0.00.00.01.00.01.01.00.00.00.373474
\n", + "

3 rows × 53 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ] + }, + "metadata": {}, + "execution_count": 26 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "#**Isolation Forest using Sampled Data without DTW:**" + ], + "metadata": { + "id": "MvHp9cwtoMJn" + } + }, + { + "cell_type": "code", + "source": [ + "# Load sampled_data + dtw distances from drive\n", + "sampled_data = pd.read_csv('/content/drive/My Drive/swat/sampled_data_with_dtw.csv')" + ], + "metadata": { + "id": "3ToSMMmZ5PWX" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#uncomment this to remove DTW distance\n", + "X_sampled = sampled_data.drop(columns=['Normal/Attack_1', 'dtw_distances']) #removing dtw distance feature\n", + "y_sampled = sampled_data['Normal/Attack_1']\n", + "\n", + "X_train_s, X_test_s, y_train_s, y_test_s = train_test_split(X_sampled, y_sampled, test_size=0.2, random_state=42)" + ], + "metadata": { + "id": "-YVtLEAXp_br" + }, + "execution_count": 32, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#uncomment this to use DTW distance\n", + "X_sampled = sampled_data.drop(columns=['Normal/Attack_1'])\n", + "y_sampled = sampled_data['Normal/Attack_1']\n", + "\n", + "X_train_s, X_test_s, y_train_s, y_test_s = train_test_split(X_sampled, y_sampled, test_size=0.2, random_state=42)" + ], + "metadata": { + "id": "mJWkqVdE4I4v" + }, + "execution_count": 54, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "iso_model = IsolationForest(n_estimators=100, max_samples='auto', contamination=float(.01),\n", + " max_features=1.0, bootstrap=False, n_jobs=-1, random_state=42, verbose=0)\n", + "iso_model.fit(X_train_s)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 74 + }, + "id": "-Nis6QMXoLYU", + "outputId": "322cf1b7-a74a-49ee-fe66-6b26a677a638" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "IsolationForest(contamination=0.01, n_jobs=-1, random_state=42)" + ], + "text/html": [ + "
IsolationForest(contamination=0.01, n_jobs=-1, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ] + }, + "metadata": {}, + "execution_count": 59 + } + ] + }, + { + "cell_type": "code", + "source": [ + "iso_predictions = iso_model.predict(X_test_s)\n", + "\n", + "iso_binary_predictions = [1 if pred == -1 else 0 for pred in iso_predictions]\n", + "\n", + "iso_true_labels = y_test_s\n", + "iso_predicted_labels = iso_binary_predictions" + ], + "metadata": { + "id": "kHUSmpfbol7B" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "##without DTW" + ], + "metadata": { + "id": "JL5ZLBQ1udn4" + } + }, + { + "cell_type": "code", + "source": [ + "accuracy = accuracy_score(iso_true_labels, iso_predicted_labels)\n", + "confusion = confusion_matrix(iso_true_labels, iso_predicted_labels)\n", + "precision = precision_score(iso_true_labels, iso_predicted_labels)\n", + "recall = recall_score(iso_true_labels, iso_predicted_labels)\n", + "f1 = f1_score(iso_true_labels, iso_predicted_labels)\n", + "\n", + "print(\"Accuracy:\", accuracy)\n", + "print(\"Confusion Matrix:\")\n", + "print(confusion)\n", + "print(\"Precision:\", precision)\n", + "print(\"Recall:\", recall)\n", + "print(\"F1 Score:\", f1)\n", + "print(\"Classification Report:\")\n", + "print(classification_report(iso_true_labels, iso_predicted_labels))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3AhgxEDsoo9x", + "outputId": "3c7b52d5-8f71-47f3-e89d-c41de61ca12b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Accuracy: 0.924\n", + "Confusion Matrix:\n", + "[[922 6]\n", + " [ 70 2]]\n", + "Precision: 0.25\n", + "Recall: 0.027777777777777776\n", + "F1 Score: 0.049999999999999996\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0.0 0.93 0.99 0.96 928\n", + " 1.0 0.25 0.03 0.05 72\n", + "\n", + " accuracy 0.92 1000\n", + " macro avg 0.59 0.51 0.51 1000\n", + "weighted avg 0.88 0.92 0.89 1000\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "##Using DTW" + ], + "metadata": { + "id": "WmFfPfIjuqDh" + } + }, + { + "cell_type": "code", + "source": [ + "#First ==> run isolation forest again by adding the dtw distance\n", + "accuracy = accuracy_score(iso_true_labels, iso_predicted_labels)\n", + "confusion = confusion_matrix(iso_true_labels, iso_predicted_labels)\n", + "\n", + "precision = precision_score(iso_true_labels, iso_predicted_labels)\n", + "recall = recall_score(iso_true_labels, iso_predicted_labels)\n", + "f1 = f1_score(iso_true_labels, iso_predicted_labels)\n", + "\n", + "print(\"Accuracy:\", accuracy)\n", + "print(\"Confusion Matrix:\")\n", + "print(confusion)\n", + "print(\"Precision:\", precision)\n", + "print(\"Recall:\", recall)\n", + "print(\"F1 Score:\", f1)\n", + "print(\"Classification Report:\")\n", + "print(classification_report(iso_true_labels, iso_predicted_labels))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZpVGC6WFuplf", + "outputId": "2de32aa2-d736-448f-c628-fb01fe944501" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Accuracy: 0.927\n", + "Confusion Matrix:\n", + "[[923 5]\n", + " [ 68 4]]\n", + "Precision: 0.4444444444444444\n", + "Recall: 0.05555555555555555\n", + "F1 Score: 0.09876543209876543\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0.0 0.93 0.99 0.96 928\n", + " 1.0 0.44 0.06 0.10 72\n", + "\n", + " accuracy 0.93 1000\n", + " macro avg 0.69 0.53 0.53 1000\n", + "weighted avg 0.90 0.93 0.90 1000\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "#Autoencoder using Sampled data" + ], + "metadata": { + "id": "9UxoGGetbDGL" + } + }, + { + "cell_type": "code", + "source": [ + "input_shape = X_train_s.shape[1]\n", + "input_data = Input(shape=(input_shape,))\n", + "encoded = Dense(32, activation=\"relu\")(input_data)\n", + "encoded = BatchNormalization()(encoded)\n", + "encoded = Dropout(0.5)(encoded)\n", + "\n", + "# Decoding layer\n", + "decoded = Dense(input_shape, activation='sigmoid')(encoded)\n", + "\n", + "autoencoder = Model(input_data, decoded)\n", + "\n", + "autoencoder.compile(optimizer='adam', loss='mean_squared_error')\n", + "autoencoder.summary()\n", + "\n", + "early_stopping = EarlyStopping(monitor='val_loss',patience=5,restore_best_weights=True)\n", + "\n", + "autoencoder_train=autoencoder.fit(X_train_s, X_train_s,\n", + " epochs=100,\n", + " batch_size=256,\n", + " shuffle=True,\n", + " validation_data=(X_test_s, X_test_s),callbacks=[early_stopping],verbose=1)\n", + "\n", + "y_pred = autoencoder.predict(X_test_s)\n", + "mse = np.mean(np.power(X_test_s - y_pred, 2), axis=1)\n", + "y_predictions = y_pred[:, 0]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0BNQCav0a_3D", + "outputId": "30abfd11-b124-4a98-c0c1-e4dc2be21fac" + }, + "execution_count": 55, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Model: \"model_4\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " input_5 (InputLayer) [(None, 52)] 0 \n", + " \n", + " dense_8 (Dense) (None, 32) 1696 \n", + " \n", + " batch_normalization_4 (Bat (None, 32) 128 \n", + " chNormalization) \n", + " \n", + " dropout_4 (Dropout) (None, 32) 0 \n", + " \n", + " dense_9 (Dense) (None, 52) 1716 \n", + " \n", + "=================================================================\n", + "Total params: 3540 (13.83 KB)\n", + "Trainable params: 3476 (13.58 KB)\n", + "Non-trainable params: 64 (256.00 Byte)\n", + "_________________________________________________________________\n", + "Epoch 1/100\n", + "16/16 [==============================] - 1s 17ms/step - loss: 0.2224 - val_loss: 0.1939\n", + "Epoch 2/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.1955 - val_loss: 0.1711\n", + "Epoch 3/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.1754 - val_loss: 0.1484\n", + "Epoch 4/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.1574 - val_loss: 0.1250\n", + "Epoch 5/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.1409 - val_loss: 0.1038\n", + "Epoch 6/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.1230 - val_loss: 0.0868\n", + "Epoch 7/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.1086 - val_loss: 0.0744\n", + "Epoch 8/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0934 - val_loss: 0.0661\n", + "Epoch 9/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0815 - val_loss: 0.0601\n", + "Epoch 10/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0716 - val_loss: 0.0559\n", + "Epoch 11/100\n", + "16/16 [==============================] - 0s 7ms/step - loss: 0.0642 - val_loss: 0.0517\n", + "Epoch 12/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0580 - val_loss: 0.0479\n", + "Epoch 13/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0535 - val_loss: 0.0443\n", + "Epoch 14/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0495 - val_loss: 0.0409\n", + "Epoch 15/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0458 - val_loss: 0.0380\n", + "Epoch 16/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0436 - val_loss: 0.0356\n", + "Epoch 17/100\n", + "16/16 [==============================] - 0s 4ms/step - loss: 0.0421 - val_loss: 0.0338\n", + "Epoch 18/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0393 - val_loss: 0.0320\n", + "Epoch 19/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0389 - val_loss: 0.0301\n", + "Epoch 20/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0365 - val_loss: 0.0292\n", + "Epoch 21/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0357 - val_loss: 0.0284\n", + "Epoch 22/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0346 - val_loss: 0.0275\n", + "Epoch 23/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0336 - val_loss: 0.0273\n", + "Epoch 24/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0327 - val_loss: 0.0265\n", + "Epoch 25/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0319 - val_loss: 0.0261\n", + "Epoch 26/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0308 - val_loss: 0.0256\n", + "Epoch 27/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0308 - val_loss: 0.0257\n", + "Epoch 28/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0297 - val_loss: 0.0253\n", + "Epoch 29/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0293 - val_loss: 0.0248\n", + "Epoch 30/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0290 - val_loss: 0.0244\n", + "Epoch 31/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0280 - val_loss: 0.0245\n", + "Epoch 32/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0279 - val_loss: 0.0231\n", + "Epoch 33/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0270 - val_loss: 0.0222\n", + "Epoch 34/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0267 - val_loss: 0.0223\n", + "Epoch 35/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0264 - val_loss: 0.0221\n", + "Epoch 36/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0259 - val_loss: 0.0211\n", + "Epoch 37/100\n", + "16/16 [==============================] - 0s 5ms/step - loss: 0.0255 - val_loss: 0.0207\n", + "Epoch 38/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0253 - val_loss: 0.0211\n", + "Epoch 39/100\n", + "16/16 [==============================] - 0s 6ms/step - loss: 0.0250 - val_loss: 0.0224\n", + "Epoch 40/100\n", + "16/16 [==============================] - 0s 7ms/step - loss: 0.0241 - val_loss: 0.0216\n", + "Epoch 41/100\n", + "16/16 [==============================] - 0s 8ms/step - loss: 0.0240 - val_loss: 0.0234\n", + "Epoch 42/100\n", + "16/16 [==============================] - 0s 7ms/step - loss: 0.0234 - val_loss: 0.0238\n", + "32/32 [==============================] - 0s 2ms/step\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "threshold = np.percentile(mse, 95.5)\n", + "\n", + "y_pred = (mse > threshold).astype(int)\n", + "\n", + "accuracy = accuracy_score(y_test_s, y_pred)\n", + "conf_matrix = confusion_matrix(y_test_s, y_pred)\n", + "precision = precision_score(y_test_s, y_pred)\n", + "recall = recall_score(y_test_s, y_pred)\n", + "f1 = f1_score(y_test_s, y_pred)\n", + "\n", + "print(f\"Accuracy: {accuracy}\")\n", + "print(\"Confusion Matrix:\")\n", + "print(conf_matrix)\n", + "print(f\"Precision: {precision}\")\n", + "print(f\"Recall: {recall}\")\n", + "print(f\"F1-score: {f1}\")\n", + "print(\"Classification Report:\")\n", + "print(classification_report(y_test_s, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Pp8TOOG0ElVw", + "outputId": "7082015f-1020-410f-faca-b10bfa7543cb" + }, + "execution_count": 53, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Accuracy: 0.903\n", + "Confusion Matrix:\n", + "[[893 35]\n", + " [ 62 10]]\n", + "Precision: 0.2222222222222222\n", + "Recall: 0.1388888888888889\n", + "F1-score: 0.17094017094017094\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0.0 0.94 0.96 0.95 928\n", + " 1.0 0.22 0.14 0.17 72\n", + "\n", + " accuracy 0.90 1000\n", + " macro avg 0.58 0.55 0.56 1000\n", + "weighted avg 0.88 0.90 0.89 1000\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "###AutoEncoder using DTW" + ], + "metadata": { + "id": "0sD_FT4XFnU3" + } + }, + { + "cell_type": "code", + "source": [ + "#First ==> run Autoencoder again after adding the dtw distance\n", + "threshold = np.percentile(mse, 95.5)\n", + "y_pred = (mse > threshold).astype(int)\n", + "\n", + "accuracy = accuracy_score(y_test_s, y_pred)\n", + "conf_matrix = confusion_matrix(y_test_s, y_pred)\n", + "precision = precision_score(y_test_s, y_pred)\n", + "recall = recall_score(y_test_s, y_pred)\n", + "f1 = f1_score(y_test_s, y_pred)\n", + "\n", + "print(f\"Accuracy: {accuracy}\")\n", + "print(\"Confusion Matrix:\")\n", + "print(conf_matrix)\n", + "print(f\"Precision: {precision}\")\n", + "print(f\"Recall: {recall}\")\n", + "print(f\"F1-score: {f1}\")\n", + "print(\"Classification Report:\")\n", + "print(classification_report(y_test_s, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Hmh2V7HBG8rA", + "outputId": "0542dd8a-fac4-4639-c4cb-f81d1dfeba86" + }, + "execution_count": 78, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Accuracy: 0.963\n", + "Confusion Matrix:\n", + "[[923 5]\n", + " [ 32 40]]\n", + "Precision: 0.8888888888888888\n", + "Recall: 0.5555555555555556\n", + "F1-score: 0.6837606837606838\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0.0 0.97 0.99 0.98 928\n", + " 1.0 0.89 0.56 0.68 72\n", + "\n", + " accuracy 0.96 1000\n", + " macro avg 0.93 0.78 0.83 1000\n", + "weighted avg 0.96 0.96 0.96 1000\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "#**BASELINES : AutoEncoder and Isolation forest** (Using all the data)" + ], + "metadata": { + "id": "zbhn0uSbZ9gx" + } + }, + { + "cell_type": "markdown", + "source": [ + "###Split :Train/Test" + ], + "metadata": { + "id": "KEAWCJ5lSqNs" + } + }, + { + "cell_type": "code", + "source": [ + "input_shape = df_train.shape[1]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "J0RkCQSdmCbr", + "outputId": "075a2f14-c7ba-4e11-fe85-985c7186ea8f" + }, + "execution_count": 26, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "705962" + ] + }, + "metadata": {}, + "execution_count": 26 + } + ] + }, + { + "cell_type": "code", + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "print(\"Training data shape:\", X_train.shape)\n", + "print(\"Test data shape:\", X_test.shape)" + ], + "metadata": { + "id": "O3wVTXm8Oh8t", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c4af9439-7b6a-4734-a423-c127ce8834d6" + }, + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Training data shape: (743118, 45)\n", + "Test data shape: (185780, 45)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "X_train.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "wFBlVcQ9kwIJ", + "outputId": "9a5f29c3-ef38-47ae-ba77-be6068a819e5" + }, + "execution_count": 28, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(743118, 45)" + ] + }, + "metadata": {}, + "execution_count": 28 + } + ] + }, + { + "cell_type": "code", + "source": [ + "X_test.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HHiK-LEsk2tF", + "outputId": "bdc93f50-5048-4758-9b93-65ec7853be3e" + }, + "execution_count": 29, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(185780, 45)" + ] + }, + "metadata": {}, + "execution_count": 29 + } + ] + }, + { + "cell_type": "code", + "source": [ + "df_train = X.iloc[:700000, :]\n", + "df_test = X.iloc[700000:, :]\n", + "target_train = y.iloc[:700000]\n", + "target_test = y.iloc[700000:]\n", + "\n", + "print(\"Training data shape:\", df_train.shape)\n", + "print(\"Test data shape:\", df_test.shape)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8P97S6lxD-pK", + "outputId": "2781745f-a637-47b6-f097-1974cb7c274c" + }, + "execution_count": 30, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Training data shape: (700000, 45)\n", + "Test data shape: (228898, 45)\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "##**Baseline 1 : Autoencoder** (With All Data)" + ], + "metadata": { + "id": "V9hs-U6a6o2-" + } + }, + { + "cell_type": "code", + "source": [ + "input_shape = df_train.shape[1]" + ], + "metadata": { + "id": "U_7zqAmn6l1t" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Define the encoding layer\n", + "input_data = Input(shape=(input_shape,))\n", + "encoded = Dense(32, activation=\"relu\")(input_data)\n", + "encoded = BatchNormalization()(encoded)\n", + "encoded = Dropout(0.5)(encoded)\n", + "\n", + "# Decoding layer\n", + "decoded = Dense(input_shape, activation='sigmoid')(encoded)\n", + "\n", + "autoencoder = Model(input_data, decoded)" + ], + "metadata": { + "id": "J5DIli1lPPPk" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "autoencoder.compile(optimizer='adam', loss='mean_squared_error')" + ], + "metadata": { + "id": "3ArDEJ3d9lrE" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "autoencoder.summary()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1pZATiIhif54", + "outputId": "24def066-aee3-408f-d9ae-aa8d661bf156" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Model: \"model_6\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " input_7 (InputLayer) [(None, 51)] 0 \n", + " \n", + " dense_20 (Dense) (None, 32) 1664 \n", + " \n", + " batch_normalization_4 (Bat (None, 32) 128 \n", + " chNormalization) \n", + " \n", + " dropout_4 (Dropout) (None, 32) 0 \n", + " \n", + " dense_21 (Dense) (None, 51) 1683 \n", + " \n", + "=================================================================\n", + "Total params: 3475 (13.57 KB)\n", + "Trainable params: 3411 (13.32 KB)\n", + "Non-trainable params: 64 (256.00 Byte)\n", + "_________________________________________________________________\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "early_stopping = EarlyStopping(monitor='val_loss',patience=5,restore_best_weights=True)" + ], + "metadata": { + "id": "8J455cYRUCre" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "autoencoder_train=autoencoder.fit(df_train, df_train,\n", + " epochs=100,\n", + " batch_size=256,\n", + " shuffle=True,\n", + " validation_data=(df_test, df_test),callbacks=[early_stopping],verbose=1)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QNPfJkTcUG6y", + "outputId": "8d40cf1c-6d3e-44c2-98bc-60a89bf6f797" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/100\n", + "2735/2735 [==============================] - 11s 4ms/step - loss: 0.0199 - val_loss: 0.0519\n", + "Epoch 2/100\n", + "2735/2735 [==============================] - 9s 3ms/step - loss: 0.0071 - val_loss: 0.0379\n", + "Epoch 3/100\n", + "2735/2735 [==============================] - 12s 4ms/step - loss: 0.0063 - val_loss: 0.0265\n", + "Epoch 4/100\n", + "2735/2735 [==============================] - 10s 4ms/step - loss: 0.0059 - val_loss: 0.0207\n", + "Epoch 5/100\n", + "2735/2735 [==============================] - 10s 4ms/step - loss: 0.0056 - val_loss: 0.0190\n", + "Epoch 6/100\n", + "2735/2735 [==============================] - 11s 4ms/step - loss: 0.0054 - val_loss: 0.0211\n", + "Epoch 7/100\n", + "2735/2735 [==============================] - 8s 3ms/step - loss: 0.0053 - val_loss: 0.0214\n", + "Epoch 8/100\n", + "2735/2735 [==============================] - 11s 4ms/step - loss: 0.0052 - val_loss: 0.0197\n", + "Epoch 9/100\n", + "2735/2735 [==============================] - 10s 4ms/step - loss: 0.0052 - val_loss: 0.0195\n", + "Epoch 10/100\n", + "2735/2735 [==============================] - 10s 4ms/step - loss: 0.0051 - val_loss: 0.0203\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "loss = autoencoder_train.history['loss']\n", + "val_loss = autoencoder_train.history['val_loss']\n", + "epochs = range(10)\n", + "plt.figure()\n", + "plt.plot(epochs, loss, 'bo', label='Training loss')\n", + "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n", + "plt.title('Training and validation loss')\n", + "plt.legend()\n", + "plt.show()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 452 + }, + "id": "ptXcSAuf8Jtu", + "outputId": "23b448a1-7b22-4898-b3bb-4621c870e55b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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YvHixfbxCL6+vjzyyCP06NGDiIiIHNXj4eHBokWL6NOnD5988gk2m43WrVszevRo7rzzzmy/TmxsLIMGDeL8+fMOZwelGzduHJ6ennz66adcvHiRqKgoVqxYkaP3xZmaZ82aRc+ePZk0aRKGYXD//fezdOlSh7O0AOrVq8cbb7zB1KlTWbZsGWlpaezfvz/TwBIcHMy6devo378/EyZM4OLFi9SuXZvFixfbeznyytChQylZsiQTJ07kxRdf5LbbbuO5555jxIgR9nmCIiIiiImJYfHixRw9epTChQsTERHB0qVL7WdItW7dmgMHDvDBBx9w6tQpSpQoQbNmzRg2bJj9LCORm2EzXOmroojkmjZt2vDrr79mOr5CRCS/0RgWETdw7TT6v//+O19//TXNmze3piARkVymHhYRNxAaGmq/vs3BgweZMmUKycnJbN26lcqVK1tdnojITdMYFhE30KJFC2bPns3x48fx8fGhUaNGjBgxQmFFRNyGelhERETE5WkMi4iIiLg8BRYRERFxeW4xhiUtLY0//viDokWLOjUdtoiIiFjHMAzOnj1LqVKlbjhBolsElj/++IOwsDCryxAREZEcOHz4MGXKlLluG7cILEWLFgXMHQ4ICLC4GhEREcmOxMREwsLC7J/j1+MWgSX9MFBAQIACi4iISD6TneEcGnQrIiIiLk+BRURERFyeAouIiIi4PLcYwyIiIrkrNTWVS5cuWV2GuAFPT0+8vLxuetoRBRYREXFw7tw5jhw5gq7cIrmlcOHChIaG4u3tnePXUGARERG71NRUjhw5QuHChSlZsqQm45SbYhgGKSkp/Pnnn+zfv5/KlSvfcIK4rCiwiIiI3aVLlzAMg5IlS+Ln52d1OeIG/Pz8KFSoEAcPHiQlJQVfX98cvY4G3YqISAbqWZHclNNeFYfXyIU6RERERPKUAouIiIi4PAUWERHJdampsHo1zJ5t/kxNtboi54WHhzN27Nhst1+9ejU2m40zZ87kWU0AM2fOpFixYnm6DVekwCIiIrlq/nwID4d77oF//9v8GR5urs8LNpvturehQ4fm6HU3btzIc889l+32jRs35tixYwQGBuZoe3J9OkvoOi5cgGnT4NdfzZ8iInJ98+fD44/DtVO4HD1qrv/iC3j00dzd5rFjx+zLc+bMYfDgwezevdu+zt/f375sGAapqal4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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_pred = autoencoder.predict(df_test)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iYYEUkCDffbQ", + "outputId": "c0caad26-27d2-4fcd-8a71-9db23ef51c31" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "7154/7154 [==============================] - 15s 2ms/step\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "mse = np.mean(np.power(df_test - y_pred, 2), axis=1)" + ], + "metadata": { + "id": "J-8ijg0OJqaa" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "plt.plot(mse, marker='o', linestyle='')\n", + "plt.xlabel('Sample Index')\n", + "plt.ylabel('Mean Squared Error (MSE)')\n", + "plt.title('MSE Values for Reconstructed Samples')\n", + "plt.grid(True)\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 472 + }, + "id": "dqyda6MvL_Ff", + "outputId": "be7ec9ed-271f-4529-e187-e0e30311e150" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB/+UlEQVR4nO3deVxUVf8H8M8w7DvITsimueRCaiDuJopbLm1qi4pmllkamoklilqolY8tLmW55JJmmZUaihiKipp7rrlAZgouiAjIOuf3Bz8mRwa4M8www/B5v14+T3PvuWe+c88sX84951yZEEKAiIiIqB4xM3QARERERLWNCRARERHVO0yAiIiIqN5hAkRERET1DhMgIiIiqneYABEREVG9wwSIiIiI6h0mQERERFTvMAEiIiKieocJEFEtGDlyJAICAgwdRqUuXLiAXr16wcnJCTKZDJs3bzZ0SFRHBAQEYOTIkYYOQ6+M/fNL2mECRLVu5cqVkMlkkMlk2Lt3b4X9Qgj4+flBJpOhf//+Kvtyc3MxY8YMtGjRAnZ2dmjQoAFCQkIwYcIEXLt2TVlu5syZyudQ9y8jI0NtbEePHoVMJsP7779fafwXLlyATCZDdHS0lmfA+IwYMQJ//vknPvjgA6xevRrt2rXT23Olp6ertIWZmRlcXV3Rp08fpKam6u15DWXbtm2YOXNmvY9B6meXqLaYGzoAqr+sra2xbt06dOrUSWX77t27cfXqVVhZWalsLy4uRpcuXXDu3DmMGDECb775JnJzc3H69GmsW7cOgwcPho+Pj8oxS5Ysgb29fYXndnZ2VhtTmzZt0LRpU3z33XeYM2eO2jLr1q0DALz00ktSX6pRu3//PlJTU/Hee+9h/Pjxtfa8w4YNQ9++fVFaWoq//voLixcvRvfu3fHHH3+gZcuWtRaHvm3btg2LFi0yaAJi6Bi0+ewS6RsTIDKYvn37YuPGjfjss89gbv7fW3HdunVo27Ytbt26pVJ+8+bNOHbsGNauXYsXXnhBZV9BQQGKiooqPMezzz4LNzc3jeJ68cUXMX36dBw4cADt27evsP+7775D06ZN0aZNG43qNVY3b94EUHlSqI28vDzY2dlVWaZNmzYqSWTnzp3Rp08fLFmyBIsXL9ZZLHVJSUkJFAoFLC0tDR2KTmnz2SXSN14CI4MZNmwYbt++jcTEROW2oqIi/PDDDxW+JAHg0qVLAICOHTtW2GdtbQ1HR0edxPXiiy8C+K+n50FHjhzB+fPnlWV+/vln9OvXDz4+PrCyskJwcDBmz56N0tLSKp8jOTkZMpkMycnJKtvLLw+tXLlSZfu5c+fw7LPPwtXVFdbW1mjXrh1++eUXlTLFxcWIi4tD48aNYW1tjQYNGqBTp04q5/dhM2fOhL+/PwDgnXfegUwmUxnrcOzYMfTp0weOjo6wt7dHjx49cODAAZU6yi9p7t69G+PGjYOHhwceeeSRKl+/Op07dwbwXzuXy87OxsSJE+Hn5wcrKys0atQI8+bNg0KhUCmnUCjw6aefomXLlrC2toa7uzt69+6Nw4cPK8uUlJRg9uzZCA4OhpWVFQICAjBt2jQUFhaq1BUQEID+/ftj7969CA0NhbW1NYKCgvDtt9+qlKvunI8cORKLFi0CAJXLfsB/bf3xxx9j4cKFypjOnDmjPKfp6ekqz1fZ++bgwYPo27cvXFxcYGdnh1atWuHTTz+tNoby87Zw4UI89thjsLa2hqenJ8aOHYs7d+6oPIcQAnPmzMEjjzwCW1tbdO/eHadPn1bTkhVp8tk9efIkRo4ciaCgIFhbW8PLywujRo3C7du3VY4rv8z9119/4aWXXoKTkxPc3d0xffp0CCHwzz//YODAgXB0dISXlxc++eQTtedyw4YNmDZtGry8vGBnZ4cBAwbgn3/+qfY1ST1vhw8fRmRkJNzc3GBjY4PAwECMGjVK0nkj/WIPEBlMQEAAwsPD8d1336FPnz4AgN9++w13797F0KFD8dlnn6mUL/+h/vbbb/H++++rfIlXJisrq8I2c3PzKns7AgMD0aFDB3z//ff43//+B7lcrtxXnhSVJ2grV66Evb09oqOjYW9vj127diE2NhY5OTn46KOPqo1PitOnT6Njx47w9fXF1KlTYWdnh++//x6DBg3Cjz/+iMGDBwMo+0GIj4/HK6+8gtDQUOTk5ODw4cM4evQoevbsqbbup59+Gs7Oznj77beVl6TKLxmePn0anTt3hqOjI6ZMmQILCwt8+eWX6NatG3bv3o2wsDCVusaNGwd3d3fExsYiLy9P49dZ/mPv4uKi3Jafn4+uXbvi33//xdixY9GwYUPs378fMTExuH79OhYuXKgsO3r0aKxcuRJ9+vTBK6+8gpKSEqSkpODAgQPKMU2vvPIKVq1ahWeffRaTJk3CwYMHER8fj7Nnz+Knn35SiefixYt49tlnMXr0aIwYMQLLly/HyJEj0bZtWzz22GOSzvnYsWNx7do1JCYmYvXq1Wpf94oVK1BQUIBXX30VVlZWcHV11ei8JSYmon///vD29saECRPg5eWFs2fPYsuWLZgwYUK1MYwdOxYrV65EVFQU3nrrLaSlpeGLL77AsWPHsG/fPlhYWAAAYmNjMWfOHPTt2xd9+/bF0aNH0atXL0m9N5p8dhMTE3H58mVERUXBy8sLp0+fxldffYXTp0/jwIEDFY4dMmQImjVrhrlz52Lr1q2YM2cOXF1d8eWXX+LJJ5/EvHnzsHbtWkyePBlPPPEEunTponL8Bx98AJlMhnfffRc3btzAwoULERERgePHj8PGxqbSOKWctxs3bqBXr15wd3fH1KlT4ezsjPT0dGzatKnac0a1QBDVshUrVggA4o8//hBffPGFcHBwEPn5+UIIIZ577jnRvXt3IYQQ/v7+ol+/fsrj8vPzRZMmTQQA4e/vL0aOHCm++eYbkZmZWeE5ZsyYIQCo/dekSZNqY1y0aJEAILZv367cVlpaKnx9fUV4eLhKTA8bO3assLW1FQUFBcptI0aMEP7+/srHv//+uwAgfv/9d5Vj09LSBACxYsUK5bYePXqIli1bqtSnUChEhw4dROPGjZXbWrdurXK+pCp/zo8++khl+6BBg4SlpaW4dOmSctu1a9eEg4OD6NKli3JbeXt26tRJlJSUSH6+uLg4cfPmTZGRkSFSUlLEE088IQCIjRs3KsvOnj1b2NnZib/++kuljqlTpwq5XC6uXLkihBBi165dAoB46623KjyfQqEQQghx/PhxAUC88sorKvsnT54sAIhdu3Ypt/n7+wsAYs+ePcptN27cEFZWVmLSpEnKbVLO+RtvvCHUfdWWnwdHR0dx48YNlX3l5zQtLU1l+8Pvm5KSEhEYGCj8/f3FnTt31L7uqmJISUkRAMTatWtVtickJKhsv3HjhrC0tBT9+vVTqXfatGkCgBgxYkSV50CTz666z9R3331XoT3KP+OvvvqqcltJSYl45JFHhEwmE3PnzlVuv3PnjrCxsVGJs/xc+vr6ipycHOX277//XgAQn376qXLbw59fqeftp59+Un7XkfHhJTAyqOeffx7379/Hli1bcO/ePWzZskXt5S8AsLGxwcGDB/HOO+8AKOt9GT16NLy9vfHmm29WuIwBAD/++CMSExNV/q1YsaLauIYMGQILCwuVy2C7d+/Gv//+q7z8VR5TuXv37uHWrVvo3Lkz8vPzce7cOcnnoTJZWVnYtWsXnn/+eWX9t27dwu3btxEZGYkLFy7g33//BVA2huf06dO4cOFCjZ+3tLQUO3bswKBBgxAUFKTc7u3tjRdeeAF79+5FTk6OyjFjxoxR6S2rzowZM+Du7g4vLy907twZZ8+exSeffIJnn31WWWbjxo3o3LkzXFxclK/91q1biIiIQGlpKfbs2QOgrJ1lMhlmzJhR4XnKewy2bdsGABVm702aNAkAsHXrVpXtzZs3V16WAwB3d3c0adIEly9fVm7TxTl/5pln4O7urtWxx44dQ1paGiZOnFihV1NKD+nGjRvh5OSEnj17qpzftm3bwt7eHr///jsAYOfOnSgqKsKbb76pUu/EiRMlxanJZ/fBz1RBQQFu3bqlHIt39OjRCnW/8soryv+Wy+Vo164dhBAYPXq0cruzs3OFtis3fPhwODg4KB8/++yz8Pb2Vr5f1JF63srbZMuWLSguLq7yHFHtYwJEBuXu7o6IiAisW7cOmzZtQmlpqcoP4MOcnJwwf/58pKenIz09Hd988w2aNGmCL774ArNnz65QvkuXLoiIiFD5Fx4eXm1cDRo0QGRkJH766ScUFBQAKLv8ZW5ujueff15Z7vTp0xg8eDCcnJzg6OgId3d35cDeu3fvano6Krh48SKEEJg+fTrc3d1V/pX/2N+4cQMAMGvWLGRnZ+PRRx9Fy5Yt8c477+DkyZNaPe/NmzeRn5+PJk2aVNjXrFkzKBSKCuMkAgMDNXqOV199FYmJifj111/x9ttv4/79+xXGTl24cAEJCQkVXntERASA/177pUuX4OPjU+Xlo7///htmZmZo1KiRynYvLy84Ozvj77//VtnesGHDCnW4uLiojPHQxTnX9Lw9qHxsTYsWLbQ6/sKFC7h79y48PDwqnOPc3Fzl+S0/N40bN1Y53t3dXeWSZVWkfnazsrIwYcIEeHp6wsbGBu7u7spzpO4z9XA7OTk5wdrausLkBycnpwrjc9S9JplMhkaNGlUYf/Ugqeeta9eueOaZZxAXFwc3NzcMHDgQK1asUPvHGtU+jgEig3vhhRcwZswYZGRkoE+fPpJnI/n7+2PUqFEYPHgwgoKCsHbt2kqnrmvjpZdewpYtW7BlyxYMGDAAP/74o/J6PlA2OLdr165wdHTErFmzEBwcDGtraxw9ehTvvvtuhUG6D6rsr/OHE4DyOiZPnozIyEi1x5T/oHfp0gWXLl3Czz//jB07duDrr7/G//73PyxdulTlr2R9qWq8hDqNGzdWJjL9+/eHXC7H1KlT0b17d+WYHYVCgZ49e2LKlClq63j00Uc1jlNKzwiASnuzhBDK/9bFOVd33qS+P2pKoVDAw8MDa9euVbtf256p6lT12X3++eexf/9+vPPOOwgJCYG9vT0UCgV69+6t9jOlrp2ktF1NSD1vMpkMP/zwAw4cOIBff/0V27dvx6hRo/DJJ5/gwIEDapfooNrDBIgMbvDgwRg7diwOHDiADRs2aHy8i4sLgoODcerUKZ3GNWDAADg4OGDdunWwsLDAnTt3VC5/JScn4/bt29i0aZPKwMq0tDRJMQNlSdSDHu6FKL/8ZGFhoUwWquLq6oqoqChERUUhNzcXXbp0wcyZMzVOgNzd3WFra4vz589X2Hfu3DmYmZnBz89Pozqr895772HZsmV4//33kZCQAAAIDg5Gbm5uta89ODgY27dvR1ZWVqW9QP7+/lAoFLhw4QKaNWum3J6ZmYns7GzlQF1NVXfOpSZcD5L6/ggODgYAnDp1qspzVFkMwcHB2LlzJzp27FhlAlt+bi5cuKBySfTmzZtqe1Wkevize+fOHSQlJSEuLg6xsbHKcrq4rFuZh+sWQuDixYto1apVpcdIPW/l2rdvj/bt2+ODDz7AunXr8OKLL2L9+vW18ocJVY6XwMjg7O3tsWTJEsycORNPPfVUpeVOnDhRYW0goOxH4cyZM2ov19SEjY0NBg8ejG3btmHJkiWws7PDwIEDlfvL/8p88K/KoqIiSWvY+Pv7Qy6XK8ewlHv4WA8PD3Tr1g1ffvklrl+/XqGe8jV8AFSYJmxvb49GjRpp1d0ul8vRq1cv/PzzzyqXAjIzM5WLV+pq2YFyzs7OGDt2LLZv347jx48DKOsNSE1Nxfbt2yuUz87ORklJCYCycTRCCMTFxVUoV94+ffv2BQCVmWMAsGDBAgBAv379NI5ZyjkvXw/p4WSmKuWJzYPvj9LSUnz11Vcq5dq0aYPAwEAsXLiwQv0Pvi8ri+H5559HaWmp2svHJSUlyvIRERGwsLDA559/rlLvw+eyMlI/u+o+U5o8jza+/fZb3Lt3T/n4hx9+wPXr15UzU9WRet7u3LlT4bWEhIQAAC+DGQH2AJFRGDFiRLVlEhMTMWPGDAwYMADt27eHvb09Ll++jOXLl6OwsFDtKrc//PCD2m7mnj17wtPTs9rnfOmll/Dtt99i+/btePHFF1UW9+vQoQNcXFwwYsQIvPXWW5DJZFi9erWkbnYnJyc899xz+PzzzyGTyRAcHIwtW7Yoxw48aNGiRejUqRNatmyJMWPGICgoCJmZmUhNTcXVq1dx4sQJAGWDdrt164a2bdvC1dUVhw8fxg8//KD16s5z5sxBYmIiOnXqhHHjxsHc3BxffvklCgsLMX/+fK3qrM6ECROwcOFCzJ07F+vXr8c777yDX375Bf3791dOQc/Ly8Off/6JH374Aenp6XBzc0P37t3x8ssv47PPPsOFCxeUl0tSUlLQvXt3jB8/Hq1bt8aIESPw1VdfKS9fHjp0CKtWrcKgQYPQvXt3jeOVcs7btm0LAHjrrbcQGRkJuVyOoUOHVlnvY489hvbt2yMmJkbZq7V+/XplwlfOzMwMS5YswVNPPYWQkBBERUXB29sb586dw+nTp5WJY2UxdO3aFWPHjkV8fDyOHz+OXr16wcLCAhcuXMDGjRvx6aef4tlnn4W7uzsmT56M+Ph49O/fH3379sWxY8fw22+/SVpoVOpn19HREV26dMH8+fNRXFwMX19f7NixQ1KvqrZcXV3RqVMnREVFITMzEwsXLkSjRo0wZsyYSo+Ret5WrVqFxYsXY/DgwQgODsa9e/ewbNkyODo6KhNyMiCDzD2jeu3BafBVeXga/OXLl0VsbKxo37698PDwEObm5sLd3V3069dPZQqzEFVPg4ea6eeVKSkpEd7e3gKA2LZtW4X9+/btE+3btxc2NjbCx8dHTJkyRWzfvr3Cczw8jVYIIW7evCmeeeYZYWtrK1xcXMTYsWPFqVOnKkyDF0KIS5cuieHDhwsvLy9hYWEhfH19Rf/+/cUPP/ygLDNnzhwRGhoqnJ2dhY2NjWjatKn44IMPRFFRUZWvsbJp8EIIcfToUREZGSns7e2Fra2t6N69u9i/f79KGantKeX5hBBi5MiRQi6Xi4sXLwohhLh3756IiYkRjRo1EpaWlsLNzU106NBBfPzxxyqvraSkRHz00UeiadOmwtLSUri7u4s+ffqII0eOKMsUFxeLuLg4ERgYKCwsLISfn5+IiYlRWWJAiIrvvXJdu3YVXbt2VT6Wcs5LSkrEm2++Kdzd3YVMJlNOR6/uPFy6dElEREQIKysr4enpKaZNmyYSExPVvn/37t0revbsKRwcHISdnZ1o1aqV+Pzzz6uNodxXX30l2rZtK2xsbISDg4No2bKlmDJlirh27ZqyTGlpqYiLixPe3t7CxsZGdOvWTZw6dUr4+/tXOw1ek8/u1atXxeDBg4Wzs7NwcnISzz33nLh27ZoAIGbMmKEsV/4Zv3nzpsrxI0aMEHZ2dhVi6Nq1q3jssceUj8unwX/33XciJiZGeHh4CBsbG9GvXz/x999/V6jz4c+vlPN29OhRMWzYMNGwYUNhZWUlPDw8RP/+/cXhw4erPF9UO2RC6GhUGBERUR2RnJyM7t27Y+PGjVXOPCXTxTFAREREVO8wASIiIqJ6hwkQERER1TscA0RERET1DnuAiIiIqN5hAkRERET1jlEshLho0SJ89NFHyMjIQOvWrfH5558jNDS02uPWr1+PYcOGYeDAgdi8ebNyuxACM2bMwLJly5CdnY2OHTtiyZIlFW56VxmFQoFr167BwcFBq2XsiYiIqPYJIXDv3j34+PjAzKyaPh5DLkIkhBDr168XlpaWYvny5eL06dNizJgxwtnZWWRmZlZ5XFpamvD19RWdO3cWAwcOVNk3d+5c4eTkJDZv3ixOnDghBgwYIAIDA8X9+/clxfTPP/9UuYge//Ef//Ef//Ef/xnvv3/++afa33qDD4IOCwvDE088gS+++AJAWe+Ln58f3nzzTUydOlXtMaWlpejSpQtGjRqFlJQUZGdnK3uAhBDw8fHBpEmTMHnyZADA3bt34enpiZUrV1a7BH15eWdnZ/zzzz86v99RcXExduzYoVw6nQyD7WA82BbGge1gPNgW2svJyYGfnx+ys7Ph5ORUZVmDXgIrKirCkSNHEBMTo9xmZmaGiIgIpKamVnrcrFmz4OHhgdGjRyMlJUVlX1paGjIyMlTujOzk5ISwsDCkpqaqTYAKCwtVbkxXfmM8GxsbSXf61YS5uTlsbW1hY2PDN7YBsR2MB9vCOLAdjAfbQnvFxcUAIGn4ikEToFu3bqG0tLTCTSk9PT1x7tw5tcfs3bsX33zzjfJu0Q/LyMhQ1vFwneX7HhYfH6/2LtI7duyAra1tdS9DK4mJiXqplzTDdjAebAvjwHYwHmwLzeXn50suaxSDoKW6d+8eXn75ZSxbtkzSHYiliomJQXR0tPJxeRdar1699HIJLDExET179mRmb0BsB+PBtjAObAfjwbbQXk5OjuSyBk2A3NzcIJfLkZmZqbI9MzMTXl5eFcpfunQJ6enpeOqpp5TbFAoFgLIuw/PnzyuPy8zMhLe3t0qdISEhauOwsrKClZVVhe0WFhZ6e/Pps26Sju1gPNgWxoHtYDzYFprT5HwZdB0gS0tLtG3bFklJScptCoUCSUlJCA8Pr1C+adOm+PPPP3H8+HHlvwEDBqB79+44fvw4/Pz8EBgYCC8vL5U6c3JycPDgQbV1EhERUf1j8Etg0dHRGDFiBNq1a4fQ0FAsXLgQeXl5iIqKAgAMHz4cvr6+iI+Ph7W1NVq0aKFyvLOzMwCobJ84cSLmzJmDxo0bIzAwENOnT4ePjw8GDRpUWy+LiIiIjJjBE6AhQ4bg5s2biI2NRUZGBkJCQpCQkKAcxHzlypXqFzN6yJQpU5CXl4dXX30V2dnZ6NSpExISEmBtba2Pl0BERER1jMETIAAYP348xo8fr3ZfcnJylceuXLmywjaZTIZZs2Zh1qxZOoiOiIiITA3vBUZERET1DhMgIiIiqneM4hIYkS6VKgQOpWXhxr0CeDhYIzTQFXIz3tSWiIj+wwSITErCqeuY8fMpZN4rUm7zdLBE3MAW6N3Cu4ojiYioPuElMDIZCaeu47U1R1WSHwDIvFeE19YcRcKp6waKjIiIjA0TIDIJpQqB6O9PVFkm+vsTKFWIWoqIiIiMGRMgMgn7L9xCflFplWXyi0qx/8KtWoqIiIiMGRMgMgkbj1zRaTkiIjJtTIDIJJzNuKfTckREZNqYAJGJkDq2h2OAiIiICRCZCA8HG52WIyIi08YEiExC60ecdVqOiIhMGxMgMgkdG7vptBwREZk2JkBkEtoHNYCzrUWVZVxsLdA+qEEtRURERMaMCRCZBLmZDHOfblllmfinW/KeYEREBIAJEJmQ3i28sfSlNvBytFbZ7u1kjaUvteG9wIiISIk3QyWT0ruFN3o29+Ld4ImIqEpMgMjkyM1kCA/mWB8iIqocL4ERERFRvcMEiIiIiOodJkBERERU7zABIiIionqHCRARERHVO0yAiIiIqN5hAkRERET1DtcBIpNTVKLA6tR0/J2VD39XW7wcHgBLc+b6RET0HyZAZFLit53Bl3vSVLbN3noWY7sEIqZvcwNFRURExoZ/FpPJUJf8lPtyTxrit52p5YiIiMhYMQEik1BUoqg0+Sn35Z40FJUoaikiIiIyZkyAyCSs2HdZp+WIiMi0MQEik7D9VIZOyxERkWljAkQm4WrWPZ2WIyIi08YEiEzCzTxpY3ukliMiItNmFAnQokWLEBAQAGtra4SFheHQoUOVlt20aRPatWsHZ2dn2NnZISQkBKtXr1YpM3LkSMhkMpV/vXv31vfLIAMSOi5HRESmzeDrAG3YsAHR0dFYunQpwsLCsHDhQkRGRuL8+fPw8PCoUN7V1RXvvfcemjZtCktLS2zZsgVRUVHw8PBAZGSkslzv3r2xYsUK5WMrK6taeT1kGDJIS25k+g6EiIjqBIP3AC1YsABjxoxBVFQUmjdvjqVLl8LW1hbLly9XW75bt24YPHgwmjVrhuDgYEyYMAGtWrXC3r17VcpZWVnBy8tL+c/FxaU2Xg4ZSJCbrU7LERGRaTNoD1BRURGOHDmCmJgY5TYzMzNEREQgNTW12uOFENi1axfOnz+PefPmqexLTk6Gh4cHXFxc8OSTT2LOnDlo0KCB2noKCwtRWFiofJyTkwMAKC4uRnFxsTYvrVLl9em63vpu3ehQhM1LllTuwXZlOxge28I4sB2MB9tCe5qcM4MmQLdu3UJpaSk8PT1Vtnt6euLcuXOVHnf37l34+vqisLAQcrkcixcvRs+ePZX7e/fujaeffhqBgYG4dOkSpk2bhj59+iA1NRVyubxCffHx8YiLi6uwfceOHbC11U+PQWJiol7qrc/szWXILSnv1HzwYpf4//0KHNizU+UYtoPxYFsYB7aD8WBbaC4/P19yWYOPAdKGg4MDjh8/jtzcXCQlJSE6OhpBQUHo1q0bAGDo0KHKsi1btkSrVq0QHByM5ORk9OjRo0J9MTExiI6OVj7OycmBn58fevXqBUdHR53GXlxcjMTERPTs2RMWFhY6rbu+69sXCJ+XjFu5RQ/tkcHN3hKp73ZTbmE7GA+2hXFgOxgPtoX2yq/gSGHQBMjNzQ1yuRyZmZkq2zMzM+Hl5VXpcWZmZmjUqBEAICQkBGfPnkV8fLwyAXpYUFAQ3NzccPHiRbUJkJWVldpB0hYWFnp78+mz7vrs8Ps9kZVbhKFf7ceNe0XwcLDE+lc7wNXeUm15toPxYFsYB7aD8WBbaE6T82XQBMjS0hJt27ZFUlISBg0aBABQKBRISkrC+PHjJdejUChUxvA87OrVq7h9+za8vb1rGjLVAa72ltgR3c3QYRARkREz+CWw6OhojBgxAu3atUNoaCgWLlyIvLw8REVFAQCGDx8OX19fxMfHAygbr9OuXTsEBwejsLAQ27Ztw+rVq7FkyRIAQG5uLuLi4vDMM8/Ay8sLly5dwpQpU9CoUSOVafJERERUfxk8ARoyZAhu3ryJ2NhYZGRkICQkBAkJCcqB0VeuXIGZ2X+z9fPy8jBu3DhcvXoVNjY2aNq0KdasWYMhQ4YAAORyOU6ePIlVq1YhOzsbPj4+6NWrF2bPns21gIiIiAiAESRAADB+/PhKL3klJyerPJ4zZw7mzJlTaV02NjbYvn27LsMjIiIiE2PwhRCJiIiIahsTICIiIqp3mAARERFRvcMEiIiIiOodJkBERERU7zABIiIionqHCRARERHVO0yAiIiIqN5hAkRERET1DhMgIiIiqneYABEREVG9wwSIiIiI6h0mQERERFTvMAEiIiKieocJEBEREdU7TICIiIio3mECRERERPUOEyAiIiKqd5gAERERUb3DBIiIiIjqHSZAREREVO8wASIiIqJ6hwkQERER1TtMgIiIiKjeYQJERERE9Q4TICIiIqp3mAARERFRvcMEiIiIiOodJkBERERU7zABIiIionqHCRARERHVO0yAiIiIqN5hAkRERET1jlEkQIsWLUJAQACsra0RFhaGQ4cOVVp206ZNaNeuHZydnWFnZ4eQkBCsXr1apYwQArGxsfD29oaNjQ0iIiJw4cIFfb8MIiIiqiMMngBt2LAB0dHRmDFjBo4ePYrWrVsjMjISN27cUFve1dUV7733HlJTU3Hy5ElERUUhKioK27dvV5aZP38+PvvsMyxduhQHDx6EnZ0dIiMjUVBQUFsvi4iIiIyYwROgBQsWYMyYMYiKikLz5s2xdOlS2NraYvny5WrLd+vWDYMHD0azZs0QHByMCRMmoFWrVti7dy+Ast6fhQsX4v3338fAgQPRqlUrfPvtt7h27Ro2b95ci6+MiIiIjJW5IZ+8qKgIR44cQUxMjHKbmZkZIiIikJqaWu3xQgjs2rUL58+fx7x58wAAaWlpyMjIQEREhLKck5MTwsLCkJqaiqFDh1aop7CwEIWFhcrHOTk5AIDi4mIUFxdr/frUKa9P1/WSZtgOxoNtYRzYDsaDbaE9Tc6ZQROgW7duobS0FJ6enirbPT09ce7cuUqPu3v3Lnx9fVFYWAi5XI7FixejZ8+eAICMjAxlHQ/XWb7vYfHx8YiLi6uwfceOHbC1tdXoNUmVmJiol3pJM2wH48G2MA5sB+PBttBcfn6+5LIGTYC05eDggOPHjyM3NxdJSUmIjo5GUFAQunXrplV9MTExiI6OVj7OycmBn58fevXqBUdHRx1FXaa4uBiJiYno2bMnLCwsdFo3Scd2MB5sC+PAdjAebAvtlV/BkcKgCZCbmxvkcjkyMzNVtmdmZsLLy6vS48zMzNCoUSMAQEhICM6ePYv4+Hh069ZNeVxmZia8vb1V6gwJCVFbn5WVFaysrCpst7Cw0NubT591k3RsB+PBtjAObAfjwbbQnCbny6CDoC0tLdG2bVskJSUptykUCiQlJSE8PFxyPQqFQjmGJzAwEF5eXip15uTk4ODBgxrVSURERKarRj1AhYWFantONBEdHY0RI0agXbt2CA0NxcKFC5GXl4eoqCgAwPDhw+Hr64v4+HgAZeN12rVrh+DgYBQWFmLbtm1YvXo1lixZAgCQyWSYOHEi5syZg8aNGyMwMBDTp0+Hj48PBg0aVKNYiYiIyDRolAD99ttvWL9+PVJSUvDPP/9AoVDAzs4Ojz/+OHr16oWoqCj4+PhoFMCQIUNw8+ZNxMbGIiMjAyEhIUhISFAOYr5y5QrMzP7rqMrLy8O4ceNw9epV2NjYoGnTplizZg2GDBmiLDNlyhTk5eXh1VdfRXZ2Njp16oSEhARYW1trFBsRERGZJpkQQlRX6KeffsK7776Le/fuoW/fvggNDYWPjw9sbGyQlZWFU6dOISUlBampqRg5ciRmz54Nd3f32ohfL3JycuDk5IS7d+/qZRD0tm3b0LdvX17bNSC2g/FgWxgHtoPxYFtoT5Pfb0k9QPPnz8f//vc/9OnTR6U3ptzzzz8PAPj333/x+eefY82aNXj77be1CJ2IiIhI/yQlQFIWJQQAX19fzJ07t0YBEREREembwW+FQURERFTbJCdAzZs3R1ZWlvLxuHHjcOvWLeXjGzdu6G3VZCIiIiJdkpwAnTt3DiUlJcrHa9asUVlxUQjBu60TERFRnaD1JTB1k8dkMlmNgiEiIiKqDRwDRERERPWO5ARIJpNV6OFhjw8RERHVRZJXghZCoEePHjA3Lzvk/v37eOqpp2BpaQkAKuODiIiIiIyZ5ARoxowZKo8HDhxYocwzzzxT84iIiIiI9EzrBIiIiIiorqrR3eABYPfu3cjLy0N4eDhcXFx0ERMRERGRXklOgObNm4fc3FzMnj0bQNmYoD59+mDHjh0AAA8PDyQlJeGxxx7TT6REREREOiJ5FtiGDRvQokUL5eMffvgBe/bsQUpKCm7duoV27dohLi5OL0ESERER6ZLkBCgtLQ2tWrVSPt62bRueffZZdOzYEa6urnj//fcl3zSViIiIyJAkJ0AlJSWwsrJSPk5NTUWHDh2Uj318fFTuDUZERERkrCQnQMHBwdizZw8A4MqVK/jrr7/QpUsX5f6rV6+iQYMGuo+QiIiISMckD4J+4403MH78eKSkpODAgQMIDw9H8+bNlft37dqFxx9/XC9BEhEREemS5ARozJgxkMvl+PXXX9GlS5cK6wJdu3YNo0aN0nmARERERLqm0TpAo0aNqjTJWbx4sU4CIiIiItI33g2eiIiI6h3JPUByuVxSudLSUq2DISIiIqoNGt0N3t/fHyNGjOBgZyIiIqrTJCdAhw4dwjfffINPP/0UgYGBGDVqFF588UXe/4uIiIjqHMljgNq1a4clS5bg+vXriI6Oxk8//YRHHnkEQ4cORWJioj5jJCIiItIpjQdBW1tb46WXXkJSUhJOnTqFGzduoHfv3sjKytJHfEREREQ6p9E0+HJXr17FypUrsXLlSuTn5+Odd96Bo6OjrmMjIiIi0gvJCVBRURF++uknfPPNN0hJSUGfPn2wcOFC9OnTR/IMMSIiIiJjIDkB8vb2hoODA0aMGIHFixfDw8MDAJCXl6dSjj1BREREZOwkJ0B37tzBnTt3MHv2bMyZM6fCfiEEZDIZ1wEiIiIioyc5Afr999/1GQcRERFRrZGcAHXt2lWfcRARERHVGknT4B8e56Pr8kRERES1SVIC1KhRI8ydOxfXr1+vtIwQAomJiejTpw8+++wzjYJYtGgRAgICYG1tjbCwMBw6dKjSssuWLUPnzp3h4uICFxcXREREVCg/cuRIyGQylX+9e/fWKCYiIiIyXZIugSUnJ2PatGmYOXMmWrdujXbt2sHHxwfW1ta4c+cOzpw5g9TUVJibmyMmJgZjx46VHMCGDRsQHR2NpUuXIiwsDAsXLkRkZCTOnz+vnGn2cCzDhg1Dhw4dYG1tjXnz5qFXr144ffo0fH19leV69+6NFStWKB9bWVlJjomIiIhMm6QEqEmTJvjxxx9x5coVbNy4ESkpKdi/fz/u378PNzc3PP7441i2bJlWawItWLAAY8aMQVRUFABg6dKl2Lp1K5YvX46pU6dWKL927VqVx19//TV+/PFHJCUlYfjw4crtVlZW8PLy0igWIiIiqh80Wgm6YcOGmDRpEiZNmqSTJy8qKsKRI0cQExOj3GZmZoaIiAikpqZKqiM/Px/FxcVwdXVV2Z6cnAwPDw+4uLjgySefxJw5c9CgQQO1dRQWFqKwsFD5OCcnBwBQXFyM4uJiTV9Wlcrr03W9pBm2g/FgWxgHtoPxYFtoT5NzJhNCCD3GUqVr167B19cX+/fvR3h4uHL7lClTsHv3bhw8eLDaOsaNG4ft27fj9OnTsLa2BgCsX78etra2CAwMxKVLlzBt2jTY29sjNTVVbQ/VzJkzERcXV2H7unXrYGtrW4NXSERERLUlPz8fL7zwAu7evVvtwsxa3QvMWMydOxfr169HcnKyMvkBgKFDhyr/u2XLlmjVqhWCg4ORnJyMHj16VKgnJiYG0dHRysc5OTnw8/NDr169dL6ydXFxMRITE9GzZ09YWFjotG6Sju1gPNgWxoHtYDzYFtorv4IjhUETIDc3N8jlcmRmZqpsz8zMrHb8zscff4y5c+di586daNWqVZVlg4KC4ObmhosXL6pNgKysrNQOkrawsNDbm0+fdZN0bAfjwbYwDmwH48G20Jwm50vSNHh9sbS0RNu2bZGUlKTcplAokJSUpHJJ7GHz58/H7NmzkZCQgHbt2lX7PFevXsXt27fh7e2tk7iJiIiobtMoASopKcGsWbNw9epVnQUQHR2NZcuWYdWqVTh79ixef/115OXlKWeFDR8+XGWQ9Lx58zB9+nQsX74cAQEByMjIQEZGBnJzcwEAubm5eOedd3DgwAGkp6cjKSkJAwcORKNGjRAZGamzuImIiKju0igBMjc3x0cffYSSkhKdBTBkyBB8/PHHiI2NRUhICI4fP46EhAR4enoCAK5cuaKyAOOSJUtQVFSEZ599Ft7e3sp/H3/8MQBALpfj5MmTGDBgAB599FGMHj0abdu2RUpKCtcCIiIiIgBajAF68sknsXv3bgQEBOgsiPHjx2P8+PFq9yUnJ6s8Tk9Pr7IuGxsbbN++XUeRERERkSnSOAHq06cPpk6dij///BNt27aFnZ2dyv4BAwboLDgiIiIifdA4ARo3bhyAshWcHyaTyVBaWlrzqIiIiIj0SOMESKFQ6CMOIiIiolpj0GnwRERERIagVQK0e/duPPXUU2jUqBEaNWqEAQMGICUlRdexEREREemFxgnQmjVrEBERAVtbW7z11lt46623YGNjgx49emDdunX6iJGIiIhIpzQeA/TBBx9g/vz5ePvtt5Xb3nrrLSxYsACzZ8/GCy+8oNMAiYiIiHRN4x6gy5cv46mnnqqwfcCAAUhLS9NJUERERET6pHEC5Ofnp3LvrnI7d+6En5+fToIiIiIi0ieNL4FNmjQJb731Fo4fP44OHToAAPbt24eVK1fi008/1XmARERERLqmcQL0+uuvw8vLC5988gm+//57AECzZs2wYcMGDBw4UOcBEhEREemaRglQSUkJPvzwQ4waNQp79+7VV0xEREREeqXx3eDnz5+v07vBExEREdU2jQdB9+jRA7t379ZHLERERES1gneDJyIionqHd4MnIiKieod3gyciIqJ6R6MxQMXFxTA3N8epU6f0FQ8RERGR3mmUAFlYWKBhw4a8zEVERER1msazwN577z1MmzYNWVlZ+oiHiIiISO80HgP0xRdf4OLFi/Dx8YG/v3+FWWBHjx7VWXBERERE+qBxAjRo0CA9hEFERERUezROgGbMmKGPOIiIiIhqjeQxQIcOHapy8HNhYaHy5qhERERExkxyAhQeHo7bt28rHzs6OuLy5cvKx9nZ2Rg2bJhuoyMiIiLSA8kJkBCiyseVbSMiIiIyNhpPg6+KTCbTZXVEREREeqHTBIiIiIioLtBoFtiZM2eQkZEBoOxy17lz55CbmwsAuHXrlu6jIyIiItIDjRKgHj16qIzz6d+/P4CyS19CCF4CIyIiojpBcgKUlpamzziIiIiIao3kBMjf31+fcRARERHVGg6CJiIionrHKBKgRYsWISAgANbW1ggLC8OhQ4cqLbts2TJ07twZLi4ucHFxQURERIXyQgjExsbC29sbNjY2iIiIwIULF/T9MoiIiKiOMHgCtGHDBkRHR2PGjBk4evQoWrdujcjI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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_predictions = y_pred[:, 0]" + ], + "metadata": { + "id": "eCtK0lld25hU" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "threshold = np.percentile(mse, 85)\n", + "\n", + "y_pred = (mse > threshold).astype(int)\n", + "\n", + "accuracy = accuracy_score(target_test, y_pred)\n", + "conf_matrix = confusion_matrix(target_test, y_pred)\n", + "\n", + "print(f\"Accuracy: {accuracy}\")\n", + "print(\"Confusion Matrix:\")\n", + "print(conf_matrix)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Cthx5BQMf9s4", + "outputId": "f018d07e-be0f-45d5-d878-a71caf15eb87" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Accuracy: 0.951423778276787\n", + "Confusion Matrix:\n", + "[[185120 1676]\n", + " [ 9443 32659]]\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "threshold" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "eI41mMOGhHR-", + "outputId": "e65a603d-8bca-449b-9abb-c83ea788f1d5" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.03126554320373542" + ] + }, + "metadata": {}, + "execution_count": 176 + } + ] + }, + { + "cell_type": "code", + "source": [ + "precision = precision_score(target_test, y_pred)\n", + "recall = recall_score(target_test, y_pred)\n", + "f1 = f1_score(target_test, y_pred)\n", + "\n", + "print(f\"Precision: {precision}\")\n", + "print(f\"Recall: {recall}\")\n", + "print(f\"F1-score: {f1}\")\n", + "print(\"Classification Report:\")\n", + "print(classification_report(target_test, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Asvjur7Qf3z9", + "outputId": "4cf7ab54-58f1-4c76-c96e-a43a8e017135" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Precision: 0.9511868355905053\n", + "Recall: 0.7757113676309914\n", + "F1-score: 0.8545337990763635\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.95 0.99 0.97 186796\n", + " 1 0.95 0.78 0.85 42102\n", + "\n", + " accuracy 0.95 228898\n", + " macro avg 0.95 0.88 0.91 228898\n", + "weighted avg 0.95 0.95 0.95 228898\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "thresholds = np.linspace(min(mse), max(mse), num=100)\n", + "precision_list, recall_list, f1_list = [], [], []\n", + "\n", + "# Calculate precision, recall, and F1-score for each threshold\n", + "for threshold in thresholds:\n", + " predicted_anomalies = (mse > threshold).astype(int)\n", + " precision = precision_score(target_test, predicted_anomalies)\n", + " recall = recall_score(target_test, predicted_anomalies)\n", + " f1 = f1_score(target_test, predicted_anomalies)\n", + "\n", + " precision_list.append(precision)\n", + " recall_list.append(recall)\n", + " f1_list.append(f1)" + ], + "metadata": { + "id": "vfX01uj3M9w2" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "plt.figure(figsize=(8, 6))\n", + "plt.plot(thresholds, precision_list, label='Precision')\n", + "plt.plot(thresholds, recall_list, label='Recall')\n", + "plt.plot(thresholds, f1_list, label='F1-score')\n", + "plt.xlabel('Threshold')\n", + "plt.ylabel('Score')\n", + "plt.legend()\n", + "plt.title('Precision, Recall, and F1-score for different Thresholds')\n", + "plt.grid(True)\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 564 + }, + "id": "fAfUlHqNNPIz", + "outputId": "9504e8f2-811a-4feb-f1a0-e092e2014904" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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eTy9evXCnDlzkJeXh5dffhkbN27Etm3bXLJBNpsNQ4cORZ8+fTB37lx8++23eP7559G6dWvceeedfs2jM/mNNTExUTm2c+dO9O/fH02aNMG0adMQHR2Njz76CKNHj8ann36Kq666CgBQXFyMAQMGYPfu3bj11ltx0UUX4dSpU/jyyy9x9OhRJCUlobCwEG+99RZuvPFGTJo0CUVFRXj77bcxdOhQbN68uc4WJ3n7vB9++CGKioowefJkSJKEZ599FldffTX+/vtv5VpZs2YNrrnmGnTs2BFz5szB6dOnlf9Zecpmsyn/IJAZDAbExMT4/ZoBR2ZxyJAhSE5OxrRp05CQkICDBw/is88+cznvtttuw+LFizF8+HDcfvvtsFqt+PHHH/Hzzz+7/CVgyZIluPbaa/Hggw/il19+wZw5c7B79+4qwf7evXtx4403YvLkyZg0aRLat2+P0tJSDBw4EMeOHcPkyZPRrFkz/PTTT5g+fTpOnDiBl156qdrX8d577+HNN9/E5s2b8dZbbwEA+vXrF5BxVeftt9/G5MmT0a9fP9x///34+++/ceWVV6JRo0bIzMys9n7/93//h/bt2+PNN99Uyodat26N0aNH491338Xnn3+O+fPnIyYmBl26dFFe3/jx4zF06FA888wzKC0txfz583HxxRdj27ZtLv/w8fc9DgD279+Pa6+9FrfddhvGjx+PRYsWYcKECejRowc6deqESy65BPfeey9eeeUV/Oc//8EFF1wAAMrnQLjnnnuQmJiImTNn4uDBg3jppZcwZcoULFu2zOU8f64lb96bPRnPrFmzMHv2bGRlZeHOO+/E3r17MX/+fPz6669V5tiZEAL//Oc/sWHDBtxxxx244IIL8Pnnnyv/OHJ2zTXXYOfOnbjnnnvQokUL5OfnIzs7G4cPH+YC2XAniALgnXfeEQDEt99+K06ePCmOHDkili5dKho3biyMRqM4evSoEEKI8ePHCwBi2rRpLvf/8ccfBQDxwQcfuBxftWqVy/GCggIRGxsr+vTpI8rKylzOtdvtytfjx48XzZs3V76/7777RFxcnLBardW+hu+//14AEN9//70QQgiz2SxSUlLEhRde6PJcX3/9tQAgZsyY4fJ8AMTjjz/u8pjdu3cXPXr0qPY5a+JuTj/55BORnJws9Hq9OHLkiHLu5ZdfLjp37izKy8uV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b7yBgQMHYt68eYiPj8fSpUuh1Tq6JrVr10557Msuu8zlud58800kJCTghx9+wBVXXBG8FxlGGPQGkyHesSXx2YOOxWytBoV4QK5sdoH7l27HqWITOqTFMuANIY1T0MtevUREXtBGOTKuoXpuL1x66aWYP38+SkpK8OKLL0Kj0eCaa67Bzp07UVpaisGDB7ucbzab0b17dwDA9u3bMWDAACXgrSwvLw+PPvoo1q1bh/z8fNhsNpSWluLw4cO+vbYIwKA32NK6VAS9f4Rd0Pvqd/vw04HTiNKpMe/mixjwhpCKmV4iIt9Iks8lBsEWHR2NNm3aAAAWLVqErl274u2338aFF14IAFixYgWaNGnich+9Xg8AMBprbhM6fvx4nD59Gi+//DKaN28OvV6Pvn37wmw218ErqR8Y9AZbWhdg95dht5jtp/2n8PLafQCAp67qjNbJMSEeEWlUEqx2wUwvEVEDoFKp8J///AdTp07FX3/9Bb1ej8OHD2PgwIFuz+/SpQuWLFkCi8XiNtu7ceNGvP766xgxYgQA4MiRIzh16lSdvoZwx+4NwRaGi9lOFplw3zJHHe/1PTMxunuT2u9EdU6u67Uz6CUiahCuu+46qNVqvPHGG3jooYfwwAMPYMmSJThw4AB+++03vPrqq0pv3ylTpqCwsBA33HADtmzZgn379uG9997D3r17AQBt27bFe++9h927d+OXX37BzTffXGt2ONIx6A02uW3Zqb8AS1loxwLHn84fWLYdJ4tMaJ8ai1lXdgr1kKiCXNfLTC8RUcOg0WgwZcoUPPvss5g+fToee+wxzJkzBxdccAGGDRuGFStWoGXLlgCAxo0b47vvvkNxcTEGDhyIHj16YOHChUrW9+2338bZs2dx0UUXYezYsbj33nuRkpISypcXcixvCLbYdCAqCSg9BeTvApr0COlwFv74NzbsPwWjVo15N3eHUcc63nChctqVjYiIIsvixYvdHp82bRqmTZsGALjvvvtw3333VfsYXbp0werVq93e1r17d/z6668ux6699lqX7513/GzRokXE7wDKTG+wSVJYbVLxv82OVZyPXdERbVIaZt++cMVMLxERUeAw6A0FOegNcV3vkTOlOHS6FBqVhCu7haiRN1VLXbFBBWt6iYiI/MegNxTSuzo+hzjo/XGfYxVn92YJiNGz0iXcMNNLREQUOAx6Q0HO9Ob9CdhtIRvGhv0nAQAD2iaHbAxUPTVreomIiAKGQW8oNG4DaIyO/cFP7w/JEGx2gY37TwMALm6bFJIxUM0Y9BIREQUOg95QUKmBDMc2gjj8c0iG8MexczhXZkGsQYMuTeJDMgaqmVzeYIvw1bRERETBwKA3VJr3dXw+vCkkT79hn6O0oV/rxtCoeRmEI2Z6iYiIAofRTqg06+f4fOinkDy9vIjtYtbzhi01F7IREREFDIPeUMnsDUgqoOAQUHg8qE9dYrLit8NnAQCXsJ43bDHTS0REFDgMekPFEHe+i0OQs72/5JyGxSaQ2ciI5o2jg/rc5DkNg14iIqKAYdAbSiEqcVBKG9qwtCGcMdNLRBS5JkyYAEmSqnzs378f69evx6hRo5CRkQFJkrB8+fJQDzciMOgNpRAtZttQEfQOYGlDWNNU7MjGml4iosg0bNgwnDhxwuWjZcuWKCkpQdeuXTFv3rxQD7FaZrM51EPwGoPeUJIzvfm7gNIzQXnKE+fKsC+/GCrJ0bmBwldFzMtMLxGRF4QQKLWUhuRDeNliUq/XIy0tzeVDrVZj+PDhePLJJ3HVVVd59bpnzZqFZs2aQa/XIyMjA/fee69yu8lkwiOPPILMzEzo9Xq0adMGb7/9tnL7Dz/8gN69e0Ov1yM9PR3Tpk2D1WpVbh80aBCmTJmC+++/H0lJSRg6dCgA4M8//8Tw4cMRExOD1NRUjB07FqdOnfJqHoKFe8+GUkwy0LgtcHofcOQXoP3wOn9KOcvbuWkCEqJ0df585DvnTK82xGMhIqovyqxl6PNhn5A89y83/YIobVRInvvTTz/Fiy++iKVLl6JTp07Izc3Fjh07lNvHjRuHTZs24ZVXXkHXrl2Rk5OjBKfHjh3DiBEjMGHCBLz77rvYs2cPJk2aBIPBgFmzZimPsWTJEtx5553YuHEjAKCgoACXXXYZbr/9drz44osoKyvDI488gjFjxuC7774L6uv3BIPeUGve1xH0HtoYnKB3f0VpQxuWNoQ7uabXzkwvEVFE+vrrrxETE6N8P3z4cHz88cc+Pdbhw4eRlpaGrKwsaLVaNGvWDL179wYA/PXXX/joo4+QnZ2NrKwsAECrVq2U+77++uvIzMzEa6+9BkmS0KFDBxw/fhyPPPIIZsyYAVVFEqZt27Z49tlnlfs9+eST6N69O5566inl2KJFi5CZmYm//voL7dq18+m11BUGvaHWrB/w27vAobqv67XbBTbul/vzMugNdxqnPr36EI+FiKi+MGqM+OWmX0L23N649NJLMX/+fOX76GjPOio99dRTLoHmrl27cN111+Gll15Cq1atMGzYMIwYMQKjRo2CRqPB9u3boVarMXDgQLePt3v3bvTt2xeSJCnH+vfvj+LiYhw9ehTNmjUDAPTo0cPlfjt27MD333/vErjLDhw4wKCXKpEXs53YDphLAF3dtRDbnVuIU8VmROnUuKhZYp09DwWGit0biIi8JklSyEoMvBUdHY02bdp4fb877rgDY8aMUb7PyMiARqPB3r178e233yI7Oxt33XUXnnvuOfzwww8wGr0Lxmsar7Pi4mKMGjUKzzzzTJVz09PTA/KcgcSgN9QSmgNxTYDCY8DRLUAr9/8KCwS5nvcfrRpDp+EaxnB3vk+vPcQjISKicNKoUSM0atSoynGj0YhRo0Zh1KhRuPvuu9GhQwf88ccf6Ny5M+x2O3744QelvMHZBRdcgE8//RRCCCXbu3HjRsTGxqJp06bVjuOiiy7Cp59+ihYtWkCjCf+QkpFPqEkS0Cw4rcvket6LWc9bLyh9epnoJSJqUIqLi7F9+3Zs374dAJCTk4Pt27fj8OHD1d5n8eLFePvtt/Hnn3/i77//xvvvvw+j0YjmzZujRYsWGD9+PG699VYsX74cOTk5WLduHT766CMAwF133YUjR47gnnvuwZ49e/DFF19g5syZmDp1qlLP687dd9+NM2fO4MYbb8Svv/6KAwcOYPXq1Zg4cSJsNltA5yQQGPSGA7nE4dDGOnuKcosNm3McbdHYn7d+4I5sREQN05YtW9C9e3d0794dADB16lR0794dM2bMqPY+CQkJWLhwIfr3748uXbrg22+/xVdffYXGjR3tSefPn49rr70Wd911Fzp06IBJkyahpKQEANCkSROsXLkSmzdvRteuXXHHHXfgtttuw6OPPlrjODMyMrBx40bYbDYMGTIEnTt3xv3334+EhIQag+VQCf9cdEMg9+s9ugWwWQB14BtU/XrwDExWO1Lj9GiTUrXgnMKPSlnIxvIGIqJIs3jx4mpvGzRokNc9f0ePHo3Ro0dXe7vBYMALL7yAF154we3tAwcOxObNm6u9/7p169web9u2LT777DNvhhoy4ReGN0TJHQBDAmAp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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "max(f1_list)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WzRVfdsCcvvB", + "outputId": "9da4cdb1-3226-4e6c-9d33-35355bb6857f" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.8558930166570332" + ] + }, + "metadata": {}, + "execution_count": 173 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MD_BvVZ0mrXq" + }, + "source": [ + "## **Baseline 2 : Isolation Forest**\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "p_Qk7L5AAB7I" + }, + "outputs": [], + "source": [ + "model = IsolationForest(n_estimators=100, max_samples='auto', contamination=float(.01),\n", + " max_features=1.0, bootstrap=False, n_jobs=-1, random_state=42, verbose=0)" + ] + }, + { + "cell_type": "code", + "source": [ + "model.fit(df_train)" + ], + "metadata": { + "id": "iDVHN0_oAuPw", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 74 + }, + "outputId": "66c11888-a5c7-4674-fac7-b953344ac3c2" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "IsolationForest(contamination=0.01, n_jobs=-1, random_state=42)" + ], + "text/html": [ + "
IsolationForest(contamination=0.01, n_jobs=-1, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ] + }, + "metadata": {}, + "execution_count": 37 + } + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4GZqdbuUEBDT" + }, + "outputs": [], + "source": [ + "predictions = model.predict(df_test)\n", + "\n", + "binary_predictions = [1 if pred == -1 else 0 for pred in predictions]\n", + "\n", + "true_labels = target_test\n", + "predicted_labels = binary_predictions" + ] + }, + { + "cell_type": "code", + "source": [ + "accuracy = accuracy_score(true_labels, predicted_labels)\n", + "confusion = confusion_matrix(true_labels, predicted_labels)\n", + "precision = precision_score(true_labels, predicted_labels)\n", + "recall = recall_score(true_labels, predicted_labels)\n", + "f1 = f1_score(true_labels, predicted_labels)\n", + "\n", + "print(\"Accuracy:\", accuracy)\n", + "print(\"Confusion Matrix:\")\n", + "print(confusion)\n", + "print(\"Precision:\", precision)\n", + "print(\"Recall:\", recall)\n", + "print(\"F1 Score:\", f1)\n", + "print(\"Classification Report:\")\n", + "print(classification_report(true_labels, predicted_labels))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EoxiH_PvIkDg", + "outputId": "1a6ac079-ce82-4088-ec46-f00d0b735bad" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Accuracy: 0.9459453555732248\n", + "Confusion Matrix:\n", + "[[184552 2244]\n", + " [ 10129 31973]]\n", + "Precision: 0.9344185638717597\n", + "Recall: 0.759417604864377\n", + "F1 Score: 0.8378778547936949\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.95 0.99 0.97 186796\n", + " 1 0.93 0.76 0.84 42102\n", + "\n", + " accuracy 0.95 228898\n", + " macro avg 0.94 0.87 0.90 228898\n", + "weighted avg 0.95 0.95 0.94 228898\n", + "\n" + ] + } + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file