{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3e28487c-dd21-47ca-9b37-666c22cc4fdb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Cell 1: Import necessary libraries (no NLTK needed)\n",
    "import pandas as pd\n",
    "import re\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, precision_score, recall_score, f1_score\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "648e9d93-8c13-424e-8293-3d8dd0afa7c7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                                                text sentiment\n",
      "0  Java Concurrency in Practice is probably the b...  positive\n",
      "1    haha aww hun i bet you are more creative tha...  positive\n",
      "2  _pickle lol, thank you very much Hope you`re h...  positive\n",
      "3  Out for an evening on the town with jeremy. Sa...  negative\n",
      "4   - just took over the #1 Most Endorsed spot on...  positive\n",
      "sentiment\n",
      "positive    2000\n",
      "negative     600\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# Cell 2: Read the dataset\n",
    "df = pd.read_csv('unbalanceddataset.csv')\n",
    "print(df.head())\n",
    "print(df['sentiment'].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "963ca4d9-d89c-490d-bf31-d02cfc64cc6b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Cell 3: Text Cleaning Function\n",
    "def clean_text(text):\n",
    "    # Lowercase\n",
    "    text = text.lower()\n",
    "    # Remove URLs\n",
    "    text = re.sub(r'http\\S+|www\\S+|https\\S+', '', text, flags=re.MULTILINE)\n",
    "    # Remove HTML tags\n",
    "    text = re.sub(r'<.*?>', '', text)\n",
    "    # Remove punctuation, special characters, numbers\n",
    "    text = re.sub(r'[^a-z\\s]', '', text)\n",
    "    return text\n",
    "\n",
    "# Apply cleaning\n",
    "df['cleaned_text'] = df['text'].apply(clean_text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "fc92391a-4dff-447a-b3bb-b0d6b41d3fd1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Cell 4: Split the dataset (use processed_text after adding tokenization and stop words removal)\n",
    "# First, add explicit tokenization (simple split) and join back after removing stop words\n",
    "stop_words = set(['a', 'an', 'the', 'is', 'are', 'was', 'were', 'this', 'that', 'these', 'those', 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her', 'us', 'them', 'my', 'your', 'his', 'its', 'our', 'their', 'mine', 'yours', 'hers', 'ours', 'theirs', 'what', 'which', 'who', 'whom', 'whose', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', 'should', 'now'])  # Basic stop words list\n",
    "\n",
    "df['tokens'] = df['cleaned_text'].apply(lambda x: x.split())  # Explicit tokenization using split\n",
    "\n",
    "def remove_stopwords(tokens):\n",
    "    return [token for token in tokens if token not in stop_words]\n",
    "\n",
    "df['no_stop'] = df['tokens'].apply(remove_stopwords)\n",
    "\n",
    "df['processed_text'] = df['no_stop'].apply(lambda x: ' '.join(x))  # Join back for vectorization (no stemming/lemmatization here)\n",
    "\n",
    "X = df['processed_text']\n",
    "y = df['sentiment'].map({'positive': 1, 'negative': 0})  # Binary sentiment\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "81d6bfde-d3be-43b8-a48e-1fe40442ac68",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Cell 5: Feature Representation - Bag of Words (stop words already handled above, but can add more in vectorizer if needed)\n",
    "bow_vectorizer = CountVectorizer()\n",
    "X_train_bow = bow_vectorizer.fit_transform(X_train)\n",
    "X_test_bow = bow_vectorizer.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "7219d674-e8c3-4f40-b591-d29b40abc412",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-4 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-4 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-4 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: start;\n",
       "  justify-content: space-between;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-4 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-4 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-4 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    font-family: monospace;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td.value pre {\n",
       "    color:rgb(255, 94, 0) !important;\n",
       "    background-color: transparent !important;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" checked><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>RandomForestClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_estimators',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_estimators&nbsp;</td>\n",
       "            <td class=\"value\">100</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('criterion',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">criterion&nbsp;</td>\n",
       "            <td class=\"value\">&#x27;gini&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_depth',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">max_depth&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_split',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">min_samples_split&nbsp;</td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_samples_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">min_samples_leaf&nbsp;</td>\n",
       "            <td class=\"value\">1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_weight_fraction_leaf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">min_weight_fraction_leaf&nbsp;</td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_features',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">max_features&nbsp;</td>\n",
       "            <td class=\"value\">&#x27;sqrt&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_leaf_nodes',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">max_leaf_nodes&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_impurity_decrease',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">min_impurity_decrease&nbsp;</td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('bootstrap',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">bootstrap&nbsp;</td>\n",
       "            <td class=\"value\">True</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('oob_score',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">oob_score&nbsp;</td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_jobs',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_jobs&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">random_state&nbsp;</td>\n",
       "            <td class=\"value\">42</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('verbose',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">verbose&nbsp;</td>\n",
       "            <td class=\"value\">0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('warm_start',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">warm_start&nbsp;</td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('class_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">class_weight&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('ccp_alpha',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">ccp_alpha&nbsp;</td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_samples',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">max_samples&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('monotonic_cst',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">monotonic_cst&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.fa-regular.fa-copy').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling.textContent.trim();\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "</script></body>"
      ],
      "text/plain": [
       "RandomForestClassifier(random_state=42)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Cell 6: Train the Model - Random Forest Classifier\n",
    "model = RandomForestClassifier(random_state=42)\n",
    "model.fit(X_train_bow, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "14d4cb6e-1e99-402e-b259-53cccb41640f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.8385\n",
      "Precision: 0.8419\n",
      "Recall: 0.9752\n",
      "F1 Score: 0.9037\n",
      "\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "           0       0.81      0.36      0.50       116\n",
      "           1       0.84      0.98      0.90       404\n",
      "\n",
      "    accuracy                           0.84       520\n",
      "   macro avg       0.82      0.67      0.70       520\n",
      "weighted avg       0.83      0.84      0.81       520\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Cell 7: Predict and Evaluate\n",
    "y_pred = model.predict(X_test_bow)\n",
    "\n",
    "# Metrics\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "precision = precision_score(y_test, y_pred)\n",
    "recall = recall_score(y_test, y_pred)\n",
    "f1 = f1_score(y_test, y_pred)\n",
    "\n",
    "print(f\"Accuracy: {accuracy:.4f}\")\n",
    "print(f\"Precision: {precision:.4f}\")\n",
    "print(f\"Recall: {recall:.4f}\")\n",
    "print(f\"F1 Score: {f1:.4f}\")\n",
    "print(\"\\nClassification Report:\\n\", classification_report(y_test, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "613ee6ad-d3d1-4410-8d46-65d1db05e187",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAokAAAIjCAYAAABvUIGpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUbNJREFUeJzt3XlclOX+//H3gDBsAqIiUooLiWKaZaaouSSJa5p2zNywTNPjUm4ZfVvUUswyTTOtTsctrMzSyiX3JdPMTMvU3DKpBDEXEFFkuX9/9HNO4+0Cxjgj83qexzwezHVf93V/Zk7T+ZzPdd3XbTEMwxAAAADwNx7ODgAAAACuhyQRAAAAJiSJAAAAMCFJBAAAgAlJIgAAAExIEgEAAGBCkggAAAATkkQAAACYkCQCAADAhCQRwFUdOHBALVu2VFBQkCwWixYvXlyk4//666+yWCyaPXt2kY57M2vWrJmaNWvm7DAAuDmSROAmcOjQIT3xxBOqUqWKfHx8FBgYqEaNGumNN97QuXPnHHrt+Ph47dq1S+PGjdO8efN09913O/R6N1Lv3r1lsVgUGBh42e/xwIEDslgsslgseu211wo9/tGjRzV69Gjt3LmzCKIFgBurhLMDAHB1S5cu1b/+9S9ZrVb16tVLt99+uy5cuKBNmzZp5MiR2r17t9555x2HXPvcuXPasmWL/u///k+DBg1yyDUiIiJ07tw5eXl5OWT8aylRooSysrL0xRdfqEuXLnbHkpKS5OPjo/Pnz1/X2EePHtWYMWNUqVIl1alTp8DnrVy58rquBwBFiSQRcGGHDx9W165dFRERobVr16p8+fK2YwMHDtTBgwe1dOlSh13/+PHjkqTg4GCHXcNiscjHx8dh41+L1WpVo0aN9MEHH5iSxPnz56tt27b65JNPbkgsWVlZ8vPzk7e39w25HgBcDdPNgAubOHGiMjMz9d5779kliBdFRkbqySeftL3Pzc3VSy+9pKpVq8pqtapSpUp69tlnlZ2dbXdepUqV1K5dO23atEn33HOPfHx8VKVKFc2dO9fWZ/To0YqIiJAkjRw5UhaLRZUqVZL01zTtxb//bvTo0bJYLHZtq1atUuPGjRUcHKyAgABFRUXp2WeftR2/0prEtWvX6t5775W/v7+Cg4PVoUMH7d2797LXO3jwoHr37q3g4GAFBQXp0UcfVVZW1pW/2Et069ZNy5cv1+nTp21t27Zt04EDB9StWzdT/5MnT2rEiBGqVauWAgICFBgYqNatW+uHH36w9Vm/fr3q1asnSXr00Udt09YXP2ezZs10++23a/v27WrSpIn8/Pxs38ulaxLj4+Pl4+Nj+vxxcXEqVaqUjh49WuDPCgAFRZIIuLAvvvhCVapUUcOGDQvU//HHH9cLL7ygu+66S5MnT1bTpk2VmJiorl27mvoePHhQDz30kO6//35NmjRJpUqVUu/evbV7925JUqdOnTR58mRJ0iOPPKJ58+ZpypQphYp/9+7dateunbKzszV27FhNmjRJDzzwgL7++uurnrd69WrFxcUpLS1No0eP1rBhw7R582Y1atRIv/76q6l/ly5ddObMGSUmJqpLly6aPXu2xowZU+A4O3XqJIvFok8//dTWNn/+fFWvXl133XWXqf8vv/yixYsXq127dnr99dc1cuRI7dq1S02bNrUlbDVq1NDYsWMlSf369dO8efM0b948NWnSxDbOiRMn1Lp1a9WpU0dTpkxR8+bNLxvfG2+8obJlyyo+Pl55eXmSpLffflsrV67UtGnTFB4eXuDPCgAFZgBwSenp6YYko0OHDgXqv3PnTkOS8fjjj9u1jxgxwpBkrF271tYWERFhSDI2btxoa0tLSzOsVqsxfPhwW9vhw4cNScarr75qN2Z8fLwRERFhiuHFF180/v6vlcmTJxuSjOPHj18x7ovXmDVrlq2tTp06RmhoqHHixAlb2w8//GB4eHgYvXr1Ml3vsccesxvzwQcfNEqXLn3Fa/79c/j7+xuGYRgPPfSQ0aJFC8MwDCMvL88ICwszxowZc9nv4Pz580ZeXp7pc1itVmPs2LG2tm3btpk+20VNmzY1JBkzZ8687LGmTZvata1YscKQZLz88svGL7/8YgQEBBgdO3a85mcEgOtFJRFwURkZGZKkkiVLFqj/smXLJEnDhg2zax8+fLgkmdYuRkdH695777W9L1u2rKKiovTLL79cd8yXuriW8bPPPlN+fn6BzklJSdHOnTvVu3dvhYSE2Npr166t+++/3/Y5/65///527++9916dOHHC9h0WRLdu3bR+/XqlpqZq7dq1Sk1NvexUs/TXOkYPj7/+9ZmXl6cTJ07YptK///77Al/TarXq0UcfLVDfli1b6oknntDYsWPVqVMn+fj46O233y7w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yyTZTzfzewachyQRRcrT01Pjx4/XtGnT9Pvvv5uOHzp0SK1atVLnzp31448/6qOPPtKmTZs0aNAgW59evXrp6NGjWr9+vT755BO98847SktLsxvHw8NDU6dO1e7duzVnzhytXbtWTz/9tKS/pqqmTJmiwMBApaSkKCUlRSNGjDDF0r17d33xxRe25FKSVqxYoaysLD344IOSpMTERM2dO1czZ87U7t27NXToUPXo0UMbNmwoku8LKG58fX114cIF9e7dW999950+//xzbdmyRYZhqE2bNsrJyZEkDRw4UNnZ2dq4caN27dqlV155RQEBAabx+D0DTmQARSQ+Pt7o0KGDYRiG0aBBA+Oxxx4zDMMwFi1aZFz8R61Pnz5Gv3797M776quvDA8PD+PcuXPG3r17DUnGtm3bbMcPHDhgSDImT558xWt//PHHRunSpW3vZ82aZQQFBZn6RURE2MbJyckxypQpY8ydO9d2/JFHHjEefvhhwzAM4/z584afn5+xefNmuzH69OljPPLII1f/MgA38PfffH5+vrFq1SrDarUaHTt2NCQZX3/9ta3vn3/+afj6+hoLFiwwDMMwatWqZYwePfqy465bt86QZJw6dcowDH7PgLOUcGqGimLrlVde0X333Wf6f/w//PCDfvzxRyUlJdnaDMNQfn6+Dh8+rP3796tEiRK66667bMcjIyNVqlQpu3FWr16txMRE/fzzz8rIyFBubq7Onz+vrKysAq9RKlGihLp06aKkpCT17NlTZ8+e1WeffaYPP/xQknTw4EFlZWXp/vvvtzvvwoULuvPOOwv1fQDF1ZIlSxQQEKCcnBzl5+erW7du6tSpk5YsWaL69evb+pUuXVpRUVHau3evJGnIkCEaMGCAVq5cqdjYWHXu3Fm1a9e+7jj4PQNFjyQRDtGkSRPFxcUpISFBvXv3trVnZmbqiSee0JAhQ0znVKxYUfv377/m2L/++qvatWunAQMGaNy4cQoJCdGmTZvUp08fXbhwoVAL2bt3766mTZsqLS1Nq1atkq+vr1q1amWLVZKWLl2qW265xe48niUL/KV58+aaMWOGvL29FR4erhIlSujzzz+/5nmPP/644uLitHTpUq1cuVKJiYmaNGmSBg8efN2x8HsGihZJIhxmwoQJqlOnjqKiomxtd911l/bs2aPIyMjLnhMVFaXc3Fzt2LFDdevWlfRXBeDvd0tv375d+fn5mjRpkjw8/lpWu2DBArtxvL29lZeXd80YGzZsqAoVKuijjz7S8uXL9a9//UteXl6SpOjoaFmtViUnJ6tp06aF+/CAm/D39zf9nmvUqKHc3Fxt3bpVDRs2lCSdOHFC+/btU3R0tK1fhQoV1L9/f/Xv318JCQl69913L5sk8nsGnIMkEQ5Tq1Ytde/eXVOnTrW1jRo1Sg0aNNCgQYP0+OOPy9/fX3v27NGqVav05ptvqnr16oqNjVW/fv00Y8YMeXl5afjw4fL19bVthxEZGamcnBxNmzZN7du319dff62ZM2faXbtSpUrKzMzUmjVrdMcdd8jPz++KFcZu3bpp5syZ2r9/v9atW2drL1mypEaMGKGhQ4cqPz9fjRs3Vnp6ur7++msFBgYqPj7eAd8acPO77bbb1KFDB/Xt21dvv/22SpYsqWeeeUa33HKLOnToIEl66qmn1Lp1a1WrVk2nTp3SunXrVKNGjcuOx+8ZcBJnL4pE8fH3RewXHT582PD29jb+/o/at99+a9x///1GQECA4e/vb9SuXdsYN26c7fjRo0eN1q1bG1ar1YiIiDDmz59vhIaGGjNnzrT1ef31143y5csbvr6+RlxcnDF37ly7he6GYRj9+/c3SpcubUgyXnzxRcMw7Be6X7Rnzx5DkhEREWHk5+fbHcvPzzemTJliREVFGV5eXkbZsmWNuLg4Y8OGDf/sywKKgcv95i86efKk0bNnTyMoKMj2O92/f7/t+KBBg4yqVasaVqvVKFu2rNGzZ0/jzz//NAzDfOOKYfB7BpzBYhiG4cQcFbim33//XRUqVNDq1avVokULZ4cDAIBbIEmEy1m7dq0yMzNVq1YtpaSk6Omnn9Yff/yh/fv329YXAQAAx2JNIlxOTk6Onn32Wf3yyy8qWbKkGjZsqKSkJBJEAABuICqJAAAAMOGxfAAAADAhSQQAAIAJSSIAAABMSBIBAABgQpIIAAAAE5JEAC6rd+/e6tixo+19s2bN9NRTT93wONavXy+LxaLTp0/f8GsDgLOQJAIotN69e8tischiscjb21uRkZEaO3ascnNzHXrdTz/9VC+99FKB+pLYAcA/w2baAK5Lq1atNGvWLGVnZ2vZsmUaOHCgvLy8lJCQYNfvwoUL8vb2LpJrhoSEFMk4AIBro5II4LpYrVaFhYUpIiJCAwYMUGxsrD7//HPbFPG4ceMUHh6uqKgoSdJvv/2mLl26KDg4WCEhIerQoYN+/fVX23h5eXkaNmyYgoODVbp0aT399NO6dK//S6ebs7OzNWrUKFWoUEFWq1WRkZF677339Ouvv6p58+aSpFKlSslisah3796SpPz8fCUmJqpy5cry9fXVHXfcoYULF9pdZ9myZapWrZp8fX3VvHlzuzgBwF2QJAIoEr6+vrpw4YIkac2aNdq3b59WrVqlJUuWKCcnR3FxcSpZsqS++uorff311woICFCrVq1s50yaNEmzZ8/Wf//7X23atEknT57UokWLrnrNXr166YMPPtDUqVO1d+9evf322woICFCFChX0ySefSJL27dunlJQUvfHGG5KkxMREzZ07VzNnztTu3bs1dOhQ9ejRQxs2bJD0VzLbqVMntW/fXjt37tTjjz+uZ555xlFfGwC4LKabAfwjhmFozZo1WrFihQYPHqzjx4/L399f//nPf2zTzO+//77y8/P1n//8RxaLRZI0a9YsBQcHa/369WrZsqWmTJmihIQEderUSZI0c+ZMrVix4orX3b9/vxYsWKBVq1YpNjZWklSlShXb8YtT06GhoQoODpb0V+Vx/PjxWr16tWJiYmznbNq0SW+//baaNm2qGTNmqGrVqpo0aZIkKSoqSrt27dIrr7xShN8aALg+kkQA12XJkiUKCAhQTk6O8vPz1a1bN40ePVoDBw5UrVq17NYh/vDDDzp48KBKlixpN8b58+d16NAhpaenKyUlRfXr17cdK1GihO6++27TlPNFO3fulKenp5o2bVrgmA8ePKisrCzdf//9du0XLlzQnXfeKUnau3evXRySbAklALgTkkQA16V58+aaMWOGvL29FR4erhIl/vevE39/f7u+mZmZqlu3rpKSkkzjlC1b9rqu7+vrW+hzMjMzJUlLly7VLbfcYnfMarVeVxwAUFyRJAK4Lv7+/oqMjCxQ37vuuksfffSRQkNDFRgYeNk+5cuX19atW9WkSRNJUm5urrZv36677rrrsv1r1aql/Px8bdiwwTbd/HcXK5l5eXm2tujoaFmtViUnJ1+xAlmjRg19/vnndm3ffPPNtT8kABQz3LgCwOG6d++uMmXKqEOHDvrqq690+PBhrV+/XkOGDNHvv/8uSXryySc1YcIELV68WD///LP+/e9/X3WPw0qVKik+Pl6PPfaYFi9ebBtzwYIFkqSIiAhZLBYtWbJEx48fV2ZmpkqWLKkRI0Zo6NChmjNnjg4dOqTvv/9e06ZN05w5cyRJ/fv314EDBzRy5Ejt27dP8+fP1+zZsx39FQGAyyFJBOBwfn5+2rhxoypWrKhOnTqpRo0a6tOnj86fP2+rLA4fPlw9e/ZUfHy8YmJiVLJkST344INXHXfGjBl66KGH9O9//1vVq1dX3759dfbsWUnSLbfcojFjxuiZZ55RuXLlNGjQIEnSSy+9pOeff16JiYmqUaOGWrVqpaVLl6py5cqSpIoVK+qTTz7R4sWLdccdd2jmzJkaP368A78dAHBNFuNKq8IBAADgtqgkAgAAwIQkEQAAACYkiQAAADAhSQQAAIAJSSIAAABMSBIBAABgQpIIAAAAE5JEAAAAmJAkAgAAwIQkEQAAACYkiQAAADD5f41cMOtvCzU0AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Cell 8: Confusion Matrix\n",
    "cm = confusion_matrix(y_test, y_pred)\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n",
    "            xticklabels=['Negative', 'Positive'], \n",
    "            yticklabels=['Negative', 'Positive'])\n",
    "plt.xlabel('Predicted')\n",
    "plt.ylabel('Actual')\n",
    "plt.title('Confusion Matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c545b9a9-c73b-4d39-bd47-aef5a1fdb173",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
