From b7474d8a593ec6131a2fc5b9a9dca4bdf52d79c4 Mon Sep 17 00:00:00 2001
From: mas1u19 <mas1u19@soton.ac.uk>
Date: Wed, 7 Jun 2023 21:52:35 +0000
Subject: [PATCH] Upload New File

---
 Part_A_Binary.ipynb | 2883 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 2883 insertions(+)
 create mode 100644 Part_A_Binary.ipynb

diff --git a/Part_A_Binary.ipynb b/Part_A_Binary.ipynb
new file mode 100644
index 0000000..0f103e1
--- /dev/null
+++ b/Part_A_Binary.ipynb
@@ -0,0 +1,2883 @@
+{
+ "cells": [
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "5354ae81",
+   "metadata": {},
+   "source": [
+    "# Coursework 2\n",
+    "\n",
+    "## Part A\n",
+    "### A.1\tProblem Description\n",
+    "The task requires the design and implementation of a ML model to classify 100 test traces as normal or abnormal events. The dataset contains 6,000 system traces where half of them is labelled as 0 (normal events) and the other half as 1 (abnormal data injection attack events). Each trace has 128 features where the first 116 columns represent measurements from four PMUs and the remaining 12 columns contain control panel logs, Snort alerts and relay logs. Meanwhile, the last column represents the label. The goal is to predict the labels of 100 test traces without labels using the training dataset to train the ML model.\n",
+    "\n",
+    "### A.2\tData Pre-processing \n",
+    "`Pandas library` is used for data processing given data is available in tabular form. The consistency, missing or invalid entries is checked first and foremost. Categorical data were observed and will be mapped to binary using dummies. Non-categorical data will be normalised.\n",
+    "\n",
+    "Given target values are split between normal and anomalous samples we can start with a logistical regression to find a good fit. The data may be further broken into training and test. The test data that is provided will be used as final validator on accuracy of ML model.\n",
+    "\n",
+    "First, let's do some basic analysis of input data. (Please note that both Training and Test data had missing headers as described in the assignment. This has been manually added.)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1609,
+   "id": "3997c6f9",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import matplotlib.pyplot as plt"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1610,
+   "id": "70a5a0d9",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "RangeIndex: 6000 entries, 0 to 5999\n",
+      "Columns: 129 entries, R1-PA1:VH to marker\n",
+      "dtypes: float64(112), int64(17)\n",
+      "memory usage: 5.9 MB\n"
+     ]
+    }
+   ],
+   "source": [
+    "raw_data = pd.read_csv('TrainingDataBinary.csv')\n",
+    "raw_data.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1611,
+   "id": "a10544aa",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(6000, 129)"
+      ]
+     },
+     "execution_count": 1611,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "raw_data.shape"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1612,
+   "id": "65f549be",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "C:\\Users\\syeda\\AppData\\Local\\Temp\\ipykernel_28668\\39642624.py:1: FutureWarning: In a future version of pandas all arguments of DataFrame.any and Series.any will be keyword-only.\n",
+      "  len(raw_data[raw_data.isnull().any(1)])\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "0"
+      ]
+     },
+     "execution_count": 1612,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(raw_data[raw_data.isnull().any(1)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1613,
+   "id": "d592ca2b",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "Int64Index: 6000 entries, 0 to 5999\n",
+      "Columns: 129 entries, R1-PA1:VH to marker\n",
+      "dtypes: float64(112), int64(17)\n",
+      "memory usage: 6.0 MB\n"
+     ]
+    }
+   ],
+   "source": [
+    "raw_data.drop_duplicates(keep='first', inplace=True)\n",
+    "raw_data.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1614,
+   "id": "283c569c",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 1614,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "raw_data.columns[raw_data.isnull().any()].tolist()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1615,
+   "id": "ed5a0f8a",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "0    3000\n",
+       "1    3000\n",
+       "Name: marker, dtype: int64"
+      ]
+     },
+     "execution_count": 1615,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "raw_data['marker'].value_counts()"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "8d15070d",
+   "metadata": {},
+   "source": [
+    "So, there are 6000 rows of all not-null data and the target column *marker* has value 0 and 1. Further, it's equally divided giving us a good stable sample."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1616,
+   "id": "081e4ad7",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>R1-PA1:VH</th>\n",
+       "      <th>R1-PM1:V</th>\n",
+       "      <th>R1-PA2:VH</th>\n",
+       "      <th>R1-PM2:V</th>\n",
+       "      <th>R1-PA3:VH</th>\n",
+       "      <th>R1-PM3:V</th>\n",
+       "      <th>R1-PA4:IH</th>\n",
+       "      <th>R1-PM4:I</th>\n",
+       "      <th>R1-PA5:IH</th>\n",
+       "      <th>R1-PM5:I</th>\n",
+       "      <th>...</th>\n",
+       "      <th>control_panel_log4</th>\n",
+       "      <th>relay1_log</th>\n",
+       "      <th>relay2_log</th>\n",
+       "      <th>relay3_log</th>\n",
+       "      <th>relay4_log</th>\n",
+       "      <th>snort_log1</th>\n",
+       "      <th>snort_log2</th>\n",
+       "      <th>snort_log3</th>\n",
+       "      <th>snort_log4</th>\n",
+       "      <th>marker</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>5900</th>\n",
+       "      <td>67.385566</td>\n",
+       "      <td>131108.1288</td>\n",
+       "      <td>-52.591796</td>\n",
+       "      <td>131083.0556</td>\n",
+       "      <td>-172.586347</td>\n",
+       "      <td>131183.3486</td>\n",
+       "      <td>63.208704</td>\n",
+       "      <td>488.17126</td>\n",
+       "      <td>-57.307239</td>\n",
+       "      <td>493.11523</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2981</th>\n",
+       "      <td>-106.856629</td>\n",
+       "      <td>132085.9864</td>\n",
+       "      <td>133.161121</td>\n",
+       "      <td>131459.1546</td>\n",
+       "      <td>13.166570</td>\n",
+       "      <td>132136.1329</td>\n",
+       "      <td>-107.698877</td>\n",
+       "      <td>322.63982</td>\n",
+       "      <td>132.301685</td>\n",
+       "      <td>322.82293</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2293</th>\n",
+       "      <td>-92.704571</td>\n",
+       "      <td>130757.1031</td>\n",
+       "      <td>147.318908</td>\n",
+       "      <td>130732.0298</td>\n",
+       "      <td>27.330087</td>\n",
+       "      <td>130832.3229</td>\n",
+       "      <td>-69.345082</td>\n",
+       "      <td>373.17818</td>\n",
+       "      <td>154.635579</td>\n",
+       "      <td>591.26219</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1276</th>\n",
+       "      <td>-32.268983</td>\n",
+       "      <td>132311.6458</td>\n",
+       "      <td>-152.263534</td>\n",
+       "      <td>131659.7408</td>\n",
+       "      <td>87.748486</td>\n",
+       "      <td>132361.7923</td>\n",
+       "      <td>-31.948127</td>\n",
+       "      <td>281.80629</td>\n",
+       "      <td>-151.151996</td>\n",
+       "      <td>279.97519</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2346</th>\n",
+       "      <td>137.635922</td>\n",
+       "      <td>131734.9606</td>\n",
+       "      <td>17.664289</td>\n",
+       "      <td>131709.8873</td>\n",
+       "      <td>-102.335992</td>\n",
+       "      <td>131810.1804</td>\n",
+       "      <td>138.312012</td>\n",
+       "      <td>356.51517</td>\n",
+       "      <td>16.060007</td>\n",
+       "      <td>367.13555</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "<p>5 rows × 129 columns</p>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "       R1-PA1:VH     R1-PM1:V   R1-PA2:VH     R1-PM2:V   R1-PA3:VH  \\\n",
+       "5900   67.385566  131108.1288  -52.591796  131083.0556 -172.586347   \n",
+       "2981 -106.856629  132085.9864  133.161121  131459.1546   13.166570   \n",
+       "2293  -92.704571  130757.1031  147.318908  130732.0298   27.330087   \n",
+       "1276  -32.268983  132311.6458 -152.263534  131659.7408   87.748486   \n",
+       "2346  137.635922  131734.9606   17.664289  131709.8873 -102.335992   \n",
+       "\n",
+       "         R1-PM3:V   R1-PA4:IH   R1-PM4:I   R1-PA5:IH   R1-PM5:I  ...  \\\n",
+       "5900  131183.3486   63.208704  488.17126  -57.307239  493.11523  ...   \n",
+       "2981  132136.1329 -107.698877  322.63982  132.301685  322.82293  ...   \n",
+       "2293  130832.3229  -69.345082  373.17818  154.635579  591.26219  ...   \n",
+       "1276  132361.7923  -31.948127  281.80629 -151.151996  279.97519  ...   \n",
+       "2346  131810.1804  138.312012  356.51517   16.060007  367.13555  ...   \n",
+       "\n",
+       "      control_panel_log4  relay1_log  relay2_log  relay3_log  relay4_log  \\\n",
+       "5900                   0           0           0           0           0   \n",
+       "2981                   0           0           0           0           0   \n",
+       "2293                   0           0           0           0           0   \n",
+       "1276                   0           0           0           0           0   \n",
+       "2346                   0           0           0           0           0   \n",
+       "\n",
+       "      snort_log1  snort_log2  snort_log3  snort_log4  marker  \n",
+       "5900           0           0           0           0       0  \n",
+       "2981           0           0           0           0       1  \n",
+       "2293           0           0           0           0       1  \n",
+       "1276           0           0           0           0       1  \n",
+       "2346           0           0           0           0       1  \n",
+       "\n",
+       "[5 rows x 129 columns]"
+      ]
+     },
+     "execution_count": 1616,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "raw_data.sample(n=5)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1617,
+   "id": "989201f2",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array(['R1-PA1:VH', 'R1-PM1:V', 'R1-PA2:VH', 'R1-PM2:V', 'R1-PA3:VH',\n",
+       "       'R1-PM3:V', 'R1-PA4:IH', 'R1-PM4:I', 'R1-PA5:IH', 'R1-PM5:I',\n",
+       "       'R1-PA6:IH', 'R1-PM6:I', 'R1-PA7:VH', 'R1-PM7:V', 'R1-PA8:VH',\n",
+       "       'R1-PM8:V', 'R1-PA9:VH', 'R1-PM9:V', 'R1-PA10:IH', 'R1-PM10:I',\n",
+       "       'R1-PA11:IH', 'R1-PM11:I', 'R1-PA12:IH', 'R1-PM12:I', 'R1:F',\n",
+       "       'R1:DF', 'R1-PA:Z', 'R1-PA:ZH', 'R1:S', 'R2-PA1:VH', 'R2-PM1:V',\n",
+       "       'R2-PA2:VH', 'R2-PM2:V', 'R2-PA3:VH', 'R2-PM3:V', 'R2-PA4:IH',\n",
+       "       'R2-PM4:I', 'R2-PA5:IH', 'R2-PM5:I', 'R2-PA6:IH', 'R2-PM6:I',\n",
+       "       'R2-PA7:VH', 'R2-PM7:V', 'R2-PA8:VH', 'R2-PM8:V', 'R2-PA9:VH',\n",
+       "       'R2-PM9:V', 'R2-PA10:IH', 'R2-PM10:I', 'R2-PA11:IH', 'R2-PM11:I',\n",
+       "       'R2-PA12:IH', 'R2-PM12:I', 'R2:F', 'R2:DF', 'R2-PA:Z', 'R2-PA:ZH',\n",
+       "       'R2:S', 'R3-PA1:VH', 'R3-PM1:V', 'R3-PA2:VH', 'R3-PM2:V',\n",
+       "       'R3-PA3:VH', 'R3-PM3:V', 'R3-PA4:IH', 'R3-PM4:I', 'R3-PA5:IH',\n",
+       "       'R3-PM5:I', 'R3-PA6:IH', 'R3-PM6:I', 'R3-PA7:VH', 'R3-PM7:V',\n",
+       "       'R3-PA8:VH', 'R3-PM8:V', 'R3-PA9:VH', 'R3-PM9:V', 'R3-PA10:IH',\n",
+       "       'R3-PM10:I', 'R3-PA11:IH', 'R3-PM11:I', 'R3-PA12:IH', 'R3-PM12:I',\n",
+       "       'R3:F', 'R3:DF', 'R3-PA:Z', 'R3-PA:ZH', 'R3:S', 'R4-PA1:VH',\n",
+       "       'R4-PM1:V', 'R4-PA2:VH', 'R4-PM2:V', 'R4-PA3:VH', 'R4-PM3:V',\n",
+       "       'R4-PA4:IH', 'R4-PM4:I', 'R4-PA5:IH', 'R4-PM5:I', 'R4-PA6:IH',\n",
+       "       'R4-PM6:I', 'R4-PA7:VH', 'R4-PM7:V', 'R4-PA8:VH', 'R4-PM8:V',\n",
+       "       'R4-PA9:VH', 'R4-PM9:V', 'R4-PA10:IH', 'R4-PM10:I', 'R4-PA11:IH',\n",
+       "       'R4-PM11:I', 'R4-PA12:IH', 'R4-PM12:I', 'R4:F', 'R4:DF', 'R4-PA:Z',\n",
+       "       'R4-PA:ZH', 'R4:S', 'control_panel_log1', 'control_panel_log2',\n",
+       "       'control_panel_log3', 'control_panel_log4', 'relay1_log',\n",
+       "       'relay2_log', 'relay3_log', 'relay4_log', 'snort_log1',\n",
+       "       'snort_log2', 'snort_log3', 'snort_log4', 'marker'], dtype=object)"
+      ]
+     },
+     "execution_count": 1617,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "column_names = raw_data.columns.values\n",
+    "column_names"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "131b20d5",
+   "metadata": {},
+   "source": [
+    "### A.3\tAdvanced Data Analysis\n",
+    "It is understood that first 116 columns have current/voltage data so these are continuous real value data. Next 16 columns are switch (0/1) and last column is target that was just observed to contain half as 0 and other half as 1.\n",
+    "\n",
+    "Let's normalise real value data removing anomalous values, if any.\n",
+    "\n",
+    "Minimum, maximum, and number of unique data points for each feature are computed."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1618,
+   "id": "80f7ee9a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "Int64Index: 129 entries, 0 to 128\n",
+      "Data columns (total 3 columns):\n",
+      " #   Column  Non-Null Count  Dtype  \n",
+      "---  ------  --------------  -----  \n",
+      " 0   minn    129 non-null    float64\n",
+      " 1   maxx    129 non-null    float64\n",
+      " 2   uniq    129 non-null    int64  \n",
+      "dtypes: float64(2), int64(1)\n",
+      "memory usage: 4.0 KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "minn = [raw_data[c].min() for c in column_names]\n",
+    "maxx = [raw_data[c].max() for c in column_names]\n",
+    "uniq = [len(raw_data[c].unique()) for c in column_names]\n",
+    "idx=[x for x in range(len(minn))]\n",
+    "data_stat = pd.DataFrame({\"minn\": minn, \"maxx\": maxx, \"uniq\": uniq},index=idx)\n",
+    "data_stat.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1619,
+   "id": "0d21a61e",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>minn</th>\n",
+       "      <th>maxx</th>\n",
+       "      <th>uniq</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>116</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>117</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>118</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>119</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>126</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>127</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "     minn  maxx  uniq\n",
+       "116   0.0   0.0     1\n",
+       "117   0.0   0.0     1\n",
+       "118   0.0   0.0     1\n",
+       "119   0.0   0.0     1\n",
+       "126   0.0   0.0     1\n",
+       "127   0.0   0.0     1"
+      ]
+     },
+     "execution_count": 1619,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "#Feature with the same value across the sample\n",
+    "data_stat[data_stat.uniq == 1]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1620,
+   "id": "ad863ae4",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>minn</th>\n",
+       "      <th>maxx</th>\n",
+       "      <th>uniq</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>28</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>270336.0</td>\n",
+       "      <td>4</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>57</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>270336.0</td>\n",
+       "      <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>86</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>270336.0</td>\n",
+       "      <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>115</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>270336.0</td>\n",
+       "      <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>116</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>117</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>118</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>119</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>120</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>121</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>122</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>123</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>124</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>125</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>126</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>127</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>128</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>2</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "     minn      maxx  uniq\n",
+       "28    0.0  270336.0     4\n",
+       "57    0.0  270336.0     2\n",
+       "86    0.0  270336.0     3\n",
+       "115   0.0  270336.0     3\n",
+       "116   0.0       0.0     1\n",
+       "117   0.0       0.0     1\n",
+       "118   0.0       0.0     1\n",
+       "119   0.0       0.0     1\n",
+       "120   0.0       1.0     2\n",
+       "121   0.0       1.0     2\n",
+       "122   0.0       1.0     2\n",
+       "123   0.0       1.0     2\n",
+       "124   0.0       1.0     2\n",
+       "125   0.0       1.0     2\n",
+       "126   0.0       0.0     1\n",
+       "127   0.0       0.0     1\n",
+       "128   0.0       1.0     2"
+      ]
+     },
+     "execution_count": 1620,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "#Looking for categorical features... looking for feature with no more than 9 unique values\n",
+    "data_stat[data_stat.uniq < 10]"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "2ff927af",
+   "metadata": {},
+   "source": [
+    "Columns 116 onward are control values and were expected to be 0 or 1. Moreover column# 116-119 and 126-127 have all 0 and therefore, can be dropped.\n",
+    "\n",
+    "It's also interesting to note that 4 other columns have categorical data. Let's explore these."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1621,
+   "id": "71c92946",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([     0,   2058,   2048, 270336], dtype=int64)"
+      ]
+     },
+     "execution_count": 1621,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "raw_data[column_names[28]].unique()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1622,
+   "id": "6f86ffd4",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([     0, 270336], dtype=int64)"
+      ]
+     },
+     "execution_count": 1622,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "raw_data[column_names[57]].unique()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1623,
+   "id": "2311b43d",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([     0,   2048, 270336], dtype=int64)"
+      ]
+     },
+     "execution_count": 1623,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "raw_data[column_names[86]].unique()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1624,
+   "id": "726a7bb9",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([     0,   2058, 270336], dtype=int64)"
+      ]
+     },
+     "execution_count": 1624,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "raw_data[column_names[115]].unique()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1625,
+   "id": "1cfdd4ba",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['R1:S', 'R2:S', 'R3:S', 'R4:S']"
+      ]
+     },
+     "execution_count": 1625,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[column_names[28], column_names[57], column_names[86], column_names[115]]"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "b3d245bd",
+   "metadata": {},
+   "source": [
+    "So, columns R#:S have categorical values that take on 4 possible values of 0, 2048, 2058, and 270336. Dummy columns are created to hold binary and drop original data."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1626,
+   "id": "9f105bf3",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>R1:S_0</th>\n",
+       "      <th>R1:S_2048</th>\n",
+       "      <th>R1:S_2058</th>\n",
+       "      <th>R1:S_270336</th>\n",
+       "      <th>R2:S_0</th>\n",
+       "      <th>R2:S_270336</th>\n",
+       "      <th>R3:S_0</th>\n",
+       "      <th>R3:S_2048</th>\n",
+       "      <th>R3:S_270336</th>\n",
+       "      <th>R4:S_0</th>\n",
+       "      <th>R4:S_2058</th>\n",
+       "      <th>R4:S_270336</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>3088</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1152</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>5995</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2602</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3244</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2722</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "      R1:S_0  R1:S_2048  R1:S_2058  R1:S_270336  R2:S_0  R2:S_270336  R3:S_0  \\\n",
+       "3088       1          0          0            0       1            0       1   \n",
+       "1152       1          0          0            0       1            0       1   \n",
+       "5995       1          0          0            0       1            0       1   \n",
+       "2602       1          0          0            0       1            0       1   \n",
+       "3244       1          0          0            0       1            0       1   \n",
+       "2722       1          0          0            0       1            0       1   \n",
+       "\n",
+       "      R3:S_2048  R3:S_270336  R4:S_0  R4:S_2058  R4:S_270336  \n",
+       "3088          0            0       1          0            0  \n",
+       "1152          0            0       1          0            0  \n",
+       "5995          0            0       1          0            0  \n",
+       "2602          0            0       1          0            0  \n",
+       "3244          0            0       1          0            0  \n",
+       "2722          0            0       1          0            0  "
+      ]
+     },
+     "execution_count": 1626,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "#lets make a copy of original\n",
+    "df = raw_data.copy()\n",
+    "df.replace([np.inf, -np.inf], np.nan, inplace=True)\n",
+    "df.dropna(inplace=True)\n",
+    "\n",
+    "column_names_RS = [column_names[28], column_names[57], column_names[86], column_names[115]]\n",
+    "RS_frame = df[column_names_RS]\n",
+    "RS_frame = RS_frame.astype('int')\n",
+    "RS_frame = RS_frame.astype('category')\n",
+    "RS_frame = pd.get_dummies(RS_frame, dtype=int)\n",
+    "RS_frame.sample(n=6)"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "54517212",
+   "metadata": {},
+   "source": [
+    "We have created dummy columns corresponding to categorical values of RS. We can drop these now."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1627,
+   "id": "19de15f6",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "6000 rows\n",
+      "** R1-PA1:VH:5530 (92%) here\n",
+      "** R1-PM1:V:357 (5%) here\n",
+      "** R1-PA2:VH:5550 (92%) here\n",
+      "** R1-PM2:V:347 (5%) here\n",
+      "** R1-PA3:VH:5515 (91%) here\n",
+      "** R1-PM3:V:350 (5%) here\n",
+      "** R1-PA4:IH:5616 (93%) here\n",
+      "** R1-PM4:I:1587 (26%) here\n",
+      "** R1-PA5:IH:5566 (92%) here\n",
+      "** R1-PM5:I:1489 (24%) here\n",
+      "** R1-PA6:IH:5569 (92%) here\n",
+      "** R1-PM6:I:1570 (26%) here\n",
+      "** R1-PA7:VH:5533 (92%) here\n",
+      "** R1-PM7:V:360 (6%) here\n",
+      "** R1-PA8:VH:48 (0%) here\n",
+      "** R1-PM8:V:47 (0%) here\n",
+      "** R1-PA9:VH:44 (0%) here\n",
+      "** R1-PM9:V:40 (0%) here\n",
+      "** R1-PA10:IH:5561 (92%) here\n",
+      "** R1-PM10:I:1526 (25%) here\n",
+      "** R1-PA11:IH:2152 (35%) here\n",
+      "** R1-PM11:I:184 (3%) here\n",
+      "** R1-PA12:IH:2185 (36%) here\n",
+      "** R1-PM12:I:187 (3%) here\n",
+      "** R1:F:103 (1%) here\n",
+      "** R1:DF:101 (1%) here\n",
+      "** R1-PA:Z:5999 (99%) here\n",
+      "** R1-PA:ZH:5913 (98%) here\n",
+      "** R1:S:[0:99.22%,2058:0.6%,270336:0.17%,2048:0.02%]\n",
+      "** R2-PA1:VH:5659 (94%) here\n",
+      "** R2-PM1:V:4602 (76%) here\n",
+      "** R2-PA2:VH:5661 (94%) here\n",
+      "** R2-PM2:V:4577 (76%) here\n",
+      "** R2-PA3:VH:5658 (94%) here\n",
+      "** R2-PM3:V:4593 (76%) here\n",
+      "** R2-PA4:IH:5690 (94%) here\n",
+      "** R2-PM4:I:4968 (82%) here\n",
+      "** R2-PA5:IH:5711 (95%) here\n",
+      "** R2-PM5:I:4838 (80%) here\n",
+      "** R2-PA6:IH:5743 (95%) here\n",
+      "** R2-PM6:I:4957 (82%) here\n",
+      "** R2-PA7:VH:5670 (94%) here\n",
+      "** R2-PM7:V:4599 (76%) here\n",
+      "** R2-PA8:VH:50 (0%) here\n",
+      "** R2-PM8:V:50 (0%) here\n",
+      "** R2-PA9:VH:47 (0%) here\n",
+      "** R2-PM9:V:47 (0%) here\n",
+      "** R2-PA10:IH:5695 (94%) here\n",
+      "** R2-PM10:I:4924 (82%) here\n",
+      "** R2-PA11:IH:2131 (35%) here\n",
+      "** R2-PM11:I:1253 (20%) here\n",
+      "** R2-PA12:IH:2162 (36%) here\n",
+      "** R2-PM12:I:1255 (20%) here\n",
+      "** R2:F:108 (1%) here\n",
+      "** R2:DF:107 (1%) here\n",
+      "** R2-PA:Z:6000 (100%) here\n",
+      "** R2-PA:ZH:5886 (98%) here\n",
+      "** R2:S:[0:99.83%,270336:0.17%]\n",
+      "** R3-PA1:VH:5534 (92%) here\n",
+      "** R3-PM1:V:393 (6%) here\n",
+      "** R3-PA2:VH:5536 (92%) here\n",
+      "** R3-PM2:V:389 (6%) here\n",
+      "** R3-PA3:VH:5539 (92%) here\n",
+      "** R3-PM3:V:384 (6%) here\n",
+      "** R3-PA4:IH:5602 (93%) here\n",
+      "** R3-PM4:I:1601 (26%) here\n",
+      "** R3-PA5:IH:5575 (92%) here\n",
+      "** R3-PM5:I:1464 (24%) here\n",
+      "** R3-PA6:IH:5614 (93%) here\n",
+      "** R3-PM6:I:1571 (26%) here\n",
+      "** R3-PA7:VH:5554 (92%) here\n",
+      "** R3-PM7:V:392 (6%) here\n",
+      "** R3-PA8:VH:50 (0%) here\n",
+      "** R3-PM8:V:49 (0%) here\n",
+      "** R3-PA9:VH:47 (0%) here\n",
+      "** R3-PM9:V:46 (0%) here\n",
+      "** R3-PA10:IH:5548 (92%) here\n",
+      "** R3-PM10:I:1560 (26%) here\n",
+      "** R3-PA11:IH:2063 (34%) here\n",
+      "** R3-PM11:I:181 (3%) here\n",
+      "** R3-PA12:IH:2053 (34%) here\n",
+      "** R3-PM12:I:175 (2%) here\n",
+      "** R3:F:92 (1%) here\n",
+      "** R3:DF:111 (1%) here\n",
+      "** R3-PA:Z:5999 (99%) here\n",
+      "** R3-PA:ZH:5902 (98%) here\n",
+      "** R3:S:[0:99.77%,270336:0.17%,2048:0.07%]\n",
+      "** R4-PA1:VH:5664 (94%) here\n",
+      "** R4-PM1:V:1792 (29%) here\n",
+      "** R4-PA2:VH:5668 (94%) here\n",
+      "** R4-PM2:V:1781 (29%) here\n",
+      "** R4-PA3:VH:5674 (94%) here\n",
+      "** R4-PM3:V:1794 (29%) here\n",
+      "** R4-PA4:IH:5699 (94%) here\n",
+      "** R4-PM4:I:2866 (47%) here\n",
+      "** R4-PA5:IH:5692 (94%) here\n",
+      "** R4-PM5:I:2752 (45%) here\n",
+      "** R4-PA6:IH:5693 (94%) here\n",
+      "** R4-PM6:I:2859 (47%) here\n",
+      "** R4-PA7:VH:5687 (94%) here\n",
+      "** R4-PM7:V:1781 (29%) here\n",
+      "** R4-PA8:VH:50 (0%) here\n",
+      "** R4-PM8:V:48 (0%) here\n",
+      "** R4-PA9:VH:45 (0%) here\n",
+      "** R4-PM9:V:39 (0%) here\n",
+      "** R4-PA10:IH:5695 (94%) here\n",
+      "** R4-PM10:I:2826 (47%) here\n",
+      "** R4-PA11:IH:2090 (34%) here\n",
+      "** R4-PM11:I:696 (11%) here\n",
+      "** R4-PA12:IH:2078 (34%) here\n",
+      "** R4-PM12:I:726 (12%) here\n",
+      "** R4:F:117 (1%) here\n",
+      "** R4:DF:96 (1%) here\n",
+      "** R4-PA:Z:5999 (99%) here\n",
+      "** R4-PA:ZH:5891 (98%) here\n",
+      "** R4:S:[0:99.82%,270336:0.17%,2058:0.02%]\n",
+      "** control_panel_log1:[0:100.0%]\n",
+      "** control_panel_log2:[0:100.0%]\n",
+      "** control_panel_log3:[0:100.0%]\n",
+      "** control_panel_log4:[0:100.0%]\n",
+      "** relay1_log:[0:99.87%,1:0.13%]\n",
+      "** relay2_log:[0:99.88%,1:0.12%]\n",
+      "** relay3_log:[0:99.95%,1:0.05%]\n",
+      "** relay4_log:[0:99.97%,1:0.03%]\n",
+      "** snort_log1:[0:99.98%,1:0.02%]\n",
+      "** snort_log2:[0:99.98%,1:0.02%]\n",
+      "** snort_log3:[0:100.0%]\n",
+      "** snort_log4:[0:100.0%]\n",
+      "** marker:[0:50.0%,1:50.0%]\n"
+     ]
+    }
+   ],
+   "source": [
+    "ENCODING = 'utf-8'\n",
+    "\n",
+    "def expand_categories(values):\n",
+    "    result = []\n",
+    "    s = values.value_counts()\n",
+    "    t = float(len(values))\n",
+    "    for v in s.index:\n",
+    "        result.append(\"{}:{}%\".format(v,round(100*(s[v]/t),2)))\n",
+    "    return \"[{}]\".format(\",\".join(result))\n",
+    "        \n",
+    "def analyze(df):\n",
+    "    print()\n",
+    "    cols = df.columns.values\n",
+    "    total = float(len(df))\n",
+    "\n",
+    "    print(\"{} rows\".format(int(total)))\n",
+    "    for col in cols:\n",
+    " \n",
+    "        uniques = df[col].unique()\n",
+    "        unique_count = len(uniques)\n",
+    "        if unique_count>10:\n",
+    "            print(\"** {}:{} ({}%) here\".format(col,unique_count,int(((unique_count)/total)*100)))\n",
+    "        else:\n",
+    "            print(\"** {}:{}\".format(col,expand_categories(df[col])))\n",
+    "            expand_categories(df[col])\n",
+    "\n",
+    "# Analyze KDD-99\n",
+    "\n",
+    "import pandas as pd\n",
+    "import os\n",
+    "import numpy as np\n",
+    "from sklearn import metrics\n",
+    "from scipy.stats import zscore\n",
+    "\n",
+    "analyze(df)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1628,
+   "id": "4311c15b",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "Int64Index: 6000 entries, 0 to 5999\n",
+      "Columns: 125 entries, R1-PA1:VH to marker\n",
+      "dtypes: float64(112), int64(13)\n",
+      "memory usage: 5.8 MB\n"
+     ]
+    }
+   ],
+   "source": [
+    "column_names_updated = np.delete(column_names, [28, 57, 86, 115])\n",
+    "df = df.drop(column_names_RS, axis=1)\n",
+    "\n",
+    "df.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1629,
+   "id": "f21a5139",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(6000, 112)"
+      ]
+     },
+     "execution_count": 1629,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from sklearn.preprocessing import StandardScaler\n",
+    "\n",
+    "#let's scale numerical feature\n",
+    "unscaled_input = df.iloc[:,:-13]\n",
+    "scaler = StandardScaler().fit(unscaled_input)\n",
+    "scaled_input = scaler.transform(unscaled_input)\n",
+    "scaled_input[np.isnan(scaled_input)] = 1\n",
+    "#np.isnan(scaled_input.sum())\n",
+    "scaled_input.shape"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1630,
+   "id": "91c3e8c2",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "Int64Index: 6000 entries, 0 to 5999\n",
+      "Columns: 112 entries, R1-PA1:VH to R4-PA:ZH\n",
+      "dtypes: float64(112)\n",
+      "memory usage: 5.2 MB\n"
+     ]
+    }
+   ],
+   "source": [
+    "df1_scaled = pd.DataFrame(scaled_input, index=df.index, columns=column_names_updated[:scaled_input.shape[1]])\n",
+    "df1_scaled.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1631,
+   "id": "4a23f18c",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "Int64Index: 6000 entries, 0 to 5999\n",
+      "Data columns (total 12 columns):\n",
+      " #   Column              Non-Null Count  Dtype\n",
+      "---  ------              --------------  -----\n",
+      " 0   control_panel_log1  6000 non-null   int64\n",
+      " 1   control_panel_log2  6000 non-null   int64\n",
+      " 2   control_panel_log3  6000 non-null   int64\n",
+      " 3   control_panel_log4  6000 non-null   int64\n",
+      " 4   relay1_log          6000 non-null   int64\n",
+      " 5   relay2_log          6000 non-null   int64\n",
+      " 6   relay3_log          6000 non-null   int64\n",
+      " 7   relay4_log          6000 non-null   int64\n",
+      " 8   snort_log1          6000 non-null   int64\n",
+      " 9   snort_log2          6000 non-null   int64\n",
+      " 10  snort_log3          6000 non-null   int64\n",
+      " 11  snort_log4          6000 non-null   int64\n",
+      "dtypes: int64(12)\n",
+      "memory usage: 609.4 KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "df2 = df.iloc[:,-13:-1]\n",
+    "df2.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1632,
+   "id": "ba3d7444",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "Int64Index: 6000 entries, 0 to 5999\n",
+      "Data columns (total 12 columns):\n",
+      " #   Column       Non-Null Count  Dtype\n",
+      "---  ------       --------------  -----\n",
+      " 0   R1:S_0       6000 non-null   int32\n",
+      " 1   R1:S_2048    6000 non-null   int32\n",
+      " 2   R1:S_2058    6000 non-null   int32\n",
+      " 3   R1:S_270336  6000 non-null   int32\n",
+      " 4   R2:S_0       6000 non-null   int32\n",
+      " 5   R2:S_270336  6000 non-null   int32\n",
+      " 6   R3:S_0       6000 non-null   int32\n",
+      " 7   R3:S_2048    6000 non-null   int32\n",
+      " 8   R3:S_270336  6000 non-null   int32\n",
+      " 9   R4:S_0       6000 non-null   int32\n",
+      " 10  R4:S_2058    6000 non-null   int32\n",
+      " 11  R4:S_270336  6000 non-null   int32\n",
+      "dtypes: int32(12)\n",
+      "memory usage: 328.1 KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "#RS dummies\n",
+    "RS_frame.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1633,
+   "id": "2e67286d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "Int64Index: 6000 entries, 0 to 5999\n",
+      "Columns: 136 entries, R1-PA1:VH to R4:S_270336\n",
+      "dtypes: float64(112), int32(12), int64(12)\n",
+      "memory usage: 6.0 MB\n"
+     ]
+    }
+   ],
+   "source": [
+    "X = pd.concat([df1_scaled, df2, RS_frame], axis=1)\n",
+    "X.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1634,
+   "id": "7d4368da",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "y = df[column_names[-1]]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1635,
+   "id": "5ac91fca",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(6000,)"
+      ]
+     },
+     "execution_count": 1635,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "y.shape"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1636,
+   "id": "afdc301d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from sklearn.model_selection import train_test_split\n",
+    "\n",
+    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 10, test_size=0.35)"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "36ed5e7b",
+   "metadata": {},
+   "source": [
+    "35% of the data will be used for the testing subset while the remainder will be used for the training subset."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1637,
+   "id": "a0524ed8",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from sklearn.model_selection import StratifiedKFold\n",
+    "\n",
+    "#StratifiedKFold ensures data labels are balanced\n",
+    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=10)"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "feb811f5",
+   "metadata": {},
+   "source": [
+    "StratifiedKFold ensures data labels are balanced"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "6af2b794",
+   "metadata": {},
+   "source": [
+    "### A.4\tML Model Evaluation\n",
+    "#### A.4.1\tTraining Result\n",
+    "##### i. Logistic Regression (LR)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1638,
+   "id": "f6f3ac4f",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "LR score =  0.9238095238095239\n",
+      "LR accuracy score = 92.38%\n"
+     ]
+    }
+   ],
+   "source": [
+    "#using Logistic regression\n",
+    "from sklearn.linear_model import LogisticRegression\n",
+    "\n",
+    "clf_lr = LogisticRegression(C=1e2, max_iter=5000).fit(X_train, y_train)\n",
+    "score_lr = clf_lr.score(X_test, y_test) \n",
+    "print(\"LR score = \", score_lr)\n",
+    "print(\"LR accuracy score = %0.2f%%\" % (score_lr*100))"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "0e8fb03d",
+   "metadata": {},
+   "source": [
+    "So, >90% accuracy is observed on training result using Logistic Regression.\n",
+    "\n",
+    "Let's do some cross-validation to see result stability."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1639,
+   "id": "762a708e",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[0.92914497 0.91916212 0.93081599 0.91498489 0.91244157]\n",
+      "5 fold cross-validation accuracy [92.13%] with standard deviation [0.74%]\n"
+     ]
+    }
+   ],
+   "source": [
+    "from sklearn.model_selection import cross_val_score\n",
+    "\n",
+    "cross_val_scores_lr = cross_val_score(clf_lr, X, y, cv=kfold, scoring='f1_macro')\n",
+    "print(cross_val_scores_lr)\n",
+    "print (\"5 fold cross-validation accuracy [%0.2f%%] with standard deviation [%0.2f%%]\" % (100*cross_val_scores_lr.mean(), 100*cross_val_scores_lr.std()))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1640,
+   "id": "f4869aa3",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "True Negatives:  984 \n",
+      "False Positives:  67 \n",
+      "False Negatives:  93 \n",
+      "True Positives:  956\n",
+      "-------------------------------------------------------\n",
+      "              precision    recall  f1-score   support\n",
+      "\n",
+      "           0       0.91      0.94      0.92      1051\n",
+      "           1       0.93      0.91      0.92      1049\n",
+      "\n",
+      "    accuracy                           0.92      2100\n",
+      "   macro avg       0.92      0.92      0.92      2100\n",
+      "weighted avg       0.92      0.92      0.92      2100\n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x12f3f3bfa50>"
+      ]
+     },
+     "execution_count": 1640,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "from sklearn.metrics import confusion_matrix\n",
+    "from sklearn.metrics import classification_report\n",
+    "from sklearn.metrics import ConfusionMatrixDisplay\n",
+    "\n",
+    "y_pred = clf_lr.predict(X_test)\n",
+    "#accuracy, precision, recall, F1\n",
+    "tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()\n",
+    "print('True Negatives: ', tn, '\\nFalse Positives: ', fp, '\\nFalse Negatives: ', fn, '\\nTrue Positives: ', tp)\n",
+    "print('-'*55)\n",
+    "print(classification_report(y_test, y_pred))\n",
+    "ConfusionMatrixDisplay.from_predictions(y_test, y_pred)"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "13bb4535",
+   "metadata": {},
+   "source": [
+    "##### ii.\tSupport Vector Machine (SVM) "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1641,
+   "id": "4335edba",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "SVM score =  0.9242857142857143\n",
+      "SVM accuracy score = 92.43%\n"
+     ]
+    }
+   ],
+   "source": [
+    "#using SVM analysis\n",
+    "from sklearn import svm\n",
+    "\n",
+    "clf_svm = svm.SVC(kernel='linear', C=10).fit(X_train, y_train)\n",
+    "score_svm = clf_svm.score(X_test, y_test)\n",
+    "print(\"SVM score = \", score_svm)\n",
+    "print(\"SVM accuracy score = %0.2f%%\" % (score_svm*100))"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "667501ff",
+   "metadata": {},
+   "source": [
+    "So, >90% accuracy is observed on training result using SVM.\n",
+    "\n",
+    "Let's do some cross-validation to see result stability."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1642,
+   "id": "b6c60a7e",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[0.92999981 0.91416375 0.92833313 0.91583327 0.91916212]\n",
+      "5 fold cross-validation accuracy [92.15%] with standard deviation [0.65%]\n"
+     ]
+    }
+   ],
+   "source": [
+    "cross_val_scores_svm = cross_val_score(clf_svm, X, y, cv=kfold, scoring='f1_macro')\n",
+    "print(cross_val_scores_svm)\n",
+    "print (\"5 fold cross-validation accuracy [%0.2f%%] with standard deviation [%0.2f%%]\" % (100*cross_val_scores_svm.mean(), 100*cross_val_scores_svm.std()))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1643,
+   "id": "f76a4a23",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "True Negatives:  966 \n",
+      "False Positives:  85 \n",
+      "False Negatives:  74 \n",
+      "True Positives:  975\n",
+      "-------------------------------------------------------\n",
+      "              precision    recall  f1-score   support\n",
+      "\n",
+      "           0       0.93      0.92      0.92      1051\n",
+      "           1       0.92      0.93      0.92      1049\n",
+      "\n",
+      "    accuracy                           0.92      2100\n",
+      "   macro avg       0.92      0.92      0.92      2100\n",
+      "weighted avg       0.92      0.92      0.92      2100\n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x12f4c58d4d0>"
+      ]
+     },
+     "execution_count": 1643,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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kZGRSklJUXp6uu644w5lZWXprbfekvR96/3hhx9Wamqq2rRpI0kqLCzUDTfcoISEBCUmJqpPnz7au3ev65oOh0OjRo1SQkKCGjVqpHvvvVc/fr3Ej9v4lZWVuu+++5SWlqbIyEi1atVKL7zwgvbu3et6+UrDhg1ls9l0yy23SDr5CuGpU6eqRYsWio6OVufOnfX666+7fc/y5cvVunVrRUdH68orr3SL01P33XefWrdurQYNGqhly5YaP368qqura4177rnnlJaWpgYNGuiGG25QaWmp2/Hnn39e7dq1U1RUlNq2batnn33W61gA1B2SPSwjOjpaVVVVrs+rVq1SQUGBVq5cqWXLlqm6ulrZ2dmKi4vTu+++q/fee0+xsbHq2bOn67wnnnhC8+fP14svvqgNGzaopKREb7755i9+780336yXX35ZM2bM0I4dO/Tcc88pNjZWaWlpeuONNyRJBQUFOnjwoJ5++mlJ0tSpU7VgwQLNmTNH27dv18iRIzVw4ECtW7dO0slfSvr166frrrtOW7du1W233aaxY8d6/b9JXFyc5s+fr08//VRPP/205s6dq6eeesptzK5du7R48WItXbpUK1as0EcffaQ777zTdXzhwoWaMGGCHn74Ye3YsUOPPPKIxo8fr5deesnreADUEQMwodzcXKNPnz6GYRiG0+k0Vq5caURGRhqjR492HU9OTjYqKytd5/zjH/8w2rRpYzidTte+yspKIzo62njnnXcMwzCMxo0bG9OmTXMdr66uNpo2ber6LsMwjMsvv9y4++67DcMwjIKCAkOSsXLlyp+Mc82aNYYk48iRI659FRUVRoMGDYyNGze6jR08eLDxxz/+0TAMwxg3bpyRkZHhdvy+++6rda0fk2S8+eabP3v8b3/7m9G1a1fX54kTJxqhoaHGV1995dr39ttvGyEhIcbBgwcNwzCMc845x1i0aJHbdaZMmWJkZmYahmEYe/bsMSQZH3300c9+L4C6xZw9TGvZsmWKjY1VdXW1nE6n/vSnP2nSpEmu4x07dnSbp9+2bZt27dqluLg4t+tUVFRo9+7dKi0t1cGDB9W9e3fXsbCwMHXr1q1WK/+UrVu3KjQ0VJdffrnHce/atUsnTpzQNddc47a/qqpK5513niRpx44dbnFIUmZmpsffccqrr76qGTNmaPfu3SovL1dNTY3sdrvbmGbNmqlJkyZu3+N0OlVQUKC4uDjt3r1bgwcP1pAhQ1xjampqFB8f73U8AOoGyR6mdeWVV2r27NmKiIhQamqqwsLc/7rHxMS4fS4vL1fXrl21cOHCWtc6++yzTyuG6Ohor88pLy+XJP3nP/9xS7LSyXUI/pKXl6ecnBxNnjxZ2dnZio+P1yuvvKInnnjC61jnzp1b65eP0NBQv8UKwDcke5hWTEyMWrVq5fH4888/X6+++qqSkpJqVbenNG7cWJs2bdJll10m6WQFm5+fr/PPP/8nx3fs2FFOp1Pr1q1TVlZWreOnOgsOh8O1LyMjQ5GRkdq3b9/PdgTatWvnWmx4yvvvv//rP+QPbNy4Uenp6br//vtd+7788sta4/bt26cDBw4oNTXV9T0hISFq06aNkpOTlZqaqi+++EI5OTlefT+A+sMCPeA7OTk5Ouuss9SnTx+9++672rNnj9auXau77rpLX331lSTp7rvv1qOPPqolS5Zo586duvPOO3/xHvnmzZsrNzdXt956q5YsWeK65uLFiyVJ6enpstlsWrZsmQ4fPqzy8nLFxcVp9OjRGjlypF566SXt3r1bW7Zs0cyZM12L3v7yl7/o888/15gxY1RQUKBFixZp/vz5Xv285557rvbt26dXXnlFu3fv1owZM35ysWFUVJRyc3O1bds2vfvuu7rrrrt0ww03KCUlRZI0efJkTZ06VTNmzNBnn32mjz/+WPPmzdOTTz7pVTwA6g7JHvhOgwYNtH79ejVr1kz9+vVTu3btNHjwYFVUVLgq/XvuuUc33XSTcnNzlZmZqbi4OP3ud7/7xevOnj1bv//973XnnXeqbdu2GjJkiI4fPy5JatKkiSZPnqyxY8cqOTlZw4YNkyRNmTJF48eP19SpU9WuXTv17NlT//nPf9SiRQtJJ+fR33jjDS1ZskSdO3fWnDlz9Mgjj3j1815//fUaOXKkhg0bpi5dumjjxo0aP358rXGtWrVSv3791KtXL/Xo0UOdOnVyu7Xutttu0/PPP6958+apY8eOuvzyyzV//nxXrAACz2b83MoiAABgClT2AACYHMkeAACTI9kDAGByJHsAAEyOZA8AgMmR7AEAMDmSPQAAJkeyBwDA5Ej2AACYHMkeAACTI9kDAGBy/w+oNVOVd8ygjQAAAABJRU5ErkJggg==",
+      "text/plain": [
+       "<Figure size 640x480 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "y_pred = clf_svm.predict(X_test)\n",
+    "#accuracy, precision, recall, F1\n",
+    "tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()\n",
+    "print('True Negatives: ', tn, '\\nFalse Positives: ', fp, '\\nFalse Negatives: ', fn, '\\nTrue Positives: ', tp)\n",
+    "print('-'*55)\n",
+    "print(classification_report(y_test, y_pred))\n",
+    "ConfusionMatrixDisplay.from_predictions(y_test, y_pred)"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "ca370362",
+   "metadata": {},
+   "source": [
+    "##### iii.\tGradient Boosting Classifier (GBC)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1644,
+   "id": "02e51066",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "GBC score =  0.99\n",
+      "GBC accuracy score = 99.00%\n"
+     ]
+    }
+   ],
+   "source": [
+    "from sklearn.ensemble import GradientBoostingClassifier\n",
+    "\n",
+    "# Create a GradientBoostingClassifier object\n",
+    "clf_gb = GradientBoostingClassifier(n_estimators=40, learning_rate=0.5, max_depth=11, random_state=10, subsample=1.0, max_features='sqrt').fit(X_train, y_train)\n",
+    "score_gb = clf_gb.score(X_test, y_test)\n",
+    "print(\"GBC score = \", score_gb)\n",
+    "print(\"GBC accuracy score = %0.2f%%\" % (score_gb*100))"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "6fb52ba0",
+   "metadata": {},
+   "source": [
+    "A near-perfect accuracy score of 99% was obtained using GBC."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1645,
+   "id": "bcc80fcc",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[0.98749999 0.99333326 0.99333333 0.99249995 0.99083333]\n",
+      "5-fold cross-validation accuracy [99.15%] with standard deviation [0.22%]\n"
+     ]
+    }
+   ],
+   "source": [
+    "cross_val_scores_xgb = cross_val_score(clf_gb, X, y, cv=kfold, scoring='f1_macro')\n",
+    "print (cross_val_scores_xgb)\n",
+    "print (\"5-fold cross-validation accuracy [%0.2f%%] with standard deviation [%0.2f%%]\" % (100*cross_val_scores_xgb.mean(), 100*cross_val_scores_xgb.std()))"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "f8879a57",
+   "metadata": {},
+   "source": [
+    "Even the cross-validation result is the best among the models tested."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1646,
+   "id": "cd106a88",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "True Negatives:  1039 \n",
+      "False Positives:  12 \n",
+      "False Negatives:  9 \n",
+      "True Positives:  1040\n",
+      "-------------------------------------------------------\n",
+      "              precision    recall  f1-score   support\n",
+      "\n",
+      "           0       0.99      0.99      0.99      1051\n",
+      "           1       0.99      0.99      0.99      1049\n",
+      "\n",
+      "    accuracy                           0.99      2100\n",
+      "   macro avg       0.99      0.99      0.99      2100\n",
+      "weighted avg       0.99      0.99      0.99      2100\n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x12f41622e50>"
+      ]
+     },
+     "execution_count": 1646,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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+HDt2bNH69at0yeffOKoJixcuFDXX3+9nnzyScXHx5/z5/kxj1YTVFRUeCUIAAAanOGFTVJpaanTVllZeda3W7Nmjfr27avf//73io2N1SWXXKLFixc7jh86dEgFBQVKTU117IuKilJycrJycnIkSTk5OYqOjnYkApKUmpqqgIAAbd++3Qs/lFpuJwM2m02zZs3S+eefr1atWungwYOSpGnTpunll1/2WmAAADRFCQkJioqKcmxz584967iDBw86+v///Oc/dc899+i+++7TsmXLJEkFBQWSpLi4OKfz4uLiHMcKCgoUGxvrdDwoKEgxMTGOMd7g9mqCRx99VMuWLdO8efM0atQox/6LLrpICxYs0MiRI70WHAAA3mP5fvPkfOno0aOKjIx07A0JCTnraLvdrr59+2rOnDmSpEsuuUSff/65Fi1apIyMDA/i8D63KwPLly/Xiy++qPT0dAUGBjr29+rVS3v37vVqcAAAeI2X2gSRkZFOm6tkoF27dkpKSnLa16NHDx05ckSSZLVaJUmFhYVOYwoLCx3HrFarjh8/7nS8pqZGRUVFjjHe4HYy8O2336pLly5n7Lfb7aqurvZKUAAANHdXXHGF9u3b57Tvyy+/VMeOHSXVTia0Wq3asGGD43hpaam2b9+ulJQUSVJKSoqKi4uVm5vrGLNx40bZ7XYlJyd7LVa3k4GkpCRt2bLljP1///vfdckll3glKAAAvM5LlYH6Gj9+vD766CPNmTNH+/fv18qVK/Xiiy9qzJgxkmqX448bN06zZ8/WmjVrtGvXLt1xxx2Kj493LOnv0aOHBgwYoFGjRunjjz/Whx9+qMzMTA0fPtxrKwmkc5gzMH36dGVkZOjbb7+V3W7XP/7xD+3bt0/Lly/X2rVrvRYYAABe1chPLbzsssv05ptvaurUqZo5c6YSExO1YMECpaenO8ZMmjRJ5eXlGj16tIqLi3XllVdq3bp1jnsMSNKKFSuUmZmp6667znHToaysrHP/HGdhMQz3n8O0ZcsWzZw5U5999pnKysp06aWXavr06erfv79Xg/s5paWlioqK0skvOykygmcuwT+lxff2dQhAg6kxqvWB3lJJSYnTpDxvqvuuSMieoYCw0J8/wQX7dxU6OubhBo3VV87p2QRXXXWV1q9f7+1YAABoMDzC2LVzflDRjh07tGfPHkm18wj69Onj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lixZosrKSr377rsaM2aMWrRooalTp54xtqqqSsHBwV5535iYGK9cBwAaC5UB+K2QkBBZrVZ17NhR99xzj1JTU7VmzRpJP5T2H330UcXHx6tbt26SpKNHj+rmm29WdHS0YmJiNHjwYB0+fNhxTZvNpgkTJig6Olpt2rTRpEmT9NPHe/y0TVBZWanJkycrISFBISEh6tKli15++WUdPnzY8XCc1q1by2Kx6M4775RU+4jouXPnKjExUWFhYerVq5f+/ve/O73Pu+++q65duyosLEz9+vVzirO+Jk+erK5du6ply5bq1KmTpk2bpurq6jPGvfDCC0pISFDLli118803q6SkxOn4Sy+9pB49eig0NFTdu3fXc88953YsAHyHZACmERYWpqqqKsfrDRs2aN++fVq/fr3Wrl2r6upqpaWlKSIiQlu2bNGHH36oVq1aacCAAY7znnrqKS1dulSvvPKKtm7dqqKiIr355pv/833vuOMOvfrqq8rKytKePXv0wgsvqFWrVkpISNAbb7whSdq3b5+OHTumZ555RpI0d+5cLV++XIsWLdLu3bs1fvx43Xbbbdq0aZOk2qRl6NChuuGGG5SXl6e77rpLU6ZMcftnEhERoaVLl+qLL77QM888o8WLF+vpp592GrN//369/vrrevvtt7Vu3Tp9+umnuvfeex3HV6xYoenTp+vRRx/Vnj17NGfOHE2bNk3Lli1zOx4APmIAfigjI8MYPHiwYRiGYbfbjfXr1xshISHGAw884DgeFxdnVFZWOs75y1/+YnTr1s2w2+2OfZWVlUZYWJjxz3/+0zAMw2jXrp0xb948x/Hq6mqjffv2jvcyDMO45pprjPvvv98wDMPYt2+fIclYv379WeN8//33DUnGyZMnHfsqKiqMli1bGtu2bXMaO3LkSOOWW24xDMMwpk6daiQlJTkdnzx58hnX+ilJxptvvuny+BNPPGH06dPH8frhhx82AgMDjW+++cax77333jMCAgKMY8eOGYZhGJ07dzZWrlzpdJ1Zs2YZKSkphmEYxqFDhwxJxqeffuryfQH4FnMG4LfWrl2rVq1aqbq6Wna7XbfeeqseeeQRx/GePXs6zRP47LPPtH//fkVERDhdp6KiQgcOHFBJSYmOHTum5ORkx7GgoCD17dv3jFZBnby8PAUGBuqaa66pd9z79+/X6dOn9Zvf/MZpf1VVlS655BJJ0p49e5zikKSUlJR6v0edVatWKSsrSwcOHFBZWZlqamoUGRnpNKZDhw46//zznd7Hbrdr3759ioiI0IEDBzRy5EiNGjXKMaampkZRUVFuxwPAN0gG4Lf69eun559/XsHBwYqPj1dQkPOve3h4uNPrsrIy9enTRytWrDjjWm3btj2nGMLCwtw+p6ysTJL0zjvvOH0JS7XzILwlJydH6enpmjFjhtLS0hQVFaXXXntNTz31lNuxLl68+IzkJDAw0GuxAmhYJAPwW+Hh4erSpUu9x1966aVatWqVYmNjz/jruE67du20fft2XX311ZJq/wLOzc3VpZdeetbxPXv2lN1u16ZNm5SamnrG8brKhM1mc+xLSkpSSEiIjhw54rKi0KNHD8dkyDofffTRz3/IH9m2bZs6duyoBx980LHv66+/PmPckSNHlJ+fr/j4eMf7BAQEqFu3boqLi1N8fLwOHjyo9PR0t94fQNPBBELge+np6TrvvPM0ePBgbdmyRYcOHdIHH3yg++67T998840k6f7779djjz2m1atXa+/evbr33nv/5z0CLrjgAmVkZOiPf/yjVq9e7bjm66+/Lknq2LGjLBaL1q5dqxMnTqisrEwRERF64IEHNH78eC1btkwHDhzQzp07tXDhQsekvLvvvltfffWVJk6cqH379mnlypVaunSpW5/3F7/4hY4cOaLXXntNBw4cUFZW1lknQ4aGhiojI0OfffaZtmzZovvuu08333yzrFarJGnGjBmaO3eusrKy9OWXX2rXrl1asmSJ5s+f71Y8AHyHZAD4XsuWLbV582Z16NBBQ4cOVY8ePTRy5EhVVFQ4KgV/+tOfdPvttysjI0MpKSmKiIjQTTfd9D+v+/zzz+t3v/ud7r33XnXv3l2jRo1SeXm5JOn888/XjBkzNGXKFMXFxSkzM1OSNGvWLE2bNk1z585Vjx49NGDAAL3zzjtKTEyUVNvHf+ONN7R69Wr16tVLixYt0pw5c9z6vDfeeKPGjx+vzMxM9e7dW9u2bdO0adPOGNelSxcNHTpU119/vfr376+LL77YaengXXfdpZdeeklLlixRz549dc0112jp0qWOWAE0fRbD1cwnAABgClQGAAAwOZIBAABMjmQAAACTIxkAAMDkSAYAADA5kgEAAEyOZAAAAJMjGQAAwORIBgAAMDmSAQAATI5kAAAAk/v/1lsfNhYBUt4AAAAASUVORK5CYII=",
+      "text/plain": [
+       "<Figure size 640x480 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "y_pred = clf_gb.predict(X_test)\n",
+    "#accuracy, precision, recall, F1\n",
+    "tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()\n",
+    "print('True Negatives: ', tn, '\\nFalse Positives: ', fp, '\\nFalse Negatives: ', fn, '\\nTrue Positives: ', tp)\n",
+    "print('-'*55)\n",
+    "print(classification_report(y_test, y_pred))\n",
+    "ConfusionMatrixDisplay.from_predictions(y_test, y_pred)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1647,
+   "id": "87e689ce",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#difference_scores = clf_svm.score(X_test, y_test) - clf_lr.score(X_test, y_test) \n",
+    "#difference_mean = 100*cross_val_scores_lr.mean() - 100*cross_val_scores_svm.mean()\n",
+    "#difference_std = 100*cross_val_scores_lr.std() - 100*cross_val_scores_svm.std()\n",
+    "#print(\"scores difference = \", difference_scores)\n",
+    "#print(\"mean difference = \", difference_mean)\n",
+    "#print(\"standard deviation difference = \", difference_std)"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "955491a0",
+   "metadata": {},
+   "source": [
+    "The result appears to be stable with cross-validation. This was expected given target data has a good split between positive and negative. \n",
+    "Since SVM returns a near-identical result for accuracy and cross-validation compared to Logistic Regression, it is chosen as the model to train and test the dataset."
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "fbaeaae9",
+   "metadata": {},
+   "source": [
+    "### A.5\tML Model with Best Result\n",
+    "The The model with best result was found to be GBC after comparison between accuracy score, 5-fold crpss-validation result and confusion matrix were made. was found to be GBC after comparison between accuracy score, 5-fold crpss-validation result and confusion matrix were made."
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "a4cd28dc",
+   "metadata": {},
+   "source": [
+    "\n",
+    "### A.6\tGBC Testing Result\n",
+    "Let's predict outcome for our test data using the chosen classifier."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1648,
+   "id": "77fbdfde",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "test_raw_data = pd.read_csv('TestingDataBinary.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1649,
+   "id": "b6aeecef",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "RangeIndex: 100 entries, 0 to 99\n",
+      "Columns: 128 entries, R1-PA1:VH to snort_log4\n",
+      "dtypes: float64(112), int64(16)\n",
+      "memory usage: 100.1 KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "test_raw_data.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1650,
+   "id": "dec22570",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 1650,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "test_raw_data.columns[test_raw_data.isnull().any()].tolist()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1651,
+   "id": "80208613",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>R1-PA1:VH</th>\n",
+       "      <th>R1-PM1:V</th>\n",
+       "      <th>R1-PA2:VH</th>\n",
+       "      <th>R1-PM2:V</th>\n",
+       "      <th>R1-PA3:VH</th>\n",
+       "      <th>R1-PM3:V</th>\n",
+       "      <th>R1-PA4:IH</th>\n",
+       "      <th>R1-PM4:I</th>\n",
+       "      <th>R1-PA5:IH</th>\n",
+       "      <th>R1-PM5:I</th>\n",
+       "      <th>...</th>\n",
+       "      <th>control_panel_log3</th>\n",
+       "      <th>control_panel_log4</th>\n",
+       "      <th>relay1_log</th>\n",
+       "      <th>relay2_log</th>\n",
+       "      <th>relay3_log</th>\n",
+       "      <th>relay4_log</th>\n",
+       "      <th>snort_log1</th>\n",
+       "      <th>snort_log2</th>\n",
+       "      <th>snort_log3</th>\n",
+       "      <th>snort_log4</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>7</th>\n",
+       "      <td>11.596666</td>\n",
+       "      <td>131810.1804</td>\n",
+       "      <td>-108.380697</td>\n",
+       "      <td>131183.3486</td>\n",
+       "      <td>131.614135</td>\n",
+       "      <td>131860.3269</td>\n",
+       "      <td>9.453804</td>\n",
+       "      <td>370.98086</td>\n",
+       "      <td>-110.466263</td>\n",
+       "      <td>370.98086</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>40</th>\n",
+       "      <td>97.448662</td>\n",
+       "      <td>130656.8100</td>\n",
+       "      <td>-22.528701</td>\n",
+       "      <td>130631.7367</td>\n",
+       "      <td>-142.540440</td>\n",
+       "      <td>130732.0298</td>\n",
+       "      <td>98.439879</td>\n",
+       "      <td>444.59108</td>\n",
+       "      <td>-26.911828</td>\n",
+       "      <td>471.32514</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>12</th>\n",
+       "      <td>55.244591</td>\n",
+       "      <td>131208.4219</td>\n",
+       "      <td>-64.755690</td>\n",
+       "      <td>130556.5169</td>\n",
+       "      <td>175.267790</td>\n",
+       "      <td>131233.4952</td>\n",
+       "      <td>50.987514</td>\n",
+       "      <td>463.63452</td>\n",
+       "      <td>-68.949741</td>\n",
+       "      <td>463.63452</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>61</th>\n",
+       "      <td>116.757340</td>\n",
+       "      <td>131709.8873</td>\n",
+       "      <td>-3.208564</td>\n",
+       "      <td>131684.8140</td>\n",
+       "      <td>-123.214574</td>\n",
+       "      <td>131785.1071</td>\n",
+       "      <td>115.112951</td>\n",
+       "      <td>358.71249</td>\n",
+       "      <td>-5.150891</td>\n",
+       "      <td>358.52938</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>34</th>\n",
+       "      <td>106.151891</td>\n",
+       "      <td>131785.1071</td>\n",
+       "      <td>-13.808283</td>\n",
+       "      <td>131760.0339</td>\n",
+       "      <td>-133.820023</td>\n",
+       "      <td>131860.3269</td>\n",
+       "      <td>107.601474</td>\n",
+       "      <td>324.65403</td>\n",
+       "      <td>-13.097815</td>\n",
+       "      <td>328.49934</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "<p>5 rows × 128 columns</p>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "     R1-PA1:VH     R1-PM1:V   R1-PA2:VH     R1-PM2:V   R1-PA3:VH     R1-PM3:V  \\\n",
+       "7    11.596666  131810.1804 -108.380697  131183.3486  131.614135  131860.3269   \n",
+       "40   97.448662  130656.8100  -22.528701  130631.7367 -142.540440  130732.0298   \n",
+       "12   55.244591  131208.4219  -64.755690  130556.5169  175.267790  131233.4952   \n",
+       "61  116.757340  131709.8873   -3.208564  131684.8140 -123.214574  131785.1071   \n",
+       "34  106.151891  131785.1071  -13.808283  131760.0339 -133.820023  131860.3269   \n",
+       "\n",
+       "     R1-PA4:IH   R1-PM4:I   R1-PA5:IH   R1-PM5:I  ...  control_panel_log3  \\\n",
+       "7     9.453804  370.98086 -110.466263  370.98086  ...                   0   \n",
+       "40   98.439879  444.59108  -26.911828  471.32514  ...                   0   \n",
+       "12   50.987514  463.63452  -68.949741  463.63452  ...                   0   \n",
+       "61  115.112951  358.71249   -5.150891  358.52938  ...                   0   \n",
+       "34  107.601474  324.65403  -13.097815  328.49934  ...                   0   \n",
+       "\n",
+       "    control_panel_log4  relay1_log  relay2_log  relay3_log  relay4_log  \\\n",
+       "7                    0           0           0           0           0   \n",
+       "40                   0           0           0           0           0   \n",
+       "12                   0           0           0           0           0   \n",
+       "61                   0           0           0           0           0   \n",
+       "34                   0           0           0           0           0   \n",
+       "\n",
+       "    snort_log1  snort_log2  snort_log3  snort_log4  \n",
+       "7            0           0           0           0  \n",
+       "40           0           0           0           0  \n",
+       "12           0           0           0           0  \n",
+       "61           0           0           0           0  \n",
+       "34           0           0           0           0  \n",
+       "\n",
+       "[5 rows x 128 columns]"
+      ]
+     },
+     "execution_count": 1651,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "test_raw_data.sample(n=5)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1652,
+   "id": "f774ee14",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>R1:S_0</th>\n",
+       "      <th>R1:S_2058</th>\n",
+       "      <th>R2:S_0</th>\n",
+       "      <th>R3:S_0</th>\n",
+       "      <th>R4:S_0</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>44</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>83</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>61</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "    R1:S_0  R1:S_2058  R2:S_0  R3:S_0  R4:S_0\n",
+       "44       1          0       1       1       1\n",
+       "83       1          0       1       1       1\n",
+       "61       1          0       1       1       1"
+      ]
+     },
+     "execution_count": 1652,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "#let's save a copy before proceeding\n",
+    "results_df = test_raw_data.copy()\n",
+    "\n",
+    "test_RS_frame = test_raw_data[column_names_RS]\n",
+    "test_RS_frame = test_RS_frame.astype('int')\n",
+    "test_RS_frame = test_RS_frame.astype('category')\n",
+    "test_RS_frame = pd.get_dummies(test_RS_frame, dtype=int)\n",
+    "test_RS_frame.sample(3)"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "id": "4be4f161",
+   "metadata": {},
+   "source": [
+    "It is observed that test data does not has all the categorical values for RS feature as in training set. For numerical analysis let's add additional dummy columns by hand."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1653,
+   "id": "2e3ae9b9",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>R1:S_0</th>\n",
+       "      <th>R1:S_2048</th>\n",
+       "      <th>R1:S_2058</th>\n",
+       "      <th>R1:S_270336</th>\n",
+       "      <th>R2:S_0</th>\n",
+       "      <th>R2:S_270336</th>\n",
+       "      <th>R3:S_0</th>\n",
+       "      <th>R3:S_2048</th>\n",
+       "      <th>R3:S_270336</th>\n",
+       "      <th>R4:S_0</th>\n",
+       "      <th>R4:S_2058</th>\n",
+       "      <th>R4:S_270336</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>74</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>8</th>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "    R1:S_0  R1:S_2048  R1:S_2058  R1:S_270336  R2:S_0  R2:S_270336  R3:S_0  \\\n",
+       "74       1          0          0            0       1            0       1   \n",
+       "8        1          0          0            0       1            0       1   \n",
+       "\n",
+       "    R3:S_2048  R3:S_270336  R4:S_0  R4:S_2058  R4:S_270336  \n",
+       "74          0            0       1          0            0  \n",
+       "8           0            0       1          0            0  "
+      ]
+     },
+     "execution_count": 1653,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "a = RS_frame.columns.values\n",
+    "b = test_RS_frame.columns.values\n",
+    "missing_cols = [ai for ai in a if ai not in b]\n",
+    "missing_cols\n",
+    "for col in a :\n",
+    "    if col not in b :\n",
+    "        test_RS_frame[col] = 0\n",
+    "\n",
+    "#order columns as in training\n",
+    "test_RS_frame = test_RS_frame.loc[:,a]\n",
+    "test_RS_frame.sample(2)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1654,
+   "id": "890ce249",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "RangeIndex: 100 entries, 0 to 99\n",
+      "Columns: 124 entries, R1-PA1:VH to snort_log4\n",
+      "dtypes: float64(112), int64(12)\n",
+      "memory usage: 97.0 KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "#let's drop RS columns\n",
+    "test_raw_data = test_raw_data.drop(column_names_RS, axis=1)\n",
+    "test_raw_data.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1655,
+   "id": "24da31bd",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#let's deal with features requiring normaliation\n",
+    "unscaled_test_input = test_raw_data.iloc[:,:-12]\n",
+    "unscaled_test_input.replace([np.inf, -np.inf], np.nan, inplace=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1656,
+   "id": "d17cd7e4",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(100, 112)"
+      ]
+     },
+     "execution_count": 1656,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "scaled_test_input = scaler.transform(unscaled_test_input)\n",
+    "scaled_test_input.shape"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1657,
+   "id": "33845d19",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "RangeIndex: 100 entries, 0 to 99\n",
+      "Columns: 112 entries, R1-PA1:VH to R4-PA:ZH\n",
+      "dtypes: float64(112)\n",
+      "memory usage: 87.6 KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "test_df1_scaled = pd.DataFrame(scaled_test_input, index=unscaled_test_input.index, columns=column_names_updated[:scaled_test_input.shape[1]])\n",
+    "test_df1_scaled.replace(np.nan, 1, inplace=True)\n",
+    "test_df1_scaled.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1658,
+   "id": "75c977ec",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "RangeIndex: 100 entries, 0 to 99\n",
+      "Data columns (total 12 columns):\n",
+      " #   Column              Non-Null Count  Dtype\n",
+      "---  ------              --------------  -----\n",
+      " 0   control_panel_log1  100 non-null    int64\n",
+      " 1   control_panel_log2  100 non-null    int64\n",
+      " 2   control_panel_log3  100 non-null    int64\n",
+      " 3   control_panel_log4  100 non-null    int64\n",
+      " 4   relay1_log          100 non-null    int64\n",
+      " 5   relay2_log          100 non-null    int64\n",
+      " 6   relay3_log          100 non-null    int64\n",
+      " 7   relay4_log          100 non-null    int64\n",
+      " 8   snort_log1          100 non-null    int64\n",
+      " 9   snort_log2          100 non-null    int64\n",
+      " 10  snort_log3          100 non-null    int64\n",
+      " 11  snort_log4          100 non-null    int64\n",
+      "dtypes: int64(12)\n",
+      "memory usage: 9.5 KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "test_df2 = test_raw_data.iloc[:,-12:]\n",
+    "test_df2.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1659,
+   "id": "4f176a75",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "RangeIndex: 100 entries, 0 to 99\n",
+      "Columns: 136 entries, R1-PA1:VH to R4:S_270336\n",
+      "dtypes: float64(112), int32(5), int64(19)\n",
+      "memory usage: 104.4 KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "test_X = pd.concat([test_df1_scaled, test_df2, test_RS_frame], axis=1)\n",
+    "test_X.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1660,
+   "id": "7aacce46",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
+       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,\n",
+       "       1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int64)"
+      ]
+     },
+     "execution_count": 1660,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "results = clf_gb.predict(test_X)\n",
+    "results"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1661,
+   "id": "c627bdcf",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "RangeIndex: 100 entries, 0 to 99\n",
+      "Columns: 129 entries, R1-PA1:VH to marker\n",
+      "dtypes: float64(112), int64(17)\n",
+      "memory usage: 100.9 KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "results_df['marker'] = np.transpose(results)\n",
+    "results_df.info()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1662,
+   "id": "0ea24283",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>R1-PA1:VH</th>\n",
+       "      <th>R1-PM1:V</th>\n",
+       "      <th>R1-PA2:VH</th>\n",
+       "      <th>R1-PM2:V</th>\n",
+       "      <th>R1-PA3:VH</th>\n",
+       "      <th>R1-PM3:V</th>\n",
+       "      <th>R1-PA4:IH</th>\n",
+       "      <th>R1-PM4:I</th>\n",
+       "      <th>R1-PA5:IH</th>\n",
+       "      <th>R1-PM5:I</th>\n",
+       "      <th>...</th>\n",
+       "      <th>control_panel_log4</th>\n",
+       "      <th>relay1_log</th>\n",
+       "      <th>relay2_log</th>\n",
+       "      <th>relay3_log</th>\n",
+       "      <th>relay4_log</th>\n",
+       "      <th>snort_log1</th>\n",
+       "      <th>snort_log2</th>\n",
+       "      <th>snort_log3</th>\n",
+       "      <th>snort_log4</th>\n",
+       "      <th>marker</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>20</th>\n",
+       "      <td>88.120909</td>\n",
+       "      <td>131007.83580</td>\n",
+       "      <td>-31.879372</td>\n",
+       "      <td>130381.0040</td>\n",
+       "      <td>-151.862464</td>\n",
+       "      <td>131083.0556</td>\n",
+       "      <td>83.439844</td>\n",
+       "      <td>485.79083</td>\n",
+       "      <td>-36.566166</td>\n",
+       "      <td>485.97394</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>12</th>\n",
+       "      <td>55.244591</td>\n",
+       "      <td>131208.42190</td>\n",
+       "      <td>-64.755690</td>\n",
+       "      <td>130556.5169</td>\n",
+       "      <td>175.267790</td>\n",
+       "      <td>131233.4952</td>\n",
+       "      <td>50.987514</td>\n",
+       "      <td>463.63452</td>\n",
+       "      <td>-68.949741</td>\n",
+       "      <td>463.63452</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>25</th>\n",
+       "      <td>-104.123620</td>\n",
+       "      <td>75846.64175</td>\n",
+       "      <td>144.293691</td>\n",
+       "      <td>121931.3120</td>\n",
+       "      <td>11.751364</td>\n",
+       "      <td>123636.2944</td>\n",
+       "      <td>-165.607721</td>\n",
+       "      <td>1580.60552</td>\n",
+       "      <td>137.676029</td>\n",
+       "      <td>391.12296</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>5</th>\n",
+       "      <td>11.865956</td>\n",
+       "      <td>131810.18040</td>\n",
+       "      <td>-108.111406</td>\n",
+       "      <td>131183.3486</td>\n",
+       "      <td>131.889155</td>\n",
+       "      <td>131860.3269</td>\n",
+       "      <td>9.774660</td>\n",
+       "      <td>370.98086</td>\n",
+       "      <td>-110.162595</td>\n",
+       "      <td>370.98086</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>14</th>\n",
+       "      <td>88.888672</td>\n",
+       "      <td>131032.90900</td>\n",
+       "      <td>-31.105879</td>\n",
+       "      <td>130406.0773</td>\n",
+       "      <td>-151.088971</td>\n",
+       "      <td>131083.0556</td>\n",
+       "      <td>84.683162</td>\n",
+       "      <td>483.77662</td>\n",
+       "      <td>-35.775485</td>\n",
+       "      <td>485.79083</td>\n",
+       "      <td>...</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "<p>5 rows × 129 columns</p>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "     R1-PA1:VH      R1-PM1:V   R1-PA2:VH     R1-PM2:V   R1-PA3:VH  \\\n",
+       "20   88.120909  131007.83580  -31.879372  130381.0040 -151.862464   \n",
+       "12   55.244591  131208.42190  -64.755690  130556.5169  175.267790   \n",
+       "25 -104.123620   75846.64175  144.293691  121931.3120   11.751364   \n",
+       "5    11.865956  131810.18040 -108.111406  131183.3486  131.889155   \n",
+       "14   88.888672  131032.90900  -31.105879  130406.0773 -151.088971   \n",
+       "\n",
+       "       R1-PM3:V   R1-PA4:IH    R1-PM4:I   R1-PA5:IH   R1-PM5:I  ...  \\\n",
+       "20  131083.0556   83.439844   485.79083  -36.566166  485.97394  ...   \n",
+       "12  131233.4952   50.987514   463.63452  -68.949741  463.63452  ...   \n",
+       "25  123636.2944 -165.607721  1580.60552  137.676029  391.12296  ...   \n",
+       "5   131860.3269    9.774660   370.98086 -110.162595  370.98086  ...   \n",
+       "14  131083.0556   84.683162   483.77662  -35.775485  485.79083  ...   \n",
+       "\n",
+       "    control_panel_log4  relay1_log  relay2_log  relay3_log  relay4_log  \\\n",
+       "20                   0           0           0           0           0   \n",
+       "12                   0           0           0           0           0   \n",
+       "25                   0           0           0           0           0   \n",
+       "5                    0           0           0           0           0   \n",
+       "14                   0           0           0           0           0   \n",
+       "\n",
+       "    snort_log1  snort_log2  snort_log3  snort_log4  marker  \n",
+       "20           0           0           0           0       1  \n",
+       "12           0           0           0           0       1  \n",
+       "25           0           0           0           0       1  \n",
+       "5            0           0           0           0       1  \n",
+       "14           0           0           0           0       1  \n",
+       "\n",
+       "[5 rows x 129 columns]"
+      ]
+     },
+     "execution_count": 1662,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "results_df.sample(5)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1663,
+   "id": "20c29600",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "results_df.to_csv('TestingResultsBinary.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1664,
+   "id": "58c758f8",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "marker count:\n",
+      "1    56\n",
+      "0    44\n",
+      "Name: marker, dtype: int64\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAABs8AAAIjCAYAAABMLYXMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABI00lEQVR4nO3debhdg9334e/JyTyLyIQMYkpSFcRcc4ihNARRVBJK9TFPLVViLi2lKJpWE49StMpjViVmVUOjlKZoiCmJyCTSSCTr/cPKfnua4GRwTsJ9X1euy17DXr+9s60c+VhrVxVFUQQAAAAAAABIg/oeAAAAAAAAAJYX4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAABQaxMnTszee++dlVdeOVVVVbnkkkvqe6RPdMYZZ6SqqqrGsu7du2fo0KH1M9AiLGpGAAAA6pd4BgDACuP555/P3nvvnW7duqVp06ZZddVVs+OOO+ayyy6r79G+NI477rjce++9OeWUU3Lttddm5513/sRtq6qqKr8aNGiQLl26ZKeddsqDDz5YdwMvA2+//XbOOOOMjBkzpt5mGDp0aI338z9/NW3atN7m+k/XX3/9ch1TAQAAaqthfQ8AAAC18fjjj2e77bZL165dc+ihh6ZTp05544038uc//zk/+9nPctRRR9X3iF8KDzzwQL7xjW/kxBNPrNX2O+64Yw466KAURZFx48bliiuuyPbbb58777wzu+yyy+c87cLGjh2bBg0W7/8hfPvtt3PmmWeme/fu6du37+czWC00adIkv/rVrxZaXl1dXQ/TLOz666/PCy+8kGOPPba+RwEAAFgq4hkAACuEc889N23atMlTTz2Vtm3b1lg3adKk+hnqS2jSpEkLvf+fZu21186BBx5Yebznnnvmq1/9ai655JJPjGezZ89O48aNFzty1UaTJk2W+XPWlYYNG9Z4LwEAAPh8uG0jAAArhFdffTV9+vRZZLjp0KHDQst+85vfZKONNkqzZs3Srl277LfffnnjjTcW2m7EiBHp2bNnmjVrlk022SSPPPJItt1222y77baVbUaNGpWqqqq89tprNfZ98MEHU1VVtdBtCJ988snsvPPOadOmTZo3b55tttkmjz32WI1tFnzX1SuvvJKhQ4embdu2adOmTYYNG5ZZs2Yt8vVssskmad68eVZaaaVsvfXW+eMf/1hjm7vvvjtbbbVVWrRokVatWmW33XbL3//+94Wea1H+9a9/ZZ999km7du3SvHnzbLbZZrnzzjsXeg+KosjPf/7zyi0DF9d6662X9u3bZ9y4cUn+/3t4ww035Ic//GFWXXXVNG/ePDNmzEhSu/cySR599NFsvPHGadq0aXr27Jlf/OIXizz+or7zbNq0aTnuuOPSvXv3NGnSJKuttloOOuigTJ48OQ8++GA23njjJMmwYcMqr3vUqFGV/Zf1jEvq6aefTlVVVa655pqF1t17772pqqrKHXfcUVn21ltv5eCDD07Hjh3TpEmT9OnTJ7/+9a9r7Lfg9+emm27Kueeem9VWWy1NmzbNDjvskFdeeaWy3bbbbps777wzr7/+euU96t69e2X9ZZddlj59+lQ+v/369cv111+/TF8/AADAsuLKMwAAVgjdunXLE088kRdeeCFf+cpXPnXbc889N6eddlr23XfffPvb3867776byy67LFtvvXX++te/VgLc1Vdfne985zvZYostcuyxx+Zf//pX9thjj7Rr1y6rr776Es35wAMPZJdddslGG22U4cOHp0GDBhk5cmS23377PPLII9lkk01qbL/vvvumR48e+dGPfpRnn302v/rVr9KhQ4dccMEFlW3OPPPMnHHGGdliiy1y1llnpXHjxnnyySfzwAMPZKeddkqSXHvttRkyZEgGDBiQCy64ILNmzcqVV16Zr33ta/nrX/9aI2T8t4kTJ2aLLbbIrFmzcvTRR2fllVfONddckz322CO///3vs+eee2brrbfOtddem29961uVWzEuialTp2bq1KlZc801ayw/++yz07hx45x44on58MMP07hx41q/l88//3x22mmnrLLKKjnjjDPy0UcfZfjw4enYseNnzjNz5sxstdVWeemll3LwwQdnww03zOTJk3PbbbflzTffTK9evXLWWWfl9NNPz2GHHZatttoqSbLFFlskqf3v99LM+J8mT5680LLGjRundevW6devX9ZYY43cdNNNGTJkSI1tbrzxxqy00koZMGBAko9/zzfbbLNUVVXlyCOPzCqrrJK77747hxxySGbMmLHQrRfPP//8NGjQICeeeGKmT5+eH//4xznggAPy5JNPJklOPfXUTJ8+PW+++WYuvvjiJEnLli2TJL/85S9z9NFHZ++9984xxxyT2bNn529/+1uefPLJ7L///ov1+gEAAOpEAQAAK4A//vGPRXV1dVFdXV1svvnmxfe+973i3nvvLebMmVNju9dee62orq4uzj333BrLn3/++aJhw4aV5XPmzCk6dOhQ9O3bt/jwww8r240YMaJIUmyzzTaVZSNHjiySFOPGjavxnKNHjy6SFKNHjy6Koijmz59frLXWWsWAAQOK+fPnV7abNWtW0aNHj2LHHXesLBs+fHiRpDj44INrPOeee+5ZrLzyypXHL7/8ctGgQYNizz33LObNm1dj2wXHeP/994u2bdsWhx56aI31EyZMKNq0abPQ8v927LHHFkmKRx55pLLs/fffL3r06FF07969xnGTFEccccSnPt9/bnvIIYcU7777bjFp0qTiySefLHbYYYciSXHRRRcVRfH/38M11lijmDVrVo3XVtv3cuDAgUXTpk2L119/vbLsxRdfLKqrq4v//k+ebt26FUOGDKk8Pv3004skxR/+8IeF5l9w3KeeeqpIUowcOXKh9Z/HjIsyZMiQIskifw0YMKCy3SmnnFI0atSomDJlSmXZhx9+WLRt27bGZ+2QQw4pOnfuXEyePLnGcfbbb7+iTZs2ld+LBb8/vXr1qvHvyc9+9rMiSfH8889Xlu22225Ft27dFpr9G9/4RtGnT5/PfI0AAADLC7dtBABghbDjjjvmiSeeyB577JHnnnsuP/7xjzNgwICsuuqque222yrb/eEPf8j8+fOz7777ZvLkyZVfnTp1ylprrZXRo0cn+fgWd5MmTcrhhx+exo0bV/YfOnRo2rRps0QzjhkzJi+//HL233//vPfee5Vjf/DBB9lhhx3y8MMPZ/78+TX2Ofzww2s83mqrrfLee+9Vblt46623Zv78+Tn99NMX+g6wBbdNvO+++zJt2rR885vfrPGaq6urs+mmm1Ze8ye56667sskmm+RrX/taZVnLli1z2GGH5bXXXsuLL764RO9H8vHVfaussko6dOiQTTfdNI899liOP/74ha5sGjJkSJo1a1Z5XNv3ct68ebn33nszcODAdO3atbJ/r169KldZfZqbb74566+/fvbcc8+F1n3WbSnrasYFmjZtmvvuu2+hX+eff35lm8GDB2fu3Ln5wx/+UFn2xz/+MdOmTcvgwYOTJEVR5Oabb87uu++eoihqfGYGDBiQ6dOn59lnn61x7GHDhtX492TBFXj/+te/PnPutm3b5s0338xTTz1V69cKAABQn9y2EQCAFcbGG2+cP/zhD5kzZ06ee+653HLLLbn44ouz9957Z8yYMendu3defvnlFEWRtdZaa5HP0ahRoyTJ66+/niQLbdeoUaOsscYaSzTfyy+/nCQL3TLvP02fPj0rrbRS5fF/xpQklXVTp05N69at8+qrr6ZBgwbp3bv3Zx53++23X+T61q1bf+rcr7/+ejbddNOFlvfq1auy/rNulflJvvGNb+TII49MVVVVWrVqlT59+qRFixYLbdejR48aj2v7Xn744Yf597//vcjf73XWWSd33XXXp8736quvZtCgQbV5KQupqxkXqK6uTv/+/T91m/XXXz/rrrtubrzxxhxyyCFJPr5lY/v27Sufj3fffTfTpk3LiBEjMmLEiEU+z6RJk2o8/rTP6Wf5/ve/nz/96U/ZZJNNsuaaa2annXbK/vvvny233PIz9wUAAKgP4hkAACucxo0bZ+ONN87GG2+ctddeO8OGDcvvfve7DB8+PPPnz09VVVXuvvvuVFdXL7Tvgu9hWhyfdAXSvHnzajxecFXZT37yk/Tt23eR+/z38Rc1Y/Lx1UG1teC41157bTp16rTQ+oYN6+/H/tVWW+0zg0+SGledJbV/Lz/88MOlnnFJLa8zDh48OOeee24mT56cVq1a5bbbbss3v/nNyudgwdwHHnjgJ4a/r371qzUeL83ntFevXhk7dmzuuOOO3HPPPbn55ptzxRVX5PTTT8+ZZ565OC8NAACgTohnAACs0Pr165ckeeedd5IkPXv2TFEU6dGjR9Zee+1P3K9bt25JPr566D+v2Jo7d27GjRuX9ddfv7JswVU206ZNq/EcC65eW6Bnz55JPr7SqzbBqDZ69uyZ+fPn58UXX/zEQLPguB06dFii43br1i1jx45daPk//vGPyvq6Vtv3cpVVVkmzZs0qV4H9p0W9pkUd54UXXvjUbT4pntbVjItr8ODBOfPMM3PzzTenY8eOmTFjRvbbb78a87Rq1Srz5s1bZp/T5NNvc9miRYsMHjw4gwcPzpw5c7LXXnvl3HPPzSmnnJKmTZsusxkAAACWBd95BgDACmH06NGLvMplwS3v1llnnSTJXnvtlerq6px55pkLbV8URd57770kH0e3VVZZJVdddVXmzJlT2WbUqFELRbIFkeThhx+uLJs3b95Ct7zbaKON0rNnz1x44YWZOXPmQrO+++67tX25FQMHDkyDBg1y1llnLfR9aQte34ABA9K6deucd955mTt37mIfd9ddd81f/vKXPPHEE5VlH3zwQUaMGJHu3bt/6i0jPy+1fS+rq6szYMCA3HrrrRk/fnxl/UsvvZR77733M48zaNCgyi1A/9uC93fBbSb/+3NRVzMurl69emW99dbLjTfemBtvvDGdO3fO1ltvXVlfXV2dQYMG5eabb15kOFySz2ny8fs0ffr0hZYv+HdugcaNG6d3794pimKRn1cAAID65sozAABWCEcddVRmzZqVPffcM+uuu27mzJmTxx9/PDfeeGO6d++eYcOGJfk4dJ1zzjk55ZRT8tprr2XgwIFp1apVxo0bl1tuuSWHHXZYTjzxxDRq1CjnnHNOvvOd72T77bfP4MGDM27cuIwcOXKh7zzr06dPNttss5xyyimZMmVK2rVrlxtuuCEfffRRje0aNGiQX/3qV9lll13Sp0+fDBs2LKuuumreeuutjB49Oq1bt87tt9++WK97zTXXzKmnnpqzzz47W221Vfbaa680adIkTz31VLp06ZIf/ehHad26da688sp861vfyoYbbpj99tsvq6yySsaPH58777wzW265ZS6//PJPPMbJJ5+c3/72t9lll11y9NFHp127drnmmmsybty43HzzzWnQoO7/n7vFeS/PPPPM3HPPPdlqq63yP//zP/noo49y2WWXpU+fPvnb3/72qcc56aST8vvf/z777LNPDj744Gy00UaZMmVKbrvttlx11VVZf/3107Nnz7Rt2zZXXXVVWrVqlRYtWmTTTTdNjx496mTGBT766KP85je/WeS6Pffcs8Z3yQ0ePDinn356mjZtmkMOOWSh38Pzzz8/o0ePzqabbppDDz00vXv3zpQpU/Lss8/mT3/6U6ZMmVKrmf7TRhttlBtvvDHHH398Nt5447Rs2TK77757dtppp3Tq1ClbbrllOnbsmJdeeimXX355dtttt7Rq1WqxjwMAAPC5KwAAYAVw9913FwcffHCx7rrrFi1btiwaN25crLnmmsVRRx1VTJw4caHtb7755uJrX/ta0aJFi6JFixbFuuuuWxxxxBHF2LFja2x3xRVXFD169CiaNGlS9OvXr3j44YeLbbbZpthmm21qbPfqq68W/fv3L5o0aVJ07Nix+MEPflDcd999RZJi9OjRNbb961//Wuy1117FyiuvXDRp0qTo1q1bse+++xb3339/ZZvhw4cXSYp33323xr4jR44skhTjxo2rsfzXv/51scEGGxRNmjQpVlpppWKbbbYp7rvvvhrbjB49uhgwYEDRpk2bomnTpkXPnj2LoUOHFk8//fRnvr+vvvpqsffeexdt27YtmjZtWmyyySbFHXfcsdB2SYojjjjiM5+vttuOHj26SFL87ne/W+T62ryXRVEUDz30ULHRRhsVjRs3LtZYY43iqquuqrzH/6lbt27FkCFDaix77733iiOPPLJYddVVi8aNGxerrbZaMWTIkGLy5MmVbf7v//6v6N27d9GwYcMiSTFy5MjPbcZFGTJkSJHkE3/99+fl5Zdfrqx79NFHF/mcEydOLI444ohi9dVXLxo1alR06tSp2GGHHYoRI0ZUtvmk359x48Yt9D7MnDmz2H///Yu2bdsWSYpu3boVRVEUv/jFL4qtt9668v707NmzOOmkk4rp06d/5usGAACoD1VFsRjfRA4AAF8C2267bZLkwQcfrNc5AAAAgLrnO88AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAku88AwAAAAAAgJIrzwAAAAAAAKAkngEAAAAAAECpYX0PkCTz58/P22+/nVatWqWqqqq+xwEAAAAAAOpRURR5//3306VLlzRo4Dog6tZyEc/efvvtrL766vU9BgAAAAAAsBx54403stpqq9X3GHzJLBfxrFWrVkk+/pegdevW9TwNAAAAAABQn2bMmJHVV1+90g+gLi0X8WzBrRpbt24tngEAAAAAAEniq56oF24UCgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJSWi+88AwAAAAAAWBxFUeSjjz7KvHnz6nsUlnPV1dVp2LBhrb9DTzwDAAAAAABWKHPmzMk777yTWbNm1fcorCCaN2+ezp07p3Hjxp+5rXgGAAAAAACsMObPn59x48aluro6Xbp0SePGjWt9RRFfPkVRZM6cOXn33Xczbty4rLXWWmnQ4NO/1Uw8AwAAAAAAVhhz5szJ/Pnzs/rqq6d58+b1PQ4rgGbNmqVRo0Z5/fXXM2fOnDRt2vRTt//0tAYAAAAAALAc+qyrh+A/Lc7nxScLAAAAAAAASm7bCAAAAAAAfCGMH59Mnlx3x2vfPunate6OR90QzwAAAAAAgBXe+PHJOusks2fX3TGbNk3Gjv3iB7QHH3ww2223XaZOnZq2bdt+7sfbeuutc/jhh2f//fev1fYvvvhidtppp4wdOzYtWrRY6uO7bSMAAAAAALDCmzy5bsNZ8vHxFudKt6FDh6aqqirnn39+jeW33nprqqqqlvF0K6bbbrstEydOzH777VdZNnv27BxxxBFZeeWV07JlywwaNCgTJ06srO/du3c222yz/PSnP10mM4hnAAAAAAAAdaRp06a54IILMnXq1GX6vHPmzFmmz1dfLr300gwbNiwNGvz/hHXcccfl9ttvz+9+97s89NBDefvtt7PXXnvV2G/YsGG58sor89FHHy31DOIZAAAAAABAHenfv386deqUH/3oR5+63c0335w+ffqkSZMm6d69ey666KIa67t3756zzz47Bx10UFq3bp3DDjsso0aNStu2bXPHHXdknXXWSfPmzbP33ntn1qxZueaaa9K9e/estNJKOfroozNv3rzKc1177bXp169fWrVqlU6dOmX//ffPpEmTPpfX/2nefffdPPDAA9l9990ry6ZPn56rr746P/3pT7P99ttno402ysiRI/P444/nz3/+c2W7HXfcMVOmTMlDDz201HOIZwAAAAAAAHWkuro65513Xi677LK8+eabi9zmmWeeyb777pv99tsvzz//fM4444ycdtppGTVqVI3tLrzwwqy//vr561//mtNOOy1JMmvWrFx66aW54YYbcs899+TBBx/Mnnvumbvuuit33XVXrr322vziF7/I73//+8rzzJ07N2effXaee+653HrrrXnttdcydOjQz+st+ESPPvpomjdvnl69elWWPfPMM5k7d2769+9fWbbuuuuma9eueeKJJyrLGjdunL59++aRRx5Z6jkaLvUzAAAAAAAAUGt77rln+vbtm+HDh+fqq69eaP1Pf/rT7LDDDpUgtvbaa+fFF1/MT37ykxpRa/vtt88JJ5xQefzII49k7ty5ufLKK9OzZ88kyd57751rr702EydOTMuWLdO7d+9st912GT16dAYPHpwkOfjggyvPscYaa+TSSy/NxhtvnJkzZ6Zly5afx1uwSK+//no6duxY45aNEyZMSOPGjdO2bdsa23bs2DETJkyosaxLly55/fXXl3oOV54BAAAAAADUsQsuuCDXXHNNXnrppYXWvfTSS9lyyy1rLNtyyy3z8ssv17jdYr9+/Rbat3nz5pVwlnwcmbp3714jgnXs2LHGbRmfeeaZ7L777unatWtatWqVbbbZJkkyfvz4JX+BS+Df//53mjZtusT7N2vWLLNmzVrqOcQzAAAAAACAOrb11ltnwIABOeWUU5b4OVq0aLHQskaNGtV4XFVVtchl8+fPT5J88MEHGTBgQFq3bp3rrrsuTz31VG655ZYkyZw5c5Z4tiXRvn37TJ06tcayTp06Zc6cOZk2bVqN5RMnTkynTp1qLJsyZUpWWWWVpZ5DPAMAAAAAAKgH559/fm6//fYa392VJL169cpjjz1WY9ljjz2WtddeO9XV1ct0hn/84x957733cv7552errbbKuuuuW+OqtLq0wQYbZMKECTUC2kYbbZRGjRrl/vvvrywbO3Zsxo8fn80337zG/i+88EI22GCDpZ7Dd56tCKqq6nsCAIBUpVjifYv4eYbaW5rPGrBi8ufE8sM5GKB+FE6/X1rrrbdeDjjggFx66aU1lp9wwgnZeOONc/bZZ2fw4MF54okncvnll+eKK65Y5jN07do1jRs3zmWXXZbDDz88L7zwQs4+++xlfpza2GCDDdK+ffs89thj+frXv54kadOmTQ455JAcf/zxadeuXVq3bp2jjjoqm2++eTbbbLPKvq+99lreeuut9O/ff6nncOUZAAAAAACwwmvfPlmKr8taIk2bfnzcpXHWWWdVbqG4wIYbbpibbropN9xwQ77yla/k9NNPz1lnnZWhQ4cu3cEWYZVVVsmoUaPyu9/9Lr17987555+fCy+8cJkfpzaqq6szbNiwXHfddTWWX3zxxfn617+eQYMGZeutt06nTp3yhz/8ocY2v/3tb7PTTjulW7duSz1HVVHUf9OeMWNG2rRpk+nTp6d169b1Pc7yx5VnAMBywJVn1BVXPcCXjz8nlh/OwQD1o/7/ln7582ndYPbs2Rk3blx69OiRpv9Vy8aPTyZPrrs527dPunatu+N9GUyYMCF9+vTJs88+W+sQNmfOnKy11lq5/vrrs+WWWy5ym0/73Pw3t20EAAAAAAC+ELp2FbNWdJ06dcrVV1+d8ePH1zqejR8/Pj/4wQ8+MZwtLvEMAAAAAACA5cbAgQMXa/s111wza6655jI7vu88AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFBqWN8DAAAAAAAALBPjxyeTJ9fd8dq3T7p2rbvjUSfEMwAAAAAAYMU3fnyyzjrJ7Nl1d8ymTZOxY5dpQHvwwQez3XbbZerUqWnbtu0ye976dsYZZ+TWW2/NmDFjPnW70047LRMnTsyIESNq/dybbbZZTjrppAwaNGgpp/yY2zYCAAAAAAArvsmT6zacJR8fbwmudHviiSdSXV2d3Xbb7XMYasU1YcKE/OxnP8upp55aWfbwww9n9913T5cuXVJVVZVbb711of1++MMf5uSTT878+fOXyRziGQAAAAAAQB26+uqrc9RRR+Xhhx/O22+/Xd/jVMydO7dej/+rX/0qW2yxRbp161ZZ9sEHH2T99dfPz3/+80/cb5dddsn777+fu+++e5nMIZ4BAAAAAADUkZkzZ+bGG2/Md7/73ey2224ZNWrUIrd77LHH8tWvfjVNmzbNZpttlhdeeKGybtSoUWnbtm3uvffe9OrVKy1btszOO++cd955p7LN/Pnzc9ZZZ2W11VZLkyZN0rdv39xzzz2V9a+99lqqqqpy4403ZptttknTpk1z3XXXZejQoRk4cGDOO++8dOzYMW3bts1ZZ52Vjz76KCeddFLatWuX1VZbLSNHjqwx7/e///2svfbaad68edZYY42cdtppix3jbrjhhuy+++41lu2yyy4555xzsueee37iftXV1dl1111zww03LNbxPol4BgAAAAAAUEduuummrLvuullnnXVy4IEH5te//nWKolhou5NOOikXXXRRnnrqqayyyirZfffda8SoWbNm5cILL8y1116bhx9+OOPHj8+JJ55YWf+zn/0sF110US688ML87W9/y4ABA7LHHnvk5ZdfrnGck08+Occcc0xeeumlDBgwIEnywAMP5O23387DDz+cn/70pxk+fHi+/vWvZ6WVVsqTTz6Zww8/PN/5znfy5ptvVp6nVatWGTVqVF588cX87Gc/yy9/+ctcfPHFtX5fpkyZkhdffDH9+vWr9T7/aZNNNskjjzyyRPv+N/EMAAAAAACgjlx99dU58MADkyQ777xzpk+fnoceemih7YYPH54dd9wx6623Xq655ppMnDgxt9xyS2X93Llzc9VVV6Vfv37ZcMMNc+SRR+b++++vrL/wwgvz/e9/P/vtt1/WWWedXHDBBenbt28uueSSGsc59thjs9dee6VHjx7p3LlzkqRdu3a59NJLs8466+Tggw/OOuusk1mzZuUHP/hB1lprrZxyyilp3LhxHn300crz/PCHP8wWW2yR7t27Z/fdd8+JJ56Ym266qdbvy/jx41MURbp06VLrff5Tly5d8sYbbyyT7z1ruNTPAAAAAAAAwGcaO3Zs/vKXv1QiWMOGDTN48OBcffXV2XbbbWtsu/nmm1f+uV27dllnnXXy0ksvVZY1b948PXv2rDzu3LlzJk2alCSZMWNG3n777Wy55ZY1nnPLLbfMc889V2PZoq706tOnTxo0+P/XX3Xs2DFf+cpXKo+rq6uz8sorV46XJDfeeGMuvfTSvPrqq5k5c2Y++uijtG7d+jPfkwX+/e9/J0maNm1a633+U7NmzTJ//vx8+OGHadas2RI9xwKuPAMAAAAAAKgDV199dT766KN06dIlDRs2TMOGDXPllVfm5ptvzvTp0xfruRo1alTjcVVV1SJv//hZWrRoUavnXtSyBVd5PfHEEznggAOy66675o477shf//rXnHrqqZkzZ06t52jfvn2SZOrUqYv7EpJ8fNvHFi1aLHU4S8QzAAAAAACAz91HH32U//3f/81FF12UMWPGVH4999xz6dKlS37729/W2P7Pf/5z5Z+nTp2af/7zn+nVq1etjtW6det06dIljz32WI3ljz32WHr37r30L+a/PP744+nWrVtOPfXU9OvXL2uttVZef/31xXqOnj17pnXr1nnxxReXaIYXXnghG2ywwRLt+9/cthEAAAAAAOBzdscdd2Tq1Kk55JBD0qZNmxrrBg0alKuvvjqHH354ZdlZZ52VlVdeOR07dsypp56a9u3bZ+DAgbU+3kknnZThw4enZ8+e6du3b0aOHJkxY8bkuuuuW1YvqWKttdbK+PHjc8MNN2TjjTfOnXfeWeP72WqjQYMG6d+/fx599NEar3PmzJl55ZVXKo/HjRuXMWPGpF27dunatWtl+SOPPJKddtppqV9L4sozAAAAAADgi6B9+2QJvy9riTVt+vFxa+Hqq69O//79Fwpnycfx7Omnn87f/va3yrLzzz8/xxxzTDbaaKNMmDAht99+exo3blzr0Y4++ugcf/zxOeGEE7LeeuvlnnvuyW233Za11lqr1s9RW3vssUeOO+64HHnkkenbt28ef/zxnHbaaYv9PN/+9rdzww03VG4HmSRPP/10Nthgg8pVZccff3w22GCDnH766ZVt3nrrrTz++OMZNmzY0r+YJFXFktwAcxmbMWNG2rRpk+nTpy/Wl8d9aVRV1fcEAACpypL/2FjEzzPU3tJ81oAVkz8nlh/OwQD1o/7/ln7582ndYPbs2Rk3blx69OiRpv8dy8aPTyZPrrtB27dP/uPqJ5ZOURTZdNNNc9xxx+Wb3/xmrff7/ve/n6lTp2bEiBGfuM2nfm7+i9s2AgAAAAAAXwxdu4pZK7CqqqqMGDEizz///GLt16FDhxx//PHLbA7xDAAAAAAAgOVC375907dv38Xa54QTTlimM/jOMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAgBVOURT1PQIrkMX5vIhnAAAAAADACqNRo0ZJklmzZtXzJKxIFnxeFnx+Pk3Dz3sYAAAAAACAZaW6ujpt27bNpEmTkiTNmzdPVVVVPU/F8qooisyaNSuTJk1K27ZtU11d/Zn7iGcAAAAAAMAKpVOnTklSCWjwWdq2bVv53HwW8QwAAAAAAFihVFVVpXPnzunQoUPmzp1b3+OwnGvUqFGtrjhbQDwDAAAAAABWSNXV1YsVRaA2GtT3AAAAAAAAALC8EM8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwA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AAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAkngGAAAAAAAAJfEMAAAAAAAASuIZAAAAAAAAlMQzAAAAAAAAKIlnAAAAAAAAUBLPAAAAAAAAoCSeAQAAAAAAQEk8AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAAAAAACUxDMAAAAAAAAoiWcAAAAAAABQEs8AAAAAAACgJJ4BAAAAAABASTwDAAAAAACAUsP6HiBJiqJIksyYMaOeJwEA4JMt+c9qfspj8fjEwJeNf+uXJ343AOqDvxpf2IJesKAfQF1aLuLZ+++/nyRZffXV63kSAAA+WZt62JMvJ58Y+LLxb/3yxO8GQH1o4/T7id5///208QZRx6qK5SDbzp8/P2+//XZatWqVqqqq+h5nhTFjxoysvvrqeeONN9K6dev6Hgf4AnKeAT5vzjPA58k5Bvi8Oc8An7cv83mmKIq8//776dKlSxo08A1U1K3l4sqzBg0aZLXVVqvvMVZYrVu3/tKdOIG65TwDfN6cZ4DPk3MM8HlzngE+b1/W84wrzqgvci0AAAAAAACUxDMAAAAAAAAoiWcrsCZNmmT48OFp0qRJfY8CfEE5zwCfN+cZ4PPkHAN83pxngM+b8wzUj6qiKIr6HgIAAAAAAACWB648AwAAAAAAgJJ4BgAAAAAAACXxDAAAAAAAAEriGQAAAAAAAJTEsxXUz3/+83Tv3j1NmzbNpptumr/85S/1PRKwgvrRj36UjTfeOK1atUqHDh0ycODAjB07tsY2s2fPzhFHHJGVV145LVu2zKBBgzJx4sR6mhhYkZ1//vmpqqrKscceW1nmHAMsC2+99VYOPPDArLzyymnWrFnWW2+9PP3005X1RVHk9NNPT+fOndOsWbP0798/L7/8cj1ODKwo5s2bl9NOOy09evRIs2bN0rNnz5x99tkpiqKyjXMMsDgefvjh7L777unSpUuqqqpy66231lhfm3PKlClTcsABB6R169Zp27ZtDjnkkMycObMOXwV8sYlnK6Abb7wxxx9/fIYPH55nn30266+/fgYMGJBJkybV92jACuihhx7KEUcckT//+c+57777Mnfu3Oy000754IMPKtscd9xxuf322/O73/0uDz30UN5+++3stdde9Tg1sCJ66qmn8otf/CJf/epXayx3jgGW1tSpU7PlllumUaNGufvuu/Piiy/moosuykorrVTZ5sc//nEuvfTSXHXVVXnyySfTokWLDBgwILNnz67HyYEVwQUXXJArr7wyl19+eV566aVccMEF+fGPf5zLLrusso1zDLA4Pvjgg6y//vr5+c9/vsj1tTmnHHDAAfn73/+e++67L3fccUcefvjhHHbYYXX1EuALr6r4z/9NhhXCpptumo033jiXX355kmT+/PlZffXVc9RRR+Xkk0+u5+mAFd27776bDh065KGHHsrWW2+d6dOnZ5VVVsn111+fvffeO0nyj3/8I7169coTTzyRzTbbrJ4nBlYEM2fOzIYbbpgrrrgi55xzTvr27ZtLLrnEOQZYJk4++eQ89thjeeSRRxa5viiKdOnSJSeccEJOPPHEJMn06dPTsWPHjBo1Kvvtt19djgusYL7+9a+nY8eOufrqqyvLBg0alGbNmuU3v/mNcwywVKqqqnLLLbdk4MCBSWr3c8tLL72U3r1756mnnkq/fv2SJPfcc0923XXXvPnmm+nSpUt9vRz4wnDl2Qpmzpw5eeaZZ9K/f//KsgYNGqR///554okn6nEy4Iti+vTpSZJ27dolSZ555pnMnTu3xnln3XXXTdeuXZ13gFo74ogjsttuu9U4lyTOMcCycdttt6Vfv37ZZ5990qFDh2ywwQb55S9/WVk/bty4TJgwoca5pk2bNtl0002da4DPtMUWW+T+++/PP//5zyTJc889l0cffTS77LJLEucYYNmqzTnliSeeSNu2bSvhLEn69++fBg0a5Mknn6zzmeGLqGF9D8DimTx5cubNm5eOHTvWWN6xY8f84x//qKepgC+K+fPn59hjj82WW26Zr3zlK0mSCRMmpHHjxmnbtm2NbTt27JgJEybUw5TAiuaGG27Is88+m6eeemqhdc4xwLLwr3/9K1deeWWOP/74/OAHP8hTTz2Vo48+Oo0bN86QIUMq55NF/XeUcw3wWU4++eTMmDEj6667bqqrqzNv3ryce+65OeCAA5LEOQZYpmpzTpkwYUI6dOhQY33Dhg3Trl075x1YRsQzACqOOOKIvPDCC3n00UfrexTgC+KNN97IMccck/vuuy9Nmzat73GAL6j58+enX79+Oe+885IkG2ywQV544YVcddVVGTJkSD1PB6zobrrpplx33XW5/vrr06dPn4wZMybHHntsunTp4hwDAF9Qbtu4gmnfvn2qq6szceLEGssnTpyYTp061dNUwBfBkUcemTvuuCOjR4/OaqutVlneqVOnzJkzJ9OmTauxvfMOUBvPPPNMJk2alA033DANGzZMw4YN89BDD+XSSy9Nw4YN07FjR+cYYKl17tw5vXv3rrGsV69eGT9+fJJUzif+OwpYEieddFJOPvnk7LfffllvvfXyrW99K8cdd1x+9KMfJXGOAZat2pxTOnXqlEmTJtVY/9FHH2XKlCnOO7CMiGcrmMaNG2ejjTbK/fffX1k2f/783H///dl8883rcTJgRVUURY488sjccssteeCBB9KjR48a6zfaaKM0atSoxnln7NixGT9+vPMO8Jl22GGHPP/88xkzZkzlV79+/XLAAQdU/tk5BlhaW265ZcaOHVtj2T//+c9069YtSdKjR4906tSpxrlmxowZefLJJ51rgM80a9asNGhQ86/QqqurM3/+/CTOMcCyVZtzyuabb55p06blmWeeqWzzwAMPZP78+dl0003rfGb4InLbxhXQ8ccfnyFDhqRfv37ZZJNNcskll+SDDz7IsGHD6ns0YAV0xBFH5Prrr8///d//pVWrVpV7Y7dp0ybNmjVLmzZtcsghh+T4449Pu3bt0rp16xx11FHZfPPNs9lmm9Xz9MDyrlWrVpXvUFygRYsWWXnllSvLnWOApXXcccdliy22yHnnnZd99903f/nLXzJixIiMGDEiSVJVVZVjjz0255xzTtZaa6306NEjp512Wrp06ZKBAwfW7/DAcm/33XfPueeem65du6ZPnz7561//mp/+9Kc5+OCDkzjHAItv5syZeeWVVyqPx40blzFjxqRdu3bp2rXrZ55TevXqlZ133jmHHnporrrqqsydOzdHHnlk9ttvv3Tp0qWeXhV8sVQVRVHU9xAsvssvvzw/+clPMmHChPTt2zeXXnqp/6sAWCJVVVWLXD5y5MgMHTo0STJ79uyccMIJ+e1vf5sPP/wwAwYMyBVXXOFWAMAS2XbbbdO3b99ccsklSZxjgGXjjjvuyCmnnJKXX345PXr0yPHHH59DDz20sr4oigwfPjwjRozItGnT8rWvfS1XXHFF1l577XqcGlgRvP/++znttNNyyy23ZNKkSenSpUu++c1v5vTTT0/jxo2TOMcAi+fBBx/Mdtttt9DyIUOGZNSoUbU6p0yZMiVHHnlkbr/99jRo0CCDBg3KpZdempYtW9blS4EvLPEMAAAAAAAASr7zDAAAAAAAAEriGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK4hkAAFDDu+++m+9+97vp2rVrmjRpkk6dOmXAgAF57LHH6ns0AAAA+Nw1rO8BAACA5cugQYMyZ86cXHPNNVljjTUyceLE3H///XnvvffqezQAAAD43LnyDAAAqJg2bVoeeeSRXHDBBdluu+3SrVu3bLLJJjnllFOyxx57VLb59re/nVVWWSWtW7fO9ttvn+eee67G85x//vnp2LFjWrVqlUMOOSQnn3xy+vbtW1m/7bbb5thjj62xz8CBAzN06NDK4w8//DAnnnhiVl111bRo0SKbbrppHnzwwcr6UaNGpW3btrn33nvTq1evtGzZMjvvvHPeeeedGs/761//On369EmTJk3SuXPnHHnkkTVe72e9FgAAAL5cxDMAAKCiZcuWadmyZW699dZ8+OGHi9xmn332yaRJk3L33XfnmWeeyYYbbpgddtghU6ZMSZLcdNNNOeOMM3Leeefl6aefTufOnXPFFVcs9ixHHnlknnjiidxwww3529/+ln322Sc777xzXn755co2s2bNyoUXXphrr702Dz/8cMaPH58TTzyxsv7KK6/MEUcckcMOOyzPP/98brvttqy55pq1fi0AAAB8+VQVRVHU9xAAAMDy4+abb86hhx6af//739lwww2zzTbbZL/99stXv/rVPProo9ltt90yadKkNGnSpLLPmmuume9973s57LDDssUWW2SDDTbIz3/+88r6zTbbLLNnz86YMWOSfHzlWd++fXPJJZdUthk4cGDatm2bUaNGZfz48VljjTUyfvz4dOnSpbJN//79s8kmm+S8887LqFGjMmzYsLzyyivp2bNnkuSKK67IWWedlQkTJiRJVl111QwbNiznnHPOQq+zNq8FAACALx/feQYAANQwaNCg7LbbbnnkkUfy5z//OXfffXd+/OMf51e/+lU++OCDzJw5MyuvvHKNff7973/n1VdfTZK89NJLOfzww2us33zzzTN69Ohaz/D8889n3rx5WXvttWss//DDD2scu3nz5pVwliSdO3fOpEmTkiSTJk3K22+/nR122GGRx3juuec+87UAAADw5SOeAQAAC2natGl23HHH7LjjjjnttNPy7W9/O8OHD8///M//pHPnzjW+e2yBtm3b1vr5GzRokP++CcbcuXMr/zxz5sxUV1fnmWeeSXV1dY3tWrZsWfnnRo0a1VhXVVVVed5mzZp96gwzZ85cJq8FAACALxbxDAAA+Ey9e/fOrbfemg033DATJkxIw4YN071790Vu26tXrzz55JM56KCDKsv+/Oc/19hmlVVWyTvvvFN5PG/evLzwwgvZbrvtkiQbbLBB5s2bl0mTJmWrrbZaoplbtWqV7t275/77768873+qzWsBAADgy6dBfQ8AAAAsP957771sv/32+c1vfpO//e1vGTduXH73u9/lxz/+cb7xjW+kf//+2XzzzTNw4MD88Y9/zGuvvZbHH388p556ap5++ukkyTHHHJNf//rXGTlyZP75z39m+PDh+fvf/17jONtvv33uvPPO3HnnnfnHP/6R7373u5k2bVpl/dprr50DDjggBx10UP7whz9k3Lhx+ctf/pIf/ehHufPOO2v9es4444xcdNFFufTSS/Pyyy/n2WefzWWXXZYktXotAAAAfPm48gwAAKho2bJlNt1001x88cV59dVXM3fu3Ky++uo59NBD84Mf/CBVVVW56667cuqpp2bYsGF5991306lTp2y99dbp2LFjkmTw4MF59dVX873vfS+zZ8/OoEGD8t3vfjf33ntv5TgHH3xwnnvuuRx00EFp2LBhjjvuuIWuDhs5cmTOOeecnHDCCXnrrbfSvn37bLbZZvn6179e69czZMiQzJ49OxdffHFOPPHEtG/fPnvvvXeS1Oq1AAAA8OVTVfz3Fw0AAAAsY2eccUZuvfXWjBkzpr5HAQAAgE/lto0AAAAAAABQEs8AAAAAAACg5LaNAAAAAAAAUHLlGQAAAAAAAJTEMwAAAAAAACiJZwAAAAAAAFASzwAAAAAAAKAkngEAAAAAAEBJPAMAAAAAAICSeAYAAAAAAAAl8QwAAAAAAABK/w+2Bgwn49epUQAAAABJRU5ErkJggg==",
+      "text/plain": [
+       "<Figure size 2000x600 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import matplotlib.patches as mpatches\n",
+    "\n",
+    "# Get the sequence of results\n",
+    "results_sequence = results_df['marker']\n",
+    "print('marker count:')\n",
+    "results_sequence_counts = results_df['marker'].value_counts()\n",
+    "print(results_sequence_counts)\n",
+    "# Define colors for each class in the sequence\n",
+    "colors = ['blue' if result == 0 else 'red' for result in results_sequence]\n",
+    "\n",
+    "plt.figure(figsize=(20, 6))\n",
+    "plt.bar(range(len(results_sequence)), np.ones_like(results_sequence), color=colors, width=1)\n",
+    "patches = [mpatches.Patch(color=color, label=label) for label, color in zip(['Normal     (0)', 'Abnormal (1)'], ['blue', 'red'])]\n",
+    "plt.legend(handles=patches, bbox_to_anchor=(1, 1), loc='upper left')\n",
+    "plt.xlabel('Sequence')\n",
+    "plt.ylabel('Events')\n",
+    "plt.title('Sequence of Predicted Events')\n",
+    "plt.yticks([])\n",
+    "plt.show()"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.11.1"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
-- 
GitLab