{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "79ebb86a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Notebook is working\n"
     ]
    }
   ],
   "source": [
    "print(\"Notebook is working\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f923e99d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DatasetDict({\n",
      "    train: Dataset({\n",
      "        features: ['text', 'label'],\n",
      "        num_rows: 25000\n",
      "    })\n",
      "    test: Dataset({\n",
      "        features: ['text', 'label'],\n",
      "        num_rows: 25000\n",
      "    })\n",
      "    unsupervised: Dataset({\n",
      "        features: ['text', 'label'],\n",
      "        num_rows: 50000\n",
      "    })\n",
      "})\n"
     ]
    }
   ],
   "source": [
    "# Load IMDb dataset\n",
    "from datasets import load_dataset\n",
    "\n",
    "dataset = load_dataset(\"imdb\")\n",
    "\n",
    "print(dataset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e5ba14d0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train shape: (25000, 2)\n",
      "Test shape: (25000, 2)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>I rented I AM CURIOUS-YELLOW from my video sto...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>\"I Am Curious: Yellow\" is a risible and preten...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>If only to avoid making this type of film in t...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>This film was probably inspired by Godard's Ma...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Oh, brother...after hearing about this ridicul...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  label\n",
       "0  I rented I AM CURIOUS-YELLOW from my video sto...      0\n",
       "1  \"I Am Curious: Yellow\" is a risible and preten...      0\n",
       "2  If only to avoid making this type of film in t...      0\n",
       "3  This film was probably inspired by Godard's Ma...      0\n",
       "4  Oh, brother...after hearing about this ridicul...      0"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "train_df = pd.DataFrame(dataset[\"train\"])\n",
    "test_df = pd.DataFrame(dataset[\"test\"])\n",
    "\n",
    "print(\"Train shape:\", train_df.shape)\n",
    "print(\"Test shape:\", test_df.shape)\n",
    "\n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8845f919",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training samples: 25000\n",
      "Test samples: 25000\n"
     ]
    }
   ],
   "source": [
    "# Extract text and labels\n",
    "\n",
    "X_train = train_df[\"text\"]\n",
    "y_train = train_df[\"label\"]\n",
    "\n",
    "X_test = test_df[\"text\"]\n",
    "y_test = test_df[\"label\"]\n",
    "\n",
    "print(\"Training samples:\", len(X_train))\n",
    "print(\"Test samples:\", len(X_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b63f8dae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pipeline created successfully\n"
     ]
    }
   ],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "tfidf_lr_model = Pipeline([\n",
    "    (\"tfidf\", TfidfVectorizer(stop_words=\"english\", max_features=20000, ngram_range=(1, 2))),\n",
    "    (\"clf\", LogisticRegression(max_iter=1000, random_state=42))\n",
    "])\n",
    "\n",
    "print(\"Pipeline created successfully\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "d0cef6d0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training completed in 16.63 seconds\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "start_time = time.time()\n",
    "\n",
    "tfidf_lr_model.fit(X_train, y_train)\n",
    "\n",
    "end_time = time.time()\n",
    "training_time_tfidf = end_time - start_time\n",
    "\n",
    "print(f\"Training completed in {training_time_tfidf:.2f} seconds\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ecce1092",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TF-IDF + Logistic Regression Results\n",
      "------------------------------------\n",
      "Accuracy : 0.8826\n",
      "Precision: 0.8809\n",
      "Recall   : 0.8849\n",
      "F1-score : 0.8829\n",
      "\n",
      "Classification Report:\n",
      "\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "    Negative       0.88      0.88      0.88     12500\n",
      "    Positive       0.88      0.88      0.88     12500\n",
      "\n",
      "    accuracy                           0.88     25000\n",
      "   macro avg       0.88      0.88      0.88     25000\n",
      "weighted avg       0.88      0.88      0.88     25000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report\n",
    "\n",
    "# Predict on the test set\n",
    "y_pred_tfidf = tfidf_lr_model.predict(X_test)\n",
    "\n",
    "# Calculate metrics\n",
    "accuracy_tfidf = accuracy_score(y_test, y_pred_tfidf)\n",
    "precision_tfidf = precision_score(y_test, y_pred_tfidf)\n",
    "recall_tfidf = recall_score(y_test, y_pred_tfidf)\n",
    "f1_tfidf = f1_score(y_test, y_pred_tfidf)\n",
    "\n",
    "print(\"TF-IDF + Logistic Regression Results\")\n",
    "print(\"------------------------------------\")\n",
    "print(f\"Accuracy : {accuracy_tfidf:.4f}\")\n",
    "print(f\"Precision: {precision_tfidf:.4f}\")\n",
    "print(f\"Recall   : {recall_tfidf:.4f}\")\n",
    "print(f\"F1-score : {f1_tfidf:.4f}\")\n",
    "\n",
    "print(\"\\nClassification Report:\\n\")\n",
    "print(classification_report(y_test, y_pred_tfidf, target_names=[\"Negative\", \"Positive\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "41713664",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 600x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "cm = confusion_matrix(y_test, y_pred_tfidf)\n",
    "\n",
    "plt.figure(figsize=(6,5))\n",
    "sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\",\n",
    "            xticklabels=[\"Negative\",\"Positive\"],\n",
    "            yticklabels=[\"Negative\",\"Positive\"])\n",
    "\n",
    "plt.xlabel(\"Predicted Label\")\n",
    "plt.ylabel(\"True Label\")\n",
    "plt.title(\"Confusion Matrix - TF-IDF + Logistic Regression\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "095ef595",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting seaborn\n",
      "  Using cached seaborn-0.13.2-py3-none-any.whl.metadata (5.4 kB)\n",
      "Requirement already satisfied: numpy!=1.24.0,>=1.20 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from seaborn) (2.4.3)\n",
      "Requirement already satisfied: pandas>=1.2 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from seaborn) (3.0.1)\n",
      "Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from seaborn) (3.10.8)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.3.3)\n",
      "Requirement already satisfied: cycler>=0.10 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.62.1)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.9)\n",
      "Requirement already satisfied: packaging>=20.0 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (25.0)\n",
      "Requirement already satisfied: pillow>=8 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (12.1.1)\n",
      "Requirement already satisfied: pyparsing>=3 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.2.5)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.9.0.post0)\n",
      "Requirement already satisfied: tzdata in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from pandas>=1.2->seaborn) (2025.3)\n",
      "Requirement already satisfied: six>=1.5 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.17.0)\n",
      "Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)\n",
      "Installing collected packages: seaborn\n",
      "Successfully installed seaborn-0.13.2\n"
     ]
    }
   ],
   "source": [
    "!pip install seaborn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ae9dd164",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n",
    "from transformers import Trainer, TrainingArguments\n",
    "import torch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "89698c81",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tokenizer loaded successfully\n"
     ]
    }
   ],
   "source": [
    "model_name = \"distilbert-base-uncased\"\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
    "\n",
    "print(\"Tokenizer loaded successfully\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c44b9d06",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Small train size: 2000\n",
      "Small test size: 1000\n"
     ]
    }
   ],
   "source": [
    "# Use smaller subsets first so DistilBERT runs faster for testing\n",
    "small_train = dataset[\"train\"].shuffle(seed=42).select(range(2000))\n",
    "small_test = dataset[\"test\"].shuffle(seed=42).select(range(1000))\n",
    "\n",
    "print(\"Small train size:\", len(small_train))\n",
    "print(\"Small test size:\", len(small_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "0f18260a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "dc562b7eec4c47f8b5fd6e25ce533db6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/2000 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "cdf27fd5d1cf46ed83dd2b2a4b006b9a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/1000 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tokenization completed\n"
     ]
    }
   ],
   "source": [
    "def tokenize_function(example):\n",
    "    return tokenizer(example[\"text\"], padding=\"max_length\", truncation=True)\n",
    "\n",
    "tokenized_train = small_train.map(tokenize_function, batched=True)\n",
    "tokenized_test = small_test.map(tokenize_function, batched=True)\n",
    "\n",
    "print(\"Tokenization completed\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "180ebc3c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset formatted for PyTorch\n"
     ]
    }
   ],
   "source": [
    "tokenized_train = tokenized_train.remove_columns([\"text\"])\n",
    "tokenized_test = tokenized_test.remove_columns([\"text\"])\n",
    "\n",
    "tokenized_train.set_format(\"torch\")\n",
    "tokenized_test.set_format(\"torch\")\n",
    "\n",
    "print(\"Dataset formatted for PyTorch\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "6ca0c5f1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3a6ba030d24a4e2489305c7146c43f9a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "model.safetensors:   0%|          | 0.00/268M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of DistilBertForSequenceClassification were not initialized from the model checkpoint at distilbert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight', 'pre_classifier.bias', 'pre_classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DistilBERT model loaded successfully\n"
     ]
    }
   ],
   "source": [
    "model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)\n",
    "\n",
    "print(\"DistilBERT model loaded successfully\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "cee489df",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training arguments set\n"
     ]
    }
   ],
   "source": [
    "training_args = TrainingArguments(\n",
    "    output_dir=\"./results\",\n",
    "    learning_rate=2e-5,\n",
    "    per_device_train_batch_size=8,\n",
    "    per_device_eval_batch_size=8,\n",
    "    num_train_epochs=1,\n",
    "    weight_decay=0.01,\n",
    "    logging_dir=\"./logs\",\n",
    "    logging_steps=50,\n",
    "    report_to=None\n",
    ")\n",
    "\n",
    "print(\"Training arguments set\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "7c68c472",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting accelerate>=0.26.0\n",
      "  Downloading accelerate-1.13.0-py3-none-any.whl.metadata (19 kB)\n",
      "Requirement already satisfied: numpy>=1.17 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from accelerate>=0.26.0) (2.4.3)\n",
      "Requirement already satisfied: packaging>=20.0 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from accelerate>=0.26.0) (25.0)\n",
      "Requirement already satisfied: psutil in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from accelerate>=0.26.0) (7.0.0)\n",
      "Requirement already satisfied: pyyaml in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from accelerate>=0.26.0) (6.0.3)\n",
      "Requirement already satisfied: torch>=2.0.0 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from accelerate>=0.26.0) (2.9.1)\n",
      "Requirement already satisfied: huggingface_hub>=0.21.0 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from accelerate>=0.26.0) (0.34.4)\n",
      "Requirement already satisfied: safetensors>=0.4.3 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from accelerate>=0.26.0) (0.7.0)\n",
      "Requirement already satisfied: filelock in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from huggingface_hub>=0.21.0->accelerate>=0.26.0) (3.20.3)\n",
      "Requirement already satisfied: fsspec>=2023.5.0 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from huggingface_hub>=0.21.0->accelerate>=0.26.0) (2026.2.0)\n",
      "Requirement already satisfied: requests in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from huggingface_hub>=0.21.0->accelerate>=0.26.0) (2.32.5)\n",
      "Requirement already satisfied: tqdm>=4.42.1 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from huggingface_hub>=0.21.0->accelerate>=0.26.0) (4.67.3)\n",
      "Requirement already satisfied: typing-extensions>=3.7.4.3 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from huggingface_hub>=0.21.0->accelerate>=0.26.0) (4.15.0)\n",
      "Requirement already satisfied: sympy>=1.13.3 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from torch>=2.0.0->accelerate>=0.26.0) (1.14.0)\n",
      "Requirement already satisfied: networkx>=2.5.1 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from torch>=2.0.0->accelerate>=0.26.0) (3.6.1)\n",
      "Requirement already satisfied: jinja2 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from torch>=2.0.0->accelerate>=0.26.0) (3.1.6)\n",
      "Requirement already satisfied: mpmath<1.4,>=1.1.0 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from sympy>=1.13.3->torch>=2.0.0->accelerate>=0.26.0) (1.3.0)\n",
      "Requirement already satisfied: colorama in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from tqdm>=4.42.1->huggingface_hub>=0.21.0->accelerate>=0.26.0) (0.4.6)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from jinja2->torch>=2.0.0->accelerate>=0.26.0) (3.0.2)\n",
      "Requirement already satisfied: charset_normalizer<4,>=2 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from requests->huggingface_hub>=0.21.0->accelerate>=0.26.0) (3.4.4)\n",
      "Requirement already satisfied: idna<4,>=2.5 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from requests->huggingface_hub>=0.21.0->accelerate>=0.26.0) (3.11)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from requests->huggingface_hub>=0.21.0->accelerate>=0.26.0) (2.6.3)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in C:\\Users\\mihai\\.conda\\envs\\acca7026\\Lib\\site-packages (from requests->huggingface_hub>=0.21.0->accelerate>=0.26.0) (2026.1.4)\n",
      "Downloading accelerate-1.13.0-py3-none-any.whl (383 kB)\n",
      "Installing collected packages: accelerate\n",
      "Successfully installed accelerate-1.13.0\n"
     ]
    }
   ],
   "source": [
    "!pip install \"accelerate>=0.26.0\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ed0755b6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Trainer created successfully\n"
     ]
    }
   ],
   "source": [
    "trainer = Trainer(\n",
    "    model=model,\n",
    "    args=training_args,\n",
    "    train_dataset=tokenized_train,\n",
    "    eval_dataset=tokenized_test,\n",
    ")\n",
    "    \n",
    "print(\"Trainer created successfully\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "def7b7e9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of DistilBertForSequenceClassification were not initialized from the model checkpoint at distilbert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight', 'pre_classifier.bias', 'pre_classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DistilBERT model loaded\n"
     ]
    }
   ],
   "source": [
    "model = AutoModelForSequenceClassification.from_pretrained(\n",
    "    \"distilbert-base-uncased\",\n",
    "    num_labels=2\n",
    ")\n",
    "\n",
    "print(\"DistilBERT model loaded\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c7c1b455",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tokenization completed\n"
     ]
    }
   ],
   "source": [
    "def tokenize_function(example):\n",
    "    return tokenizer(example[\"text\"], padding=\"max_length\", truncation=True)\n",
    "\n",
    "tokenized_train = small_train.map(tokenize_function, batched=True)\n",
    "tokenized_test = small_test.map(tokenize_function, batched=True)\n",
    "\n",
    "print(\"Tokenization completed\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "58686b42",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset formatted for PyTorch\n"
     ]
    }
   ],
   "source": [
    "tokenized_train = tokenized_train.remove_columns([\"text\"])\n",
    "tokenized_test = tokenized_test.remove_columns([\"text\"])\n",
    "\n",
    "tokenized_train.set_format(\"torch\")\n",
    "tokenized_test.set_format(\"torch\")\n",
    "\n",
    "print(\"Dataset formatted for PyTorch\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "19fc6131",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='250' max='250' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [250/250 00:49, Epoch 1/1]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Step</th>\n",
       "      <th>Training Loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>50</td>\n",
       "      <td>0.578800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>100</td>\n",
       "      <td>0.312900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>150</td>\n",
       "      <td>0.383500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>200</td>\n",
       "      <td>0.367500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>250</td>\n",
       "      <td>0.265300</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "TrainOutput(global_step=250, training_loss=0.38159041595458987, metrics={'train_runtime': 50.0447, 'train_samples_per_second': 39.964, 'train_steps_per_second': 4.996, 'total_flos': 264934797312000.0, 'train_loss': 0.38159041595458987, 'epoch': 1.0})"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainer.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "a01c728b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Prediction completed\n"
     ]
    }
   ],
   "source": [
    "predictions = trainer.predict(tokenized_test)\n",
    "print(\"Prediction completed\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "77c69987",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DistilBERT Results\n",
      "------------------\n",
      "Accuracy : 0.8750\n",
      "Precision: 0.8727\n",
      "Recall   : 0.8709\n",
      "F1-score : 0.8718\n",
      "\n",
      "Classification Report:\n",
      "\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "    Negative       0.88      0.88      0.88       512\n",
      "    Positive       0.87      0.87      0.87       488\n",
      "\n",
      "    accuracy                           0.88      1000\n",
      "   macro avg       0.87      0.87      0.87      1000\n",
      "weighted avg       0.87      0.88      0.87      1000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report\n",
    "\n",
    "# Convert raw prediction scores into class labels\n",
    "y_pred_bert = np.argmax(predictions.predictions, axis=1)\n",
    "y_true_bert = predictions.label_ids\n",
    "\n",
    "# Calculate metrics\n",
    "accuracy_bert = accuracy_score(y_true_bert, y_pred_bert)\n",
    "precision_bert = precision_score(y_true_bert, y_pred_bert)\n",
    "recall_bert = recall_score(y_true_bert, y_pred_bert)\n",
    "f1_bert = f1_score(y_true_bert, y_pred_bert)\n",
    "\n",
    "print(\"DistilBERT Results\")\n",
    "print(\"------------------\")\n",
    "print(f\"Accuracy : {accuracy_bert:.4f}\")\n",
    "print(f\"Precision: {precision_bert:.4f}\")\n",
    "print(f\"Recall   : {recall_bert:.4f}\")\n",
    "print(f\"F1-score : {f1_bert:.4f}\")\n",
    "\n",
    "print(\"\\nClassification Report:\\n\")\n",
    "print(classification_report(y_true_bert, y_pred_bert, target_names=[\"Negative\", \"Positive\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "dc8836e5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 600x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "cm_bert = confusion_matrix(y_true_bert, y_pred_bert)\n",
    "\n",
    "plt.figure(figsize=(6,5))\n",
    "sns.heatmap(cm_bert, annot=True, fmt=\"d\", cmap=\"Purples\",\n",
    "            xticklabels=[\"Negative\",\"Positive\"],\n",
    "            yticklabels=[\"Negative\",\"Positive\"])\n",
    "\n",
    "plt.xlabel(\"Predicted Label\")\n",
    "plt.ylabel(\"True Label\")\n",
    "plt.title(\"Confusion Matrix - DistilBERT\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "894b0a13",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "test_df = pd.DataFrame(dataset[\"test\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "e8bd68a9",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test = test_df[\"label\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "b14e82df",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test_df shape: (25000, 2)\n",
      "y_test length: 25000\n",
      "y_pred_tfidf is missing\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from datasets import load_dataset\n",
    "\n",
    "# Reload dataset\n",
    "dataset = load_dataset(\"imdb\")\n",
    "\n",
    "# Recreate test dataframe and labels\n",
    "test_df = pd.DataFrame(dataset[\"test\"])\n",
    "y_test = test_df[\"label\"]\n",
    "\n",
    "# Check that TF-IDF predictions still exist\n",
    "print(\"test_df shape:\", test_df.shape)\n",
    "print(\"y_test length:\", len(y_test))\n",
    "\n",
    "try:\n",
    "    print(\"y_pred_tfidf length:\", len(y_pred_tfidf))\n",
    "except NameError:\n",
    "    print(\"y_pred_tfidf is missing\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "acca7026",
   "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.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
