Files
MachineLearning/Notebooks/Notebook-2.ipynb
T

266 lines
45 KiB
Plaintext
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"id": "d1b71a9c-e3b2-43d4-85fa-4329d90e47b9",
"metadata": {},
"source": [
"# Practical-2 (Email Spam Detection)\n",
"\n",
"---\n",
"\n",
"Problem Statement: Classify the email using the binary classification method. Email Spam detection has two states: a) Normal State Not Spam, b) Abnormal State Spam. Use K-Nearest Neighbors and Support Vector Machine for classification. Analyze their performance.\n",
"\n",
"- Dataset link: https://www.kaggle.com/datasets/balaka18/email-spam-classification-dataset-csv\n",
"- Dataset available in [Datasets](https://git.kska.io/sppu-be-comp-content/MachineLearning/src/branch/main/Datasets/) directory.\n",
"\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "207c53ea-5e9c-49a2-90c5-2b28285c611a",
"metadata": {},
"outputs": [],
"source": [
"# ---------------------------------------------------------------\n",
"# EMAIL SPAM CLASSIFICATION USING KNN & SVM\n",
"# ---------------------------------------------------------------\n",
"\n",
"# ---------------------------------------------------------------\n",
"# 1. IMPORT LIBRARIES\n",
"# ---------------------------------------------------------------\n",
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.svm import SVC\n",
"from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "597c392f-12e8-4ed7-8ce2-0dd6289a7388",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['the', 'to', 'ect', 'and', 'for', 'of', 'a', 'you', 'hou', 'in',\n",
" ...\n",
" 'connevey', 'jay', 'valued', 'lay', 'infrastructure', 'military',\n",
" 'allowing', 'ff', 'dry', 'Prediction'],\n",
" dtype='object', length=3001)\n",
" the to ect and for of a you hou in ... connevey jay valued \\\n",
"0 0 0 1 0 0 0 2 0 0 0 ... 0 0 0 \n",
"1 8 13 24 6 6 2 102 1 27 18 ... 0 0 0 \n",
"2 0 0 1 0 0 0 8 0 0 4 ... 0 0 0 \n",
"3 0 5 22 0 5 1 51 2 10 1 ... 0 0 0 \n",
"4 7 6 17 1 5 2 57 0 9 3 ... 0 0 0 \n",
"\n",
" lay infrastructure military allowing ff dry Prediction \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 1 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 1 0 0 \n",
"\n",
"[5 rows x 3001 columns]\n"
]
}
],
"source": [
"# ---------------------------------------------------------------\n",
"# 2. LOAD DATASET\n",
"# ---------------------------------------------------------------\n",
"df = pd.read_csv(\"emails.csv\", encoding=\"ISO-8859-1\") # Adjust path if needed\n",
"\n",
"# Drop unnecessary columns if present\n",
"if \"Email No.\" in df.columns:\n",
" df = df.drop(columns=[\"Email No.\"])\n",
"\n",
"# Ensure label is integer\n",
"df[\"Prediction\"] = df[\"Prediction\"].astype(int)\n",
"\n",
"# Features & target\n",
"X = df.drop(columns=[\"Prediction\"])\n",
"y = df[\"Prediction\"]\n",
"\n",
"# Print basic info\n",
"print(df.columns)\n",
"print(df.head(5))"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "72b43964-1d8c-4f99-ad09-fd5e87c54ab5",
"metadata": {},
"outputs": [],
"source": [
"# ---------------------------------------------------------------\n",
"# 3. SPLIT DATA INTO TRAINING AND TESTING SETS\n",
"# ---------------------------------------------------------------\n",
"X_train, X_test, y_train, y_test = train_test_split(\n",
" X, y, test_size=0.2, random_state=42, stratify=y\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "9941a486-03b4-4770-abe9-d411197c8809",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"--- KNN Performance ---\n",
"Accuracy: 0.8714975845410629\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" 0 0.93 0.88 0.91 735\n",
" 1 0.74 0.85 0.79 300\n",
"\n",
" accuracy 0.87 1035\n",
" macro avg 0.84 0.86 0.85 1035\n",
"weighted avg 0.88 0.87 0.87 1035\n",
"\n",
"Confusion Matrix:\n",
" [[648 87]\n",
" [ 46 254]]\n"
]
}
],
"source": [
"# ---------------------------------------------------------------\n",
"# 4. K-NEAREST NEIGHBORS CLASSIFIER\n",
"# ---------------------------------------------------------------\n",
"knn = KNeighborsClassifier(n_neighbors=5)\n",
"knn.fit(X_train, y_train)\n",
"y_pred_knn = knn.predict(X_test)\n",
"\n",
"print(\"\\n--- KNN Performance ---\")\n",
"print(\"Accuracy:\", accuracy_score(y_test, y_pred_knn))\n",
"print(\"Classification Report:\\n\", classification_report(y_test, y_pred_knn))\n",
"print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_pred_knn))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "86ba6eeb-fa7a-4651-81bd-df6de11c387e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"--- SVM Performance ---\n",
"Accuracy: 0.9671497584541063\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" 0 0.98 0.97 0.98 735\n",
" 1 0.94 0.95 0.94 300\n",
"\n",
" accuracy 0.97 1035\n",
" macro avg 0.96 0.96 0.96 1035\n",
"weighted avg 0.97 0.97 0.97 1035\n",
"\n",
"Confusion Matrix:\n",
" [[716 19]\n",
" [ 15 285]]\n"
]
}
],
"source": [
"# ---------------------------------------------------------------\n",
"# 5. SUPPORT VECTOR MACHINE CLASSIFIER\n",
"# ---------------------------------------------------------------\n",
"svm = SVC(kernel='linear', random_state=42) # Linear kernel for binary classification\n",
"svm.fit(X_train, y_train)\n",
"y_pred_svm = svm.predict(X_test)\n",
"\n",
"print(\"\\n--- SVM Performance ---\")\n",
"print(\"Accuracy:\", accuracy_score(y_test, y_pred_svm))\n",
"print(\"Classification Report:\\n\", classification_report(y_test, y_pred_svm))\n",
"print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_pred_svm))"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "a0ebfbf9-1ce6-4d22-9d28-5234df7df601",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9kAAAHWCAYAAABjfUoWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABsXUlEQVR4nO3df3zN9f//8fvZ7JfNNpNt5sfol5mEEKf8bgxLfqx6V2QiSqNYVHrL76yUiPwoCf1Q3ioqJEvhU+bXxFtIlFrFNvJjTDa21/cP3513p/2w8do523G7dnld3s7z9Xy9zvMce3vs8Xo+Xs+XxTAMQwAAAAAA4Iq5OXsAAAAAAAC4CpJsAAAAAABMQpINAAAAAIBJSLIBAAAAADAJSTYAAAAAACYhyQYAAAAAwCQk2QAAAAAAmIQkGwAAAAAAk5BkAwAAAABgEpJs4DKlp6fr7rvvVrVq1WSxWDRjxgzT38NisWj8+PGmn7ei6t+/v+rWrevsYQAAriIvvfSSrr32Wrm7u6tJkyamn5/YZm/9+vWyWCxav369s4cCXDaSbBSwaNEiWSwWbd++3a791KlTuvXWW+Xt7a01a9ZIksaPHy+LxaKQkBCdPXu2wLnq1q2rO++8067NYrHIYrFo2rRpJX7voqSnp2vkyJGKiIhQ5cqV5evrq2bNmmny5Mk6efJkCT/x5RkxYoS++OILjR49Wu+88466dOlSpu/nSPl/r25ubvrtt98K7M/MzJSPj48sFouGDh1a6vOfPXtW48ePJ4ACgBPt3r1bd999t8LDw+Xt7a2aNWuqU6dOmjVrliRpx44dslgsGjNmTJHnOHDggCwWixISEiSVTfzIzc3VwoUL1b59ewUFBcnLy0t169bVQw89VOLfFy7X2rVr9dRTT+n222/XwoULNWXKlDJ9P0f65ZdfbL+TTZ48udA+ffr0kcVikZ+f32W9x5IlS8pkEgIo70iyUSKZmZnq3Lmz/vvf/2r58uUFEsqMjAzNnTu3VOd86aWXCk3MS2rbtm266aabNHv2bLVp00avvPKKpk2bpqZNm+qFF17Qvffee9nnLomvvvpKPXr00MiRI9W3b19FRESY/h5//fVXsb/clDUvLy+9//77Bdo//vjjKzrv2bNnNWHChFIn2fPnz9f+/fuv6L0BANKmTZvUvHlz7dq1S4MGDdJrr72mhx9+WG5ubnr11VclSbfccosiIiIKjQP5lixZIknq27evXbtZ8eOvv/7SnXfeqQEDBsgwDD377LOaO3eu+vXrp+TkZN166636/fffS3XO0vjqq6/k5uamBQsWqF+/furWrZvp7+Hs2Obt7V3o31VWVpY++eQTeXt7X/a5LyfJbtu2rf766y+1bdv2st8XcDaSbFzS6dOnFR0drZ07d+qjjz5S165dC/Rp0qSJXnrpJf31118lOmeTJk2Unp6uefPmXdaYTp48qV69esnd3V3fffed5s+fr0cffVSPPvqo3nzzTf30009l/o9zRkaGAgMDy/Q9vL29ValSpTJ9j+J069at0MC7ZMkSxcTEOGwcWVlZkiQPDw95eXk57H0BwFU9//zzCggI0LZt2zRmzBg9/PDDmjBhgr744gtt2rTJ1q9Pnz76+eeftXnz5kLP8/777ysiIkK33HKLXbtZ8WPUqFFas2aNpk+frg0bNmjkyJEaMGCAJk6cqD179mjq1KklPtflyMjIkI+Pjzw9PcvsPZwd27p166a9e/dq165ddu2ffPKJcnJy1KlTJ4eM49y5c8rLy5Obm5u8vb3l5kaagoqLn14U68yZM+rSpYt27Nihjz76qMjAOHbsWKWnp5d4Nvv2229Xx44dNXXq1BIn5n/3+uuv648//tArr7xS6AxySEhIgRngOXPmqGHDhvLy8lJYWJji4+MLlJS3b99eN910k/bu3asOHTqocuXKqlmzpl0Qzy9pNwxDs2fPtpVaSf8rk/un/GN++eUXW9v27dsVHR2ta665Rj4+PqpXr54GDBhgd1xh92R/99136tq1q/z9/eXn56c77rijwC8/+e/37bffKiEhQdWrV5evr6969eqlo0ePFvm9/tMDDzygnTt36ocffrC1paWl6auvvtIDDzxQoH9OTo7Gjh2rZs2aKSAgQL6+vmrTpo2+/vprW59ffvlF1atXlyRNmDDB9v3lf87+/fvLz89PP/30k7p166YqVaqoT58+tn1/v29t3LhxcnNz07p16+zGMXjwYHl6ehb4hQEAcNFPP/2khg0bFnqxODg42Pbn/H9/82es/y4lJUX79++39fm70saPwvz+++96/fXX1alTJw0fPrzAfnd3d40cOVK1atWytZkZIy0WixYuXKisrCxbrFq0aJGtzHrRokUFxvTPuH369GkNHz5cdevWlZeXl4KDg9WpUyft2LHD1qewe7KzsrL05JNPqnbt2vLy8lL9+vX18ssvyzCMAu83dOhQrVixQjfddJO8vLzUsGFD2219JWG1WlWvXr0Cf8fvvfeeunTpoqCgoALHfPLJJ4qJiVFYWJi8vLx03XXXadKkScrNzbX1ad++vVatWqVff/3V9v3lf878+64/+OADjRkzRjVr1lTlypWVmZlZ4J7sffv2ycfHR/369bMbwzfffCN3d3c9/fTTJf6sgKOQZKNIWVlZ6tq1q7Zt26Zly5YVuLf679q0aVPqpHn8+PGlSsz/7tNPP5WPj4/uvvvuEr9XfHy8wsLCNG3aNMXGxur1119X586ddf78ebu+J06cUJcuXdS4cWNNmzZNERERevrpp/X5559LuljG9M4770iSOnXqpHfeecf2uqQyMjLUuXNn/fLLL3rmmWc0a9Ys9enTp8iZgnx79uxRmzZttGvXLj311FN67rnndOjQIbVv315btmwp0H/YsGHatWuXxo0bpyFDhuizzz4r1T3Ubdu2Va1atewC79KlS+Xn51foBZfMzEy9+eabat++vV588UWNHz9eR48etVVCSFL16tVtf+e9evWyfX+9e/e2nefChQuKjo5WcHCwXn75ZcXGxhY6vjFjxqhJkyYaOHCgTp8+LUn64osvNH/+fI0dO1aNGzcu8WcFgKtJeHi4UlJS9P333xfbr169errtttv0n//8xy6Bkv6XeBeWNJc2fhTm888/14ULF/Tggw+WqL/ZMfKdd95RmzZt5OXlZYtVpa2Se/TRRzV37lzFxsZqzpw5GjlypHx8fLRv374ijzEMQ3fddZemT5+uLl266JVXXlH9+vU1atQo273vf/fNN9/oscce03333aepU6fq3Llzio2N1Z9//lnicd5///364IMPbEn8sWPHtHbt2iIviCxatEh+fn5KSEjQq6++qmbNmmns2LF65plnbH3+/e9/q0mTJrrmmmts398/S8cnTZqkVatWaeTIkZoyZUqhFQMNGjTQpEmT9M477+jTTz+VdPF31P79+ysiIkITJ04s8ecEHMYA/mHhwoWGJCM8PNzw8PAwVqxYUWTfcePGGZKMo0ePGhs2bDAkGa+88optf3h4uBETE2N3jCQjPj7eMAzD6NChgxEaGmqcPXvW7r23bdtW7BirVq1qNG7cuESfJyMjw/D09DQ6d+5s5Obm2tpfe+01Q5Lx1ltv2dratWtnSDLefvttW1t2drYRGhpqxMbGFvk58uV/H/+U/7kOHTpkGIZhLF++vESfU5Ixbtw42+uePXsanp6exk8//WRrO3z4sFGlShWjbdu2Bd4vKirKyMvLs7WPGDHCcHd3N06ePFns+/7973XkyJHG9ddfb9vXokUL46GHHir0O7hw4YKRnZ1td64TJ04YISEhxoABA2xtR48eLfDZ8sXFxRmSjGeeeabQfeHh4XZtu3fvNjw9PY2HH37YOHHihFGzZk2jefPmxvnz54v9jABwNVu7dq3h7u5uuLu7G1ar1XjqqaeML774wsjJySnQd/bs2YYk44svvrC15ebmGjVr1jSsVqtd38uNH4UZMWKEIcn47rvvSvSZyiJGxsXFGb6+vnbvc+jQIUOSsXDhwgJj+GdsCwgIuOTn/GdsW7FihSHJmDx5sl2/u+++27BYLMbBgwft3s/T09OubdeuXYYkY9asWcW+b/7neOmll4zvv//ekGT83//9n2EYF//O/fz8jKysrEK/g/zf2/7ukUceMSpXrmycO3fO1hYTE1MgbhuGYXz99deGJOPaa68tcK78fV9//bWtLTc312jdurUREhJiHDt2zIiPjzcqVap0yd+jAGdhJhtFSk9Pl7e3t2rXrl2i/m3btlWHDh1KPZudlpZW6nuzMzMzVaVKlRL1/fLLL5WTk6Phw4fb3d8zaNAg+fv7a9WqVXb9/fz87BZw8fT01K233qqff/65VGMsTn553sqVKwvMpBclNzdXa9euVc+ePXXttdfa2mvUqKEHHnhA33zzjTIzM+2OGTx4sF35eps2bZSbm6tff/21xGN94IEHdPDgQW3bts32v0Vd2XZ3d7ddhc7Ly9Px48d14cIFNW/e3K40riSGDBlSon433XSTJkyYoDfffFPR0dE6duyYFi9e7NR72QGgvOvUqZOSk5N11113adeuXZo6daqio6NVs2ZN22xhvn/961/y8PCwm5XesGGD/vjjj0JLxfOVJn4UJj+mlSTeOytGXkpgYKC2bNmiw4cPl/iY1atXy93dXY8//rhd+5NPPinDMGyVdfmioqJ03XXX2V7ffPPN8vf3L9XvLQ0bNtTNN99su49+yZIl6tGjhypXrlxofx8fH9ufT58+rWPHjqlNmzY6e/as3S0ClxIXF2d3rqK4ublp0aJFOnPmjLp27ao5c+Zo9OjRat68eYnfC3AkkmwU6fXXX5enp6e6dOlS4lUvS5s0X05iLkn+/v628uBLyQ+W9evXt2v39PTUtddeWyCY1qpVq8B91VWrVtWJEydKPL5LadeunWJjYzVhwgRdc8016tGjhxYuXKjs7Owijzl69KjOnj1b4HNIF0up8vLyCjwupU6dOnavq1atKkml+ixNmzZVRESElixZovfee0+hoaHq2LFjkf0XL16sm2++Wd7e3qpWrZqqV6+uVatW6dSpUyV+z0qVKtndY3cpo0aNUuPGjbV161aNGzdOkZGRJT4WAK5WLVq00Mcff6wTJ05o69atGj16tE6fPq27775be/futfWrVq2aoqOjtXz5cp07d07SxSSsUqVKxT7Jo7Tx45/8/f0lqUTx3lkx8lKmTp2q77//XrVr19att96q8ePHXzL5/fXXXxUWFlbg4kKDBg1s+//un59DurzfWx544AEtW7ZMBw8e1KZNm4q9ILJnzx716tVLAQEB8vf3V/Xq1W0TFKWJ9/Xq1Stx3+uuu07jx4/Xtm3b1LBhQz333HMlPhZwNJJsFCkyMlKrV6/WX3/9pU6dOhX6vMt/atu2rdq3b1+qpHncuHFKS0vT66+/XuKxRURE6Mcff1ROTk6Jjykpd3f3QtuNfyw2UpjCFj2TVOA+NovFog8//FDJyckaOnSo/vjjDw0YMEDNmjXTmTNnSj/oIlzJZ/m7Bx54QEuXLtWSJUv0r3/9q8gVP9999131799f1113nRYsWKA1a9YoKSlJHTt2VF5eXonfz8vLq1Sriv788886cOCApIvPfQUAlJynp6datGihKVOmaO7cuTp//ryWLVtm16dv377KzMzUypUrlZOTo48++kidO3e2LWRZlJLGj8LkL2xaVv+uX26MLGmsl6R7771XP//8s2bNmqWwsDC99NJLatiwYYHZ6CthVqy///77dezYMQ0aNEjVqlVT586dC+138uRJtWvXTrt27dLEiRP12WefKSkpSS+++KIklSrel2QW++/Wrl0rSTp8+HCp7jkHHI0kG8W69dZbtWLFCmVkZKhTp04lWpk6fza7pElzu3btbAtllTQx7969u/766y999NFHl+wbHh4uSQVm43NycnTo0CHbfjPkXwX/56rlRZWetWrVSs8//7y2b9+u9957T3v27NEHH3xQaN/q1aurcuXKhVYV/PDDD3JzcytxaX9pPfDAAzpy5Ih+/PHHYq9sf/jhh7r22mv18ccf68EHH1R0dLSioqJsMx/5ivoF5XLk5eWpf//+8vf317PPPqv333//ip/jDQBXq/zy2yNHjti133XXXapSpYqWLFmizz//XCdOnCi2VDxfSeNHYbp27Sp3d3e9++67l+zryBhZ2lhfo0YNPfbYY1qxYoUOHTqkatWq6fnnny/y/OHh4Tp8+HCBGfz8Mmwzf2/5uzp16uj222/X+vXrdc899xR529X69ev1559/atGiRXriiSd05513Kioqyva9/J2Z8X7evHlKSkrS888/r5ycHD3yyCOmnRswG0k2LumOO+7Q+++/r4MHD6pLly4F7mn6p78nzf9MroqSn5i/8cYbJer/6KOPqkaNGnryySf1448/FtifkZGhyZMnS7p4r5Knp6dmzpxpd1V3wYIFOnXqlKnPe86/J2rjxo22tqysLC1evNiu34kTJwpcYW7SpIkkFVky7u7urs6dO+uTTz6xexRYenq6lixZotatW9tK68x23XXXacaMGUpMTNStt95aZL/8q+l//2xbtmxRcnKyXb/8e7z++QvK5XjllVe0adMmvfHGG5o0aZJuu+02DRkyRMeOHbvicwOAq/r6668LnelcvXq1pIK3WPn4+KhXr15avXq15s6dK19fX/Xo0eOS71PS+FGY2rVra9CgQVq7dq1mzZpVYH9eXp6mTZum33//3aEx0t/fX9dcc41drJcuPir073JzcwuUTgcHByssLKzY28O6deum3Nxcvfbaa3bt06dPl8ViUdeuXa/wExRt8uTJGjdunIYNG1Zkn8JifU5OToHPL0m+vr6lKh8vyqFDhzRq1CjFxsbq2Wef1csvv6xPP/1Ub7/99hWfGygLrAyEEunVq5fmz5+vAQMG6K677tKaNWvk7e1dZP9x48apQ4cOJT5/u3bt1K5dO23YsKFE/atWrarly5erW7duatKkifr27atmzZpJknbs2KH3339fVqtV0sWr26NHj9aECRPUpUsX3XXXXdq/f7/mzJmjFi1a2C1ydqU6d+6sOnXqaODAgRo1apTc3d311ltvqXr16kpNTbX1W7x4sebMmaNevXrpuuuu0+nTpzV//nz5+/urW7duRZ5/8uTJSkpKUuvWrfXYY4+pUqVK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YRhGu3btjCeeeMIwDMPYv3+/IclISkoqdIxff/21Ick4ceKEre3cuXNG5cqVjU2bNtn1HThwoHH//fcbhmEYo0ePNiIjI+32P/300wXOBQCAKyPWA3AG7snGVW3lypXy8/PT+fPnlZeXpwceeEDjx49XfHy8GjVqZHdv1q5du3Tw4EFVqVLF7hznzp3TTz/9pFOnTunIkSNq2bKlbV+lSpXUvHnzAmVk+Xbu3Cl3d3e1a9euxGM+ePCgzp49q06dOtm15+TkqGnTppKkffv22Y1DkqxWa4nfAwAAV0GsB+BoJNm4qnXo0EFz586Vp6enwsLCVKnS//4v4evra9f3zJkzatasmd57770C56levfplvb+Pj0+pjzlz5owkadWqVapZs6bdPi8vr8saBwAAropYD8DRSLJxVfP19dX1119for633HKLli5dquDgYPn7+xfap0aNGtqyZYvatm0rSbpw4YJSUlJ0yy23FNq/UaNGysvL04YNGxQVFVVgf/7V9dzcXFtbZGSkvLy8lJqaWuRV8QYNGujTTz+1a9u8efOlPyQAAC6GWA/A0Vj4DCihPn366JprrlGPHj30f//3fzp06JDWr1+vxx9/XL///rsk6YknntALL7ygFStW6IcfftBjjz1W7HMv69atq7i4OA0YMEArVqywnfM///mPJCk8PFwWi0UrV67U0aNHdebMGVWpUkUjR47UiBEjtHjxYv3000/asWOHZs2apcWLF0uSHn30UR04cECjRo3S/v37tWTJEi1atKisvyIAACo0Yj0AM5BkAyVUuXJlbdy4UXXq1FHv3r3VoEEDDRw4UOfOnbNd7X7yySf14IMPKi4uTlarVVWqVFGvXr2KPe/cuXN1991367HHHlNERIQGDRqkrKwsSVLNmjU1YcIEPfPMMwoJCdHQoUMlSZMmTdJzzz2nxMRENWjQQF26dNGqVatUr149SVKdOnX00UcfacWKFWrcuLHmzZunKVOmlOG3AwBAxUesB2AGi1HUKg0AAAAAAKBUmMkGAAAAAMAkJNkAAAAAAJiEJBsAAAAAAJOQZAMAAAAAYBKSbAAAAAAATEKSDQAAAACASUiyAQAAAAAwCUk2AAAAAAAmIckGAAAAAMAkJNkAAAAAAJiEJBsAAAAAAJP8P1YFgwLbFzJlAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 1200x500 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# ---------------------------------------------------------------\n",
"# 6. PLOTTING\n",
"# ---------------------------------------------------------------\n",
"fig, ax = plt.subplots(1, 2, figsize=(12, 5))\n",
"\n",
"sns.heatmap(confusion_matrix(y_test, y_pred_knn), annot=True, fmt=\"d\", cmap=\"Blues\", ax=ax[0])\n",
"ax[0].set_title(\"KNN Confusion Matrix\")\n",
"ax[0].set_xlabel(\"Predicted\")\n",
"ax[0].set_ylabel(\"Actual\")\n",
"\n",
"sns.heatmap(confusion_matrix(y_test, y_pred_svm), annot=True, fmt=\"d\", cmap=\"Greens\", ax=ax[1])\n",
"ax[1].set_title(\"SVM Confusion Matrix\")\n",
"ax[1].set_xlabel(\"Predicted\")\n",
"ax[1].set_ylabel(\"Actual\")\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "956f5a26-be04-44a1-b208-5a4b38280829",
"metadata": {},
"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.8.20"
}
},
"nbformat": 4,
"nbformat_minor": 5
}