{ "cells": [ { "cell_type": "markdown", "id": "QDN6mYNmJSoD", "metadata": { "id": "QDN6mYNmJSoD" }, "source": [ "# **Email** **Classification**" ] }, { "cell_type": "markdown", "id": "KYk9RIMRJh5j", "metadata": { "id": "KYk9RIMRJh5j" }, "source": [ "## 1. Load Python Modules" ] }, { "cell_type": "code", "execution_count": 146, "id": "7986126a", "metadata": { "id": "7986126a" }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import re\n", "from collections import Counter\n", "from sklearn.model_selection import train_test_split\n", "from tokenizers import Tokenizer\n", "from tokenizers.models import WordLevel\n", "from tokenizers.pre_tokenizers import Whitespace\n", "from torch.nn.utils.rnn import pad_sequence\n", "import torch\n", "import torch.nn as nn\n", "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix\n", "import joblib\n" ] }, { "cell_type": "markdown", "id": "at4FAoSjJu4y", "metadata": { "id": "at4FAoSjJu4y" }, "source": [ "## 2. Read the Dataset from CSV file - Using Pandas" ] }, { "cell_type": "code", "execution_count": 142, "id": "27f357fe", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "27f357fe", "outputId": "b8861987-5780-48b2-c0db-2f05133bc3bf" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "summary": "{\n \"name\": \"df\",\n \"rows\": 179,\n \"fields\": [\n {\n \"column\": \"email\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 150,\n \"samples\": [\n \"Congratulations! You're the lucky winner of our holiday giveaway. Click here to claim your prize!\",\n \"Congratulations on reaching a new milestone! Here's to many more achievements.\",\n \"We're excited to share our latest updates with you. Stay tuned for more news!\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"label\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"spam\",\n \"ham\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}", "type": "dataframe", "variable_name": "df" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
emaillabel
0Upgrade to our premium plan for exclusive acce...ham
1Happy holidays from our team! Wishing you joy ...ham
2We're hiring! Check out our career opportuniti...ham
3Your Amazon account has been locked. Click her...spam
4Your opinion matters! Take our survey and help...ham
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "text/plain": [ " email label\n", "0 Upgrade to our premium plan for exclusive acce... ham\n", "1 Happy holidays from our team! Wishing you joy ... ham\n", "2 We're hiring! Check out our career opportuniti... ham\n", "3 Your Amazon account has been locked. Click her... spam\n", "4 Your opinion matters! Take our survey and help... ham" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df=pd.read_csv(\"/content/email_classification.csv\")\n", "df.head()" ] }, { "cell_type": "markdown", "id": "UvIVswiPKEDK", "metadata": { "id": "UvIVswiPKEDK" }, "source": [ "## 3. Basic Inspection on given dataset" ] }, { "cell_type": "code", "execution_count": 143, "id": "bf44e24c", "metadata": { "id": "bf44e24c" }, "outputs": [], "source": [ "def basic_inspection_dataset(table):\n", " \"\"\"Generates a basic inspection dataset from the given table.\"\"\"\n", "\n", " print(\"top 5 rows - using head\")\n", " print(table.head())\n", " print()\n", "\n", " print(\"bottom 5 rows using tail\")\n", " print(table.tail())\n", " print()\n", "\n", " print(\"numbers of samples and columns\")\n", " print(table.shape)\n", " print()\n", "\n", " print(\"numbers of samples \")\n", " print(len(table))\n", " print()\n", "\n", " print(\"numbers of entries in the data frame\")\n", " print(table.size)\n", " print()\n", "\n", " print(\"Columns Names\")\n", " print(table.columns)\n", " print()\n", "\n", " print(\"Columns dtypes\")\n", " print(table.dtypes)\n", " print()\n", "\n", " print(\"Dataframe info\")\n", " print(table.info())\n", " print()\n", "\n", " print()\n", " print(\"check the missing value in each column\")\n", " print(table.isnull().sum())\n", "\n", " print()\n", " print(\"check the missing value in each column\")\n", " print(table.isna().sum())\n", "\n", " print()\n", " print(\"table describe\")\n", " print(table.describe())\n" ] }, { "cell_type": "code", "execution_count": 145, "id": "cb577cdb", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "cb577cdb", "outputId": "ac7bc5db-2ff0-4efa-e969-cdad4518781c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "top 5 rows - using head\n", " email label\n", "0 Upgrade to our premium plan for exclusive acce... ham\n", "1 Happy holidays from our team! Wishing you joy ... ham\n", "2 We're hiring! Check out our career opportuniti... ham\n", "3 Your Amazon account has been locked. Click her... spam\n", "4 Your opinion matters! Take our survey and help... ham\n", "\n", "bottom 5 rows using tail\n", " email label\n", "174 We're pleased to inform you that your refund h... ham\n", "175 Get rich quick! Invest in our revolutionary ne... spam\n", "176 Your free trial period is ending soon. Upgrade... ham\n", "177 Your order is on its way! Track your shipment ... ham\n", "178 Limited-time offer! Get 50% off on all purchas... spam\n", "\n", "numbers of samples and columns\n", "(179, 2)\n", "\n", "numbers of samples \n", "179\n", "\n", "numbers of entries in the data frame\n", "358\n", "\n", "Columns Names\n", "Index(['email', 'label'], dtype='object')\n", "\n", "Columns dtypes\n", "email object\n", "label object\n", "dtype: object\n", "\n", "Dataframe info\n", "\n", "RangeIndex: 179 entries, 0 to 178\n", "Data columns (total 2 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 email 179 non-null object\n", " 1 label 179 non-null object\n", "dtypes: object(2)\n", "memory usage: 2.9+ KB\n", "None\n", "\n", "\n", "check the missing value in each column\n", "email 0\n", "label 0\n", "dtype: int64\n", "\n", "check the missing value in each column\n", "email 0\n", "label 0\n", "dtype: int64\n", "\n", "table describe\n", " email label\n", "count 179 179\n", "unique 150 2\n", "top You've been selected for a free trial of our p... ham\n", "freq 4 100\n" ] } ], "source": [ "\n", "basic_inspection_dataset(df)" ] }, { "cell_type": "markdown", "id": "rPpnpJLkKCi7", "metadata": { "id": "rPpnpJLkKCi7" }, "source": [ "## 4.Handling Missing Values" ] }, { "cell_type": "code", "execution_count": 119, "id": "2a57914c", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 147 }, "id": "2a57914c", "outputId": "ce4535e8-a190-4da8-c0a6-2379c826e419" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0
email0
label0
\n", "

" ], "text/plain": [ "email 0\n", "label 0\n", "dtype: int64" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isna().sum()" ] }, { "cell_type": "markdown", "id": "8wiBitUkK8Yo", "metadata": { "id": "8wiBitUkK8Yo" }, "source": [ "## 5. EDA" ] }, { "cell_type": "code", "execution_count": 120, "id": "ccf32df4", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 491 }, "id": "ccf32df4", "outputId": "52698a7a-9e64-466d-e28a-364b901b83ac" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAHJCAYAAACv/cI/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAHwlJREFUeJzt3X+QVfV9//HXIrIgsguo7MK4hLU6Qav4C4P4oyZKQ35ZUaapLcmosZpJQUEaTZgqBvyBMlEZLEJME3+N1sSMkpikmHStWCOiorExGjWVCK3dpZWwKygLyn7/cLLfbrT55V3uZ/HxmDkz3HPOnn3fGRaee+6599R0dXV1BQCgIP2qPQAAwK8TKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABSnf7UH+EPs2LEjL7/8coYMGZKamppqjwMA/A66urry6quvZtSoUenX7zefI+mTgfLyyy+nqamp2mMAAH+A9evXZ9999/2N+/TJQBkyZEiSt55gXV1dlacBAH4XHR0daWpq6v5//Dfpk4Hyq5d16urqBAoA9DG/y+UZLpIFAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDi/N6B8uCDD+bkk0/OqFGjUlNTk+XLl/fY3tXVlblz52bkyJEZNGhQJk2alBdeeKHHPhs3bsy0adNSV1eXoUOH5uyzz87mzZvf1RMBAHYdv3egbNmyJYceemiWLFnyjtsXLlyYxYsXZ9myZVm9enUGDx6cyZMnZ+vWrd37TJs2LT/96U/zwx/+MN/97nfz4IMP5txzz/3DnwUAsEup6erq6vqDv7imJvfcc0+mTJmS5K2zJ6NGjcrf/u3f5vOf/3ySpL29PQ0NDbn55ptz+umn59lnn81BBx2Uxx57LOPHj0+SrFixIh/72MfyH//xHxk1atRv/b4dHR2pr69Pe3u7mwUCQB/x+/z/XdFrUNauXZvW1tZMmjSpe119fX0mTJiQVatWJUlWrVqVoUOHdsdJkkyaNCn9+vXL6tWrKzkOANBH9a/kwVpbW5MkDQ0NPdY3NDR0b2ttbc2IESN6DtG/f4YPH969z6/r7OxMZ2dn9+OOjo5Kjg0AFKaigdJbFixYkHnz5lV7jCKM+eL3qj0CO9Evrvp4tUcAqIqKvsTT2NiYJGlra+uxvq2trXtbY2NjNmzY0GP7G2+8kY0bN3bv8+vmzJmT9vb27mX9+vWVHBsAKExFA6W5uTmNjY1paWnpXtfR0ZHVq1dn4sSJSZKJEydm06ZNWbNmTfc+999/f3bs2JEJEya843Fra2tTV1fXYwEAdl2/90s8mzdvzs9//vPux2vXrs2Pf/zjDB8+PKNHj86sWbNy+eWX54ADDkhzc3MuueSSjBo1qvudPgceeGA+8pGP5JxzzsmyZcuyffv2zJgxI6effvrv9A4eAGDX93sHyuOPP54PfehD3Y9nz56dJDnjjDNy880356KLLsqWLVty7rnnZtOmTTnuuOOyYsWKDBw4sPtrbr/99syYMSMnnXRS+vXrl6lTp2bx4sUVeDoAwK7gXX0OSrW8lz8HxUWy7y0ukgV2JVX7HBQAgEoQKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxREoAEBxBAoAUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxREoAEBxBAoAUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxREoAEBxBAoAUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxREoAEBxBAoAUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxREoAEBxBAoAUByBAgAUp+KB8uabb+aSSy5Jc3NzBg0alD/6oz/KZZddlq6uru59urq6Mnfu3IwcOTKDBg3KpEmT8sILL1R6FACgj6p4oFx99dVZunRp/v7v/z7PPvtsrr766ixcuDDXX3999z4LFy7M4sWLs2zZsqxevTqDBw/O5MmTs3Xr1kqPAwD0Qf0rfcCHH344p5xySj7+8Y8nScaMGZN//Md/zKOPPprkrbMnixYtysUXX5xTTjklSXLrrbemoaEhy5cvz+mnn17pkQCAPqbiZ1COOeaYtLS05Pnnn0+SPPXUU3nooYfy0Y9+NEmydu3atLa2ZtKkSd1fU19fnwkTJmTVqlXveMzOzs50dHT0WACAXVfFz6B88YtfTEdHR8aOHZvddtstb775Zq644opMmzYtSdLa2pokaWho6PF1DQ0N3dt+3YIFCzJv3rxKjwoAFKriZ1C++c1v5vbbb88dd9yRJ554Irfccku+/OUv55ZbbvmDjzlnzpy0t7d3L+vXr6/gxABAaSp+BuXCCy/MF7/4xe5rSQ455JC89NJLWbBgQc4444w0NjYmSdra2jJy5Mjur2tra8thhx32jsesra1NbW1tpUcFAApV8TMor732Wvr163nY3XbbLTt27EiSNDc3p7GxMS0tLd3bOzo6snr16kycOLHS4wAAfVDFz6CcfPLJueKKKzJ69Oj88R//cZ588slce+21+cxnPpMkqampyaxZs3L55ZfngAMOSHNzcy655JKMGjUqU6ZMqfQ4AH3GmC9+r9ojsBP94qqPV3uEolU8UK6//vpccskl+Zu/+Zts2LAho0aNymc/+9nMnTu3e5+LLrooW7ZsybnnnptNmzbluOOOy4oVKzJw4MBKjwMA9EE1Xf/7I177iI6OjtTX16e9vT11dXXVHmen8hvWe4vfsN5b/Hy/t7wXf75/n/+/3YsHACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOL0SqD853/+Zz71qU9lr732yqBBg3LIIYfk8ccf797e1dWVuXPnZuTIkRk0aFAmTZqUF154oTdGAQD6oIoHyi9/+csce+yx2X333fNP//RPeeaZZ3LNNddk2LBh3fssXLgwixcvzrJly7J69eoMHjw4kydPztatWys9DgDQB/Wv9AGvvvrqNDU15aabbupe19zc3P3nrq6uLFq0KBdffHFOOeWUJMmtt96ahoaGLF++PKeffnqlRwIA+piKn0H5zne+k/Hjx+fP//zPM2LEiBx++OH56le/2r197dq1aW1tzaRJk7rX1dfXZ8KECVm1atU7HrOzszMdHR09FgBg11XxQHnxxRezdOnSHHDAAbnvvvvyuc99Lueff35uueWWJElra2uSpKGhocfXNTQ0dG/7dQsWLEh9fX330tTUVOmxAYCCVDxQduzYkSOOOCJXXnllDj/88Jx77rk555xzsmzZsj/4mHPmzEl7e3v3sn79+gpODACUpuKBMnLkyBx00EE91h144IFZt25dkqSxsTFJ0tbW1mOftra27m2/rra2NnV1dT0WAGDXVfFAOfbYY/Pcc8/1WPf888/nfe97X5K3LphtbGxMS0tL9/aOjo6sXr06EydOrPQ4AEAfVPF38VxwwQU55phjcuWVV+aTn/xkHn300dx444258cYbkyQ1NTWZNWtWLr/88hxwwAFpbm7OJZdcklGjRmXKlCmVHgcA6IMqHihHHXVU7rnnnsyZMyfz589Pc3NzFi1alGnTpnXvc9FFF2XLli0599xzs2nTphx33HFZsWJFBg4cWOlxAIA+qOKBkiSf+MQn8olPfOL/3F5TU5P58+dn/vz5vfHtAYA+zr14AIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFAChOrwfKVVddlZqamsyaNat73datWzN9+vTstdde2XPPPTN16tS0tbX19igAQB/Rq4Hy2GOP5Stf+UrGjRvXY/0FF1yQe++9N3fddVdWrlyZl19+OaeddlpvjgIA9CG9FiibN2/OtGnT8tWvfjXDhg3rXt/e3p6vfe1rufbaa3PiiSfmyCOPzE033ZSHH344jzzySG+NAwD0Ib0WKNOnT8/HP/7xTJo0qcf6NWvWZPv27T3Wjx07NqNHj86qVat6axwAoA/p3xsHvfPOO/PEE0/ksccee9u21tbWDBgwIEOHDu2xvqGhIa2tre94vM7OznR2dnY/7ujoqOi8AEBZKn4GZf369Zk5c2Zuv/32DBw4sCLHXLBgQerr67uXpqamihwXAChTxQNlzZo12bBhQ4444oj0798//fv3z8qVK7N48eL0798/DQ0N2bZtWzZt2tTj69ra2tLY2PiOx5wzZ07a29u7l/Xr11d6bACgIBV/ieekk07KT37ykx7rzjrrrIwdOzZf+MIX0tTUlN133z0tLS2ZOnVqkuS5557LunXrMnHixHc8Zm1tbWprays9KgBQqIoHypAhQ3LwwQf3WDd48ODstdde3evPPvvszJ49O8OHD09dXV3OO++8TJw4MUcffXSlxwEA+qBeuUj2t7nuuuvSr1+/TJ06NZ2dnZk8eXJuuOGGaowCABRopwTKAw880OPxwIEDs2TJkixZsmRnfHsAoI9xLx4AoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiCBQAoDgCBQAojkABAIojUACA4ggUAKA4AgUAKI5AAQCKI1AAgOIIFACgOAIFACiOQAEAiiNQAIDiVDxQFixYkKOOOipDhgzJiBEjMmXKlDz33HM99tm6dWumT5+evfbaK3vuuWemTp2atra2So8CAPRRFQ+UlStXZvr06XnkkUfywx/+MNu3b8+HP/zhbNmypXufCy64IPfee2/uuuuurFy5Mi+//HJOO+20So8CAPRR/St9wBUrVvR4fPPNN2fEiBFZs2ZN/uRP/iTt7e352te+ljvuuCMnnnhikuSmm27KgQcemEceeSRHH310pUcCAPqYXr8Gpb29PUkyfPjwJMmaNWuyffv2TJo0qXufsWPHZvTo0Vm1atU7HqOzszMdHR09FgBg19WrgbJjx47MmjUrxx57bA4++OAkSWtrawYMGJChQ4f22LehoSGtra3veJwFCxakvr6+e2lqaurNsQGAKuvVQJk+fXqefvrp3Hnnne/qOHPmzEl7e3v3sn79+gpNCACUqOLXoPzKjBkz8t3vfjcPPvhg9t133+71jY2N2bZtWzZt2tTjLEpbW1saGxvf8Vi1tbWpra3trVEBgMJU/AxKV1dXZsyYkXvuuSf3339/mpube2w/8sgjs/vuu6elpaV73XPPPZd169Zl4sSJlR4HAOiDKn4GZfr06bnjjjvy7W9/O0OGDOm+rqS+vj6DBg1KfX19zj777MyePTvDhw9PXV1dzjvvvEycONE7eACAJL0QKEuXLk2SfPCDH+yx/qabbsqZZ56ZJLnuuuvSr1+/TJ06NZ2dnZk8eXJuuOGGSo8CAPRRFQ+Urq6u37rPwIEDs2TJkixZsqTS3x4A2AW4Fw8AUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxREoAEBxBAoAUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxREoAEBxBAoAUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxREoAEBxBAoAUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxREoAEBxBAoAUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxalqoCxZsiRjxozJwIEDM2HChDz66KPVHAcAKETVAuUb3/hGZs+enUsvvTRPPPFEDj300EyePDkbNmyo1kgAQCGqFijXXnttzjnnnJx11lk56KCDsmzZsuyxxx75+te/Xq2RAIBCVCVQtm3bljVr1mTSpEn/f5B+/TJp0qSsWrWqGiMBAAXpX41v+j//8z95880309DQ0GN9Q0NDfvazn71t/87OznR2dnY/bm9vT5J0dHT07qAF2tH5WrVHYCd6L/4dfy/z8/3e8l78+f7Vc+7q6vqt+1YlUH5fCxYsyLx58962vqmpqQrTwM5Tv6jaEwC95b388/3qq6+mvr7+N+5TlUDZe++9s9tuu6Wtra3H+ra2tjQ2Nr5t/zlz5mT27Nndj3fs2JGNGzdmr732Sk1NTa/PS3V1dHSkqakp69evT11dXbXHASrIz/d7S1dXV1599dWMGjXqt+5blUAZMGBAjjzyyLS0tGTKlClJ3oqOlpaWzJgx423719bWpra2tse6oUOH7oRJKUldXZ1/wGAX5ef7veO3nTn5laq9xDN79uycccYZGT9+fD7wgQ9k0aJF2bJlS84666xqjQQAFKJqgfIXf/EX+e///u/MnTs3ra2tOeyww7JixYq3XTgLALz3VPUi2RkzZrzjSzrwv9XW1ubSSy9928t8QN/n55v/S03X7/JeHwCAncjNAgGA4ggUAKA4AgUAKI5AAQCKI1AAgOL0iXvxALDreOWVVzJ37tz8y7/8SzZs2JAdO3b02L5x48YqTUZJBApF6urqyre+9a3/8x+wu+++u0qTAe/Wpz/96fz85z/P2WefnYaGBvdU4x0JFIo0a9asfOUrX8mHPvQh/4DBLuZf//Vf89BDD+XQQw+t9igUTKBQpNtuuy133313Pvaxj1V7FKDCxo4dm9dff73aY1A4F8lSpPr6+uy3337VHgPoBTfccEP+7u/+LitXrswrr7ySjo6OHgskAoVCfelLX8q8efP8lgW7oKFDh6ajoyMnnnhiRowYkWHDhmXYsGEZOnRohg0bVu3xKIR78VCk119/Paeeemp+9KMfZcyYMdl99917bH/iiSeqNBnwbn3gAx9I//79M3PmzHe8xuyEE06o0mSUxDUoFOmMM87ImjVr8qlPfcpFsrCLefrpp/Pkk0/m/e9/f7VHoWAChSJ973vfy3333Zfjjjuu2qMAFTZ+/PisX79eoPAbCRSK1NTUlLq6umqPAfSC8847LzNnzsyFF16YQw455G0v4Y4bN65Kk1ES16BQpO9973u5/vrrs2zZsowZM6ba4wAV1K/f29+fUVNTk66urtTU1OTNN9+swlSURqBQpGHDhuW1117LG2+8kT322ONtv2H5KGzou1566aXfuP1973vfTpqEknmJhyItWrSo2iMAvUSA8LtwBgWAqnjmmWeybt26bNu2rcf6P/uzP6vSRJTEGRSKt3Xr1rf9A+YCWui7XnzxxZx66qn5yU9+0n3tSZLujxNwDQqJT5KlUFu2bMmMGTMyYsSIDB48uPuTJn+1AH3XzJkz09zcnA0bNmSPPfbIT3/60zz44IMZP358HnjggWqPRyEECkW66KKLcv/992fp0qWpra3NP/zDP2TevHkZNWpUbr311mqPB7wLq1atyvz587P33nunX79+6devX4477rgsWLAg559/frXHoxAChSLde++9ueGGGzJ16tT0798/xx9/fC6++OJceeWVuf3226s9HvAuvPnmmxkyZEiSZO+9987LL7+c5K2LZ5977rlqjkZBXINCkTZu3Nh9N+O6urrutxUfd9xx+dznPlfN0YB36eCDD85TTz2V5ubmTJgwIQsXLsyAAQNy4403uos53ZxBoUj77bdf1q5dmyQZO3ZsvvnNbyZ568zK0KFDqzgZ8G5dfPHF2bFjR5Jk/vz5Wbt2bY4//vh8//vfz+LFi6s8HaXwNmOKdN1112W33XbL+eefn3/+53/OySefnK6urmzfvj3XXnttZs6cWe0RgQrauHFjhg0b5sagdBMo9AkvvfRS1qxZk/333999OmAXsn79+iRv3X8L/jfXoFCslpaWtLS0ZMOGDd2ng3/l61//epWmAt6tN954I/PmzcvixYuzefPmJMmee+6Z8847L5deeunbbm3Be5NAoUjz5s3L/PnzM378+IwcOdJpX9iFnHfeebn77ruzcOHCTJw4Mclbbz3+0pe+lFdeeSVLly6t8oSUwEs8FGnkyJFZuHBhPv3pT1d7FKDC6uvrc+edd+ajH/1oj/Xf//7385d/+Zdpb2+v0mSUxLt4KNK2bdtyzDHHVHsMoBfU1tZmzJgxb1vf3NycAQMG7PyBKJJAoUh//dd/nTvuuKPaYwC9YMaMGbnsssvS2dnZva6zszNXXHFFZsyYUcXJKImXeCjG7Nmzu/+8Y8eO3HLLLRk3blzGjRv3tovmrr322p09HlAhp556alpaWlJbW5tDDz00SfLUU09l27ZtOemkk3rse/fdd1djRArgIlmK8eSTT/Z4fNhhhyVJnn766R7rXTALfdvQoUMzderUHuu8zZhf5wwKADvV66+/nh07dmTw4MFJkl/84hdZvnx5DjzwwEyePLnK01EK16AAsFOdcsopue2225IkmzZtytFHH51rrrkmU6ZM8RZjugkUAHaqJ554Iscff3yS5Fvf+lYaGhry0ksv5dZbb3UvHroJFAB2qtdeey1DhgxJkvzgBz/Iaaedln79+uXoo4/OSy+9VOXpKIVAAWCn2n///bN8+fKsX78+9913Xz784Q8nSTZs2JC6uroqT0cpBAoAO9XcuXPz+c9/PmPGjMmECRO6P+7+Bz/4QQ4//PAqT0cpvIsHgJ2utbU1//Vf/5VDDz00/fq99bvyo48+mrq6uowdO7bK01ECgQIAFMdLPABAcQQKAFAcgQIAFEegAADFEShAxX3wgx/MrFmzfqd9H3jggdTU1GTTpk3v6nuOGTMmixYtelfHAMohUACA4ggUAKA4AgXoVbfddlvGjx+fIUOGpLGxMX/1V3+VDRs2vG2/H/3oRxk3blwGDhyYo48+Ok8//XSP7Q899FCOP/74DBo0KE1NTTn//POzZcuWnfU0gJ1MoAC9avv27bnsssvy1FNPZfny5fnFL36RM8888237XXjhhbnmmmvy2GOPZZ999snJJ5+c7du3J0n+/d//PR/5yEcyderU/Nu//Vu+8Y1v5KGHHsqMGTN28rMBdpb+1R4A2LV95jOf6f7zfvvtl8WLF+eoo47K5s2bs+eee3Zvu/TSS/Onf/qnSZJbbrkl++67b+6555588pOfzIIFCzJt2rTuC28POOCALF68OCeccEKWLl2agQMH7tTnBPQ+Z1CAXrVmzZqcfPLJGT16dIYMGZITTjghSbJu3boe+/3qhnFJMnz48Lz//e/Ps88+myR56qmncvPNN2fPPffsXiZPnpwdO3Zk7dq1O+/JADuNMyhAr9myZUsmT56cyZMn5/bbb88+++yTdevWZfLkydm2bdvvfJzNmzfns5/9bM4///y3bRs9enQlRwYKIVCAXvOzn/0sr7zySq666qo0NTUlSR5//PF33PeRRx7pjo1f/vKXef7553PggQcmSY444og888wz2X///XfO4EDVeYkH6DWjR4/OgAEDcv311+fFF1/Md77znVx22WXvuO/8+fPT0tKSp59+OmeeeWb23nvvTJkyJUnyhS98IQ8//HBmzJiRH//4x3nhhRfy7W9/20WysAsTKECv2WeffXLzzTfnrrvuykEHHZSrrroqX/7yl99x36uuuiozZ87MkUcemdbW1tx7770ZMGBAkmTcuHFZuXJlnn/++Rx//PE5/PDDM3fu3IwaNWpnPh1gJ6rp6urqqvYQAAD/mzMoAEBxBAoAUByBAgAUR6AAAMURKABAcQQKAFAcgQIAFEegAADFESgAQHEECgBQHIECABRHoAAAxfl/dRKMz/GzrK0AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df[\"label\"].value_counts().plot.bar()" ] }, { "cell_type": "markdown", "id": "z6fIAIO9LF_W", "metadata": { "id": "z6fIAIO9LF_W" }, "source": [ "## 7.preprocessing" ] }, { "cell_type": "code", "execution_count": 121, "id": "3fb1ef4b", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3fb1ef4b", "outputId": "bef66bb7-4867-44c9-c1c8-37785cb00ca3" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":1: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!\n", "You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.\n", "A typical example is when you are setting values in a column of a DataFrame, like:\n", "\n", "df[\"col\"][row_indexer] = value\n", "\n", "Use `df.loc[row_indexer, \"col\"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", "\n", " df['label'][df['label']=='ham']=1\n", ":2: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!\n", "You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.\n", "A typical example is when you are setting values in a column of a DataFrame, like:\n", "\n", "df[\"col\"][row_indexer] = value\n", "\n", "Use `df.loc[row_indexer, \"col\"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", "\n", " df[\"label\"][df['label']=='spam']=0\n" ] } ], "source": [ "df['label'][df['label']=='ham']=1\n", "df[\"label\"][df['label']=='spam']=0" ] }, { "cell_type": "code", "execution_count": 122, "id": "0802f88d", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 178 }, "id": "0802f88d", "outputId": "da21f8a9-bb8e-4646-89cf-eb8c4cf49a15" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
label
1100
079
\n", "

" ], "text/plain": [ "label\n", "1 100\n", "0 79\n", "Name: count, dtype: int64" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"label\"].value_counts()" ] }, { "cell_type": "code", "execution_count": 123, "id": "2c48b2fa", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 424 }, "id": "2c48b2fa", "outputId": "5fa99872-77f9-42cb-ee53-289a8d599b2d" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "summary": "{\n \"name\": \"df\",\n \"rows\": 179,\n \"fields\": [\n {\n \"column\": \"email\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 150,\n \"samples\": [\n \"Congratulations! You're the lucky winner of our holiday giveaway. Click here to claim your prize!\",\n \"Congratulations on reaching a new milestone! Here's to many more achievements.\",\n \"We're excited to share our latest updates with you. Stay tuned for more news!\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"label\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": 0,\n \"max\": 1,\n \"num_unique_values\": 2,\n \"samples\": [\n 0,\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}", "type": "dataframe", "variable_name": "df" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
emaillabel
0Upgrade to our premium plan for exclusive acce...1
1Happy holidays from our team! Wishing you joy ...1
2We're hiring! Check out our career opportuniti...1
3Your Amazon account has been locked. Click her...0
4Your opinion matters! Take our survey and help...1
.........
174We're pleased to inform you that your refund h...1
175Get rich quick! Invest in our revolutionary ne...0
176Your free trial period is ending soon. Upgrade...1
177Your order is on its way! Track your shipment ...1
178Limited-time offer! Get 50% off on all purchas...0
\n", "

179 rows × 2 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", " \n", " \n", " \n", "
\n", "\n", "
\n", "
\n" ], "text/plain": [ " email label\n", "0 Upgrade to our premium plan for exclusive acce... 1\n", "1 Happy holidays from our team! Wishing you joy ... 1\n", "2 We're hiring! Check out our career opportuniti... 1\n", "3 Your Amazon account has been locked. Click her... 0\n", "4 Your opinion matters! Take our survey and help... 1\n", ".. ... ...\n", "174 We're pleased to inform you that your refund h... 1\n", "175 Get rich quick! Invest in our revolutionary ne... 0\n", "176 Your free trial period is ending soon. Upgrade... 1\n", "177 Your order is on its way! Track your shipment ... 1\n", "178 Limited-time offer! Get 50% off on all purchas... 0\n", "\n", "[179 rows x 2 columns]" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 124, "id": "8d380947", "metadata": { "id": "8d380947" }, "outputs": [], "source": [ "def normalize(data):\n", " normalized = []\n", " for i in data:\n", " i = i.lower()\n", " # get rid of urls\n", " i = re.sub('https?://\\S+|www\\.\\S+', '', i)\n", " # get rid of non words and extra spaces\n", " i = re.sub('\\\\W', ' ', i)\n", " i = re.sub('\\n', '', i)\n", " i = re.sub(' +', ' ', i)\n", " i = re.sub('^ ', '', i)\n", " i = re.sub(' $', '', i)\n", "\n", " normalized.append(i)\n", " return normalized\n", "\n", "df[\"nor\"]=normalize(df['email'])" ] }, { "cell_type": "code", "execution_count": 125, "id": "f73e3c8d", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "f73e3c8d", "outputId": "e6864bad-a5b6-4c31-8d92-acd598447198" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "summary": "{\n \"name\": \"df\",\n \"rows\": 179,\n \"fields\": [\n {\n \"column\": \"email\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 150,\n \"samples\": [\n \"Congratulations! You're the lucky winner of our holiday giveaway. Click here to claim your prize!\",\n \"Congratulations on reaching a new milestone! Here's to many more achievements.\",\n \"We're excited to share our latest updates with you. Stay tuned for more news!\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"label\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": 0,\n \"max\": 1,\n \"num_unique_values\": 2,\n \"samples\": [\n 0,\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"nor\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 150,\n \"samples\": [\n \"congratulations you re the lucky winner of our holiday giveaway click here to claim your prize\",\n \"congratulations on reaching a new milestone here s to many more achievements\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}", "type": "dataframe", "variable_name": "df" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
emaillabelnor
0Upgrade to our premium plan for exclusive acce...1upgrade to our premium plan for exclusive acce...
1Happy holidays from our team! Wishing you joy ...1happy holidays from our team wishing you joy a...
2We're hiring! Check out our career opportuniti...1we re hiring check out our career opportunitie...
3Your Amazon account has been locked. Click her...0your amazon account has been locked click here...
4Your opinion matters! Take our survey and help...1your opinion matters take our survey and help ...
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "text/plain": [ " email label \\\n", "0 Upgrade to our premium plan for exclusive acce... 1 \n", "1 Happy holidays from our team! Wishing you joy ... 1 \n", "2 We're hiring! Check out our career opportuniti... 1 \n", "3 Your Amazon account has been locked. Click her... 0 \n", "4 Your opinion matters! Take our survey and help... 1 \n", "\n", " nor \n", "0 upgrade to our premium plan for exclusive acce... \n", "1 happy holidays from our team wishing you joy a... \n", "2 we re hiring check out our career opportunitie... \n", "3 your amazon account has been locked click here... \n", "4 your opinion matters take our survey and help ... " ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "id": "hfDglIWQL_EN", "metadata": { "id": "hfDglIWQL_EN" }, "source": [ "## 8.spliting the data" ] }, { "cell_type": "code", "execution_count": 126, "id": "371ba1e0", "metadata": { "id": "371ba1e0" }, "outputs": [], "source": [ "x=df['nor']\n", "y=df['label']" ] }, { "cell_type": "code", "execution_count": 127, "id": "c16a0044", "metadata": { "id": "c16a0044" }, "outputs": [], "source": [ "x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=42,test_size=0.20)" ] }, { "cell_type": "markdown", "id": "31aa2XGxMIEP", "metadata": { "id": "31aa2XGxMIEP" }, "source": [ "## 9.tokenizing the data" ] }, { "cell_type": "code", "execution_count": 128, "id": "908128ba", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "908128ba", "outputId": "aa3acfa7-27fc-4e2c-9acd-117f9f069913" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11, 14, 150, 96, 245, 4, 42, 23, 151, 3, 246, 17, 97, 247]\n" ] } ], "source": [ "def tokenize(x_train):\n", " return text.lower().split()\n", "\n", "word_counts = Counter()\n", "for text in x_train:\n", " word_counts.update(tokenize(text))\n", "\n", "sorted_words = [word for word, _ in word_counts.most_common()]\n", "\n", "vocab = {\"\": 0, \"\": 1}\n", "vocab.update({word: idx + 2 for idx, word in enumerate(sorted_words)})\n", "\n", "tokenizer = Tokenizer(WordLevel(vocab, unk_token=\"\"))\n", "tokenizer.pre_tokenizer = Whitespace()\n", "\n", "def text_to_sequence(texts):\n", " return [tokenizer.encode(text.lower()).ids for text in texts]\n", "\n", "x_train_seq = text_to_sequence(x_train)\n", "x_test_seq = text_to_sequence(x_test)\n", "\n", "# Display the first sequence\n", "print(x_train_seq[0])" ] }, { "cell_type": "markdown", "id": "KpH1uGhuMePY", "metadata": { "id": "KpH1uGhuMePY" }, "source": [ "## 10.padding the data" ] }, { "cell_type": "code", "execution_count": 129, "id": "110790c5", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "110790c5", "outputId": "5469d30d-f793-4308-bda1-245165d674c6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Padded Training Sequences:\n", "tensor([[ 11, 14, 150, ..., 0, 0, 0],\n", " [ 2, 10, 13, ..., 0, 0, 0],\n", " [ 7, 14, 98, ..., 0, 0, 0],\n", " ...,\n", " [ 11, 14, 69, ..., 0, 0, 0],\n", " [ 7, 16, 33, ..., 0, 0, 0],\n", " [ 2, 37, 242, ..., 0, 0, 0]])\n", "\n", "Padded Testing Sequences:\n", "tensor([[196, 15, 63, 51, 36, 20, 130, 1, 8, 5, 3, 1, 15, 0,\n", " 0, 0, 0],\n", " [ 7, 14, 9, 220, 8, 5, 3, 21, 2, 41, 39, 0, 0, 0,\n", " 0, 0, 0],\n", " [ 7, 16, 12, 34, 6, 9, 24, 199, 360, 8, 5, 3, 21, 2,\n", " 39, 0, 0],\n", " [ 29, 41, 52, 3, 4, 251, 1, 8, 5, 3, 47, 15, 0, 0,\n", " 0, 0, 0],\n", " [ 21, 2, 39, 15, 8, 5, 3, 1, 2, 1, 0, 0, 0, 0,\n", " 0, 0, 0],\n", " [ 31, 7, 16, 12, 34, 6, 9, 257, 1, 8, 5, 3, 391, 2,\n", " 1, 0, 0],\n", " [ 11, 14, 69, 3, 114, 4, 284, 19, 285, 78, 424, 6, 164, 1,\n", " 0, 0, 0],\n", " [ 7, 16, 33, 9, 130, 431, 8, 5, 3, 21, 2, 39, 0, 0,\n", " 0, 0, 0],\n", " [ 2, 10, 13, 12, 250, 8, 5, 3, 108, 2, 10, 0, 0, 0,\n", " 0, 0, 0],\n", " [ 29, 238, 6, 4, 222, 58, 1, 241, 20, 9, 1, 1, 25, 236,\n", " 0, 0, 0],\n", " [ 2, 10, 13, 12, 124, 8, 5, 3, 101, 2, 55, 0, 0, 0,\n", " 0, 0, 0],\n", " [ 11, 329, 2, 79, 148, 2, 1, 19, 22, 0, 0, 0, 0, 0,\n", " 0, 0, 0],\n", " [ 21, 2, 39, 15, 8, 5, 3, 1, 2, 1, 0, 0, 0, 0,\n", " 0, 0, 0],\n", " [ 2, 453, 23, 4, 1, 87, 22, 88, 454, 11, 135, 292, 7, 293,\n", " 0, 0, 0],\n", " [ 31, 7, 14, 4, 344, 220, 25, 17, 111, 8, 5, 3, 21, 2,\n", " 39, 0, 0],\n", " [ 11, 16, 1, 60, 176, 3, 4, 282, 311, 20, 2, 79, 177, 15,\n", " 0, 0, 0],\n", " [ 7, 16, 12, 34, 6, 9, 24, 37, 25, 4, 27, 54, 8, 5,\n", " 3, 100, 15],\n", " [196, 131, 63, 51, 36, 20, 130, 1, 8, 5, 3, 1, 15, 0,\n", " 0, 0, 0],\n", " [ 11, 14, 170, 9, 466, 90, 339, 468, 15, 3, 108, 2, 470, 0,\n", " 0, 0, 0],\n", " [ 11, 14, 69, 3, 114, 4, 60, 243, 1, 56, 46, 30, 20, 4,\n", " 191, 0, 0],\n", " [ 2, 10, 13, 12, 61, 19, 81, 49, 8, 5, 3, 147, 2, 92,\n", " 0, 0, 0],\n", " [ 11, 14, 5, 3, 80, 7, 19, 204, 172, 1, 1, 7, 1, 203,\n", " 0, 0, 0],\n", " [ 7, 16, 12, 315, 6, 9, 24, 199, 8, 5, 3, 21, 2, 39,\n", " 0, 0, 0],\n", " [ 91, 41, 241, 8, 5, 3, 47, 4, 68, 67, 0, 0, 0, 0,\n", " 0, 0, 0],\n", " [ 11, 14, 416, 3, 114, 4, 284, 19, 1, 286, 11, 180, 387, 9,\n", " 1, 0, 0],\n", " [ 31, 20, 1, 9, 60, 1, 5, 28, 3, 1, 59, 1, 0, 0,\n", " 0, 0, 0],\n", " [ 31, 7, 14, 17, 344, 220, 25, 4, 345, 140, 8, 5, 3, 21,\n", " 2, 39, 0],\n", " [ 2, 65, 13, 12, 224, 359, 46, 128, 129, 1, 30, 235, 0, 0,\n", " 0, 0, 0],\n", " [ 4, 42, 23, 5, 3, 80, 7, 117, 22, 1, 6, 376, 0, 0,\n", " 0, 0, 0],\n", " [ 11, 16, 1, 9, 1, 26, 7, 6, 430, 1, 25, 4, 1, 0,\n", " 0, 0, 0],\n", " [ 78, 1, 19, 4, 45, 456, 1, 318, 3, 4, 133, 235, 0, 0,\n", " 0, 0, 0],\n", " [ 2, 181, 182, 13, 12, 1, 6, 1, 461, 8, 5, 3, 1, 17,\n", " 1, 0, 0],\n", " [ 31, 7, 14, 17, 220, 25, 4, 409, 140, 8, 5, 3, 21, 2,\n", " 239, 0, 0],\n", " [ 7, 14, 342, 3, 9, 32, 215, 8, 5, 3, 343, 15, 0, 0,\n", " 0, 0, 0],\n", " [ 29, 439, 234, 15, 8, 5, 3, 52, 4, 95, 155, 54, 0, 0,\n", " 0, 0, 0],\n", " [ 7, 14, 4, 344, 220, 8, 5, 3, 21, 2, 1, 39, 0, 0,\n", " 0, 0, 0]])\n" ] } ], "source": [ "max_len = max([len(seq) for seq in x_train_seq])\n", "\n", "x_train_seq = [torch.tensor(seq) for seq in x_train_seq]\n", "x_test_seq = [torch.tensor(seq) for seq in x_test_seq]\n", "\n", "x_train_pad = pad_sequence(x_train_seq, batch_first=True, padding_value=0)\n", "x_test_pad = pad_sequence(x_test_seq, batch_first=True, padding_value=0)\n", "\n", "# Output\n", "print(\"Padded Training Sequences:\")\n", "print(x_train_pad)\n", "\n", "print(\"\\nPadded Testing Sequences:\")\n", "print(x_test_pad)" ] }, { "cell_type": "code", "execution_count": 130, "id": "CI7rsglC7ykt", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CI7rsglC7ykt", "outputId": "8dabd091-93fb-4925-f014-7c248747118a" }, "outputs": [ { "data": { "text/plain": [ "array([1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1,\n", " 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0,\n", " 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1,\n", " 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1,\n", " 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,\n", " 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1,\n", " 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0,\n", " 1, 1, 0])" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y.values.astype(int)" ] }, { "cell_type": "code", "execution_count": 130, "id": "9539f843", "metadata": { "id": "9539f843" }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 131, "id": "506d1be8", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "506d1be8", "outputId": "3bfa99a5-f1be-434c-a14c-245a85ca4c33" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":4: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n", " x_train_tensor=torch.tensor(x_train_pad,dtype=torch.float32)\n", ":5: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n", " x_test_tensor=torch.tensor(x_test_pad,dtype=torch.float32)\n" ] } ], "source": [ "# x_train_tf_dense = x_train.values\n", "# x_test_tf_dense = x_test.values\n", "\n", "x_train_tensor=torch.tensor(x_train_pad,dtype=torch.float32)\n", "x_test_tensor=torch.tensor(x_test_pad,dtype=torch.float32)\n", "\n", "y_train_tensor = torch.tensor(y_train.values.astype(int), dtype=torch.long)\n", "y_test_tensor = torch.tensor(y_test.values.astype(int), dtype=torch.long)\n" ] }, { "cell_type": "code", "execution_count": 132, "id": "ea6d90c4", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ea6d90c4", "outputId": "ea05f71c-9a55-4551-d2b8-198dabc8a70c" }, "outputs": [ { "data": { "text/plain": [ "473" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(tokenizer.get_vocab())" ] }, { "cell_type": "code", "execution_count": 132, "id": "b45fdf35", "metadata": { "id": "b45fdf35" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "4f7f9a03", "metadata": { "id": "4f7f9a03" }, "source": [ "## 11.model" ] }, { "cell_type": "code", "execution_count": 133, "id": "9ef01b5a", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9ef01b5a", "outputId": "8288573a-09cd-4f48-98ef-c515dfccb80e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RNNModel(\n", " (embedding): Embedding(473, 25)\n", " (rnn): RNN(25, 25, batch_first=True, dropout=0.2)\n", " (fc): Linear(in_features=25, out_features=2, bias=True)\n", ")\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.11/dist-packages/torch/nn/modules/rnn.py:123: UserWarning: dropout option adds dropout after all but last recurrent layer, so non-zero dropout expects num_layers greater than 1, but got dropout=0.2 and num_layers=1\n", " warnings.warn(\n" ] } ], "source": [ "vocab_size = 473\n", "embedding_dim = 25\n", "hidden_units = 25\n", "num_classes = 2\n", "max_len = 20\n", "\n", "class RNNModel(nn.Module):\n", " def __init__(self, vocab_size, embedding_dim, hidden_units, num_classes):\n", " super(RNNModel, self).__init__()\n", " self.embedding = nn.Embedding(vocab_size, embedding_dim)\n", " self.rnn = nn.RNN(embedding_dim, hidden_units, batch_first=True, dropout=0.2)\n", " self.fc = nn.Linear(hidden_units, num_classes)\n", "\n", " def forward(self, x):\n", " x = self.embedding(x)\n", " output, _ = self.rnn(x)\n", " x = output[:, -1, :]\n", " x = self.fc(x)\n", " return F.softmax(x, dim=1)\n", "\n", "\n", "model = RNNModel(vocab_size, embedding_dim, hidden_units, num_classes)\n", "\n", "print(model)" ] }, { "cell_type": "code", "execution_count": 134, "id": "3ebc4421", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3ebc4421", "outputId": "532f8196-0c7e-46b5-bb59-74cc9cc4cebd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cpu\n" ] } ], "source": [ "import torch.optim as optim\n", "optimizer = optim.Adam(model.parameters(), lr=0.001)\n", "criterion = nn.CrossEntropyLoss()\n", "\n", "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "print(device)\n", "# model.to(device)" ] }, { "cell_type": "code", "execution_count": 135, "id": "4026777d", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4026777d", "outputId": "e8b3ddde-b9bc-467c-a10e-648633562060" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100, Loss: 0.0049, Accuracy: 0.3986\n", "Epoch 2/100, Loss: 0.0049, Accuracy: 0.3986\n", "Epoch 3/100, Loss: 0.0048, Accuracy: 0.5804\n", "Epoch 4/100, Loss: 0.0048, Accuracy: 0.5944\n", "Epoch 5/100, Loss: 0.0048, Accuracy: 0.5804\n", "Epoch 6/100, Loss: 0.0048, Accuracy: 0.5874\n", "Epoch 7/100, Loss: 0.0047, Accuracy: 0.5874\n", "Epoch 8/100, Loss: 0.0047, Accuracy: 0.5944\n", "Epoch 9/100, Loss: 0.0047, Accuracy: 0.5944\n", "Epoch 10/100, Loss: 0.0047, Accuracy: 0.5944\n", "Epoch 11/100, Loss: 0.0047, Accuracy: 0.5944\n", "Epoch 12/100, Loss: 0.0047, Accuracy: 0.5944\n", "Epoch 13/100, Loss: 0.0047, Accuracy: 0.5944\n", "Epoch 14/100, Loss: 0.0047, Accuracy: 0.5944\n", "Epoch 15/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 16/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 17/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 18/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 19/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 20/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 21/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 22/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 23/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 24/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 25/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 26/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 27/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 28/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 29/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 30/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 31/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 32/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 33/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 34/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 35/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 36/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 37/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 38/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 39/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 40/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 41/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 42/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 43/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 44/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 45/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 46/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 47/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 48/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 49/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 50/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 51/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 52/100, Loss: 0.0047, Accuracy: 0.6014\n", "Epoch 53/100, Loss: 0.0047, Accuracy: 0.6154\n", "Epoch 54/100, Loss: 0.0047, Accuracy: 0.6154\n", "Epoch 55/100, Loss: 0.0047, Accuracy: 0.6154\n", "Epoch 56/100, Loss: 0.0047, Accuracy: 0.6154\n", "Epoch 57/100, Loss: 0.0046, Accuracy: 0.6154\n", "Epoch 58/100, Loss: 0.0046, Accuracy: 0.6154\n", "Epoch 59/100, Loss: 0.0046, Accuracy: 0.6154\n", "Epoch 60/100, Loss: 0.0046, Accuracy: 0.6154\n", "Epoch 61/100, Loss: 0.0046, Accuracy: 0.6154\n", "Epoch 62/100, Loss: 0.0046, Accuracy: 0.6154\n", "Epoch 63/100, Loss: 0.0046, Accuracy: 0.6154\n", "Epoch 64/100, Loss: 0.0046, Accuracy: 0.6224\n", "Epoch 65/100, Loss: 0.0046, Accuracy: 0.6224\n", "Epoch 66/100, Loss: 0.0046, Accuracy: 0.6224\n", "Epoch 67/100, Loss: 0.0046, Accuracy: 0.6224\n", "Epoch 68/100, Loss: 0.0046, Accuracy: 0.6434\n", "Epoch 69/100, Loss: 0.0046, Accuracy: 0.6434\n", "Epoch 70/100, Loss: 0.0046, Accuracy: 0.6434\n", "Epoch 71/100, Loss: 0.0046, Accuracy: 0.6434\n", "Epoch 72/100, Loss: 0.0046, Accuracy: 0.6434\n", "Epoch 73/100, Loss: 0.0045, Accuracy: 0.6434\n", "Epoch 74/100, Loss: 0.0045, Accuracy: 0.6434\n", "Epoch 75/100, Loss: 0.0045, Accuracy: 0.6434\n", "Epoch 76/100, Loss: 0.0045, Accuracy: 0.6434\n", "Epoch 77/100, Loss: 0.0045, Accuracy: 0.6434\n", "Epoch 78/100, Loss: 0.0044, Accuracy: 0.6643\n", "Epoch 79/100, Loss: 0.0044, Accuracy: 0.6713\n", "Epoch 80/100, Loss: 0.0043, Accuracy: 0.6573\n", "Epoch 81/100, Loss: 0.0043, Accuracy: 0.7133\n", "Epoch 82/100, Loss: 0.0042, Accuracy: 0.7133\n", "Epoch 83/100, Loss: 0.0042, Accuracy: 0.7832\n", "Epoch 84/100, Loss: 0.0041, Accuracy: 0.8112\n", "Epoch 85/100, Loss: 0.0040, Accuracy: 0.8182\n", "Epoch 86/100, Loss: 0.0039, Accuracy: 0.8112\n", "Epoch 87/100, Loss: 0.0038, Accuracy: 0.8042\n", "Epoch 88/100, Loss: 0.0038, Accuracy: 0.8112\n", "Epoch 89/100, Loss: 0.0037, Accuracy: 0.8182\n", "Epoch 90/100, Loss: 0.0036, Accuracy: 0.8601\n", "Epoch 91/100, Loss: 0.0035, Accuracy: 0.8671\n", "Epoch 92/100, Loss: 0.0035, Accuracy: 0.8741\n", "Epoch 93/100, Loss: 0.0034, Accuracy: 0.8741\n", "Epoch 94/100, Loss: 0.0034, Accuracy: 0.8741\n", "Epoch 95/100, Loss: 0.0033, Accuracy: 0.8811\n", "Epoch 96/100, Loss: 0.0033, Accuracy: 0.8881\n", "Epoch 97/100, Loss: 0.0032, Accuracy: 0.8881\n", "Epoch 98/100, Loss: 0.0032, Accuracy: 0.8951\n", "Epoch 99/100, Loss: 0.0031, Accuracy: 0.8951\n", "Epoch 100/100, Loss: 0.0031, Accuracy: 0.9161\n" ] } ], "source": [ "import time\n", "import torch.nn.functional as F\n", "\n", "# Training loop\n", "num_epochs = 100\n", "losses=[]\n", "for epoch in range(num_epochs):\n", " model.train() # Set to training mode\n", " running_loss = 0.0\n", " correct_preds = 0\n", " total_samples = 0\n", " optimizer.zero_grad()\n", " x_train_tensor=x_train_tensor.to(device).long()\n", " outputs = model(x_train_tensor)\n", " y_train_tensor=y_train_tensor.to(device)\n", " loss = criterion(outputs, y_train_tensor) # Compute loss\n", "\n", " loss.backward() # Backpropagation\n", " optimizer.step() # Update weights\n", "\n", " # Compute accuracy\n", " _, predicted = torch.max(outputs, 1)\n", " correct_preds += (predicted == y_train_tensor).sum().item()\n", " total_samples += y_train_tensor.size(0)\n", "\n", " running_loss += loss.item()\n", "\n", " # Compute epoch loss and accuracy\n", " epoch_loss = running_loss / len(y_train_tensor)\n", " epoch_acc = correct_preds / total_samples\n", " losses.append(epoch_loss)\n", "\n", " print(f\"Epoch {epoch+1}/{num_epochs}, Loss: {epoch_loss:.4f}, Accuracy: {epoch_acc:.4f}\")\n", " if epoch_acc>0.95:\n", " break" ] }, { "cell_type": "code", "execution_count": 136, "id": "0686RqEC81AH", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 489 }, "id": "0686RqEC81AH", "outputId": "a6bb6f5e-307e-4b34-f853-cff8da70819a" }, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'plot betweeen loss and epoch')" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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ERFRPVZqEOzhsmJMtIiIiOoprn1o/TgZnoiIqB7i2oe2gYkWERFRPcO1D20HEy0iIqJ6xpS1D6l+Y6JFRERUz3DtQ9vBRIuIiKieadZEVXWQCXFkOUy0iIiI6hmufWg7mGgRERHVM1z70HYw0SIiIqqHuPahbWDBUiIionqKax9aPyZaRERE9RjXPrRuHDokIiIiMhP2aBEREVkZLjRtPZhoERERWREuNG1dOHRIRERkJbjQtPVhokVERGQFuNC0dWKiRUREZAW40LR1YqJFRERkBbjQtHViokVERGQFuNC0dWKiRUREZAW40LR1YqJFRERkBbjQtHViokVERGQluNC09WHBUiIiIivChaatS416tL788kts375dej1lyhS4ubkhIiIC58+fr7XGERERUXllC00PCG6OcP+mTLLqsRolWp988gmcnZ0BAGlpaVi6dCnmz58PT09PTJgwoVYbSERERGStajR0ePHiRbRq1QoAsGnTJrz44ouIjY1F9+7d8ac//ak220dERERktWrUo9W4cWNcu3YNAPD999+jV69eAACVSoU7d+7UXuuIiIioSqUGgbSz17A5+3eknb3GZXjqkRr1aPXq1Quvv/46OnXqhFOnTuH5558HABw7dgy+vr612T4iIiKqREpOHmZvPS5bnkerViGhXyCfQqwHatSjtXTpUoSHh+PKlSvYuHEjmjZtCgA4dOgQhgwZYvK5fH19oVKpEBYWhoyMjErjN2zYgLZt20KlUqFDhw7YsWOH7H0hBOLj46HVauHs7IyoqCicPn3a6LlKSkoQHBwMhUKB7Oxs2XtHjhxBjx49oFKp4OPjg/nz55vcFiIiInNKycnDW6syy62BqNMX461VmUjJybNQy6hMjRItNzc3LFmyBJs3b0bv3r2l/bNnz8b7779f7fOsW7cOcXFxSEhIQGZmJjp27Ijo6GhcvnzZaPy+ffswZMgQjB49GllZWYiJiUFMTAxycnKkmPnz52Px4sVISkpCeno6XFxcEB0djeLi8ms/TZkyBd7e3uX2FxYW4tlnn0XLli1x6NAhLFiwAB988AFWrFhhUluIiIjMpdQgMHvrcRgbJCzbN3vrcQ4jWphCCGHybyAlJQWNGzdGZGQkgPu9Up9//jkCAwOxdOlSuLu7V+s8YWFh6Nq1K5YsWQIAMBgM8PHxwbvvvotp06aVix80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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(range(len(losses)),losses)\n", "plt.xlabel('epoch')\n", "plt.ylabel(\"loss\")\n", "plt.title(\"plot betweeen loss and epoch\")" ] }, { "cell_type": "code", "execution_count": 137, "id": "166d1dcf", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "166d1dcf", "outputId": "c146ed33-4c2c-43c2-809e-4236f9471f8a" }, "outputs": [ { "data": { "text/plain": [ "tensor(0.6890)" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "with torch.no_grad():\n", " model.eval()\n", " x_test_tensor=x_test_tensor.to(device).long()\n", " y_test_tensor=y_test_tensor.to(device).long()\n", " y_eval= model(x_test_tensor)\n", " loss= criterion(y_eval,y_test_tensor)\n", "loss" ] }, { "cell_type": "code", "execution_count": 138, "id": "b990a17d", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "b990a17d", "outputId": "ce04ede1-3329-4a7c-df77-86c3b5c89508" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "summary": "{\n \"name\": \"pd\",\n \"rows\": 36,\n \"fields\": [\n {\n \"column\": 0,\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 36,\n \"samples\": [\n \"tensor([0.0374, 0.9626])\",\n \"tensor([0.6917, 0.3083])\",\n \"tensor([0.5716, 0.4284])\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 1,\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 14,\n \"samples\": [\n \"tensor(1)\",\n \"tensor(1)\",\n \"tensor(0)\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}", "type": "dataframe" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
0[tensor(0.6891), tensor(0.3109)]tensor(0)
1[tensor(0.0483), tensor(0.9517)]tensor(0)
2[tensor(0.5423), tensor(0.4577)]tensor(0)
3[tensor(0.7586), tensor(0.2414)]tensor(0)
4[tensor(0.2382), tensor(0.7618)]tensor(0)
5[tensor(0.0543), tensor(0.9457)]tensor(0)
6[tensor(0.0532), tensor(0.9468)]tensor(1)
7[tensor(0.9093), tensor(0.0907)]tensor(0)
8[tensor(0.2428), tensor(0.7572)]tensor(0)
9[tensor(0.4006), tensor(0.5994)]tensor(1)
10[tensor(0.0504), tensor(0.9496)]tensor(0)
11[tensor(0.1647), tensor(0.8353)]tensor(1)
12[tensor(0.2382), tensor(0.7618)]tensor(0)
13[tensor(0.6917), tensor(0.3083)]tensor(1)
14[tensor(0.1095), tensor(0.8905)]tensor(0)
15[tensor(0.3917), tensor(0.6083)]tensor(1)
16[tensor(0.9553), tensor(0.0447)]tensor(0)
17[tensor(0.5365), tensor(0.4635)]tensor(0)
18[tensor(0.1198), tensor(0.8802)]tensor(1)
19[tensor(0.0375), tensor(0.9625)]tensor(1)
20[tensor(0.2604), tensor(0.7396)]tensor(0)
21[tensor(0.2091), tensor(0.7909)]tensor(1)
22[tensor(0.0676), tensor(0.9324)]tensor(0)
23[tensor(0.7802), tensor(0.2198)]tensor(0)
24[tensor(0.0685), tensor(0.9315)]tensor(1)
25[tensor(0.0506), tensor(0.9494)]tensor(1)
26[tensor(0.5716), tensor(0.4284)]tensor(0)
27[tensor(0.4996), tensor(0.5004)]tensor(1)
28[tensor(0.1557), tensor(0.8443)]tensor(1)
29[tensor(0.5404), tensor(0.4596)]tensor(1)
30[tensor(0.7261), tensor(0.2739)]tensor(1)
31[tensor(0.6571), tensor(0.3429)]tensor(0)
32[tensor(0.8776), tensor(0.1224)]tensor(0)
33[tensor(0.8899), tensor(0.1101)]tensor(0)
34[tensor(0.5336), tensor(0.4664)]tensor(0)
35[tensor(0.0374), tensor(0.9626)]tensor(0)
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "text/plain": [ " 0 1\n", "0 [tensor(0.6891), tensor(0.3109)] tensor(0)\n", "1 [tensor(0.0483), tensor(0.9517)] tensor(0)\n", "2 [tensor(0.5423), tensor(0.4577)] tensor(0)\n", "3 [tensor(0.7586), tensor(0.2414)] tensor(0)\n", "4 [tensor(0.2382), tensor(0.7618)] tensor(0)\n", "5 [tensor(0.0543), tensor(0.9457)] tensor(0)\n", "6 [tensor(0.0532), tensor(0.9468)] tensor(1)\n", "7 [tensor(0.9093), tensor(0.0907)] tensor(0)\n", "8 [tensor(0.2428), tensor(0.7572)] tensor(0)\n", "9 [tensor(0.4006), tensor(0.5994)] tensor(1)\n", "10 [tensor(0.0504), tensor(0.9496)] tensor(0)\n", "11 [tensor(0.1647), tensor(0.8353)] tensor(1)\n", "12 [tensor(0.2382), tensor(0.7618)] tensor(0)\n", "13 [tensor(0.6917), tensor(0.3083)] tensor(1)\n", "14 [tensor(0.1095), tensor(0.8905)] tensor(0)\n", "15 [tensor(0.3917), tensor(0.6083)] tensor(1)\n", "16 [tensor(0.9553), tensor(0.0447)] tensor(0)\n", "17 [tensor(0.5365), tensor(0.4635)] tensor(0)\n", "18 [tensor(0.1198), tensor(0.8802)] tensor(1)\n", "19 [tensor(0.0375), tensor(0.9625)] tensor(1)\n", "20 [tensor(0.2604), tensor(0.7396)] tensor(0)\n", "21 [tensor(0.2091), tensor(0.7909)] tensor(1)\n", "22 [tensor(0.0676), tensor(0.9324)] tensor(0)\n", "23 [tensor(0.7802), tensor(0.2198)] tensor(0)\n", "24 [tensor(0.0685), tensor(0.9315)] tensor(1)\n", "25 [tensor(0.0506), tensor(0.9494)] tensor(1)\n", "26 [tensor(0.5716), tensor(0.4284)] tensor(0)\n", "27 [tensor(0.4996), tensor(0.5004)] tensor(1)\n", "28 [tensor(0.1557), tensor(0.8443)] tensor(1)\n", "29 [tensor(0.5404), tensor(0.4596)] tensor(1)\n", "30 [tensor(0.7261), tensor(0.2739)] tensor(1)\n", "31 [tensor(0.6571), tensor(0.3429)] tensor(0)\n", "32 [tensor(0.8776), tensor(0.1224)] tensor(0)\n", "33 [tensor(0.8899), tensor(0.1101)] tensor(0)\n", "34 [tensor(0.5336), tensor(0.4664)] tensor(0)\n", "35 [tensor(0.0374), tensor(0.9626)] tensor(0)" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(zip(y_eval,y_test_tensor))" ] }, { "cell_type": "markdown", "id": "T0u5-cUAMyOM", "metadata": { "id": "T0u5-cUAMyOM" }, "source": [ "## 12. model saving" ] }, { "cell_type": "code", "execution_count": 147, "id": "JWm6cCd_IiMc", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JWm6cCd_IiMc", "outputId": "398071bf-b2b5-4520-da06-526ccc0d2899" }, "outputs": [ { "data": { "text/plain": [ "['tokenizer.pkl']" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "joblib.dump(tokenizer,\"tokenizer.pkl\")" ] }, { "cell_type": "code", "execution_count": 141, "id": "av1UX3WVIWvJ", "metadata": { "id": "av1UX3WVIWvJ" }, "outputs": [], "source": [ "torch.save(model.state_dict(), \"email_classfication.pth\")" ] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "T4", "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" } }, "nbformat": 4, "nbformat_minor": 5 }