{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "f0fb2388-6c99-41c3-8629-777c954f87a6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n",
    "\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "import warnings\n",
    "warnings.filterwarnings (\"ignore\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1dde3d63-b4b0-4790-81f1-24573a70323a",
   "metadata": {},
   "outputs": [],
   "source": [
    "data= pd.read_csv(r\"C:\\Users\\hp\\Downloads\\Dataset.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b1d4caf5-1840-4121-9a2c-9b273535155d",
   "metadata": {},
   "source": [
    "## Check the dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "52dc27cc-814f-4fd7-abbf-248e7ee70c18",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(25192, 42)\n",
      "Index(['duration', 'protocol_type', 'service', 'flag', 'src_bytes',\n",
      "       'dst_bytes', 'land', 'wrong_fragment', 'urgent', 'hot',\n",
      "       'num_failed_logins', 'logged_in', 'num_compromised', 'root_shell',\n",
      "       'su_attempted', 'num_root', 'num_file_creations', 'num_shells',\n",
      "       'num_access_files', 'num_outbound_cmds', 'is_host_login',\n",
      "       'is_guest_login', 'count', 'srv_count', 'serror_rate',\n",
      "       'srv_serror_rate', 'rerror_rate', 'srv_rerror_rate', 'same_srv_rate',\n",
      "       'diff_srv_rate', 'srv_diff_host_rate', 'dst_host_count',\n",
      "       'dst_host_srv_count', 'dst_host_same_srv_rate',\n",
      "       'dst_host_diff_srv_rate', 'dst_host_same_src_port_rate',\n",
      "       'dst_host_srv_diff_host_rate', 'dst_host_serror_rate',\n",
      "       'dst_host_srv_serror_rate', 'dst_host_rerror_rate',\n",
      "       'dst_host_srv_rerror_rate', 'class'],\n",
      "      dtype='str')\n",
      "<class 'pandas.DataFrame'>\n",
      "RangeIndex: 25192 entries, 0 to 25191\n",
      "Data columns (total 42 columns):\n",
      " #   Column                       Non-Null Count  Dtype  \n",
      "---  ------                       --------------  -----  \n",
      " 0   duration                     25192 non-null  int64  \n",
      " 1   protocol_type                25192 non-null  str    \n",
      " 2   service                      25192 non-null  str    \n",
      " 3   flag                         25192 non-null  str    \n",
      " 4   src_bytes                    25192 non-null  int64  \n",
      " 5   dst_bytes                    25192 non-null  int64  \n",
      " 6   land                         25192 non-null  int64  \n",
      " 7   wrong_fragment               25192 non-null  int64  \n",
      " 8   urgent                       25192 non-null  int64  \n",
      " 9   hot                          25192 non-null  int64  \n",
      " 10  num_failed_logins            25192 non-null  int64  \n",
      " 11  logged_in                    25192 non-null  int64  \n",
      " 12  num_compromised              25192 non-null  int64  \n",
      " 13  root_shell                   25192 non-null  int64  \n",
      " 14  su_attempted                 25192 non-null  int64  \n",
      " 15  num_root                     25192 non-null  int64  \n",
      " 16  num_file_creations           25192 non-null  int64  \n",
      " 17  num_shells                   25192 non-null  int64  \n",
      " 18  num_access_files             25192 non-null  int64  \n",
      " 19  num_outbound_cmds            25192 non-null  int64  \n",
      " 20  is_host_login                25192 non-null  int64  \n",
      " 21  is_guest_login               25192 non-null  int64  \n",
      " 22  count                        25192 non-null  int64  \n",
      " 23  srv_count                    25192 non-null  int64  \n",
      " 24  serror_rate                  25192 non-null  float64\n",
      " 25  srv_serror_rate              25192 non-null  float64\n",
      " 26  rerror_rate                  25192 non-null  float64\n",
      " 27  srv_rerror_rate              25192 non-null  float64\n",
      " 28  same_srv_rate                25192 non-null  float64\n",
      " 29  diff_srv_rate                25192 non-null  float64\n",
      " 30  srv_diff_host_rate           25192 non-null  float64\n",
      " 31  dst_host_count               25192 non-null  int64  \n",
      " 32  dst_host_srv_count           25192 non-null  int64  \n",
      " 33  dst_host_same_srv_rate       25192 non-null  float64\n",
      " 34  dst_host_diff_srv_rate       25192 non-null  float64\n",
      " 35  dst_host_same_src_port_rate  25192 non-null  float64\n",
      " 36  dst_host_srv_diff_host_rate  25192 non-null  float64\n",
      " 37  dst_host_serror_rate         25192 non-null  float64\n",
      " 38  dst_host_srv_serror_rate     25192 non-null  float64\n",
      " 39  dst_host_rerror_rate         25192 non-null  float64\n",
      " 40  dst_host_srv_rerror_rate     25192 non-null  float64\n",
      " 41  class                        25192 non-null  str    \n",
      "dtypes: float64(15), int64(23), str(4)\n",
      "memory usage: 8.1 MB\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "print(data.shape)\n",
    "print(data.columns)\n",
    "print(data.info())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50b322b8-0e02-4b5b-8199-3249d375cffd",
   "metadata": {},
   "source": [
    "## Check target variables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "930e7aca-c299-4e91-897b-bdacc275d8eb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total missing values: 0\n"
     ]
    }
   ],
   "source": [
    "print(\"Total missing values:\", data.isnull().sum().sum())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c09aa7a1-160f-430b-9033-760855d02ad4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "class\n",
      "normal     13449\n",
      "anomaly    11743\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(data[\"class\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f7ee10bc-e4c0-42bd-807e-7e84eab39653",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAHHCAYAAACiOWx7AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPs5JREFUeJzt3QmcjfX///+Xfd+3oYQie9QoFOKTrBWhskWIFvtOllCfD9mXRJKlT8lStEgklLINw2SXkCVbn2zZDed/e71+3+v8zzGDa3TGzDnzuN9u53bmXNd7rvM+hzPznPf7fb2uZB6PxyMAAAC4qeQ33w0AAABFaAIAAHCB0AQAAOACoQkAAMAFQhMAAIALhCYAAAAXCE0AAAAuEJoAAABcIDQBAAC4QGgCEBKqVq1qN9wZL730khQsWDChuwHcUYQmIImYMWOGJEuWTNKmTSt//PFHjP0aOEqVKpUgfQtFp06dsvda3/MdO3YkdHcABAChCUhiLl26JMOGDUvoboS8efPmWWAKCwuTTz75JKG7AyAACE1AElO2bFn54IMP5PDhw/H2HHod8AsXLkhS9vHHH0udOnWkSZMmMmvWrITuDoAAIDQBScwbb7whV69edTXaFB0dLW+99Zbcd999kiZNGlvDot+vo1W+dPtTTz0lS5YskXLlykm6dOnk/ffflx9++MFGW+bOnSuDBw+Wu+66SzJlyiSNGjWS06dP23G6dOkiuXPnlowZM0qrVq1iHHv69Onyr3/9y9poH0qUKCGTJk26rdeu04/VqlWLsf3atWvWN+2XY/bs2RIeHm79zZw5s5QuXVrGjRvn6nkOHDggP/30kzRu3Nhu+/btk9WrV99wSnT79u3Wr/Tp01s/hg8fHqPt8ePHpU2bNpInTx6b9itTpozMnDnTr83vv/9u7/fIkSNl4sSJcu+999oxa9SoIQcPHrQwq/+ed999t/0b1atXT06cOOF3jC+//FLq1q0r+fLls/db/+31e/T/zI3ocfX/gB7vehcvXpQsWbLIK6+84uq9AxKzlAndAQB3VqFChaRFixY22tSnTx/75XgjL7/8sv1i1jDRvXt3WbdunQwdOtTW6CxYsMCv7a5du2xURX85tm3bVooWLerdp9+jv6T1+X777TeZMGGCpEqVSpInTy4nT56UQYMGydq1a23dlfZv4MCB3u/VgFSyZEl55plnJGXKlPL111/L66+/bkGnffv2cXrtL7zwgj3X0aNHbdrM8fPPP9vImwYctXTpUnstTzzxhLzzzju2TV/zqlWrpHPnzrd8nk8//VQyZMhgQVJftwYPnaJ79NFHY7TV11+rVi1p0KCBPP/88/LZZ59J7969LaTVrl3b2uionQYsfe86dOhg75FO/+libF07dX2f9LkuX74sHTt2tFCkIUyPreFTg6we3/l36NGjh0ybNs37vfpvoAG2W7dudr98+XL79zhz5oyMGDEi1terQa158+b2PPp82bNn9+7Tfy/9Xt0PBD0PgCRh+vTpHv3Ir1+/3rNnzx5PypQpPZ06dfLuf/zxxz0lS5b0Po6KirL2L7/8st9xevToYduXL1/u3VagQAHbtnjxYr+2K1assO2lSpXyXL582bu9SZMmnmTJknlq167t175ixYp2LF/nz5+P8Vpq1qzpuffee/22af/1djO7du2y/kyYMMFv++uvv+7JmDGj97k6d+7syZw5syc6OtpzO0qXLu1p1qyZ9/Ebb7zhyZkzp+fKlSsx+qz9+eijj7zbLl265AkLC/M0bNjQu23s2LHW7uOPP/Zu0/dT3y/t95kzZ2zbvn37rF2uXLk8p06d8rbt27evbS9TpoxfH/TfIXXq1J6LFy/e9P1+5ZVXPOnTp/dr17JlS79/K+e9nTRpkt/3PvPMM56CBQt6rl275vr9AxIrpueAJEinbV588UWZMmWKHDlyJNY2ixYtsnsdcfClI07qm2++8duuox81a9aM9Vg6sqUjS47y5cvblE7r1q392ul2nUbSaUGHjtQ4dErvf//7nzz++OOyd+9eexwX999/v63pmjNnjnebTjvp6M7TTz/tfa6sWbPKuXPnbMQprjZv3ixbtmyxkSqHfq391unL6+loju8oTOrUqeWRRx6x1+f7b6EjY77H1PezU6dOcvbsWfnxxx/9jvncc8/ZlJjv+6r0eXS0zne7jkj5nk3p+37//fff1u/KlSvL+fPnZefOnTd9b/V4voveddTp22+/lWbNmtloFBDsCE1AEtW/f38LJzda27R//36bPitcuLDfdv3lraFC918fmm7knnvu8Xvs/ELPnz9/jO067eYbhnRKrHr16jbdpc+bK1cuW1el4hqanCk6PaYTFHS6StcL6XaHTv9pCNDpMV3/o+Fu8eLFrheAa181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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(x=\"class\", data=data)\n",
    "\n",
    "plt.title(\"Normal vs Anomaly\")\n",
    "plt.xlabel(\"Class\")\n",
    "plt.ylabel(\"Number of Records\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6fedfe46-c412-477f-8a8a-c57bf5fc6941",
   "metadata": {},
   "source": [
    "## Convert categorical columns into numbers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "68e10751-6564-4c78-ad9e-93e37c89e1fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "encoder = LabelEncoder()\n",
    "\n",
    "data[\"protocol_type\"] = encoder.fit_transform(\n",
    "    data[\"protocol_type\"]\n",
    ")\n",
    "\n",
    "data[\"service\"] = encoder.fit_transform(\n",
    "    data[\"service\"]\n",
    ")\n",
    "\n",
    "data[\"flag\"] = encoder.fit_transform(\n",
    "    data[\"flag\"]\n",
    ")\n",
    "\n",
    "data[\"class\"] = encoder.fit_transform(\n",
    "    data[\"class\"]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "d7de246b-8434-47fd-b2c3-2d2f1fba254e",
   "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>duration</th>\n",
       "      <th>protocol_type</th>\n",
       "      <th>service</th>\n",
       "      <th>flag</th>\n",
       "      <th>src_bytes</th>\n",
       "      <th>dst_bytes</th>\n",
       "      <th>land</th>\n",
       "      <th>wrong_fragment</th>\n",
       "      <th>urgent</th>\n",
       "      <th>hot</th>\n",
       "      <th>...</th>\n",
       "      <th>dst_host_srv_count</th>\n",
       "      <th>dst_host_same_srv_rate</th>\n",
       "      <th>dst_host_diff_srv_rate</th>\n",
       "      <th>dst_host_same_src_port_rate</th>\n",
       "      <th>dst_host_srv_diff_host_rate</th>\n",
       "      <th>dst_host_serror_rate</th>\n",
       "      <th>dst_host_srv_serror_rate</th>\n",
       "      <th>dst_host_rerror_rate</th>\n",
       "      <th>dst_host_srv_rerror_rate</th>\n",
       "      <th>class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>19</td>\n",
       "      <td>9</td>\n",
       "      <td>491</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>25</td>\n",
       "      <td>0.17</td>\n",
       "      <td>0.03</td>\n",
       "      <td>0.17</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.05</td>\n",
       "      <td>0.00</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>41</td>\n",
       "      <td>9</td>\n",
       "      <td>146</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.60</td>\n",
       "      <td>0.88</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>46</td>\n",
       "      <td>5</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>...</td>\n",
       "      <td>26</td>\n",
       "      <td>0.10</td>\n",
       "      <td>0.05</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>1.00</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>22</td>\n",
       "      <td>9</td>\n",
       "      <td>232</td>\n",
       "      <td>8153</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>255</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.03</td>\n",
       "      <td>0.04</td>\n",
       "      <td>0.03</td>\n",
       "      <td>0.01</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.01</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>22</td>\n",
       "      <td>9</td>\n",
       "      <td>199</td>\n",
       "      <td>420</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>255</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 42 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   duration  protocol_type  service  flag  src_bytes  dst_bytes  land  \\\n",
       "0         0              1       19     9        491          0     0   \n",
       "1         0              2       41     9        146          0     0   \n",
       "2         0              1       46     5          0          0     0   \n",
       "3         0              1       22     9        232       8153     0   \n",
       "4         0              1       22     9        199        420     0   \n",
       "\n",
       "   wrong_fragment  urgent  hot  ...  dst_host_srv_count  \\\n",
       "0               0       0    0  ...                  25   \n",
       "1               0       0    0  ...                   1   \n",
       "2               0       0    0  ...                  26   \n",
       "3               0       0    0  ...                 255   \n",
       "4               0       0    0  ...                 255   \n",
       "\n",
       "   dst_host_same_srv_rate  dst_host_diff_srv_rate  \\\n",
       "0                    0.17                    0.03   \n",
       "1                    0.00                    0.60   \n",
       "2                    0.10                    0.05   \n",
       "3                    1.00                    0.00   \n",
       "4                    1.00                    0.00   \n",
       "\n",
       "   dst_host_same_src_port_rate  dst_host_srv_diff_host_rate  \\\n",
       "0                         0.17                         0.00   \n",
       "1                         0.88                         0.00   \n",
       "2                         0.00                         0.00   \n",
       "3                         0.03                         0.04   \n",
       "4                         0.00                         0.00   \n",
       "\n",
       "   dst_host_serror_rate  dst_host_srv_serror_rate  dst_host_rerror_rate  \\\n",
       "0                  0.00                      0.00                  0.05   \n",
       "1                  0.00                      0.00                  0.00   \n",
       "2                  1.00                      1.00                  0.00   \n",
       "3                  0.03                      0.01                  0.00   \n",
       "4                  0.00                      0.00                  0.00   \n",
       "\n",
       "   dst_host_srv_rerror_rate  class  \n",
       "0                      0.00      1  \n",
       "1                      0.00      1  \n",
       "2                      0.00      0  \n",
       "3                      0.01      1  \n",
       "4                      0.00      1  \n",
       "\n",
       "[5 rows x 42 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1e3f009-0a72-4355-9e25-7f2bd821ad73",
   "metadata": {},
   "source": [
    "## Separate X and Y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a8ea5fbe-1af0-4858-be81-c7352459680e",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = data.drop(\"class\", axis=1)\n",
    "\n",
    "y = data[\"class\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c5f4cecc-c993-4883-9638-9fe4b2c2e5ec",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = data.drop(\"class\", axis=1)\n",
    "\n",
    "y = data[\"class\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8dea0148-6725-4602-8593-751788e876ac",
   "metadata": {},
   "source": [
    "## Split the data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "c5fd96ba-e3e9-4373-879b-e1586d166c21",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X,\n",
    "    y,\n",
    "    test_size=0.20,\n",
    "    random_state=42,\n",
    "    stratify=y\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "be104f4e-d703-4fdd-b64d-afa7b5d088fd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training data: (20153, 41)\n",
      "Testing data: (5039, 41)\n"
     ]
    }
   ],
   "source": [
    "print(\"Training data:\", X_train.shape)\n",
    "print(\"Testing data:\", X_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8805eda1-344a-4051-990b-375ea8d41222",
   "metadata": {},
   "source": [
    "## Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "6edfde55-4ae9-49f8-8d7d-d0157bf28044",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Logistic Regression Accuracy: 0.9023615796785076\n"
     ]
    }
   ],
   "source": [
    "model1 = LogisticRegression(max_iter=1000)\n",
    "\n",
    "model1.fit(X_train, y_train)\n",
    "\n",
    "prediction1 = model1.predict(X_test)\n",
    "\n",
    "accuracy1 = accuracy_score(\n",
    "    y_test,\n",
    "    prediction1\n",
    ")\n",
    "\n",
    "print(\"Logistic Regression Accuracy:\",\n",
    "      accuracy1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "f567a02b-5efe-4495-a837-36af381372cc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.96      0.83      0.89      2349\n",
      "           1       0.87      0.97      0.91      2690\n",
      "\n",
      "    accuracy                           0.90      5039\n",
      "   macro avg       0.91      0.90      0.90      5039\n",
      "weighted avg       0.91      0.90      0.90      5039\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    classification_report(\n",
    "        y_test,\n",
    "        prediction1\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1142d30b-be4e-448e-891b-71474b7f55d5",
   "metadata": {},
   "source": [
    "## Decision Tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "8140dc70-889c-4782-93a0-ec30318d7648",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Decision Tree Accuracy: 0.9950386981543957\n"
     ]
    }
   ],
   "source": [
    "model2 = DecisionTreeClassifier(\n",
    "    random_state=42\n",
    ")\n",
    "\n",
    "model2.fit(X_train, y_train)\n",
    "\n",
    "prediction2 = model2.predict(X_test)\n",
    "\n",
    "accuracy2 = accuracy_score(\n",
    "    y_test,\n",
    "    prediction2\n",
    ")\n",
    "\n",
    "print(\"Decision Tree Accuracy:\",\n",
    "      accuracy2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "bd6f1121-ed77-42f3-905d-d122ddcbb041",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.99      0.99      0.99      2349\n",
      "           1       1.00      1.00      1.00      2690\n",
      "\n",
      "    accuracy                           1.00      5039\n",
      "   macro avg       1.00      1.00      1.00      5039\n",
      "weighted avg       1.00      1.00      1.00      5039\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    classification_report(\n",
    "        y_test,\n",
    "        prediction2\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0329e6a4-0621-42a6-8881-25e87967580f",
   "metadata": {},
   "source": [
    "## Random Forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "e467f36a-35b0-41dd-9d89-31fb2c6cdd61",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Random Forest Accuracy: 0.9980154792617583\n"
     ]
    }
   ],
   "source": [
    "model3 = RandomForestClassifier(\n",
    "    n_estimators=100,\n",
    "    random_state=42\n",
    ")\n",
    "\n",
    "model3.fit(X_train, y_train)\n",
    "\n",
    "prediction3 = model3.predict(X_test)\n",
    "\n",
    "accuracy3 = accuracy_score(\n",
    "    y_test,\n",
    "    prediction3\n",
    ")\n",
    "\n",
    "print(\"Random Forest Accuracy:\",\n",
    "      accuracy3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "b743efcb-d2e6-4aa7-affa-48eecf9916f4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       1.00      1.00      1.00      2349\n",
      "           1       1.00      1.00      1.00      2690\n",
      "\n",
      "    accuracy                           1.00      5039\n",
      "   macro avg       1.00      1.00      1.00      5039\n",
      "weighted avg       1.00      1.00      1.00      5039\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    classification_report(\n",
    "        y_test,\n",
    "        prediction3\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c1fb11e5-9c35-4b24-b4bc-26451ee799ff",
   "metadata": {},
   "source": [
    "## Compare the three models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "a0c87f5f-bbd3-4974-b3a5-51928dc0fdc9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Logistic Regression: 0.9023615796785076\n",
      "Decision Tree: 0.9950386981543957\n",
      "Random Forest: 0.9980154792617583\n"
     ]
    }
   ],
   "source": [
    "print(\"Logistic Regression:\",\n",
    "      accuracy1)\n",
    "\n",
    "print(\"Decision Tree:\",\n",
    "      accuracy2)\n",
    "\n",
    "print(\"Random Forest:\",\n",
    "      accuracy3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "0b775856-3c90-4489-9b1c-a7bda6bfba17",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                 Model  Accuracy\n",
      "0  Logistic Regression  0.902362\n",
      "1        Decision Tree  0.995039\n",
      "2        Random Forest  0.998015\n"
     ]
    }
   ],
   "source": [
    "results = pd.DataFrame({\n",
    "    \"Model\": [\n",
    "        \"Logistic Regression\",\n",
    "        \"Decision Tree\",\n",
    "        \"Random Forest\"\n",
    "    ],\n",
    "    \n",
    "    \"Accuracy\": [\n",
    "        accuracy1,\n",
    "        accuracy2,\n",
    "        accuracy3\n",
    "    ]\n",
    "})\n",
    "\n",
    "print(results)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "469d5afe-fcbf-4489-94d2-fbc6861616b0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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7jnUjwEAAIDsGMwqSFXHr9GjR1urVq0i9V6jlS1b1q655pqDej3l2uoWy4IFC1JMUwrCxx9/fKiLDQAAgCzokINZlccqXbp0mvMceeSRrvUWAAAASKic2S1bttgnn3ySYrqmffbZZ+m1XAAAAED6B7PqbBWrvNWGDRvoiAUAAIDEDma/+eYbV5YruRo1arjHAAAAgIQNZlW3NflAB/LLL79Y7tyHnIILAAAAZF4w26RJk8ioWqE//vjD1ZZVlQMAAAAgsxxyU+qjjz5q55xzjqtooNQC0fC2qg373HPPZcQyAgAAAOkTzGqggi+++MJeeOEF+/zzzy1//vxuxK7WrVvHrDkLAAAAZJTDSnJVHdmOHTum/9IAAAAAh+Cwe2ypcoGGm927d2+S6S1atDjclwQAAAAyfgSwSy+91L788kvLkSOHBUHgput/2bdv36G+JAAAAJA51QzuvPNOK1u2rBsJrECBAvb111/bBx98YLVr17YFCxYc3lIAAAAAmdEyu3jxYps/f74VKVLEcubM6W5nn322DRkyxO644w5bvnz54SwHAAAAkPEts0ojOProo93/Cmg3btzo/lepru++++7QlwAAAADIrJbZKlWquJJcSjWoW7euDR061PLkyWNjx461cuXKHe5yAAAAABkfzN577722c+dO9//AgQPtkksusQYNGthxxx1n06ZNO/QlAAAAADIrmG3atGnk//Lly9vKlSvtt99+s2OPPTZS0QAAAABIuJzZf/75x3Lnzm1fffVVkumFCxcmkAUAAEBiB7Marvakk06iliwAAAD8rGbQt29f69Onj0stAAAAALzKmX3yySdt9erVVqJECVeO68gjj0zy+LJly9Jz+QAAAID0C2ZbtWp1qE8BAAAAEiOY7d+/f8YsCQAAAJDRObMAAACAty2zOXPmTLMMF5UOAAAAkLDB7IwZM1LUnl2+fLk988wzNmDAgPRcNgAAACB9g9mWLVummHbFFVdY5cqV3XC2N99886G+JAAAABDfnNkzzzzT5s2bl14vBwAAAGROMLt7924bOXKklSxZMj1eDgAAAMiYNINjjz02SQewIAjszz//tAIFCtjzzz9/qC8HAAAAZF4w+9hjjyUJZlXd4Pjjj7e6deu6QBcAAABI2GD2xhtvzJglAQAAADI6Z3bSpEk2ffr0FNM1TeW5AAAAgIQNZocMGWJFihRJMb1o0aI2ePDg9FouAAAAIP2D2XXr1lnZsmVTTC9durR7DAAAAEjYYFYtsF988UWK6Z9//rkdd9xx6bVcAAAAQPoHs61bt7Y77rjD3nvvPdu3b5+7zZ8/3+6880675pprDvXlAAAAgMyrZjBo0CBbu3atnX/++ZY79/89ff/+/damTRtyZgEAAJDYwWyePHls2rRp9sADD9iKFSssf/78VrVqVZczCwAAACR0MBuqUKGCuwEAAADe5Mxefvnl9vDDD6eYPnToULvyyivTa7kAAACA9A9mP/jgA7v44otTTL/ooovcYwAAAEDCBrN//fWXy5tN7ogjjrAdO3ak13IBAAAA6R/MqrOXOoAlN3XqVKtUqdKhvhwAAACQeR3A7rvvPrvssstszZo1dt5557lp8+bNsylTptjLL798+EsCAAAAZHQw27x5c5s5c6arKavgVaW5qlWr5gZOKFy48KG+HAAAAJC5pbmaNWvmbqI82RdffNF69OhhS5cudSOCAQAAAAmZMxtS5YK2bdtaiRIlbNiwYS7l4OOPP07fpQMAAADSq2V206ZNNnnyZJswYYJrkb3qqqtsz549Lu2Azl8AAABI2JZZ5cqeeuqp9sUXX9iIESNs48aN9sQTT2Ts0gEAAADp0TL75ptv2h133GGdO3dmGFsAAAD41TK7cOFC+/PPP61WrVpWt25de/LJJ23btm0Zu3QAAABAegSzZ555po0bN85++eUX69SpkxskQZ2/9u/fb++8844LdAEAAICErmZw5JFH2k033eRaar/88ku766677KGHHrKiRYtaixYtMmYpAQAAgPQszSXqEDZ06FD7+eefXa1ZAAAAwJtgNpQrVy5r1aqVzZo1Kz1eDgAAAMi8YBYAAACIB4JZAAAAeItgFgAAAN4imAUAAIC3CGYBAADgLYJZAAAAeItgFgAAAN5KiGB21KhRVqZMGcuXL5/VrVvXlixZclDP05C6OXLkcDVuAQAAkP3EPZidNm2ade/e3fr372/Lli2zatWqWdOmTW3Lli1pPm/t2rXWo0cPa9CgQaYtKwAAABJL3IPZ4cOHW4cOHaxdu3ZWqVIlGzNmjBUoUMAmTpyY6nP27dtn1113nQ0YMMDKlSuXqcsLAACAxBHXYHbv3r22dOlSa9y48f8WKGdOd3/x4sWpPm/gwIFWtGhRu/nmmw/4Hnv27LEdO3YkuQEAACBriGswu23bNtfKWqxYsSTTdX/Tpk0xn7Nw4UKbMGGCjRs37qDeY8iQIVaoUKHIrVSpUumy7AAAAIi/uKcZHIo///zTbrjhBhfIFilS5KCe07t3b9u+fXvktn79+gxfTgAAAGSO3BZHCkhz5cplmzdvTjJd94sXL55i/jVr1riOX82bN49M279/v/ubO3du++677+zkk09O8py8efO6GwAAALKeuLbM5smTx2rVqmXz5s1LEpzqfr169VLMf9ppp9mXX35pK1asiNxatGhhjRo1cv+TQgAAAJC9xLVlVlSWq23btla7dm2rU6eOjRgxwnbu3OmqG0ibNm2sZMmSLvdVdWirVKmS5PnHHHOM+5t8OgAAALK+uAezV199tW3dutX69evnOn1Vr17d5s6dG+kUtm7dOlfhAAAAAEi4YFa6dOnibrEsWLAgzedOnjw5g5YKAAAAiY4mTwAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeSohgdtSoUVamTBnLly+f1a1b15YsWZLqvOPGjbMGDRrYscce626NGzdOc34AAABkXXEPZqdNm2bdu3e3/v3727Jly6xatWrWtGlT27JlS8z5FyxYYK1bt7b33nvPFi9ebKVKlbImTZrYhg0bMn3ZAQAAkM2D2eHDh1uHDh2sXbt2VqlSJRszZowVKFDAJk6cGHP+F154wW699VarXr26nXbaaTZ+/Hjbv3+/zZs3L9OXHQAAANk4mN27d68tXbrUpQpEFihnTndfra4HY9euXfbPP/9Y4cKFM3BJAQAAkIhyx/PNt23bZvv27bNixYolma77K1euPKjXuOeee6xEiRJJAuJoe/bscbfQjh07/uNSAwAAIFHEPc3gv3jooYds6tSpNmPGDNd5LJYhQ4ZYoUKFIjfl2AIAACBriGswW6RIEcuVK5dt3rw5yXTdL168eJrPffTRR10w+/bbb9vpp5+e6ny9e/e27du3R27r169Pt+UHAABANg5m8+TJY7Vq1UrSeSvszFWvXr1Unzd06FAbNGiQzZ0712rXrp3me+TNm9cKFiyY5AYAAICsIa45s6KyXG3btnVBaZ06dWzEiBG2c+dOV91A2rRpYyVLlnTpAvLwww9bv379bMqUKa427aZNm9z0o446yt0AAACQfcQ9mL366qtt69atLkBVYKqSW2pxDTuFrVu3zlU4CI0ePdpVQbjiiiuSvI7q1N5///2ZvvwAAADIxsGsdOnSxd1SGyQh2tq1azNpqQAAAJDovK5mAAAAgOyNYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtwhmAQAA4C2CWQAAAHiLYBYAAADeIpgFAACAtxIimB01apSVKVPG8uXLZ3Xr1rUlS5akOf/06dPttNNOc/NXrVrV5syZk2nLCgAAgMQR92B22rRp1r17d+vfv78tW7bMqlWrZk2bNrUtW7bEnH/RokXWunVru/nmm2358uXWqlUrd/vqq68yfdkBAACQzYPZ4cOHW4cOHaxdu3ZWqVIlGzNmjBUoUMAmTpwYc/7HH3/cLrzwQrv77rutYsWKNmjQIKtZs6Y9+eSTmb7sAAAAiK/c8XzzvXv32tKlS613796RaTlz5rTGjRvb4sWLYz5H09WSG00tuTNnzow5/549e9wttH37dvd3x44dlp727dmdrq8H/FfpvY5nFLYdJBofth22G2T1bWfH/3+tIAgSO5jdtm2b7du3z4oVK5Zkuu6vXLky5nM2bdoUc35Nj2XIkCE2YMCAFNNLlSr1n5YdSHSFnrgl3osAeIltB0icbefPP/+0QoUKJW4wmxnU6hvdkrt//3777bff7LjjjrMcOXLEddkQ+0xMJxrr16+3ggULxntxAC+w3QCHh20ncalFVoFsiRIlDjhvXIPZIkWKWK5cuWzz5s1Jput+8eLFYz5H0w9l/rx587pbtGOOOeY/LzsylnYq7FiAQ8N2Axwetp3EdKAW2YToAJYnTx6rVauWzZs3L0nLqe7Xq1cv5nM0PXp+eeedd1KdHwAAAFlX3NMMlALQtm1bq127ttWpU8dGjBhhO3fudNUNpE2bNlayZEmX+yp33nmnNWzY0IYNG2bNmjWzqVOn2meffWZjx46N8ycBAABAtgtmr776atu6dav169fPdeKqXr26zZ07N9LJa926da7CQah+/fo2ZcoUu/fee61Pnz5WoUIFV8mgSpUqcfwUSC9KCVHN4eSpIQBSx3YDHB62nawhR3AwNQ8AAACABBT3QRMAAACAw0UwCwAAAG8RzAIAAMBbBLMAAAAJTqVLERsdwAAAADzw77//utFLdYuu9JTd8U0AcTi73rdvX7wXA8hQaifRgRdA+njllVfs3HPPta+//toFsjqOsI39H4JZIJMvEWknpGGcgaxMLUe5c/9fKfPffvstMp2LgcDB0baigDU8dpQrV84dPx5//HG78MIL3f01a9bEezETAsEskEnCS0IrV660zp07W+vWrW3BggX2999/x3vRgHQTBqsbN250IzaWLl3arrrqKrvtttts9+7dLsgFkPY2pABW24oaPqKPHR9//LE9//zzVqpUKZs1a5adeuqp8V7chEDOLJDOdCadPJ9pz5499vLLL1uePHlsxowZ7tLQrl277JtvvrG77rrLHegBn+hgq8NHeJVB/4eBqraB66+/3rXItm/f3goWLOjW80aNGlnPnj3dgRhA2n799VebNGmSLV682IYPH26///67Pffcc7Zw4UJ75JFH7JxzznHbWi6u9NEyCxyuDRs2JLkfXgqKPpMOffvtt+7SkFpkK1WqZC+99JI9++yz1rx5cxs7diy9VJFwDrRORqfL6FJndIvr66+/bqtXr7YXX3zRrrzySmvatKlVq1bNHYg//PDDDF92wOf+E//8848NGjTIypQpY6+99pqVKFHCbU/Vq1e3Dh062FFHHWUzZ85089IJ7P/wLQCHoWHDhu5MWZdNQ+FO5c0333Q7HJ0567KQ6FJQ48aNXWtsp06d3LTChQu7vKc///zTtdYCiXBwjc7tjj64Jr+IpxO0q6++2ooXLx5JI/jkk0/cY7oUeuyxx9oXX3zhthW1zH733Xf26KOP2kUXXZTJnwpITNEnhHv37o1M//LLL23atGk2ZcoUd/L3xBNP2Pnnn+8eO+2009zxRNvWL7/84k4i99MYQjALHIrwLPqZZ56xYcOGWf78+SOPKVC9/PLL7aabbnJpBdoR6bLq+++/7+arX7++C2Dfe++9yHOqVKlip59+ur3wwgtx+TxAmJ8XHlx1U75rr1693LqpnO4jjjjCHTTVOrRp0yY37wMPPOCepxaioUOH2l9//eVSCuSMM86wd9991zp27OjW+0WLFtlnn33mHleQG33gBrKD6I5c4d8ffvjBunTpYnXq1HEng2GjhrZJpaDpasaqVavcSeK2bdtc2oGcddZZtnPnTndskZy0zhLMAge7Iwpzk7Sj0eUf5QPq7Diky0HLli2zV1991aUQKGjVTkdBwdatW61mzZpWq1atJK2wJUuWdAHv559/HtlRAZkpzO9W66tOwOrWrWsnnXSSffTRR/bggw+6/G4dWFu2bOlaWbXOz58/3wWr06dPtzPPPNNtD/ny5XMlgxS4ar0uUqSI9e7d24YMGeJO2uTHH390rUxq1QWyg+TpZzt27HB/FciqE7BSdBTIavvRVbs33njDqlat6q7aabu59NJL7b777nOtsWosWb9+vTVp0sSOP/54mzBhgv3xxx9uu12yZIlla+oABiC2ffv2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",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,5))\n",
    "\n",
    "sns.barplot(\n",
    "    x=\"Model\",\n",
    "    y=\"Accuracy\",\n",
    "    data=results\n",
    ")\n",
    "\n",
    "plt.title(\"Machine Learning Model Comparison\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.xlabel(\"Model\")\n",
    "\n",
    "plt.xticks(rotation=20)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9acf614a-7abf-40bd-8f9a-878262710780",
   "metadata": {},
   "source": [
    "## Confusion matrix for Random Forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "332db22d-1d45-41fd-95a6-4d94d2a292fd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[2341    8]\n",
      " [   2 2688]]\n"
     ]
    }
   ],
   "source": [
    "cm = confusion_matrix(\n",
    "    y_test,\n",
    "    prediction3\n",
    ")\n",
    "\n",
    "print(cm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "a535d8ac-cc3a-4633-8289-a616841aa4c9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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3y6LFi2SefPmyaVLl6RZs2aSK1cu+emnn2TFihWSM2dOk5VwP+btt982v0r48ccfy88//yzHjx+X2bNnX/U5O3XqJJ999pn55c6tW7fK+++/b7argcOXX35p1tF2HDhwQMaMGWPua5Dw3//+VyZNmiSbN2+WPn36yGOPPSbLli3zBDRt27aVVq1amZ9VfvLJJ+WFF15I5b0HIN3RX48EcG06d+7satOmjfk7MTHRtWjRIld4eLirf//+ZlmRIkVc8fHxnvWnT5/uqlixolnXTZdHRES4vv/+e3O/WLFirpEjR3qWX7p0yVWiRAnP86i7777b9fzzz5u/t2/frukG89zJWbp0qVl+4sQJz7wLFy64IiMjXb/88ovPul27dnU9+uij5u/o6GhXlSpVfJYPGjToim0ByNzoowBcJ80U6Nm7Zgs0nd++fXsZMmSI6atQtWpVn34JGzZskJ07d5qMgrcLFy7Irl275NSpU+asv27dup5lWbJkkdq1a19RfnDTs/2wsDC5++67/W6ztuHcuXNy7733+szXrEbNmjXN35qZ8G6Hqlevnt/PASBzIFAArpPW7idOnGgCAu2LoAd2txw5cvisGxcXJ7Vq1ZJPP/30iu0UKlTomksdKaXtUPPnz5cbbrjBZ5n2cQAANwIF4DppMKCdB/1x6623ysyZM6Vw4cKSO3fuZNcpVqyYrF69Who0aGDu61DLtWvXmscmR7MWmsnQvgXakTIpd0ZDO0m6ValSxQQEe/futcxEVK5c2XTK9LZq1Sq/XieAzIPOjEAa6tChgxQsWNCMdNDOjLGxseY6B88995zs37/frPP888/LG2+8IXPmzJFt27bJM888c9VrIJQpU0Y6d+4sXbp0MY9xb3PWrFlmuY7G0NEOWiI5cuSIySZo6aN///6mA+O0adNM2eP333+X9957z9xXTz/9tOzYsUMGDBhgOkLOmDHDdLIE4CwECkAaioyMlOXLl0upUqXMiAI9a+/atavpo+DOMPTr1086duxoDv7aJ0AP6g888MBVt6uljwcffNAEFZUqVZJu3brJ2bNnzTItLQwdOtSMWChSpIj06tXLzNcLNr3yyitm9IO2Q0deaClCh0sqbaOOmNDgQ4dO6uiIESNGpPo+ApC+hGiPxmA3AgAApE9kFAAAgCUCBQAAYIlAAQAAWCJQAAAAlggUAACAJQIFAABgiUABAABYIlAAAACWCBQAAIAlAgUAAGCJQAEAAIiV/weazkBeCKh1uAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 600x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(6,5))\n",
    "\n",
    "sns.heatmap(\n",
    "    cm,\n",
    "    annot=True,\n",
    "    fmt=\"d\",\n",
    "    cmap=\"Blues\"\n",
    ")\n",
    "\n",
    "plt.title(\"Random Forest Confusion Matrix\")\n",
    "\n",
    "plt.xlabel(\"Predicted\")\n",
    "plt.ylabel(\"Actual\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0cbf84ca-fb58-4589-a58c-b0784857447a",
   "metadata": {},
   "source": [
    "## Feature importance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "4698526f-9451-4a98-b9e1-0e4c9cefa788",
   "metadata": {},
   "outputs": [],
   "source": [
    "importance = model3.feature_importances_\n",
    "\n",
    "features = X.columns\n",
    "\n",
    "importance_df = pd.DataFrame({\n",
    "    \"Feature\": features,\n",
    "    \"Importance\": importance\n",
    "})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "fa6f49ef-7608-4de4-b325-5ceaffa4ec28",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                        Feature  Importance\n",
      "4                     src_bytes    0.197405\n",
      "5                     dst_bytes    0.088876\n",
      "3                          flag    0.083065\n",
      "32           dst_host_srv_count    0.072693\n",
      "33       dst_host_same_srv_rate    0.065365\n",
      "28                same_srv_rate    0.057827\n",
      "11                    logged_in    0.044737\n",
      "22                        count    0.042408\n",
      "29                diff_srv_rate    0.034526\n",
      "1                 protocol_type    0.034376\n",
      "24                  serror_rate    0.033200\n",
      "34       dst_host_diff_srv_rate    0.030342\n",
      "35  dst_host_same_src_port_rate    0.025441\n",
      "25              srv_serror_rate    0.024180\n",
      "2                       service    0.024117\n",
      "23                    srv_count    0.019773\n",
      "36  dst_host_srv_diff_host_rate    0.019657\n",
      "37         dst_host_serror_rate    0.016962\n",
      "39         dst_host_rerror_rate    0.014435\n",
      "31               dst_host_count    0.013248\n",
      "38     dst_host_srv_serror_rate    0.012314\n",
      "9                           hot    0.011170\n",
      "40     dst_host_srv_rerror_rate    0.006958\n",
      "27              srv_rerror_rate    0.005459\n",
      "12              num_compromised    0.005346\n",
      "7                wrong_fragment    0.004427\n",
      "26                  rerror_rate    0.003774\n",
      "0                      duration    0.003356\n",
      "30           srv_diff_host_rate    0.002249\n",
      "21               is_guest_login    0.001124\n",
      "15                     num_root    0.000376\n",
      "16           num_file_creations    0.000204\n",
      "10            num_failed_logins    0.000202\n",
      "18             num_access_files    0.000135\n",
      "13                   root_shell    0.000134\n",
      "8                        urgent    0.000077\n",
      "14                 su_attempted    0.000025\n",
      "17                   num_shells    0.000024\n",
      "6                          land    0.000010\n",
      "19            num_outbound_cmds    0.000000\n",
      "20                is_host_login    0.000000\n"
     ]
    }
   ],
   "source": [
    "importance_df = importance_df.sort_values(\n",
    "    \"Importance\",\n",
    "    ascending=False\n",
    ")\n",
    "\n",
    "print(importance_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "ebd2d262-d387-4ac5-a1a3-d18040992f42",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                        Feature  Importance\n",
      "4                     src_bytes    0.197405\n",
      "5                     dst_bytes    0.088876\n",
      "3                          flag    0.083065\n",
      "32           dst_host_srv_count    0.072693\n",
      "33       dst_host_same_srv_rate    0.065365\n",
      "28                same_srv_rate    0.057827\n",
      "11                    logged_in    0.044737\n",
      "22                        count    0.042408\n",
      "29                diff_srv_rate    0.034526\n",
      "1                 protocol_type    0.034376\n",
      "24                  serror_rate    0.033200\n",
      "34       dst_host_diff_srv_rate    0.030342\n",
      "35  dst_host_same_src_port_rate    0.025441\n",
      "25              srv_serror_rate    0.024180\n",
      "2                       service    0.024117\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    importance_df.head(15)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "5d4ed87a-2c9e-4617-96dd-733f06cf528b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABAEAAAIjCAYAAAByNwIfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAiG9JREFUeJzt3QmczeX///8Xg7Hve/ZdsouQpZCllFQiH1uWVCqFSmTLUpaylCUKlVC2UpJUIjshIpVsldJi35fzvz2v3/ec/zljljNjxow5j/vtdj4z5/1+n/f7Ou9zmo/rdb2u15XC4/F4DAAAAAAAJHspE7sBAAAAAADg2iAIAAAAAABAiCAIAAAAAABAiCAIAAAAAABAiCAIAAAAAABAiCAIAAAAAABAiCAIAAAAAABAiCAIAAAAAABAiCAIAAAAAABAiCAIAAAAAABAiCAIAAAAAqRIkSKox4oVKxK8LZMmTbIHHnjAChUq5K7ZsWPHSI+bMWNGlO38888/Y7xO/fr17aabbrLr1R9//GGDBg2yrVu3Jvi1Tp8+7a4V7Oev46L6bFq3bp0gbdy5c6dr4759+xLk/ABwPUuV2A0AAABJy7vvvhvw/J133rEvvvjiiu1ly5ZN8La88sorduLECatevbodOnQoxuOHDBliRYsWDdiWNWtWS+4UBBg8eLAVKVLEKlWqlOBBAF3LGzwJ1pNPPmk333xzwDa1N6GCAGqj2pdQ1wCA6xVBAAAAEOB///tfwPN169a5IEDE7dfCN99848sCyJgxY4zHN23a1KpVq2ah4uLFi3b58mW7HtSpU8fuv/9+u56dOnXKMmTIkNjNAICrwnQAAAAQp85Qr169rGDBghYeHm6lS5e20aNHm8fjCThOnfcePXrYrFmz3DFp06a1qlWr2sqVK4O6TuHChd05YkOZA5cuXbKr5W37hx9+aDfeeKOlS5fOatasadu3b3f7p0yZYiVKlHDvSSPOEVPPvVMMNm/ebLVq1XKvV5bC5MmTr7jW4cOHrXPnzpYnTx53vooVK9rMmTMDjtH51Sbd57Fjx1rx4sXdvZ84caJvhL1Tp06+VHtNkZBVq1b5plToeH1mTz/9tJ05cybg/JpqoUDL77//bi1atHC/58qVy3r37u27n2qDtolG2r3XUur91Vq/fr01adLEsmTJYunTp7d69erZ6tWrA47Zv3+/PfbYY+67pPuZI0cO9978773et7bJbbfddsX0lajaq4wB/+km3ikmCkTpmrlz57YCBQr49n/22WcusKGgQKZMmezOO++0H374IeCcmoqiz0Sv073Ply+f3XPPPUxTAJCoyAQAAACxoo7+3XffbV9//bXruCr9/PPPP7c+ffq4DuRrr70WcLw6UXPnznXp4N5Oqzp7GzZsiPd5+Or0nTx50tKkSWONGze2MWPGWMmSJeN8PnWgP/74Y3v88cfd8xEjRthdd91lzz77rHsf6hweOXLERo4caQ8//LB99dVXAa/XvmbNmlmrVq2sTZs29sEHH9ijjz7q2qfjRZ1xBQx++eUXF3RQoECBB3VIjx49ak899VTAOadPn25nz561bt26uft57733usDHgAED3DZ1TEWBB9G5lMKv66rTrPs+YcIE++2339w+f+rs677VqFHDBRuWL1/u7qECDnq9AgCq06Dfdd2WLVu611WoUCHGe6k2/vPPPwHbsmfPbilTpnT3TVkcChANHDjQbdP7vP32291noOkgsnHjRluzZo2rJaCOtTrTao/un6YAKHhQt25d910bP368vfDCC75pK3GdvqLPWO9b91fBL9HUmA4dOrh7pSkrur9qx6233mpbtmzxTUG47777XGDgiSeecNsU7FFWzYEDB5imACDxeAAAAKLx+OOPa3jf93zRokXu+dChQwOOu//++z0pUqTw/PLLL75tOk6PTZs2+bbt37/fkzZtWs+9994bq3ZkyJDB06FDh0j3zZ0719OxY0fPzJkzPQsXLvT079/fkz59ek/OnDk9Bw4ciPHc9erV85QrVy5gm9odHh7u2bt3r2/blClT3Pa8efN6jh8/7tvet29ft93/WJ1T28aMGePbdu7cOU+lSpU8uXPn9pw/f95tGzt2rDvuvffe8x2nfTVr1vRkzJjRdx2dW8dlzpzZc/jw4YC2bty40e2bPn36Fe/t9OnTV2wbMWKE+6z0WXjp3uocQ4YMCTi2cuXKnqpVq/qe//333+64gQMHeoLx9ddf+74HER96T5cvX/aULFnS07hxY/e7f7uLFi3qadSoUbTvZe3ate5c77zzjm/bhx9+6Lbp2hFF1fbChQsHfL90L3Xsrbfe6rl48aJv+4kTJzxZs2b1dO3aNeD1f/75pydLliy+7UeOHHGvHzVqVFD3CQCuFaYDAACA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1q0B93/GjBmWNWtW+/zzz61s2bLus23SpIkdOnTI7df9mzlzpn300Ue++6TzAgAAAEB8IwiQxPTp08d15tUhXLZsmesMfvfdd27fpk2bXAdbnVJ11NUZrVu3rtunzn/NmjWta9eurnOpR8GCBYO6Zr9+/VywQedPlSqVPfzww759CxcutKeeesp69eplO3bssEceecQ6depkX3/9tds/f/581+GeMmWK/fzzz7Zo0SIrX76827dgwQLXeVZ7vW2KyeOPP27nzp2zlStX2vbt2+2VV15xnWZ/zz//vL388su2a9cuFwRRAGPWrFkBx+j5Qw89FOP1fv/9d3cP1cH/6quvXEBE79+bYaD7qnszevRo+/77761x48Z29913u/caG6dPn3bnUABF7+3AgQPWu3dvt08/W7Vq5QsM6KFgTGR0b44fPx7wAAAAAIBgpQr6SCS4kydP2ltvvWXvvfeeNWjQwG3TCLE60qKOo0bHNWqtEevChQtb5cqV3b4sWbK4kXqN5ufNmzdW1x02bJjVq1fP18G+88477ezZsy7bQB1XZRk89thjbv8zzzxj69atc9tvu+021yZdr2HDhpY6dWqXEVC9enV3bPbs2S0sLMy1Ndg26Xz33XefL5BQrFixK45RUKFRo0a+523btrXXX3/dXnrpJff8p59+cp153ceYvPHGG+7ezZkzx7VfSpUq5duv9/ncc89Z69at3XMFJRQAUZ0DvTZYFy5csMmTJ/uyE3r06OHehyjIkS5dOtfBj+k+jRgxwgYPHhz0dQEAAADAH5kASYhS0M+fP281atTwbVNHWin4oo6vOv7qGLdr186NdmuE+WpVqFDB97umIMjhw4fdT422165dO+B4Pdd2eeCBB+zMmTOuTcpCUObA1czTV6bD0KFD3TUGDhzoRt8j0si/P3XQlXqv4ITovlSpUsXKlCkT4/WUuq/0f28AwJ9G2f/4449o33+wFJzxn56g++y9x7HRt29fO3bsmO9x8ODBWJ8DAAAAQOgiCHAd0Yi6pgbMnj3bdSIHDBhgFStWvOol/vw7wN55+5oLHwxNOdDUBNUq0Gi2MgaUXq+R77jo0qWL/frrry7IoekA6vBPmDAh4BhlQ/jT6Pntt99u77//vnuun8oOCIbafDVSpkzpq43gFdl7jxhk0H32f02wNG1BtQv8HwAAAAAQLIIASYhGitVZXL9+vW/bkSNHXHq7l+bsK/V+5MiRbpRcI+Cayy6aDnDp0qV4bZMK2a1evTpgm57feOONAR1pFfMbP368q2Gwdu1a14GPa5sUWOjevburKaBaBFOnTo3xNer0z507111bQQRv+n4wWRCrVq2KtOOuDrYKHUb3/nPlyuV++tc7UHZBbCXEZwcAAAAAEVETIAnR3PDOnTu74oA5cuSw3Llzu6J93tHmTz75xHVwNdKu6vmqmq8Re+90gSJFirgAggIDOpemEnhfG1dqi4rWqfaAgg+LFy92nfPly5f7Kt+r86opDEp51zx8BQU0bcHbJhXCU6dco9g5c+aM9no9e/a0pk2bunn5CoBo/r0CETFp2bKlPfroo+6hWgXqvAdDc/OVaaD2KdVe9QE0rUB1DXRf9f41LUEBGq0MMH36dNfJ9xYiLFGihAtaqMK/aisoYBNxRYdg6D5p9QBlVeizVzsim6IAAAAAAFeDTIAkZtSoUW6OukbW1em+9dZb3XJ4omXm1AFX6rs6xio0p6kBWkbPW2Vehfg0Sq0RahXZu1otWrRwFfJVIE/X0SoA6ghr+T9vmzRSr3nyGlVXcECBAnVkRcXvFJRQJ9o7ah4dBRS0QoDen6rlKxigqQbBTJXQPdu2bVvQUwFE7VQmhYoyqjii7rXej7cDrhoFKoaojAQVK9SKDB9//LFbplF0nD4DLVGo96/CgappEFuqp6Cgg6Y/6D5FzD4AAAAAgPiQwhOXickAkgQVL1TWQMUnJltY+NXVNwAQWjaPap/YTQAAAAnQN1AB8ehqh5EJAAAAAABAiCAIkIypuJ5qA0T20L7EoPn+UbVp+PDhIXEPAAAAACCxMB0gGdM69EoJiYzSQ1R48Fr7/fff7cyZM5HuUyFDPZL7PYhPTAcAEFdMBwAAIDSnA7A6QDKmDm5S6+TecMMNFur3AAAAAAASC9MBAAAAAAAIEWQCAMnAyqFtok35AQAAAAAhEwAAAAAAgBBBEAAAAAAAgBBBEAAAAAAAgBBBEAAAAAAAgBBBEAAAAAAAgBDB6gBAMlC3/2wLC0+X2M0AcJU2j2qf2E0AAADJHJkAAAAAAACECIIAAAAAAACECIIAAAAAAACECIIAAAAAAACECIIAAAAAAACECIIAAAAAAACECIIAAAAAAACECIIA0ahfv7717Nkz3s+7YsUKS5EihR09ejTezw0AAAAAQFQIAiThYMHVKFKkiI0dOzaxmwEz27dvnwv6bN26NbGbAgAAACDEEQRASDh//vx1cU4AAAAASEgEAf7PqVOnrH379pYxY0bLly+fjRkzJmD/xIkTrWTJkpY2bVrLkyeP3X///W57x44d7ZtvvrFx48a50V49NPIbjM2bN1u1atUsffr0VqtWLdu9e3fA/kmTJlnx4sUtTZo0Vrp0aXv33Xd9+zwejw0aNMgKFSpk4eHhlj9/fnvyySd9mQn79++3p59+2temmOj45s2bW7Zs2SxDhgxWrlw5W7Jkidt36dIl69y5sxUtWtTSpUvn2qL360/3oUWLFjZ8+HB3f7JmzWpDhgyxixcvWp8+fSx79uxWoEABmz59esDrDh48aK1atXLH65h77rkn6PunaRXVq1d37dXra9eu7d6H6N5UqlTJpk2b5tqtz+3NN9909+ny5csB59E1H3744RivF9k5ZenSpXbrrbe6NuTIkcPuuusu27Nnj+91OlYqV67sPgt9Pl46V9myZd25ypQp475n0Tl37pwdP3484AEAAAAAwSII8H/UUVVn/qOPPrJly5a5DuZ3333n9m3atMl1sNWpVUddnb66deu6feoM16xZ07p27WqHDh1yj4IFCwZ1zX79+rlgg86fKlWqgI7owoUL7amnnrJevXrZjh077JFHHrFOnTrZ119/7fbPnz/fXnvtNZsyZYr9/PPPtmjRIitfvrzbt2DBAtfhVnu9bYrJ448/7jqYK1eutO3bt9srr7ziAiKiTrPO9+GHH9rOnTttwIAB9sILL9gHH3wQcI6vvvrK/vjjD3eOV1991QYOHOg6xAosrF+/3rp37+7ex2+//eaOv3DhgjVu3NgyZcpkq1atstWrV7trNmnSJMZRdgUXFHSoV6+eff/997Z27Vrr1q1bQMDjl19+cfdJ90Op+A888ID9+++/vnso//33n/s827ZtG9RnFvGc3gDSM8884z7HL7/80lKmTGn33nuvL9iwYcMG93P58uXus9BrZdasWe5eDhs2zHbt2uUCKC+++KLNnDkzyuuPGDHCsmTJ4nsE+10DAAAAAEnh0ZByiDt58qQbwX3vvfdcR9HbOVTHVx1LdfjVAVfnVR3WiDSyqxHiYOfgK8Bw2223uU5hgwYN3DaNut9555125swZNyqsUW2Nxmv02ksj5upw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CrOqpqtWgP8DAAAAAAAkPXEKAvTp08e++uormzRpkqtUPm3aNFcjIH/+/G49dQAAAAAAkEyWCFy8eLHr7NevX986derk5i+XKFHCChcubLNmzXLF1AAAAAAAQDLIBPjvv/+sWLFi7nfNNdBzufXWW23lypXx20IAAAAAAJB4QQAFAPbu3et+L1OmjH3wwQe+DIGsWbPGT8sAAAAAAEDirw7w2muvWVhYmD355JO2fPlya968uek0Fy5ccEunaTk1AEmnAigAAACA5C3YvsFVLxEo+/fvt82bN7u6ABUqVLja0wEIEkEAAAAAALHpG8SpMKC/s2fPuoKAegAAAAAAgGRWE+DSpUv20ksv2Q033GAZM2a0X3/91W1/8cUX7a233orvNgIAAAAAgMQKAgwbNsxmzJhhI0eOtDRp0vi233TTTTZt2rT4aBcAAAAAAEgKQYB33nnH3nzzTWvbtq0rEOhVsWJF+/HHH+OzfQAAAAAAIJ7EqSbA77//7ooARnT58mW3QgCAa6tu/9kWFp4usZuBRLJ5VPvEbgIAAACScybAjTfeaKtWrbpi+7x586xy5crx0S4AAAAAAJAUMgEGDBhgHTp0cBkBGv1fsGCB7d69200T+OSTT+K7jQAAAAAA4FpnAmgVAI/HY/fcc48tXrzYli9fbhkyZHBBgV27drltjRo1io92AQAAAACAxMwEKFmypB06dMhy585tderUsezZs9v27dstT5488d0uAAAAAACQmJkAygLw99lnn9mpU6fiu00AAAAAACCpFAaMKigAAAAAAACSSRAgRYoU7hFxGwAAAAAASGY1ATTy37FjRwsPD3fPz549a927d3fFAf1ptQCgfv36VqlSJRs7dqwVKVLEevbs6R7y559/Wrt27WzNmjWWOnVqO3r0aKTbAAAAAACJFATQsoD+/ve//8VjU5Ccbdy4MSBY9Nprr7kik1u3brUsWbJEuS05GDRokC1atMi9LwAAAAC4boIA06dPT7iWIFnLlStXwPM9e/ZY1apV3YoT0W2LL+fPn7c0adIk+XMCAAAAQJItDAh4aZWI9u3bW8aMGS1fvnw2ZsyYgP2aDqBpAd7f58+fb++8846rKaEpJpFti2lqikbYCxUq5Kan5M+f35588smA67300kuuTZkzZ7Zu3bpZrVq17Lnnngs4z99//+2mHqxcuTLG9xjZ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CAIAAAAAABAiCAIAAAAAABAiCAIAAAAAABAiCAIkkPr161vPnj3j/bwrVqywFClS2NGjRy0pmzFjhmXNmtX3fNCgQVapUqWAY7QtT5487v0sWrQoym0AAAAAgPhBECCZBguuRpEiRWzs2LHxes7evXvbl19+6Xu+a9cuGzx4sE2ZMsUOHTpkTZs2jXRbcrBv3z4X1Ni6dWtiNwUAAABAiEuV2A1AaMiYMaN7eO3Zs8f9vOeee1wHOapt8eX8+fOWJk2aJH9OAAAAAEhIZALEg1OnTln79u1dJzdfvnw2ZsyYgP0TJ060kiVLWtq0aV2q+/333++2d+zY0b755hsbN26c6/TqoVHjYGzevNmqVatm6dOnt1q1atnu3bsD9k+aNMmKFy/uOqmlS5e2d99917fP4/G4tPtChQpZeHi45c+f35588klfZsL+/fvt6aef9rUp2PR/nU/tuffee+3ff/8N2O8/HUC/N2/e3P2eMmVKd43ItgUzNaJ69eqWIUMGN/Wgdu3aru3+15s2bZoVLVrU3fs333zTvdfLly8HnEdBh4cffjjG60V2Tlm6dKndeuutrg05cuSwu+66yxfQEB0rlStXdu9L99hL5ypbtqw7V5kyZdx3BQAAAAASCkGAeNCnTx/Xmf/oo49s2bJlrnP63XffuX2bNm1yHewhQ4a4jro6jHXr1nX71PmvWbOmde3a1aW/61GwYMGgrtmvXz8XbND5U6VKFdCJXbhwoT311FPWq1cv27Fjhz3yyCPWqVMn+/rrr93++fPn22uvvebS7n/++Wc39758+fJu34IFC6xAgQKuvd42xWT9+vXWuXNn69Gjh0t5v+2222zo0KHRTg2YPn26+917jci2RefixYvWokULq1evnn3//fe2du1a69atW0Dw4JdffnHvVe9J7XrggQdccMJ7H+S///5zn0nbtm1jfJ+RndMbBHrmmWfcZ6EpDwpiKBDiDTZs2LDB/Vy+fLl7X3qtzJo1ywYMGGDDhg1zUyGGDx9uL774os2cOTPK6587d86OHz8e8AAAAACAYDEd4CqdPHnS3nrrLXvvvfesQYMGbps6cepIy4EDB9xItUaHM2XKZIULF3YjwpIlSxY3Uq/R87x588bquuo4qgMszz//vN1555129uxZN6I8evRol2Xw2GOPuf3qoK5bt85tVwddbdL1GjZsaKlT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HDhg99xzj2XMmNEyZ85srVq1sr/++st3rqheF5369etbjx49rGfPnpYzZ05r3Lix2/7qq6+6e6g2FSxY0B577DE7efKk7z136tTJjh075tqvh64t586ds969e9sNN9zgXqt7q+MBAAAAIKGkSrAzI8k7dOiQtWnTxkaOHGn33nuvnThxwlatWmUej8ft//LLL10H+osvvvC9ZsSIEbZnzx4rXry4e/7DDz/Y999/b/Pnz4/2WurMK6jQtWtXmz17thtF37Bhg+sUi67bvn17Gz9+vNWpU8ddo1u3bm7fwIEDfedRB/rll1+2sWPHWqpUqeztt9+2X375xV1/wYIFFhYWZpcvX/YFAL755ht37ccff9wefPDBgE52xNcFY+bMmfboo4/a6tWrfdtSpkzp2q1gwq+//uqCAM8++6xNnDjRatWq5do6YMAA2717tzte7RIFFHbu3Glz5sxxgZaFCxdakyZNbPv27VayZMlIr6/AgR5ex48fD6rdAAAAACAEAUI8CKAOcsuWLa1w4cJum0a0vTQ6rZHyNGnSBIz6v//++/biiy+657NmzXIj2CVKlIj2WuqsajT8rrvu8gUQypYt69uvUf/nn3/eOnTo4J4rE+Cll15ynWn/IMBDDz3kRtb9KaDwzjvvWK5cudxzBS3Ukd67d68bmRftL1eunG3cuNFuvvnmSF8XDHXOFTTxp8wAryJFitjQoUOte/fuLgige5clSxYX7MibN6/vOGUqTJ8+3f1UAECUFbB06VK3ffjw4ZFeX0EY3SsAAAAAiAumA4QwdegbNGjgOv4PPPCATZ061Y4cOeLbr+3+AQBp27atCwKIMgY0qq9tMcmePbubYqAU+ubNm9u4ceNcEMJr27ZtbkqBRsm9D2UN6JjTp0/7jqtWrdoV51YAw78jv2vXLtf59wYA5MYbb3RTELQvqtcFo2rVqldsW758ubuPSuvPlCmTtWvXzv7999+AdkekIMWlS5esVKlSAe9ZmQvKgohK3759XTDF+zh48GCs2g8AAAAgtBEECGFKgdeo+WeffeY6yRMmTHBz/zWC7s0EiEjTB5TW/t1339maNWtcJ1Rp9sHQCPfatWtdivzcuXNdB3jdunVun+bQa4R769atvoc6yj///HPAfP3I2hTZtmDE5XURX7Nv3z6X3VChQgU3tWDz5s32xhtvxFg4UO9X91/H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O3bMEyoS4r4PHDjQU65cuYB7+vfffwccw3c9fu/54cOHA+73F198oVXjPF9//bXvGL7rc2J13x966CHPG2+84dmyZYtn165dno4dO7p/m//2229J6t/rBAGARKLO4uOPP+57funSJU/+/Pk9I0aMiPT4Vq1aee68886AbTVq1PA88sgj7vfLly+7P/KjRo3y7VcnNTw83P0fgOgf9/rjvnHjRt8xn332mfuH/O+//+5J7uL7nkf1f7q6x/v37w/oGEX2f76hIiHuu4IA99xzT5TX5Lue8N913f/bb789YBvf9djd92DuXUzn1N95BWw+/PBD3zH6h6e+/wpMJncJcc8j6yjpfn7zzTcBHaOnnnrKE6oS4r4rCKBOT1T4rif8d13f6eLFi7t/U3rxXa8e5/suFy9e9GTKlMkzc+bMJPXvdaYDAIng/PnztnnzZpf+45UyZUr3fO3atZG+Rtv9j5fGjRv7jt+7d6/9+eefAcdkyZLFpS15j9FPpRRVq1bNd4yO17XXr19vyVlC3PPIHDt2zKXK6T77U0q00hcrV67s0qcvXrxooSAh7/uKFStcqm7p0qXt0UcftX///TfgHHzXE+67rvTbTz/91KUnRsR3Pfj7Hh/n1H5NTfI/RinUhQoVivN1Q/meR/V3XbJnzx6wfdasWZYzZ0676aabrG/fvnb69GkLBQl535USral1xYoVc6nQBw4c8O3ju56w33Vd47333rOHH37Y/TvGH9/1hnG+77pX+t56/34klX+vp4qXswCIlX/++ccuXbpkefLkCdiu5z/++GOkr9EfjMiO13bvfu+26I5Rp8lfqlSp3B8m7zHJVULc84g0V1E1Atq0aePmcHk9+eSTVqVKFXef16xZ4/4P9NChQ/bqq69acpdQ913z/1u2bGlFixa1PXv22AsvvGBNmzZ1/8cZFhbGdz2Bv+szZ85086X1Gfjjux67+x4f59RnlCZNmisCj9F9fslFQtzziC5fvmw9e/a02rVruw6Q10MPPWSFCxd2Hdbvv//e/e1X3YAFCxZYcpdQ912doBkzZrjArv5uDB482M2t3rFjh/t7w3c9Yb/rixYtsqNHj7qaO/74rl+6qvuu+6V75+30J5V/rxMEAIB4oChvq1atXLGXSZMmBex75plnfL9XqFDB/SPmkUceccWnwsPDE6G117/WrVv7flcRO93X4sWLu+yABg0aJGrbQsHbb7/tRulUJMkf33UkNyqQpk7ot99+G7C9W7duAX+DVOBLf3sUlNTfIsSeArn+fz8UFFDn84MPPog06wjx66233nKfgTqs/viux50y4+bMmeP+bRLx/y8TG9MBgESglCqNVkasaKvnefPmjfQ12h7d8d6fMR1z+PDhgP1K1VUF0qium1wkxD2PGADYv3+/ffHFFwFZAJHRP2x03/ft22fJXULed39KHdW1fvnlF985+K4nzD1ftWqVGwXq0qVLjG3hux7zd/dqz6mfSlnVCF58XTeU77m/Hj162CeffGJff/21FShQIMbvunj/BiVnCX3fvTTiX6pUqYC/63zXE+ae698vy5cvD/rvuvBdzxvta0ePHu2CAMuWLXNBLa+k8u91ggBAItDoWNWqVe3LL78MSDnU85o1a0b6Gm33P17U4fQer7Ro/WHwP+b48eNu7pD3GP3U/3lqfpPXV1995a7t/aOeXCXEPfcPAGgeo/4PVHOhY7J161Y3rytiqldylFD3PaLffvvN1QTQCIX3HHzXE+aea7RI569YsWKMbeG7Hv19j49zan/q1KkDjlGQRnOp43rdUL7noowuBQAWLlzo/m7o/1+D+a6L929QcpZQ9z0iLYem0WbvPeW7nnD3fPr06e7v9J133hnjsXzXL8d430eOHGkvvfSSLV26NGBef5L693q8lBcEEKclR1QJdMaMGa4KaLdu3dySI3/++afb365dO8/zzz8fsIRXqlSpPKNHj3bVcFVFN7IlAnWOjz76yPP999+76t2RLTlSuXJlz/r16z3ffvutp2TJkiG1bFp83vPz58+7ZV0KFCjglpHyXz7n3Llz7pg1a9a4irzar6XU3nvvPU+uXLk87du394SK+L7vJ06ccMseqRr03r17PcuXL/dUqVLFfZfPnj3rOw/f9fj9+yJaFip9+vSeSZMmXXFNvuuxv+/6O6FlpPTIly+f+17r959//jnoc3qXTdMSdl999ZVbNq1mzZruEQoS4p4/+uijbvmuFStWBPxdP336tNv/yy+/uKUwda/1N0j/n1usWDFP3bp1PaEiIe57r1693D3XPdXfJC3BmzNnTrc6gxff9fi9595q97qnzz333BXX5LvuifV917/FtaTgvHnzAv5+6N8uSenf6wQBgEQ0YcIE94dXfyy0BInWAvVfkkXL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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "top_features = importance_df.head(15)\n",
    "\n",
    "plt.figure(figsize=(10,6))\n",
    "\n",
    "sns.barplot(\n",
    "    x=\"Importance\",\n",
    "    y=\"Feature\",\n",
    "    data=top_features\n",
    ")\n",
    "\n",
    "plt.title(\n",
    "    \"Top 15 Important Features\"\n",
    ")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95d640ca-a22b-4d40-bc6b-da889f39aa63",
   "metadata": {},
   "source": [
    "## Simple error analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "8928a193-9a70-4d35-86ed-f17ae898ba78",
   "metadata": {},
   "outputs": [],
   "source": [
    "test_results = X_test.copy()\n",
    "\n",
    "test_results[\"Actual\"] = y_test.values\n",
    "\n",
    "test_results[\"Predicted\"] = prediction3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "fa32e2a1-dee2-42c8-8e9a-74e73fa32d31",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       duration  protocol_type  service  flag  src_bytes  dst_bytes  land  \\\n",
      "10216         0              1       19     9        334          0     0   \n",
      "9807          0              0       13     9          8          0     0   \n",
      "5036          0              1       22     1          0          0     0   \n",
      "18019         0              2       46     9        100          0     0   \n",
      "13183         0              1       17     5          0          0     0   \n",
      "\n",
      "       wrong_fragment  urgent  hot  ...  dst_host_same_srv_rate  \\\n",
      "10216               0       0    0  ...                    0.33   \n",
      "9807                0       0    0  ...                    0.01   \n",
      "5036                0       0    0  ...                    0.00   \n",
      "18019               0       0    0  ...                    0.03   \n",
      "13183               0       0    0  ...                    0.05   \n",
      "\n",
      "       dst_host_diff_srv_rate  dst_host_same_src_port_rate  \\\n",
      "10216                    0.07                         0.35   \n",
      "9807                     0.03                         0.01   \n",
      "5036                     0.00                         0.00   \n",
      "18019                    0.06                         0.03   \n",
      "13183                    0.05                         0.02   \n",
      "\n",
      "       dst_host_srv_diff_host_rate  dst_host_serror_rate  \\\n",
      "10216                         0.00                  0.01   \n",
      "9807                          0.97                  0.00   \n",
      "5036                          0.00                  0.00   \n",
      "18019                         0.00                  0.00   \n",
      "13183                         0.22                  0.01   \n",
      "\n",
      "       dst_host_srv_serror_rate  dst_host_rerror_rate  \\\n",
      "10216                      0.04                  0.00   \n",
      "9807                       0.00                  0.01   \n",
      "5036                       0.00                  0.00   \n",
      "18019                      0.00                  0.00   \n",
      "13183                      0.11                  0.00   \n",
      "\n",
      "       dst_host_srv_rerror_rate  Actual  Predicted  \n",
      "10216                       0.0       0          1  \n",
      "9807                        0.0       0          1  \n",
      "5036                        0.0       1          0  \n",
      "18019                       0.0       0          1  \n",
      "13183                       0.0       1          0  \n",
      "\n",
      "[5 rows x 43 columns]\n"
     ]
    }
   ],
   "source": [
    "errors = test_results[\n",
    "    test_results[\"Actual\"]\n",
    "    != test_results[\"Predicted\"]\n",
    "]\n",
    "\n",
    "print(errors.head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "c74178c0-999e-4a9c-b1ba-2e7921d8be3c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of incorrect predictions: 10\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    \"Number of incorrect predictions:\",\n",
    "    len(errors)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "689b5776-5b5d-49b0-97c1-98ae990e6b76",
   "metadata": {},
   "outputs": [],
   "source": [
    "test_results[\"Protocol\"] = data.loc[\n",
    "    X_test.index,\n",
    "    \"protocol_type\"\n",
    "].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "6cc9ff72-58b3-4833-9255-64576609d294",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "            Actual  Predicted\n",
      "Protocol                     \n",
      "0         0.139130   0.144928\n",
      "1         0.520128   0.520869\n",
      "2         0.831008   0.832558\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    test_results.groupby(\"Protocol\")[\n",
    "        [\"Actual\", \"Predicted\"]\n",
    "    ].mean()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "e3226b80-f0c2-402c-a09b-8c58b4376698",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Protocol: 1 Accuracy: 0.998271178068659\n",
      "Protocol: 0 Accuracy: 0.9942028985507246\n",
      "Protocol: 2 Accuracy: 0.9984496124031008\n"
     ]
    }
   ],
   "source": [
    "for protocol in test_results[\"Protocol\"].unique():\n",
    "\n",
    "    subset = test_results[\n",
    "        test_results[\"Protocol\"] == protocol\n",
    "    ]\n",
    "\n",
    "    acc = accuracy_score(\n",
    "        subset[\"Actual\"],\n",
    "        subset[\"Predicted\"]\n",
    "    )\n",
    "\n",
    "    print(\n",
    "        \"Protocol:\",\n",
    "        protocol,\n",
    "        \"Accuracy:\",\n",
    "        acc\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f7de1f7d-f319-485e-b97d-bc15559ee5a7",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
