Pant0x commited on
Commit
bf36835
·
verified ·
1 Parent(s): 509cc38

Upload 6 files

Browse files
README.md CHANGED
@@ -1,12 +1,10 @@
1
- ---
2
- title: Emailspamclassification
3
- emoji:
4
- colorFrom: yellow
5
- colorTo: green
6
- sdk: gradio
7
- sdk_version: 6.1.0
8
- app_file: app.py
9
- pinned: false
10
- ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ ---
2
+ title: Email Spam Classifier
3
+ emoji: 📧
4
+ colorFrom: blue
5
+ colorTo: green
6
+ sdk: gradio
7
+ sdk_version: "3.48"
8
+ app_file: app.py
9
+ pinned: false
10
+ ---
 
 
app.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import torch
3
+ import torch.nn as nn
4
+ import pickle
5
+
6
+ # ---------- Model Definition ----------
7
+ class SpamClassifier(nn.Module):
8
+ def __init__(self, input_dim):
9
+ super(SpamClassifier, self).__init__()
10
+ self.fc1 = nn.Linear(input_dim, 128)
11
+ self.relu = nn.ReLU()
12
+ self.fc2 = nn.Linear(128, 2)
13
+ self.softmax = nn.Softmax(dim=1)
14
+
15
+ def forward(self, x):
16
+ x = self.fc1(x)
17
+ x = self.relu(x)
18
+ x = self.fc2(x)
19
+ x = self.softmax(x)
20
+ return x
21
+
22
+ # ---------- Load Vectorizer ----------
23
+ with open("model/vectorizer.pkl", "rb") as f:
24
+ vectorizer = pickle.load(f)
25
+
26
+ input_dim = len(vectorizer.get_feature_names_out())
27
+
28
+ # ---------- Load Model ----------
29
+ model = SpamClassifier(input_dim)
30
+ model.load_state_dict(torch.load("model/email_spam_classifier.pth", map_location=torch.device("cpu")))
31
+ model.eval()
32
+
33
+ # ---------- Prediction Function ----------
34
+ def predict_email(text):
35
+ X = vectorizer.transform([text]).toarray()
36
+ X_tensor = torch.tensor(X, dtype=torch.float32)
37
+ with torch.no_grad():
38
+ probs = model(X_tensor).numpy()[0]
39
+ labels = ["Ham", "Spam"]
40
+ return {labels[i]: float(probs[i]) for i in range(2)}
41
+
42
+ # ---------- Gradio Interface ----------
43
+ iface = gr.Interface(
44
+ fn=predict_email,
45
+ inputs=gr.Textbox(lines=5, placeholder="Paste your email here..."),
46
+ outputs=gr.Label(num_top_classes=2),
47
+ title="Email Spam Classifier",
48
+ description="Classify emails as Spam or Ham using a PyTorch model."
49
+ )
50
+
51
+ if __name__ == "__main__":
52
+ iface.launch()
email-spam-classification.ipynb ADDED
@@ -0,0 +1 @@
 
 
1
+ {"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":6897944,"sourceType":"datasetVersion","datasetId":3962399}],"dockerImageVersionId":31154,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nfrom torch.utils.data import DataLoader, Dataset, random_split, TensorDataset\nimport torch.optim as optim\nimport pandas as pd\nimport numpy as np\nimport re\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport joblib","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:17:42.293030Z","iopub.execute_input":"2025-12-11T12:17:42.293790Z","iopub.status.idle":"2025-12-11T12:17:47.350595Z","shell.execute_reply.started":"2025-12-11T12:17:42.293760Z","shell.execute_reply":"2025-12-11T12:17:47.349944Z"}},"outputs":[],"execution_count":1},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/email-spam-classification-dataset/combined_data.csv')\n\nprint(\"Columns:\", df.columns)\nprint(\"Sample data:\\n\", df.head())\n\ndef clean_text(text):\n text = re.sub(r\"http\\S+\", \"\", str(text)) \n text = re.sub(r\"[^a-zA-Z\\s]\", \"\", text) \n text = text.lower().strip()\n return text\n\ndf['text'] = df['text'].apply(clean_text)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:17:47.352006Z","iopub.execute_input":"2025-12-11T12:17:47.352418Z","iopub.status.idle":"2025-12-11T12:17:52.125268Z","shell.execute_reply.started":"2025-12-11T12:17:47.352393Z","shell.execute_reply":"2025-12-11T12:17:52.124678Z"}},"outputs":[{"name":"stdout","text":"Columns: Index(['label', 'text'], dtype='object')\nSample data:\n label text\n0 1 ounce feather bowl hummingbird opec moment ala...\n1 1 wulvob get your medircations online qnb ikud v...\n2 0 computer connection from cnn com wednesday es...\n3 1 university degree obtain a prosperous future m...\n4 0 thanks for all your answers guys i know i shou...\n","output_type":"stream"}],"execution_count":2},{"cell_type":"code","source":"from sklearn.feature_extraction.text import TfidfVectorizer\n\nvectorizer = TfidfVectorizer(max_features=1000)\nX = vectorizer.fit_transform(df['text']).toarray()\ny = df['label'].values \n\nX_tensor = torch.tensor(X, dtype=torch.float32)\ny_tensor = torch.tensor(y, dtype=torch.long)\n\ndataset = TensorDataset(X_tensor, y_tensor)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:17:52.126077Z","iopub.execute_input":"2025-12-11T12:17:52.126362Z","iopub.status.idle":"2025-12-11T12:18:06.397542Z","shell.execute_reply.started":"2025-12-11T12:17:52.126337Z","shell.execute_reply":"2025-12-11T12:18:06.396894Z"}},"outputs":[],"execution_count":3},{"cell_type":"code","source":"\njoblib.dump(vectorizer, 'vectorizer.pkl')\nprint(\" Vectorizer saved as vectorizer.pkl\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:18:06.399405Z","iopub.execute_input":"2025-12-11T12:18:06.399703Z","iopub.status.idle":"2025-12-11T12:18:07.092061Z","shell.execute_reply.started":"2025-12-11T12:18:06.399685Z","shell.execute_reply":"2025-12-11T12:18:07.091171Z"}},"outputs":[{"name":"stdout","text":" Vectorizer saved as vectorizer.pkl\n","output_type":"stream"}],"execution_count":4},{"cell_type":"code","source":"train_size = int(0.8 * len(dataset))\ntest_size = len(dataset) - train_size\ntrain_data, test_data = random_split(dataset, [train_size, test_size])\n\ntrain_loader = DataLoader(train_data, batch_size=32, shuffle=True)\ntest_loader = DataLoader(test_data, batch_size=32, shuffle=False)\n\nprint(f\"Train samples: {len(train_data)}, Test samples: {len(test_data)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:18:07.092839Z","iopub.execute_input":"2025-12-11T12:18:07.093104Z","iopub.status.idle":"2025-12-11T12:18:07.115100Z","shell.execute_reply.started":"2025-12-11T12:18:07.093085Z","shell.execute_reply":"2025-12-11T12:18:07.114489Z"}},"outputs":[{"name":"stdout","text":"Train samples: 66758, Test samples: 16690\n","output_type":"stream"}],"execution_count":5},{"cell_type":"code","source":"class SpamClassifier(nn.Module):\n def __init__(self, input_size, hidden_size=64):\n super(SpamClassifier, self).__init__()\n self.model = nn.Sequential(\n nn.Linear(input_size, hidden_size),\n nn.ReLU(),\n nn.Linear(hidden_size, hidden_size // 2),\n nn.ReLU(),\n nn.Linear(hidden_size // 2, 1)\n )\n\n def forward(self, x):\n return self.model(x)\n\nmodel = SpamClassifier(input_size=X.shape[1])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:18:07.115790Z","iopub.execute_input":"2025-12-11T12:18:07.116024Z","iopub.status.idle":"2025-12-11T12:18:07.128669Z","shell.execute_reply.started":"2025-12-11T12:18:07.116008Z","shell.execute_reply":"2025-12-11T12:18:07.127912Z"}},"outputs":[],"execution_count":6},{"cell_type":"code","source":"print(X.shape[1])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:18:07.129287Z","iopub.execute_input":"2025-12-11T12:18:07.129520Z","iopub.status.idle":"2025-12-11T12:18:07.135831Z","shell.execute_reply.started":"2025-12-11T12:18:07.129493Z","shell.execute_reply":"2025-12-11T12:18:07.135228Z"}},"outputs":[{"name":"stdout","text":"1000\n","output_type":"stream"}],"execution_count":7},{"cell_type":"code","source":"criterion = nn.BCEWithLogitsLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:18:07.136601Z","iopub.execute_input":"2025-12-11T12:18:07.136847Z","iopub.status.idle":"2025-12-11T12:18:09.987263Z","shell.execute_reply.started":"2025-12-11T12:18:07.136830Z","shell.execute_reply":"2025-12-11T12:18:09.986670Z"}},"outputs":[],"execution_count":8},{"cell_type":"code","source":"num_epochs = 20\ntrain_losses = []\n\nfor epoch in range(num_epochs):\n model.train()\n running_loss = 0.0\n\n for features, labels in train_loader:\n optimizer.zero_grad()\n outputs = model(features)\n\n loss = criterion(outputs, labels.unsqueeze(1).float())\n\n loss.backward()\n optimizer.step()\n running_loss += loss.item()\n\n avg_loss = running_loss / len(train_loader)\n train_losses.append(avg_loss)\n\n print(f\"Epoch [{epoch+1}/{num_epochs}] - Loss: {avg_loss:.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:18:09.987987Z","iopub.execute_input":"2025-12-11T12:18:09.988415Z","iopub.status.idle":"2025-12-11T12:19:35.822114Z","shell.execute_reply.started":"2025-12-11T12:18:09.988389Z","shell.execute_reply":"2025-12-11T12:19:35.821160Z"}},"outputs":[{"name":"stdout","text":"Epoch [1/20] - Loss: 0.1178\nEpoch [2/20] - Loss: 0.0704\nEpoch [3/20] - Loss: 0.0537\nEpoch [4/20] - Loss: 0.0417\nEpoch [5/20] - Loss: 0.0332\nEpoch [6/20] - Loss: 0.0261\nEpoch [7/20] - Loss: 0.0204\nEpoch [8/20] - Loss: 0.0158\nEpoch [9/20] - Loss: 0.0127\nEpoch [10/20] - Loss: 0.0106\nEpoch [11/20] - Loss: 0.0086\nEpoch [12/20] - Loss: 0.0076\nEpoch [13/20] - Loss: 0.0064\nEpoch [14/20] - Loss: 0.0057\nEpoch [15/20] - Loss: 0.0049\nEpoch [16/20] - Loss: 0.0056\nEpoch [17/20] - Loss: 0.0053\nEpoch [18/20] - Loss: 0.0046\nEpoch [19/20] - Loss: 0.0042\nEpoch [20/20] - Loss: 0.0045\n","output_type":"stream"}],"execution_count":9},{"cell_type":"code","source":"model.eval()\ntrain_preds, train_labels = [], []\n\nwith torch.no_grad():\n for features, labels in train_loader:\n outputs = model(features)\n probs = torch.sigmoid(outputs)\n predicted = (probs > 0.5).int().squeeze(1)\n train_preds.extend(predicted.numpy())\n train_labels.extend(labels.numpy())\n\n# Compute training accuracy\ntrain_accuracy = np.mean(np.array(train_preds) == np.array(train_labels))\nprint(f\"\\n Training Accuracy: {train_accuracy * 100:.2f}%\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:19:35.824408Z","iopub.execute_input":"2025-12-11T12:19:35.824690Z","iopub.status.idle":"2025-12-11T12:19:37.318929Z","shell.execute_reply.started":"2025-12-11T12:19:35.824670Z","shell.execute_reply":"2025-12-11T12:19:37.318060Z"}},"outputs":[{"name":"stdout","text":"\n Training Accuracy: 99.68%\n","output_type":"stream"}],"execution_count":10},{"cell_type":"code","source":"plt.figure(figsize=(8,5))\nplt.plot(range(1, num_epochs+1), train_losses, marker='o', linestyle='-', color='b')\nplt.title('Training Loss Over Epochs')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.grid(True)\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:19:37.319754Z","iopub.execute_input":"2025-12-11T12:19:37.319992Z","iopub.status.idle":"2025-12-11T12:19:37.580665Z","shell.execute_reply.started":"2025-12-11T12:19:37.319974Z","shell.execute_reply":"2025-12-11T12:19:37.579835Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 800x500 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAArwAAAHWCAYAAACVPVriAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABgNUlEQVR4nO3dd3wUdf7H8femE6q0hNACiHRCx6iAnoGAqITQRE+KhVPJ/eAiqKg0y6EoHKgIigI2lCJgR0IERQGRpoKA4NEhQVQMEAgxmd8fc7uwZJMMIclsNq/n4zGP3Z397ux3PkziO+N3vuMwDMMQAAAA4KP87O4AAAAAUJQIvAAAAPBpBF4AAAD4NAIvAAAAfBqBFwAAAD6NwAsAAACfRuAFAACATyPwAgAAwKcReAEAAODTCLwAvNqQIUMUGRlZoM9OmDBBDoejcDsE5MN53B0/ftzurgD4HwIvgAJxOByWltWrV9vdVVsMGTJE5cqVs7sblhiGobfeekudO3dWpUqVFBoaqhYtWuiJJ57Q6dOn7e5eDs5AmduSkpJidxcBeJkAuzsAoGR666233F6/+eabSkpKyrG+SZMml/U9s2fPVnZ2doE++/jjj+uRRx65rO/3dVlZWbr99tu1cOFCderUSRMmTFBoaKjWrFmjiRMnatGiRVq5cqXCwsLs7moOM2fO9PhHRaVKlYq/MwC8GoEXQIH8/e9/d3u9fv16JSUl5Vh/sfT0dIWGhlr+nsDAwAL1T5ICAgIUEMCvubxMnjxZCxcu1KhRo/Tcc8+51g8bNkz9+/dXXFychgwZos8++6xY+2XlOOnbt6+qVq1aTD0CUJIxpAFAkbn++uvVvHlzbdq0SZ07d1ZoaKgeffRRSdIHH3ygnj17KiIiQsHBwWrQoIGefPJJZWVluW3j4jG8+/btk8Ph0PPPP69XX31VDRo0UHBwsNq3b6/vvvvO7bOexvA6HA4lJCRo2bJlat68uYKDg9WsWTMtX748R/9Xr16tdu3aKSQkRA0aNNArr7xS6OOCFy1apLZt26pMmTKqWrWq/v73v+vw4cNubVJSUjR06FDVqlVLwcHBqlGjhnr16qV9+/a52mzcuFGxsbGqWrWqypQpo3r16umuu+7K87vPnDmj5557TldddZUmTZqU4/1bbrlFgwcP1vLly7V+/XpJ0s0336z69et73F50dLTatWvntu7tt9927V/lypV122236eDBg25t8jpOLsfq1avlcDi0YMECPfroowoPD1fZsmV166235uiDZO3fQpJ27typ/v37q1q1aipTpowaNWqkxx57LEe7EydOaMiQIapUqZIqVqyooUOHKj093a1NUlKSrrvuOlWqVEnlypVTo0aNCmXfAbjj1AeAIvXbb7+pR48euu222/T3v//d9b/G582bp3LlyikxMVHlypXTF198oXHjxiktLc3tTGNu5s+fr5MnT+of//iHHA6HJk+erPj4eP33v//N96zw119/rSVLluiBBx5Q+fLl9cILL6hPnz46cOCAqlSpIknasmWLunfvrho1amjixInKysrSE088oWrVql1+Uf5n3rx5Gjp0qNq3b69JkyYpNTVV06dP1zfffKMtW7a4/td8nz59tH37dv3zn/9UZGSkjh07pqSkJB04cMD1ulu3bqpWrZoeeeQRVapUSfv27dOSJUvyrcMff/yhESNG5HomfNCgQZo7d64+/vhjXX311RowYIAGDRqk7777Tu3bt3e1279/v9avX+/2b/f0009r7Nix6t+/v+655x79+uuvevHFF9W5c2e3/ZNyP07y8vvvv+dYFxAQkGNIw9NPPy2Hw6GHH35Yx44d07Rp0xQTE6OtW7eqTJkykqz/W/zwww/q1KmTAgMDNWzYMEVGRuqXX37RRx99pKefftrte/v376969epp0qRJ2rx5s1577TVVr15dzz77rCRp+/btuvnmm9WyZUs98cQTCg4O1p49e/TNN9/ku+8ALpEBAIVg+PDhxsW/Urp06WJIMmbNmpWjfXp6eo51//jHP4zQ0FDj7NmzrnWDBw826tat63q9d+9eQ5JRpUoV4/fff3et/+CDDwxJxkcffeRaN378+Bx9kmQEBQUZe/bsca37/vvvDUnGiy++6Fp3yy23GKGhocbhw4dd63bv3m0EBATk2KYngwcPNsqWLZvr++fOnTOqV69uNG/e3Dhz5oxr/ccff2xIMsaNG2cYhmH88ccfhiTjueeey3VbS5cuNSQZ3333Xb79utC0adMMScbSpUtzbfP7778bkoz4+HjDMAzjzz//NIKDg40HH3zQrd3kyZMNh8Nh7N+/3zAMw9i3b5/h7+9vPP30027tfvzxRyMgIMBtfV7HiSfOf1dPS6NGjVztVq1aZUgyatasaaSlpbnWL1y40JBkTJ8+3TAM6/8WhmEYnTt3NsqXL+/aT6fs7Owc/bvrrrvc2vTu3duoUqWK6/V//vMfQ5Lx66+/WtpvAAXHkAYARSo4OFhDhw7Nsd55Zk2STp48qePHj6tTp05KT0/Xzp07893ugAEDdMUVV7hed+rUSZL03//+N9/PxsTEqEGDBq7XLVu2VIUKFVyfzcrK0sqVKxUXF6eIiAhXuyuvvFI9evTId/tWbNy4UceOHdMDDzygkJAQ1/qePXuqcePG+uSTTySZdQoKCtLq1av1xx9/eNyW8+zjxx9/rMzMTMt9OHnypCSpfPnyubZxvpeWliZJqlChgnr06KGFCxfKMAxXuwULFujqq69WnTp1JElLlixRdna2+vfvr+PHj7uW8PBwNWzYUKtWrXL7ntyOk7y8//77SkpKclvmzp2bo92gQYPc9rFv376qUaOGPv30U0nW/y1+/fVXffXVV7rrrrtc++nkaZjLfffd5/a6U6dO+u2331y1dP67ffDBBwW+MBOANQReAEWqZs2aCgoKyrF++/bt6t27typWrKgKFSqoWrVqrgve/vzzz3y3e3HgcIbf3EJhXp91ft752WPHjunMmTO68sorc7TztK4g9u/fL0lq1KhRjvcaN27sej84OFjPPvusPvvsM4WFhalz586aPHmy29RbXbp0UZ8+fTRx4kRVrVpVvXr10ty5c5WRkZFnH5wh0Bl8PfEUigcMGKCDBw9q3bp1kqRffvlFmzZt0oABA1xtdu/eLcMw1LBhQ1WrVs1t2bFjh44dO+b2PbkdJ3np3LmzYmJi3Jbo6Ogc7Ro2bOj22uFw6Morr3SNgbb6b+H8g6h58+aW+pffMTpgwABde+21uueeexQWFqbbbrtNCxcuJPwCRYDAC6BIXXgm1+nEiRPq0qWLvv/+ez3xxBP66KOPlJSU5BrbaOU/+P7+/h7XX3jWsSg+a4eRI0fq559/1qRJkxQSEqKxY8eqSZMm2rJliyQzwC1evFjr1q1TQkKCDh8+rLvuuktt27bVqVOnct2uc8q4H374Idc2zveaNm3qWnfLLbcoNDRUCxculCQtXLhQfn5+6tevn6tNdna2HA6Hli9fnuMsbFJSkl555RW37/F0nJR0+R1nZcqU0VdffaWVK1fqzjvv1A8//KABAwaoa9euOS7eBHB5CLwAit3q1av122+/ad68eRoxYoRuvvlmxcTEuA1RsFP16tUVEhKiPXv25HjP07qCqFu3riRp165dOd7btWuX632nBg0a6MEHH9SKFSu0bds2nTt3TlOmTHFrc/XVV+vpp5/Wxo0b9c4772j79u167733cu2Dc3aA+fPn5xqw3nzzTUnm7AxOZcuW1c0336xFixYpOztbCxYsUKdOndyGfzRo0ECGYahevXo5zsLGxMTo6quvzqdChWf37t1urw3D0J49e1yzf1j9t3DOTrFt27ZC65ufn59uvPFGTZ06VT/99JOefvppffHFFzmGfAC4PAReAMXOeebrwjOq586d08svv2xXl9z4+/srJiZGy5Yt05EjR1zr9+zZU2jz0bZr107Vq1fXrFmz3IYefPbZZ9qxY4d69uwpyZyP9uzZs26fbdCggcqXL+/63B9//JHj7HSrVq0kKc9hDaGhoRo1apR27drlcVqtTz75RPPmzVNsbGyOgDpgwAAdOXJEr732mr7//nu34QySFB8fL39/f02cODFH3wzD0G+//ZZrvwrbm2++6TZsY/HixTp69KhrPLbVf4tq1aqpc+fOmjNnjg4cOOD2HQX5vwOeZpmw8u8G4NIxLRmAYnfNNdfoiiuu0ODBg/V///d/cjgceuutt7xqSMGECRO0YsUKXXvttbr//vuVlZWll156Sc2bN9fWrVstbSMzM1NPPfVUjvWVK1fWAw88oGeffVZDhw5Vly5dNHDgQNdUWJGRkfrXv/4lSfr555914403qn///mratKkCAgK0dOlSpaam6rbbbpMkvfHGG3r55ZfVu3dvNWjQQCdPntTs2bNVoUIF3XTTTXn28ZFHHtGWLVv07LPPat26derTp4/KlCmjr7/+Wm+//baaNGmiN954I8fnbrrpJpUvX16jRo2Sv7+/+vTp4/Z+gwYN9NRTT2nMmDHat2+f4uLiVL58ee3du1dLly7VsGHDNGrUKEt1zM3ixYs93mmta9eubtOaVa5cWdddd52GDh2q1NRUTZs2TVdeeaXuvfdeSebNTaz8W0jSCy+8oOuuu05t2rTRsGHDVK9ePe3bt0+ffPKJ5ePC6YknntBXX32lnj17qm7dujp27Jhefvll1apVS9ddd13BigLAM1vmhgDgc3KblqxZs2Ye23/zzTfG1VdfbZQpU8aIiIgwHnroIePzzz83JBmrVq1ytctt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sqa46pSenm65bYECb3Z2tp566ilNmTJFp06dkiSVL19eDz74oB577DH5+dlzF67s7GxJ5rRp//rXvyRJrVq10tq1azVr1qxcA++YMWPczhynpaWpdu3a6tat2yWNSS5NMjMzlZSUpG7duqp69SBde620alUdPf10hNq1Y9oGJ2edunbtqsDAQLu747WokzXUyRrqZB21soY6WVPcdXL+H3krChR4H3vsMb3++ut65plndO2110qSvv76a02YMEFnz57V008/ne82qlatKn9/f6WmprqtT01NVXh4uMfPhIeH59m+atWqCggIUNOmTd3aNGnSRF9//XWufQkODlZwcM67hgUGBnJg5yMwMFDXXBOgO++U3npLGjUqQF9/LTkcdvfMu3AsWUOdrKFO1lAn66iVNdTJmuKq06V8R4FOxb7xxht67bXXdP/996tly5Zq2bKlHnjgAc2ePVvz5s2ztI2goCC1bdtWycnJrnXZ2dlKTk52XQR3sejoaLf2knna3Nk+KChI7du3165du9za/Pzzz6pbt+4l7CEu1aRJUmiotHat9N57dvcGAADgvAIF3t9//12NG+e8rWzjxo31+++/W95OYmKiZs+erTfeeEM7duzQ/fffr9OnT2vo0KGSpEGDBrld1DZixAgtX75cU6ZM0c6dOzVhwgRt3LhRCQkJrjajR4/WggULNHv2bO3Zs0cvvfSSPvroIz3wwAMF2VVYVLOm5Pyneugh6RKG1QAAABSpAgXeqKgot6nAnF566SW1bNnS8nYGDBig559/XuPGjVOrVq20detWLV++3HVh2oEDB3T06FFX+2uuuUbz58/Xq6++qqioKC1evFjLli1T8+bNXW169+6tWbNmafLkyWrRooVee+01vf/++7ruuusKsqu4BA8+KNWtKx06JD33nN29AQAAMBVoDO/kyZPVs2dPrVy50jWcYN26dTp48KDHO5/lJSEhwe0M7YVWr16dY12/fv3Ur1+/PLd511136a677rqkfuDylSkjTZ4sDRggPfusdNddUu3advcKAACUdgU6w9ulSxf9/PPP6t27t06cOKETJ04oPj5e27dv11tvvVXYfUQJ0q+f1KmTdOaM9MgjdvcGAADgMubhjYiIyDEbw/fff6/XX39dr7766mV3DCWTwyFNmya1ayfNny8lJEi5XIMIAABQLOyZMBc+rU0b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DocqVark8f2MjAxlZGS4Xqf97//TZmZmKjMz0+LelC7OulCfvPlynapVc8jKr5BTp/5SZmbec5n5cp0KE3WyhjpZR62soU7WFHedLuV7bA28x48fV1ZWlsLCwtzWh4WFaefOnR4/k5KS4rF9SkqKx/Znz57Vww8/rIEDB6pChQoe20yaNEkTJ07MsX7FihUKDQ21siulVlJSkt1dKBF8sU5ZWVKVKt30228hkhy5ths2LECvvXZU/fr9rIYNT+S5TV+sU1GgTtZQJ+uolTXUyZriqlN6errltrYG3qKWmZmp/v37yzAMzZw5M9d2Y8aMcTtrnJaWptq1a6tbt265huTSLjMzU0lJSeratasCAwPt7o7X8vU6vfyyQ7fdJkmGDON86HU4DBmG1LGjoQ0bHNqwoYY2bKihG2/M1iOPZKtzZ0OOCzKyr9epsFAna6iTddTKGupkTXHXKS23K6c9sDXwVq1aVf7+/kpNTXVbn5qaqvDwcI+fCQ8Pt9TeGXb379+vL774Is/gGhwcrODg4BzrAwMDObDzQY2s8dU69e8vBQSYc/JeODVZrVoOTZsmxcc7tHOn9Mwz0ttvS8nJfkpO9tM110iPPmrO8Xth8PXVOhU26mQNdbKOWllDnawprjpdynfYetFaUFCQ2rZtq+TkZNe67OxsJScnKzo62uNnoqOj3dpL5qnzC9s7w+7u3bu1cuVKValSpWh2AIDi46V9+6RVq6T5883HvXvN9ZLUuLE0b560Z4/0wANScLC0dq10881SmzbSokVMXQYAKFq2z9KQmJio2bNn64033tCOHTt0//336/Tp0xo6dKgkadCgQW4XtY0YMULLly/XlClTtHPnTk2YMEEbN25UQkKCJDPs9u3bVxs3btQ777yjrKwspaSkKCUlRefOnbNlHwFf5+9v3nJ44EDz0d8/Z5vISGnGDDMMjxollS0rbd1qniWOigpQcnJtcT0IAKAo2B54BwwYoOeff17jxo1Tq1attHXrVi1fvtx1YdqBAwd09IJ5ja655hrNnz9fr776qqKiorR48WItW7ZMzZs3lyQdPnxYH374oQ4dOqRWrVqpRo0armXt2rW27COA82rUkJ57Ttq/Xxo/XrriCunnnx168cU2atIkQDNmSGfO2N1LAIAv8YqL1hISElxnaC+2evXqHOv69eunfv36eWwfGRkpw8h7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7LPP6ssvv1SPHj2UlZXlsT3HlPTGG2+ofPny+f5vel8/njxlgZSUFAUFBeX4wzKv46Mgv9sKS0CRbh0l3vDhw7Vt27Z8xyJFR0crOjra9fqaa65RkyZN9Morr+jJJ58s6m7aokePHq7nLVu2VMeOHVW3bl0tXLjQ0tmA0uj1119Xjx49FBERkWub0ngsoXBkZmaqf//+MgxDM2fOzLNtafz5ve2221zPW7RooZYtW6pBgwZavXq1brzxRht75r3mzJmjO+64I98LZ339eLKaBbwZZ3iRq4SEBH388cdatWqVatWqdUmfDQwMVOvWrbVnz54i6p33qVSpkq666qpc9zk8PDzH1aupqakKDw8vju7Zbv/+/Vq5cqXuueeeS/pcaTyWnMfEpRwvVatWlb+/f6k9xpxhd//+/UpKSsrz7K4n+f38+qL69euratWque5zaT+m1qxZo127dl3y7yzJt46n3LJAeHi4zp07pxMnTri1z+v4KMjvtsJC4EUOhmEoISFBS5cu1RdffKF69epd8jaysrL0448/qkaNGkXQQ+906tQp/fLLL7nuc3R0tJKTk93WJSUluZ3N9GVz585V9erV1bNnz0v6XGk8lurVq6fw8HC34yUtLU3ffvttrsdLUFCQ2rZt6/aZ7OxsJScn+/wx5gy7u3fv1sqVK1WlSpVL3kZ+P7++6NChQ/rtt99y3efSfExJ5v+Ratu2raKioi75s75wPOWXBdq2bavAwEC342PXrl06cOBArsdHQX63FZoivSQOJdL9999vVKxY0Vi9erVx9OhR15Kenu5qc+eddxqPPPKI6/XEiRONzz//3Pjll1+MTZs2GbfddpsREhJibN++3Y5dKBYPPvigsXr1amPv3r3GN998Y8TExBhVq1Y1jh07ZhhGzhp98803RkBAgPH8888bO3bsMMaPH28EBgYaP/74o127UGyysrKMOnXqGA8//HCO90rrsXTy5Eljy5YtxpYtWwxJxtSpU40tW7a4ZhZ45plnjEqVKhkffPCB8cMPPxi9evUy6tWrZ5w5c8a1jb/97W/Giy++6Hr93nvvGcHBwca8efOMn376yRg2bJhRqVIlIyUlpdj3rzDlVatz584Zt956q1GrVi1j69atbr+zMjIyXNu4uFb5/fyWRHnV6eTJk8aoUaOMdevWGXv37jVWrlxptGnTxmjYsKFx9uxZ1zZKwzGV38+eYRjGn3/+aYSGhhozZ870uI3ScDxZyQL33XefUadOHeOLL74wNm7caERHRxvR0dFu22nUqJGxZMkS12srv9uKAoEXOUjyuMydO9fVpkuXLsbgwYNdr0eOHGnUqVPHCAoKMsLCwoybbrrJ2Lx5c/F3vhgNGDDAqFGjhhEUFGTUrFnTGDBggLFnzx7X+xfXyDAMY+HChcZVV11lBAUFGc2aNTM++eSTYu61PT7//HNDkrFr164c75XWY2nVqlUef86ctcjOzjbGjh1rhIWFGcHBwcaNN96Yo35169Y1xo8f77buxRdfdNWvQ4cOxvr164tpj4pOXrXau3dvrr+zVq1a5drGxbXK7+e3JMqrTunp6Ua3bt2MatWqGYGBgUbdunWNe++9N0dwLQ3HVH4/e4ZhGK+88opRpkwZ48SJEx63URqOJytZ4MyZM8YDDzxgXHHFFUZoaKjRu3dv4+jRozm2c+FnrPxuKwqO/3UGAAAA8EmM4QUAAIBPI/ACAADApxF4AQAA4NMIvAAAAPBpBF4AAAD4NAIvAAAAfBqBFwAAAD6NwAsAAACfRuAFAOTK4XBo2bJldncDAC4LgRcAvNSQIUPkcDhyLN27d7e7awBQogTY3QEAQO66d++uuXPnuq0LDg62qTcAUDJxhhcAvFhwcLDCw8PdliuuuEKSOdxg5syZ6tGjh8qUKaP69etr8eLFbp//8ccf9be//U1lypRRlSpVNGzYMJ06dcqtzZw5c9SsWTMFBwerRo0aSkhIcHv/+PHj6t27t0JDQ9WwYUN9+OGHRbvTAFDICLwAUIKNHTtWffr00ffff6877rhDt912m3bs2CFJOn36tGJjY3XFFVfou+++06JFi7Ry5Uq3QDtz5kwNHz5cw4YN048//qgPP/xQV155pdt3TJw4Uf3799cPP/ygm266SXfccYd+//33Yt1PALgcDsMwDLs7AQDIaciQIXr77bcVEhLitv7RRx/Vo48+KofDofvuu08zZ850vXf11VerTZs2evnllzV79mw9/PDDOnjwoMqWLStJ+vTTT3XLLbfoyJEjCgsLU82aNTV06FA99dRTHvvgcDj0+OOP68knn5Rkhuhy5crps88+YywxgBKDMbwA4MVuuOEGt0ArSZUrV3Y9j46OdnsvOjpaW7dulSTt2LFDUVFRrrArSddee62ys7O1a9cuORwOHTlyRDfeeGOefWjZsqXredmyZVWhQgUdO3asoLsEAMWOwAsAXqxs2bI5hhgUljJlylhqFxgY6Pba4XAoOzu7KLoEAEWCMbwAUIKtX78+x+smTZpIkpo0aaLvv/9ep0+fdr3/zTffyM/PT40aNVL58uUVGRmp5OTkYu0zABQ3zvACgBfLyMhQSkqK27qAgABVrVpVkrRo0SK1a9dO1113nd555x1t2LBBr7/+uiTpjjvu0Pjx4zV48GBNmDBBv/76q/75z3/qzjvvVFhYmCRpwoQJuu+++1S9enX16NFDJ0+e1DfffKN//vOfxbujAFCECLwA4MWWL1+uGjVquK1r1KiRdu7cKcmcQeG9997TAw88oBo1aujdd99V06ZNJUmhoaH6/PPPNWLECLVv316hoaHq06ePpk6d6trW4MGDdfbsWf3nP//RqFGjVLVqVfXt27f4dhAAigGzNABACeVwOLR06VLFxcXZ3RUA8GqM4QUAAIBPI/ACAADApzGGFwBKKEakAYA1nOEFAACATyPwAgAAwKcReAEAAODTCLwAAADwaQReAAAA+DQCLwAAAHwagRcAAAA+jcALAAAAn/b/OMMCZ/xJNYsAAAAASUVORK5CYII=\n"},"metadata":{}}],"execution_count":11},{"cell_type":"code","source":"model.eval()\nall_preds, all_labels = [], []\n\nwith torch.no_grad():\n for features, labels in test_loader:\n outputs = model(features)\n probs = torch.sigmoid(outputs)\n predicted = (probs > 0.5).int().squeeze(1)\n all_preds.extend(predicted.numpy())\n all_labels.extend(labels.numpy())\n\naccuracy = np.mean(np.array(all_preds) == np.array(all_labels))\nprint(f\"\\n Test Accuracy: {accuracy*100:.2f}%\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:19:37.581628Z","iopub.execute_input":"2025-12-11T12:19:37.581927Z","iopub.status.idle":"2025-12-11T12:19:37.948489Z","shell.execute_reply.started":"2025-12-11T12:19:37.581900Z","shell.execute_reply":"2025-12-11T12:19:37.947527Z"}},"outputs":[{"name":"stdout","text":"\n Test Accuracy: 97.91%\n","output_type":"stream"}],"execution_count":12},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, classification_report\nimport matplotlib.pyplot as plt\n\ncm = confusion_matrix(all_labels, all_preds)\n\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=[\"Not Spam\", \"Spam\"])\ndisp.plot(cmap='Blues', values_format='d')\nplt.title(\"Confusion Matrix - Test Data\")\nplt.show()\n\nprint(\"\\n Classification Report:\")\nprint(classification_report(all_labels, all_preds, target_names=[\"Not Spam\", \"Spam\"]))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:19:37.949468Z","iopub.execute_input":"2025-12-11T12:19:37.949969Z","iopub.status.idle":"2025-12-11T12:19:38.167158Z","shell.execute_reply.started":"2025-12-11T12:19:37.949941Z","shell.execute_reply":"2025-12-11T12:19:38.166251Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 2 Axes>","image/png":"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\n"},"metadata":{}},{"name":"stdout","text":"\n Classification Report:\n precision recall f1-score support\n\n Not Spam 0.97 0.98 0.98 7937\n Spam 0.98 0.98 0.98 8753\n\n accuracy 0.98 16690\n macro avg 0.98 0.98 0.98 16690\nweighted avg 0.98 0.98 0.98 16690\n\n","output_type":"stream"}],"execution_count":13},{"cell_type":"code","source":"torch.save(model.state_dict(), \"email_spam_classifier.pth\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T12:19:38.168158Z","iopub.execute_input":"2025-12-11T12:19:38.168436Z","iopub.status.idle":"2025-12-11T12:19:38.174096Z","shell.execute_reply.started":"2025-12-11T12:19:38.168405Z","shell.execute_reply":"2025-12-11T12:19:38.173378Z"}},"outputs":[],"execution_count":14}]}
model/email_spam_classifier.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:dc0a2f4ce75aae3897e396f329b5a8acc7449b0857000d09bf21a5d415896cd7
3
+ size 267540
model/vectorizer.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7f360faeaf1980fb464c65e41de4d78e0eb54baff4b06a71d3d85bcb9cd3ccd2
3
+ size 3178246
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ torch
2
+ gradio
3
+ scikit-learn
4
+ numpy