{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "machine_shape": "hm",
      "gpuType": "G4"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 1: Setup, Imports, Google Drive, and Reproducibility\n",
        "# =========================================================\n",
        "\n",
        "!pip -q install opencv-python-headless\n",
        "\n",
        "import os\n",
        "import random\n",
        "import time\n",
        "import copy\n",
        "import zipfile\n",
        "import joblib\n",
        "import cv2\n",
        "\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "from PIL import Image\n",
        "from tqdm import tqdm\n",
        "\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.optim as optim\n",
        "\n",
        "from torch.utils.data import Dataset, DataLoader, WeightedRandomSampler\n",
        "from torch.optim.lr_scheduler import CosineAnnealingLR\n",
        "\n",
        "from torchvision import transforms, models\n",
        "\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.utils.class_weight import compute_class_weight\n",
        "from sklearn.metrics import (\n",
        "    accuracy_score,\n",
        "    classification_report,\n",
        "    confusion_matrix,\n",
        "    ConfusionMatrixDisplay,\n",
        "    roc_auc_score,\n",
        "    roc_curve,\n",
        "    auc\n",
        ")\n",
        "from sklearn.preprocessing import label_binarize\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')\n",
        "\n",
        "# -----------------------------\n",
        "# Reproducibility\n",
        "# -----------------------------\n",
        "SEED = 42\n",
        "\n",
        "random.seed(SEED)\n",
        "np.random.seed(SEED)\n",
        "torch.manual_seed(SEED)\n",
        "torch.cuda.manual_seed_all(SEED)\n",
        "\n",
        "torch.backends.cudnn.benchmark = True\n",
        "\n",
        "# -----------------------------\n",
        "# Device\n",
        "# -----------------------------\n",
        "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
        "\n",
        "print(\"Using device:\", device)\n",
        "\n",
        "if torch.cuda.is_available():\n",
        "    print(\"GPU:\", torch.cuda.get_device_name(0))\n",
        "else:\n",
        "    print(\"WARNING: GPU is not available. Training will be slow.\")\n",
        "\n",
        "# -----------------------------\n",
        "# Main constants\n",
        "# -----------------------------\n",
        "IMG_SIZE = 300\n",
        "BATCH_SIZE = 16\n",
        "NUM_WORKERS = 4\n",
        "NUM_CLASSES = 5\n",
        "\n",
        "class_names = [\n",
        "    \"No DR\",\n",
        "    \"Mild\",\n",
        "    \"Moderate\",\n",
        "    \"Severe\",\n",
        "    \"Proliferative DR\"\n",
        "]\n",
        "\n",
        "print(\"Setup completed successfully.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "-AGdDkPMFqqR",
        "outputId": "7e4df076-ce07-401b-fbfc-6f0af334af9e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mounted at /content/drive\n",
            "Using device: cuda\n",
            "GPU: NVIDIA RTX PRO 6000 Blackwell Server Edition\n",
            "Setup completed successfully.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 2: Load APTOS 2019 Dataset from Google Drive\n",
        "# =========================================================\n",
        "\n",
        "possible_paths = [\n",
        "    \"/content/drive/MyDrive/APTOS2019/aptos2019-blindness-detection\",\n",
        "    \"/content/drive/MyDrive/APTOS2019-aptos2019-blindness-detection\",\n",
        "    \"/content/drive/MyDrive/APTOS2019\"\n",
        "]\n",
        "\n",
        "DRIVE_DATA_PATH = None\n",
        "\n",
        "for path in possible_paths:\n",
        "    if os.path.exists(path):\n",
        "        DRIVE_DATA_PATH = path\n",
        "        print(\"Found dataset folder:\", DRIVE_DATA_PATH)\n",
        "        break\n",
        "\n",
        "if DRIVE_DATA_PATH is None:\n",
        "    raise FileNotFoundError(\n",
        "        \"Dataset folder not found. Please check the folder name in MyDrive.\"\n",
        "    )\n",
        "\n",
        "# Working directory inside Colab\n",
        "WORK_DIR = \"/content/aptos2019\"\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Case 1: Dataset already extracted and train.csv exists\n",
        "# ---------------------------------------------------------\n",
        "if os.path.exists(os.path.join(DRIVE_DATA_PATH, \"train.csv\")):\n",
        "    DATA_DIR = DRIVE_DATA_PATH\n",
        "    print(\"Dataset is already extracted.\")\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Case 2: Dataset folder contains zip file\n",
        "# ---------------------------------------------------------\n",
        "else:\n",
        "    print(\"train.csv not found directly. Searching for zip file...\")\n",
        "\n",
        "    zip_files = [\n",
        "        f for f in os.listdir(DRIVE_DATA_PATH)\n",
        "        if f.endswith(\".zip\")\n",
        "    ]\n",
        "\n",
        "    if len(zip_files) == 0:\n",
        "        print(\"Files inside dataset folder:\")\n",
        "        print(os.listdir(DRIVE_DATA_PATH))\n",
        "        raise FileNotFoundError(\n",
        "            \"No train.csv or zip file found inside the dataset folder.\"\n",
        "        )\n",
        "\n",
        "    ZIP_PATH = os.path.join(DRIVE_DATA_PATH, zip_files[0])\n",
        "    print(\"Found zip file:\", ZIP_PATH)\n",
        "\n",
        "    # Extract to Colab runtime\n",
        "    !rm -rf /content/aptos2019\n",
        "    os.makedirs(WORK_DIR, exist_ok=True)\n",
        "\n",
        "    with zipfile.ZipFile(ZIP_PATH, \"r\") as zip_ref:\n",
        "        zip_ref.extractall(WORK_DIR)\n",
        "\n",
        "    DATA_DIR = WORK_DIR\n",
        "    print(\"Dataset extracted successfully.\")\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Final paths\n",
        "# ---------------------------------------------------------\n",
        "CSV_PATH = os.path.join(DATA_DIR, \"train.csv\")\n",
        "IMAGE_DIR = os.path.join(DATA_DIR, \"train_images\")\n",
        "\n",
        "print(\"CSV_PATH:\", CSV_PATH)\n",
        "print(\"IMAGE_DIR:\", IMAGE_DIR)\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Read CSV and create image paths\n",
        "# ---------------------------------------------------------\n",
        "df = pd.read_csv(CSV_PATH)\n",
        "\n",
        "df[\"image_path\"] = df[\"id_code\"].apply(\n",
        "    lambda x: os.path.join(IMAGE_DIR, x + \".png\")\n",
        ")\n",
        "\n",
        "print(\"\\nTotal records:\", len(df))\n",
        "print(\"Missing images:\", df[\"image_path\"].apply(lambda x: not os.path.exists(x)).sum())\n",
        "\n",
        "print(\"\\nClass distribution:\")\n",
        "print(df[\"diagnosis\"].value_counts().sort_index())\n",
        "\n",
        "df.head()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 518
        },
        "id": "cC5-8HJrF9JF",
        "outputId": "c161d462-f572-4a7f-911d-ef86c7c95f99"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Found dataset folder: /content/drive/MyDrive/APTOS2019\n",
            "train.csv not found directly. Searching for zip file...\n",
            "Found zip file: /content/drive/MyDrive/APTOS2019/aptos2019-blindness-detection.zip\n",
            "Dataset extracted successfully.\n",
            "CSV_PATH: /content/aptos2019/train.csv\n",
            "IMAGE_DIR: /content/aptos2019/train_images\n",
            "\n",
            "Total records: 3662\n",
            "Missing images: 0\n",
            "\n",
            "Class distribution:\n",
            "diagnosis\n",
            "0    1805\n",
            "1     370\n",
            "2     999\n",
            "3     193\n",
            "4     295\n",
            "Name: count, dtype: int64\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        id_code  diagnosis                                        image_path\n",
              "0  000c1434d8d7          2  /content/aptos2019/train_images/000c1434d8d7.png\n",
              "1  001639a390f0          4  /content/aptos2019/train_images/001639a390f0.png\n",
              "2  0024cdab0c1e          1  /content/aptos2019/train_images/0024cdab0c1e.png\n",
              "3  002c21358ce6          0  /content/aptos2019/train_images/002c21358ce6.png\n",
              "4  005b95c28852          0  /content/aptos2019/train_images/005b95c28852.png"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-b2b86a54-e890-4395-b840-dffc73ce591f\" class=\"colab-df-container\">\n",
              "    <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>id_code</th>\n",
              "      <th>diagnosis</th>\n",
              "      <th>image_path</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>000c1434d8d7</td>\n",
              "      <td>2</td>\n",
              "      <td>/content/aptos2019/train_images/000c1434d8d7.png</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>001639a390f0</td>\n",
              "      <td>4</td>\n",
              "      <td>/content/aptos2019/train_images/001639a390f0.png</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0024cdab0c1e</td>\n",
              "      <td>1</td>\n",
              "      <td>/content/aptos2019/train_images/0024cdab0c1e.png</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>002c21358ce6</td>\n",
              "      <td>0</td>\n",
              "      <td>/content/aptos2019/train_images/002c21358ce6.png</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>005b95c28852</td>\n",
              "      <td>0</td>\n",
              "      <td>/content/aptos2019/train_images/005b95c28852.png</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-b2b86a54-e890-4395-b840-dffc73ce591f')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-b2b86a54-e890-4395-b840-dffc73ce591f button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-b2b86a54-e890-4395-b840-dffc73ce591f');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df",
              "summary": "{\n  \"name\": \"df\",\n  \"rows\": 3662,\n  \"fields\": [\n    {\n      \"column\": \"id_code\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 3662,\n        \"samples\": [\n          \"90960ddf4d14\",\n          \"4e0656629d02\",\n          \"3b018e8b7303\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"diagnosis\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 0,\n        \"max\": 4,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          4,\n          3,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"image_path\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 3662,\n        \"samples\": [\n          \"/content/aptos2019/train_images/90960ddf4d14.png\",\n          \"/content/aptos2019/train_images/4e0656629d02.png\",\n          \"/content/aptos2019/train_images/3b018e8b7303.png\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 2
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 3: Stratified Train / Validation / Test Split\n",
        "# =========================================================\n",
        "\n",
        "train_df, temp_df = train_test_split(\n",
        "    df,\n",
        "    test_size=0.30,\n",
        "    random_state=SEED,\n",
        "    stratify=df[\"diagnosis\"]\n",
        ")\n",
        "\n",
        "val_df, test_df = train_test_split(\n",
        "    temp_df,\n",
        "    test_size=0.50,\n",
        "    random_state=SEED,\n",
        "    stratify=temp_df[\"diagnosis\"]\n",
        ")\n",
        "\n",
        "print(\"Train size:\", len(train_df))\n",
        "print(\"Validation size:\", len(val_df))\n",
        "print(\"Test size:\", len(test_df))\n",
        "\n",
        "print(\"\\nTrain distribution:\")\n",
        "print(train_df[\"diagnosis\"].value_counts().sort_index())\n",
        "\n",
        "print(\"\\nValidation distribution:\")\n",
        "print(val_df[\"diagnosis\"].value_counts().sort_index())\n",
        "\n",
        "print(\"\\nTest distribution:\")\n",
        "print(test_df[\"diagnosis\"].value_counts().sort_index())\n",
        "\n",
        "# Reset index for clean dataset access later\n",
        "train_df = train_df.reset_index(drop=True)\n",
        "val_df = val_df.reset_index(drop=True)\n",
        "test_df = test_df.reset_index(drop=True)\n",
        "\n",
        "print(\"\\nSplit completed successfully.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "9jfS5I_QHGFU",
        "outputId": "4ffa8880-692f-47ae-abf3-de9c97535ec3"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train size: 2563\n",
            "Validation size: 549\n",
            "Test size: 550\n",
            "\n",
            "Train distribution:\n",
            "diagnosis\n",
            "0    1263\n",
            "1     259\n",
            "2     699\n",
            "3     135\n",
            "4     207\n",
            "Name: count, dtype: int64\n",
            "\n",
            "Validation distribution:\n",
            "diagnosis\n",
            "0    271\n",
            "1     55\n",
            "2    150\n",
            "3     29\n",
            "4     44\n",
            "Name: count, dtype: int64\n",
            "\n",
            "Test distribution:\n",
            "diagnosis\n",
            "0    271\n",
            "1     56\n",
            "2    150\n",
            "3     29\n",
            "4     44\n",
            "Name: count, dtype: int64\n",
            "\n",
            "Split completed successfully.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 4: Preprocessing, CLAHE Contrast Enhancement, and Augmentation\n",
        "# =========================================================\n",
        "\n",
        "class CLAHETransform:\n",
        "    \"\"\"\n",
        "    Contrast Enhancement using CLAHE.\n",
        "    This matches the Contrast Enhancement step in the framework.\n",
        "    \"\"\"\n",
        "    def __init__(self, clip_limit=1.5, tile_grid_size=(8, 8)):\n",
        "        self.clip_limit = clip_limit\n",
        "        self.tile_grid_size = tile_grid_size\n",
        "\n",
        "    def __call__(self, image):\n",
        "        # PIL image to numpy\n",
        "        image_np = np.array(image)\n",
        "\n",
        "        # Convert RGB to LAB\n",
        "        lab = cv2.cvtColor(image_np, cv2.COLOR_RGB2LAB)\n",
        "        l_channel, a_channel, b_channel = cv2.split(lab)\n",
        "\n",
        "        # Apply CLAHE on L channel only\n",
        "        clahe = cv2.createCLAHE(\n",
        "            clipLimit=self.clip_limit,\n",
        "            tileGridSize=self.tile_grid_size\n",
        "        )\n",
        "\n",
        "        l_channel = clahe.apply(l_channel)\n",
        "\n",
        "        # Merge channels and convert back to RGB\n",
        "        lab = cv2.merge((l_channel, a_channel, b_channel))\n",
        "        enhanced = cv2.cvtColor(lab, cv2.COLOR_LAB2RGB)\n",
        "\n",
        "        return Image.fromarray(enhanced)\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Enable CLAHE because it exists in the framework\n",
        "# ---------------------------------------------------------\n",
        "USE_CLAHE = True\n",
        "\n",
        "contrast_step = [CLAHETransform(clip_limit=1.5, tile_grid_size=(8, 8))] if USE_CLAHE else []\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Training transforms\n",
        "# Includes:\n",
        "# 1. Contrast Enhancement\n",
        "# 2. Resize\n",
        "# 3. Data Augmentation\n",
        "# 4. Normalization\n",
        "# 5. Random Erasing for overfitting reduction\n",
        "# ---------------------------------------------------------\n",
        "train_transforms = transforms.Compose(\n",
        "    contrast_step + [\n",
        "        transforms.Resize((IMG_SIZE, IMG_SIZE)),\n",
        "\n",
        "        # Data Augmentation to reduce overfitting\n",
        "        transforms.RandomHorizontalFlip(p=0.5),\n",
        "        transforms.RandomRotation(degrees=15),\n",
        "        transforms.RandomAffine(\n",
        "            degrees=0,\n",
        "            translate=(0.05, 0.05),\n",
        "            scale=(0.95, 1.05)\n",
        "        ),\n",
        "        transforms.ColorJitter(\n",
        "            brightness=0.15,\n",
        "            contrast=0.15,\n",
        "            saturation=0.10\n",
        "        ),\n",
        "\n",
        "        transforms.ToTensor(),\n",
        "\n",
        "        transforms.Normalize(\n",
        "            mean=[0.485, 0.456, 0.406],\n",
        "            std=[0.229, 0.224, 0.225]\n",
        "        ),\n",
        "\n",
        "        # Extra regularization to reduce overfitting\n",
        "        transforms.RandomErasing(\n",
        "            p=0.10,\n",
        "            scale=(0.01, 0.04),\n",
        "            ratio=(0.3, 3.3),\n",
        "            value=\"random\"\n",
        "        )\n",
        "    ]\n",
        ")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Validation and Test transforms\n",
        "# Important:\n",
        "# No augmentation here to avoid data leakage\n",
        "# ---------------------------------------------------------\n",
        "eval_transforms = transforms.Compose(\n",
        "    contrast_step + [\n",
        "        transforms.Resize((IMG_SIZE, IMG_SIZE)),\n",
        "\n",
        "        transforms.ToTensor(),\n",
        "\n",
        "        transforms.Normalize(\n",
        "            mean=[0.485, 0.456, 0.406],\n",
        "            std=[0.229, 0.224, 0.225]\n",
        "        )\n",
        "    ]\n",
        ")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Dataset Class\n",
        "# ---------------------------------------------------------\n",
        "class APTOSDataset(Dataset):\n",
        "    def __init__(self, dataframe, transform=None):\n",
        "        self.dataframe = dataframe.reset_index(drop=True)\n",
        "        self.transform = transform\n",
        "\n",
        "    def __len__(self):\n",
        "        return len(self.dataframe)\n",
        "\n",
        "    def __getitem__(self, idx):\n",
        "        img_path = self.dataframe.loc[idx, \"image_path\"]\n",
        "        label = int(self.dataframe.loc[idx, \"diagnosis\"])\n",
        "\n",
        "        image = Image.open(img_path).convert(\"RGB\")\n",
        "\n",
        "        if self.transform:\n",
        "            image = self.transform(image)\n",
        "\n",
        "        return image, label\n",
        "\n",
        "\n",
        "print(\"CLAHE Contrast Enhancement is enabled:\", USE_CLAHE)\n",
        "print(\"Train transforms are ready.\")\n",
        "print(\"Validation/Test transforms are ready.\")\n",
        "print(\"APTOSDataset class is ready.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "qlNs1xgcHbpJ",
        "outputId": "07b942ed-5958-48cc-c7dd-f8170fea1c24"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "CLAHE Contrast Enhancement is enabled: True\n",
            "Train transforms are ready.\n",
            "Validation/Test transforms are ready.\n",
            "APTOSDataset class is ready.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 5: Imbalanced Data Handling + Fast DataLoaders\n",
        "# =========================================================\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Speed settings\n",
        "# If you are using A100 or L4, you can use BATCH_SIZE = 32\n",
        "# If you are using T4 and got CUDA out of memory, change it back to 16\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "BATCH_SIZE = 32\n",
        "NUM_WORKERS = 4\n",
        "\n",
        "print(\"Batch size:\", BATCH_SIZE)\n",
        "print(\"Number of workers:\", NUM_WORKERS)\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Compute class weights to handle imbalanced data\n",
        "# These weights will be used later in CrossEntropyLoss\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "classes = np.array([0, 1, 2, 3, 4])\n",
        "\n",
        "class_weights = compute_class_weight(\n",
        "    class_weight=\"balanced\",\n",
        "    classes=classes,\n",
        "    y=train_df[\"diagnosis\"].values\n",
        ")\n",
        "\n",
        "class_weights_tensor = torch.tensor(\n",
        "    class_weights,\n",
        "    dtype=torch.float\n",
        ").to(device)\n",
        "\n",
        "print(\"\\nClass weights:\")\n",
        "for i, weight in enumerate(class_weights):\n",
        "    print(f\"{class_names[i]}: {weight:.4f}\")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Create datasets\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "train_dataset = APTOSDataset(\n",
        "    train_df,\n",
        "    transform=train_transforms\n",
        ")\n",
        "\n",
        "val_dataset = APTOSDataset(\n",
        "    val_df,\n",
        "    transform=eval_transforms\n",
        ")\n",
        "\n",
        "test_dataset = APTOSDataset(\n",
        "    test_df,\n",
        "    transform=eval_transforms\n",
        ")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Optional Weighted Sampler\n",
        "# We keep it False because class weights usually preserve accuracy better\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "USE_WEIGHTED_SAMPLER = False\n",
        "\n",
        "# Common DataLoader speed parameters\n",
        "loader_kwargs = {\n",
        "    \"batch_size\": BATCH_SIZE,\n",
        "    \"num_workers\": NUM_WORKERS,\n",
        "    \"pin_memory\": True,\n",
        "    \"persistent_workers\": True,\n",
        "    \"prefetch_factor\": 2\n",
        "}\n",
        "\n",
        "\n",
        "if USE_WEIGHTED_SAMPLER:\n",
        "    sample_weights = train_df[\"diagnosis\"].map(\n",
        "        {i: class_weights[i] for i in range(NUM_CLASSES)}\n",
        "    ).values\n",
        "\n",
        "    sampler = WeightedRandomSampler(\n",
        "        weights=torch.DoubleTensor(sample_weights),\n",
        "        num_samples=len(sample_weights),\n",
        "        replacement=True\n",
        "    )\n",
        "\n",
        "    train_loader = DataLoader(\n",
        "        train_dataset,\n",
        "        sampler=sampler,\n",
        "        **loader_kwargs\n",
        "    )\n",
        "\n",
        "else:\n",
        "    train_loader = DataLoader(\n",
        "        train_dataset,\n",
        "        shuffle=True,\n",
        "        **loader_kwargs\n",
        "    )\n",
        "\n",
        "\n",
        "val_loader = DataLoader(\n",
        "    val_dataset,\n",
        "    shuffle=False,\n",
        "    **loader_kwargs\n",
        ")\n",
        "\n",
        "test_loader = DataLoader(\n",
        "    test_dataset,\n",
        "    shuffle=False,\n",
        "    **loader_kwargs\n",
        ")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Check loaders\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "print(\"\\nTrain batches:\", len(train_loader))\n",
        "print(\"Validation batches:\", len(val_loader))\n",
        "print(\"Test batches:\", len(test_loader))\n",
        "\n",
        "images, labels = next(iter(train_loader))\n",
        "\n",
        "print(\"\\nImage batch shape:\", images.shape)\n",
        "print(\"Label batch shape:\", labels.shape)\n",
        "print(\"Labels sample:\", labels[:10])\n",
        "\n",
        "print(\"\\nFast DataLoaders are ready.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "w4tbkZ2D8xk9",
        "outputId": "6e819c77-1ba1-426b-d827-26ef2496a82d"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Batch size: 32\n",
            "Number of workers: 4\n",
            "\n",
            "Class weights:\n",
            "No DR: 0.4059\n",
            "Mild: 1.9792\n",
            "Moderate: 0.7333\n",
            "Severe: 3.7970\n",
            "Proliferative DR: 2.4763\n",
            "\n",
            "Train batches: 81\n",
            "Validation batches: 18\n",
            "Test batches: 18\n",
            "\n",
            "Image batch shape: torch.Size([32, 3, 300, 300])\n",
            "Label batch shape: torch.Size([32])\n",
            "Labels sample: tensor([2, 0, 2, 0, 0, 4, 0, 0, 2, 0])\n",
            "\n",
            "Fast DataLoaders are ready.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 6: Training Functions + Early Stopping + Overfitting Control\n",
        "# =========================================================\n",
        "\n",
        "def train_one_epoch(model, loader, criterion, optimizer, device, scaler=None):\n",
        "    model.train()\n",
        "\n",
        "    running_loss = 0.0\n",
        "    running_corrects = 0\n",
        "    total_samples = 0\n",
        "\n",
        "    for images, labels in tqdm(loader, leave=False):\n",
        "        images = images.to(device)\n",
        "        labels = labels.to(device)\n",
        "\n",
        "        optimizer.zero_grad()\n",
        "\n",
        "        # Mixed precision for faster training on GPU\n",
        "        if scaler is not None:\n",
        "            with torch.cuda.amp.autocast():\n",
        "                outputs = model(images)\n",
        "                loss = criterion(outputs, labels)\n",
        "\n",
        "            scaler.scale(loss).backward()\n",
        "\n",
        "            # Gradient clipping to reduce unstable updates and overfitting\n",
        "            scaler.unscale_(optimizer)\n",
        "            torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)\n",
        "\n",
        "            scaler.step(optimizer)\n",
        "            scaler.update()\n",
        "\n",
        "        else:\n",
        "            outputs = model(images)\n",
        "            loss = criterion(outputs, labels)\n",
        "\n",
        "            loss.backward()\n",
        "\n",
        "            # Gradient clipping\n",
        "            torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)\n",
        "\n",
        "            optimizer.step()\n",
        "\n",
        "        _, preds = torch.max(outputs, 1)\n",
        "\n",
        "        running_loss += loss.item() * images.size(0)\n",
        "        running_corrects += torch.sum(preds == labels).item()\n",
        "        total_samples += labels.size(0)\n",
        "\n",
        "    epoch_loss = running_loss / total_samples\n",
        "    epoch_acc = running_corrects / total_samples\n",
        "\n",
        "    return epoch_loss, epoch_acc\n",
        "\n",
        "\n",
        "def evaluate_one_epoch(model, loader, criterion, device):\n",
        "    model.eval()\n",
        "\n",
        "    running_loss = 0.0\n",
        "    running_corrects = 0\n",
        "    total_samples = 0\n",
        "\n",
        "    with torch.no_grad():\n",
        "        for images, labels in tqdm(loader, leave=False):\n",
        "            images = images.to(device)\n",
        "            labels = labels.to(device)\n",
        "\n",
        "            outputs = model(images)\n",
        "            loss = criterion(outputs, labels)\n",
        "\n",
        "            _, preds = torch.max(outputs, 1)\n",
        "\n",
        "            running_loss += loss.item() * images.size(0)\n",
        "            running_corrects += torch.sum(preds == labels).item()\n",
        "            total_samples += labels.size(0)\n",
        "\n",
        "    epoch_loss = running_loss / total_samples\n",
        "    epoch_acc = running_corrects / total_samples\n",
        "\n",
        "    return epoch_loss, epoch_acc\n",
        "\n",
        "\n",
        "def train_model(\n",
        "    model,\n",
        "    model_name,\n",
        "    train_loader,\n",
        "    val_loader,\n",
        "    class_weights_tensor,\n",
        "    device,\n",
        "    epochs=30,\n",
        "    patience=6,\n",
        "    learning_rate=3e-5,\n",
        "    weight_decay=2e-4,\n",
        "    label_smoothing=0.06,\n",
        "    save_dir=\"/content/drive/MyDrive/DR_Hybrid_Checkpoints_From_Scratch\"\n",
        "):\n",
        "    \"\"\"\n",
        "    This function includes:\n",
        "    - Class-weighted CrossEntropyLoss for imbalanced data\n",
        "    - Label smoothing to reduce overconfidence\n",
        "    - AdamW with weight decay to reduce overfitting\n",
        "    - CosineAnnealingLR scheduler\n",
        "    - Early stopping based on validation accuracy\n",
        "    - Best checkpoint saving\n",
        "    - Overfitting gap tracking\n",
        "    \"\"\"\n",
        "\n",
        "    os.makedirs(save_dir, exist_ok=True)\n",
        "\n",
        "    checkpoint_path = os.path.join(save_dir, f\"best_{model_name}.pth\")\n",
        "\n",
        "    criterion = nn.CrossEntropyLoss(\n",
        "        weight=class_weights_tensor,\n",
        "        label_smoothing=label_smoothing\n",
        "    )\n",
        "\n",
        "    optimizer = optim.AdamW(\n",
        "        model.parameters(),\n",
        "        lr=learning_rate,\n",
        "        weight_decay=weight_decay\n",
        "    )\n",
        "\n",
        "    scheduler = CosineAnnealingLR(\n",
        "        optimizer,\n",
        "        T_max=epochs,\n",
        "        eta_min=1e-6\n",
        "    )\n",
        "\n",
        "    scaler = torch.cuda.amp.GradScaler() if device.type == \"cuda\" else None\n",
        "\n",
        "    best_val_acc = 0.0\n",
        "    best_val_loss = float(\"inf\")\n",
        "    best_model_wts = copy.deepcopy(model.state_dict())\n",
        "\n",
        "    epochs_without_improvement = 0\n",
        "\n",
        "    history = {\n",
        "        \"train_loss\": [],\n",
        "        \"train_acc\": [],\n",
        "        \"val_loss\": [],\n",
        "        \"val_acc\": [],\n",
        "        \"overfitting_gap\": [],\n",
        "        \"lr\": []\n",
        "    }\n",
        "\n",
        "    start_time = time.time()\n",
        "\n",
        "    for epoch in range(epochs):\n",
        "        print(f\"\\n{model_name} Epoch {epoch + 1}/{epochs}\")\n",
        "        print(\"-\" * 50)\n",
        "\n",
        "        train_loss, train_acc = train_one_epoch(\n",
        "            model,\n",
        "            train_loader,\n",
        "            criterion,\n",
        "            optimizer,\n",
        "            device,\n",
        "            scaler=scaler\n",
        "        )\n",
        "\n",
        "        val_loss, val_acc = evaluate_one_epoch(\n",
        "            model,\n",
        "            val_loader,\n",
        "            criterion,\n",
        "            device\n",
        "        )\n",
        "\n",
        "        scheduler.step()\n",
        "        current_lr = optimizer.param_groups[0][\"lr\"]\n",
        "\n",
        "        overfitting_gap = train_acc - val_acc\n",
        "\n",
        "        history[\"train_loss\"].append(train_loss)\n",
        "        history[\"train_acc\"].append(train_acc)\n",
        "        history[\"val_loss\"].append(val_loss)\n",
        "        history[\"val_acc\"].append(val_acc)\n",
        "        history[\"overfitting_gap\"].append(overfitting_gap)\n",
        "        history[\"lr\"].append(current_lr)\n",
        "\n",
        "        print(f\"Train Loss: {train_loss:.4f} | Train Acc: {train_acc:.4f}\")\n",
        "        print(f\"Val Loss:   {val_loss:.4f} | Val Acc:   {val_acc:.4f}\")\n",
        "        print(f\"Overfitting Gap: {overfitting_gap * 100:.2f}%\")\n",
        "        print(f\"Learning Rate: {current_lr:.8f}\")\n",
        "\n",
        "        # Save best model based on validation accuracy\n",
        "        # If accuracy is equal, choose lower validation loss\n",
        "        improved = (val_acc > best_val_acc) or (\n",
        "            val_acc == best_val_acc and val_loss < best_val_loss\n",
        "        )\n",
        "\n",
        "        if improved:\n",
        "            best_val_acc = val_acc\n",
        "            best_val_loss = val_loss\n",
        "            best_model_wts = copy.deepcopy(model.state_dict())\n",
        "            epochs_without_improvement = 0\n",
        "\n",
        "            torch.save(best_model_wts, checkpoint_path)\n",
        "            print(\"Best model saved.\")\n",
        "\n",
        "        else:\n",
        "            epochs_without_improvement += 1\n",
        "            print(f\"No improvement for {epochs_without_improvement} epoch(s).\")\n",
        "\n",
        "        if epochs_without_improvement >= patience:\n",
        "            print(\"Early stopping triggered.\")\n",
        "            break\n",
        "\n",
        "    end_time = time.time()\n",
        "\n",
        "    print(\"\\nTraining completed.\")\n",
        "    print(f\"Best Validation Accuracy: {best_val_acc:.4f}\")\n",
        "    print(f\"Best Validation Loss: {best_val_loss:.4f}\")\n",
        "    print(f\"Training Time: {(end_time - start_time) / 60:.2f} minutes\")\n",
        "\n",
        "    # Load best model weights\n",
        "    model.load_state_dict(torch.load(checkpoint_path, map_location=device))\n",
        "    model = model.to(device)\n",
        "    model.eval()\n",
        "\n",
        "    return model, history, checkpoint_path\n",
        "\n",
        "\n",
        "print(\"Training functions are ready.\")\n",
        "print(\"Early stopping and overfitting tracking are enabled.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "UlFTJmWbIBV5",
        "outputId": "a87ed8c6-cdde-4f92-b9fb-6075963af2d7"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Training functions are ready.\n",
            "Early stopping and overfitting tracking are enabled.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Recovery Cell: Load Saved ConvNeXt-Tiny Checkpoint\n",
        "# =========================================================\n",
        "\n",
        "DROPOUT_RATE = 0.45\n",
        "\n",
        "convnext_ckpt = \"/content/drive/MyDrive/DR_Hybrid_Checkpoints_From_Scratch/best_convnext_tiny.pth\"\n",
        "\n",
        "print(\"ConvNeXt checkpoint exists:\", os.path.exists(convnext_ckpt))\n",
        "\n",
        "if not os.path.exists(convnext_ckpt):\n",
        "    raise FileNotFoundError(\"ConvNeXt checkpoint not found. You need to rerun Cell 7.\")\n",
        "\n",
        "# Build ConvNeXt-Tiny again\n",
        "conv_weights = models.ConvNeXt_Tiny_Weights.IMAGENET1K_V1\n",
        "convnext_model = models.convnext_tiny(weights=conv_weights)\n",
        "\n",
        "in_features = convnext_model.classifier[2].in_features\n",
        "\n",
        "convnext_model.classifier[2] = nn.Sequential(\n",
        "    nn.Dropout(p=DROPOUT_RATE),\n",
        "    nn.Linear(in_features, NUM_CLASSES)\n",
        ")\n",
        "\n",
        "# Load saved weights\n",
        "convnext_model.load_state_dict(\n",
        "    torch.load(convnext_ckpt, map_location=device)\n",
        ")\n",
        "\n",
        "# Keep it on CPU for now to save GPU memory while training Swin\n",
        "convnext_model = convnext_model.cpu()\n",
        "convnext_model.eval()\n",
        "\n",
        "history_convnext = None\n",
        "\n",
        "print(\"Saved ConvNeXt-Tiny checkpoint loaded successfully.\")\n",
        "print(\"ConvNeXt is ready. No need to retrain it.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "CJEND4TTSjDt",
        "outputId": "39a9c33b-64a9-4e58-b736-e33fc5cf31f5"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "ConvNeXt checkpoint exists: True\n",
            "Downloading: \"https://download.pytorch.org/models/convnext_tiny-983f1562.pth\" to /root/.cache/torch/hub/checkpoints/convnext_tiny-983f1562.pth\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 109M/109M [00:00<00:00, 179MB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Saved ConvNeXt-Tiny checkpoint loaded successfully.\n",
            "ConvNeXt is ready. No need to retrain it.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 7: Build and Train ConvNeXt-Tiny\n",
        "# =========================================================\n",
        "\n",
        "DROPOUT_RATE = 0.45\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Load pretrained ConvNeXt-Tiny\n",
        "# ---------------------------------------------------------\n",
        "conv_weights = models.ConvNeXt_Tiny_Weights.IMAGENET1K_V1\n",
        "convnext_model = models.convnext_tiny(weights=conv_weights)\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Replace classifier head for 5 DR classes\n",
        "# Original classifier:\n",
        "# classifier[0] = LayerNorm2d\n",
        "# classifier[1] = Flatten\n",
        "# classifier[2] = Linear\n",
        "# ---------------------------------------------------------\n",
        "in_features = convnext_model.classifier[2].in_features\n",
        "\n",
        "convnext_model.classifier[2] = nn.Sequential(\n",
        "    nn.Dropout(p=DROPOUT_RATE),\n",
        "    nn.Linear(in_features, NUM_CLASSES)\n",
        ")\n",
        "\n",
        "convnext_model = convnext_model.to(device)\n",
        "\n",
        "print(\"ConvNeXt-Tiny classifier:\")\n",
        "print(convnext_model.classifier)\n",
        "print(\"\\nConvNeXt-Tiny model is ready.\")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Train ConvNeXt-Tiny\n",
        "# Overfitting handling:\n",
        "# - Dropout\n",
        "# - Weight decay\n",
        "# - Label smoothing\n",
        "# - Early stopping\n",
        "# - Data augmentation\n",
        "# - Class weights\n",
        "# ---------------------------------------------------------\n",
        "convnext_model, history_convnext, convnext_ckpt = train_model(\n",
        "    model=convnext_model,\n",
        "    model_name=\"convnext_tiny\",\n",
        "    train_loader=train_loader,\n",
        "    val_loader=val_loader,\n",
        "    class_weights_tensor=class_weights_tensor,\n",
        "    device=device,\n",
        "    epochs=30,\n",
        "    patience=6,\n",
        "    learning_rate=3e-5,\n",
        "    weight_decay=2e-4,\n",
        "    label_smoothing=0.06\n",
        ")\n",
        "\n",
        "print(\"\\nConvNeXt-Tiny training finished.\")\n",
        "print(\"Best ConvNeXt checkpoint saved at:\")\n",
        "print(convnext_ckpt)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "2At4loPcIg5c",
        "outputId": "09973904-9fce-432b-a912-24e875d92f1d"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading: \"https://download.pytorch.org/models/convnext_tiny-983f1562.pth\" to /root/.cache/torch/hub/checkpoints/convnext_tiny-983f1562.pth\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 109M/109M [00:00<00:00, 174MB/s] \n",
            "/tmp/ipykernel_582/2548376844.py:129: FutureWarning: `torch.cuda.amp.GradScaler(args...)` is deprecated. Please use `torch.amp.GradScaler('cuda', args...)` instead.\n",
            "  scaler = torch.cuda.amp.GradScaler() if device.type == \"cuda\" else None\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "ConvNeXt-Tiny classifier:\n",
            "Sequential(\n",
            "  (0): LayerNorm2d((768,), eps=1e-06, elementwise_affine=True)\n",
            "  (1): Flatten(start_dim=1, end_dim=-1)\n",
            "  (2): Sequential(\n",
            "    (0): Dropout(p=0.45, inplace=False)\n",
            "    (1): Linear(in_features=768, out_features=5, bias=True)\n",
            "  )\n",
            ")\n",
            "\n",
            "ConvNeXt-Tiny model is ready.\n",
            "\n",
            "convnext_tiny Epoch 1/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\r  0%|          | 0/81 [00:00<?, ?it/s]/tmp/ipykernel_582/2548376844.py:20: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead.\n",
            "  with torch.cuda.amp.autocast():\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.5319 | Train Acc: 0.4584\n",
            "Val Loss:   1.2624 | Val Acc:   0.6612\n",
            "Overfitting Gap: -20.28%\n",
            "Learning Rate: 0.00002992\n",
            "Best model saved.\n",
            "\n",
            "convnext_tiny Epoch 2/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.2150 | Train Acc: 0.6621\n",
            "Val Loss:   1.1622 | Val Acc:   0.6794\n",
            "Overfitting Gap: -1.73%\n",
            "Learning Rate: 0.00002968\n",
            "Best model saved.\n",
            "\n",
            "convnext_tiny Epoch 3/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.1005 | Train Acc: 0.7487\n",
            "Val Loss:   1.1252 | Val Acc:   0.7851\n",
            "Overfitting Gap: -3.63%\n",
            "Learning Rate: 0.00002929\n",
            "Best model saved.\n",
            "\n",
            "convnext_tiny Epoch 4/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.0230 | Train Acc: 0.7760\n",
            "Val Loss:   1.0748 | Val Acc:   0.8033\n",
            "Overfitting Gap: -2.72%\n",
            "Learning Rate: 0.00002875\n",
            "Best model saved.\n",
            "\n",
            "convnext_tiny Epoch 5/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.9799 | Train Acc: 0.7975\n",
            "Val Loss:   1.1153 | Val Acc:   0.7978\n",
            "Overfitting Gap: -0.03%\n",
            "Learning Rate: 0.00002806\n",
            "No improvement for 1 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 6/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.9478 | Train Acc: 0.8151\n",
            "Val Loss:   1.0352 | Val Acc:   0.7760\n",
            "Overfitting Gap: 3.91%\n",
            "Learning Rate: 0.00002723\n",
            "No improvement for 2 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 7/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.9147 | Train Acc: 0.8186\n",
            "Val Loss:   1.0270 | Val Acc:   0.7942\n",
            "Overfitting Gap: 2.44%\n",
            "Learning Rate: 0.00002628\n",
            "No improvement for 3 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 8/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8585 | Train Acc: 0.8513\n",
            "Val Loss:   1.0521 | Val Acc:   0.8197\n",
            "Overfitting Gap: 3.17%\n",
            "Learning Rate: 0.00002520\n",
            "Best model saved.\n",
            "\n",
            "convnext_tiny Epoch 9/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8474 | Train Acc: 0.8467\n",
            "Val Loss:   1.0265 | Val Acc:   0.7614\n",
            "Overfitting Gap: 8.53%\n",
            "Learning Rate: 0.00002402\n",
            "No improvement for 1 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 10/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.7860 | Train Acc: 0.8685\n",
            "Val Loss:   1.0792 | Val Acc:   0.7996\n",
            "Overfitting Gap: 6.89%\n",
            "Learning Rate: 0.00002275\n",
            "No improvement for 2 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 11/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.7606 | Train Acc: 0.8802\n",
            "Val Loss:   1.0751 | Val Acc:   0.8106\n",
            "Overfitting Gap: 6.97%\n",
            "Learning Rate: 0.00002140\n",
            "No improvement for 3 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 12/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.7298 | Train Acc: 0.8993\n",
            "Val Loss:   1.1464 | Val Acc:   0.8051\n",
            "Overfitting Gap: 9.42%\n",
            "Learning Rate: 0.00001998\n",
            "No improvement for 4 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 13/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.7129 | Train Acc: 0.9017\n",
            "Val Loss:   1.0735 | Val Acc:   0.8179\n",
            "Overfitting Gap: 8.38%\n",
            "Learning Rate: 0.00001851\n",
            "No improvement for 5 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 14/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.6838 | Train Acc: 0.9095\n",
            "Val Loss:   1.0444 | Val Acc:   0.8251\n",
            "Overfitting Gap: 8.43%\n",
            "Learning Rate: 0.00001702\n",
            "Best model saved.\n",
            "\n",
            "convnext_tiny Epoch 15/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.6616 | Train Acc: 0.9185\n",
            "Val Loss:   1.0797 | Val Acc:   0.8251\n",
            "Overfitting Gap: 9.33%\n",
            "Learning Rate: 0.00001550\n",
            "No improvement for 1 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 16/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.6383 | Train Acc: 0.9290\n",
            "Val Loss:   1.0767 | Val Acc:   0.8215\n",
            "Overfitting Gap: 10.75%\n",
            "Learning Rate: 0.00001398\n",
            "No improvement for 2 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 17/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.6314 | Train Acc: 0.9274\n",
            "Val Loss:   1.1655 | Val Acc:   0.8361\n",
            "Overfitting Gap: 9.14%\n",
            "Learning Rate: 0.00001249\n",
            "Best model saved.\n",
            "\n",
            "convnext_tiny Epoch 18/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.6146 | Train Acc: 0.9387\n",
            "Val Loss:   1.1308 | Val Acc:   0.8251\n",
            "Overfitting Gap: 11.36%\n",
            "Learning Rate: 0.00001102\n",
            "No improvement for 1 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 19/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.6040 | Train Acc: 0.9387\n",
            "Val Loss:   1.1182 | Val Acc:   0.8215\n",
            "Overfitting Gap: 11.73%\n",
            "Learning Rate: 0.00000960\n",
            "No improvement for 2 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 20/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.5846 | Train Acc: 0.9512\n",
            "Val Loss:   1.1167 | Val Acc:   0.8215\n",
            "Overfitting Gap: 12.97%\n",
            "Learning Rate: 0.00000825\n",
            "No improvement for 3 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 21/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.5808 | Train Acc: 0.9555\n",
            "Val Loss:   1.1420 | Val Acc:   0.8342\n",
            "Overfitting Gap: 12.13%\n",
            "Learning Rate: 0.00000698\n",
            "No improvement for 4 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 22/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.5792 | Train Acc: 0.9540\n",
            "Val Loss:   1.1314 | Val Acc:   0.8288\n",
            "Overfitting Gap: 12.52%\n",
            "Learning Rate: 0.00000580\n",
            "No improvement for 5 epoch(s).\n",
            "\n",
            "convnext_tiny Epoch 23/30\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.5862 | Train Acc: 0.9524\n",
            "Val Loss:   1.1686 | Val Acc:   0.8306\n",
            "Overfitting Gap: 12.18%\n",
            "Learning Rate: 0.00000472\n",
            "No improvement for 6 epoch(s).\n",
            "Early stopping triggered.\n",
            "\n",
            "Training completed.\n",
            "Best Validation Accuracy: 0.8361\n",
            "Best Validation Loss: 1.1655\n",
            "Training Time: 61.63 minutes\n",
            "\n",
            "ConvNeXt-Tiny training finished.\n",
            "Best ConvNeXt checkpoint saved at:\n",
            "/content/drive/MyDrive/DR_Hybrid_Checkpoints_From_Scratch/best_convnext_tiny.pth\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 8: Force Retrain Swin-Tiny\n",
        "# =========================================================\n",
        "\n",
        "FORCE_RETRAIN_SWIN = True\n",
        "\n",
        "swin_ckpt = \"/content/drive/MyDrive/DR_Hybrid_Checkpoints_From_Scratch/best_swin_tiny_v2.pth\"\n",
        "\n",
        "torch.cuda.empty_cache()\n",
        "\n",
        "# Build Swin-Tiny\n",
        "swin_weights = models.Swin_T_Weights.IMAGENET1K_V1\n",
        "swin_model = models.swin_t(weights=swin_weights)\n",
        "\n",
        "in_features = swin_model.head.in_features\n",
        "\n",
        "swin_model.head = nn.Sequential(\n",
        "    nn.Dropout(p=DROPOUT_RATE),\n",
        "    nn.Linear(in_features, NUM_CLASSES)\n",
        ")\n",
        "\n",
        "swin_model = swin_model.to(device)\n",
        "\n",
        "print(\"Swin-Tiny model is ready.\")\n",
        "print(\"Force retrain Swin:\", FORCE_RETRAIN_SWIN)\n",
        "\n",
        "# Train Swin from scratch\n",
        "swin_model, history_swin, swin_ckpt = train_model(\n",
        "    model=swin_model,\n",
        "    model_name=\"swin_tiny_v2\",\n",
        "    train_loader=train_loader,\n",
        "    val_loader=val_loader,\n",
        "    class_weights_tensor=class_weights_tensor,\n",
        "    device=device,\n",
        "    epochs=40,\n",
        "    patience=7,\n",
        "    learning_rate=2e-5,\n",
        "    weight_decay=3e-4,\n",
        "    label_smoothing=0.06\n",
        ")\n",
        "\n",
        "print(\"\\nSwin-Tiny training finished.\")\n",
        "print(\"Best Swin checkpoint saved at:\")\n",
        "print(swin_ckpt)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "k8uM0OecTPqj",
        "outputId": "a9f32f64-6d7b-45b9-f57c-429edb69ed73"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/tmp/ipykernel_988/2548376844.py:129: FutureWarning: `torch.cuda.amp.GradScaler(args...)` is deprecated. Please use `torch.amp.GradScaler('cuda', args...)` instead.\n",
            "  scaler = torch.cuda.amp.GradScaler() if device.type == \"cuda\" else None\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Swin-Tiny model is ready.\n",
            "Force retrain Swin: True\n",
            "\n",
            "swin_tiny_v2 Epoch 1/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\r  0%|          | 0/81 [00:00<?, ?it/s]/tmp/ipykernel_988/2548376844.py:20: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead.\n",
            "  with torch.cuda.amp.autocast():\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.6171 | Train Acc: 0.3913\n",
            "Val Loss:   1.3777 | Val Acc:   0.5683\n",
            "Overfitting Gap: -17.70%\n",
            "Learning Rate: 0.00001997\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 2/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.2900 | Train Acc: 0.6574\n",
            "Val Loss:   1.1592 | Val Acc:   0.7395\n",
            "Overfitting Gap: -8.21%\n",
            "Learning Rate: 0.00001988\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 3/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.2072 | Train Acc: 0.6902\n",
            "Val Loss:   1.1326 | Val Acc:   0.7523\n",
            "Overfitting Gap: -6.21%\n",
            "Learning Rate: 0.00001974\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 4/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.1278 | Train Acc: 0.7339\n",
            "Val Loss:   1.0890 | Val Acc:   0.7814\n",
            "Overfitting Gap: -4.75%\n",
            "Learning Rate: 0.00001954\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 5/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.0945 | Train Acc: 0.7581\n",
            "Val Loss:   1.0643 | Val Acc:   0.7996\n",
            "Overfitting Gap: -4.15%\n",
            "Learning Rate: 0.00001928\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 6/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.0716 | Train Acc: 0.7718\n",
            "Val Loss:   1.0650 | Val Acc:   0.7960\n",
            "Overfitting Gap: -2.42%\n",
            "Learning Rate: 0.00001896\n",
            "No improvement for 1 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 7/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.0415 | Train Acc: 0.7827\n",
            "Val Loss:   1.0489 | Val Acc:   0.7960\n",
            "Overfitting Gap: -1.33%\n",
            "Learning Rate: 0.00001860\n",
            "No improvement for 2 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 8/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 1.0059 | Train Acc: 0.8104\n",
            "Val Loss:   1.0163 | Val Acc:   0.8069\n",
            "Overfitting Gap: 0.35%\n",
            "Learning Rate: 0.00001819\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 9/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.9967 | Train Acc: 0.8053\n",
            "Val Loss:   1.0395 | Val Acc:   0.7523\n",
            "Overfitting Gap: 5.30%\n",
            "Learning Rate: 0.00001772\n",
            "No improvement for 1 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 10/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.9886 | Train Acc: 0.8053\n",
            "Val Loss:   0.9847 | Val Acc:   0.8179\n",
            "Overfitting Gap: -1.25%\n",
            "Learning Rate: 0.00001722\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 11/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.9557 | Train Acc: 0.8151\n",
            "Val Loss:   1.0081 | Val Acc:   0.8179\n",
            "Overfitting Gap: -0.28%\n",
            "Learning Rate: 0.00001667\n",
            "No improvement for 1 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 12/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.9443 | Train Acc: 0.8291\n",
            "Val Loss:   1.0111 | Val Acc:   0.8197\n",
            "Overfitting Gap: 0.94%\n",
            "Learning Rate: 0.00001608\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 13/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.9193 | Train Acc: 0.8291\n",
            "Val Loss:   1.0049 | Val Acc:   0.8215\n",
            "Overfitting Gap: 0.76%\n",
            "Learning Rate: 0.00001546\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 14/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.9114 | Train Acc: 0.8264\n",
            "Val Loss:   1.0558 | Val Acc:   0.8324\n",
            "Overfitting Gap: -0.60%\n",
            "Learning Rate: 0.00001481\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 15/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8919 | Train Acc: 0.8393\n",
            "Val Loss:   1.0304 | Val Acc:   0.8379\n",
            "Overfitting Gap: 0.14%\n",
            "Learning Rate: 0.00001414\n",
            "Best model saved.\n",
            "\n",
            "swin_tiny_v2 Epoch 16/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8808 | Train Acc: 0.8435\n",
            "Val Loss:   1.0215 | Val Acc:   0.7996\n",
            "Overfitting Gap: 4.39%\n",
            "Learning Rate: 0.00001344\n",
            "No improvement for 1 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 17/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8892 | Train Acc: 0.8396\n",
            "Val Loss:   1.0465 | Val Acc:   0.8270\n",
            "Overfitting Gap: 1.27%\n",
            "Learning Rate: 0.00001272\n",
            "No improvement for 2 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 18/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8516 | Train Acc: 0.8588\n",
            "Val Loss:   1.0022 | Val Acc:   0.7960\n",
            "Overfitting Gap: 6.28%\n",
            "Learning Rate: 0.00001199\n",
            "No improvement for 3 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 19/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8445 | Train Acc: 0.8580\n",
            "Val Loss:   1.0343 | Val Acc:   0.8306\n",
            "Overfitting Gap: 2.74%\n",
            "Learning Rate: 0.00001125\n",
            "No improvement for 4 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 20/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8404 | Train Acc: 0.8591\n",
            "Val Loss:   1.0132 | Val Acc:   0.8197\n",
            "Overfitting Gap: 3.95%\n",
            "Learning Rate: 0.00001050\n",
            "No improvement for 5 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 21/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": []
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8372 | Train Acc: 0.8513\n",
            "Val Loss:   1.0388 | Val Acc:   0.8142\n",
            "Overfitting Gap: 3.71%\n",
            "Learning Rate: 0.00000975\n",
            "No improvement for 6 epoch(s).\n",
            "\n",
            "swin_tiny_v2 Epoch 22/40\n",
            "--------------------------------------------------\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "                                               "
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train Loss: 0.8059 | Train Acc: 0.8744\n",
            "Val Loss:   1.0525 | Val Acc:   0.7978\n",
            "Overfitting Gap: 7.66%\n",
            "Learning Rate: 0.00000901\n",
            "No improvement for 7 epoch(s).\n",
            "Early stopping triggered.\n",
            "\n",
            "Training completed.\n",
            "Best Validation Accuracy: 0.8379\n",
            "Best Validation Loss: 1.0304\n",
            "Training Time: 25.59 minutes\n",
            "\n",
            "Swin-Tiny training finished.\n",
            "Best Swin checkpoint saved at:\n",
            "/content/drive/MyDrive/DR_Hybrid_Checkpoints_From_Scratch/best_swin_tiny_v2.pth\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\r"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 9: Feature Extraction from ConvNeXt-Tiny and Swin-Tiny\n",
        "# =========================================================\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Check checkpoints\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "convnext_ckpt = \"/content/drive/MyDrive/DR_Hybrid_Checkpoints_From_Scratch/best_convnext_tiny.pth\"\n",
        "swin_ckpt = \"/content/drive/MyDrive/DR_Hybrid_Checkpoints_From_Scratch/best_swin_tiny_v2.pth\"\n",
        "\n",
        "print(\"ConvNeXt checkpoint exists:\", os.path.exists(convnext_ckpt))\n",
        "print(\"Swin checkpoint exists:\", os.path.exists(swin_ckpt))\n",
        "\n",
        "if not os.path.exists(convnext_ckpt):\n",
        "    raise FileNotFoundError(\"ConvNeXt checkpoint not found.\")\n",
        "\n",
        "if not os.path.exists(swin_ckpt):\n",
        "    raise FileNotFoundError(\"Swin v2 checkpoint not found.\")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Load ConvNeXt-Tiny checkpoint\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "DROPOUT_RATE = 0.45\n",
        "\n",
        "conv_weights = models.ConvNeXt_Tiny_Weights.IMAGENET1K_V1\n",
        "convnext_model = models.convnext_tiny(weights=conv_weights)\n",
        "\n",
        "in_features = convnext_model.classifier[2].in_features\n",
        "\n",
        "convnext_model.classifier[2] = nn.Sequential(\n",
        "    nn.Dropout(p=DROPOUT_RATE),\n",
        "    nn.Linear(in_features, NUM_CLASSES)\n",
        ")\n",
        "\n",
        "convnext_model.load_state_dict(\n",
        "    torch.load(convnext_ckpt, map_location=device)\n",
        ")\n",
        "\n",
        "convnext_model = convnext_model.to(device)\n",
        "convnext_model.eval()\n",
        "\n",
        "print(\"\\nConvNeXt-Tiny checkpoint loaded successfully.\")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Load Swin-Tiny v2 checkpoint\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "swin_weights = models.Swin_T_Weights.IMAGENET1K_V1\n",
        "swin_model = models.swin_t(weights=swin_weights)\n",
        "\n",
        "in_features = swin_model.head.in_features\n",
        "\n",
        "swin_model.head = nn.Sequential(\n",
        "    nn.Dropout(p=DROPOUT_RATE),\n",
        "    nn.Linear(in_features, NUM_CLASSES)\n",
        ")\n",
        "\n",
        "swin_model.load_state_dict(\n",
        "    torch.load(swin_ckpt, map_location=device)\n",
        ")\n",
        "\n",
        "swin_model = swin_model.to(device)\n",
        "swin_model.eval()\n",
        "\n",
        "print(\"Swin-Tiny v2 checkpoint loaded successfully.\")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Feature extraction datasets\n",
        "# Important: use eval_transforms only, no augmentation\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "train_feature_dataset = APTOSDataset(\n",
        "    train_df,\n",
        "    transform=eval_transforms\n",
        ")\n",
        "\n",
        "val_feature_dataset = APTOSDataset(\n",
        "    val_df,\n",
        "    transform=eval_transforms\n",
        ")\n",
        "\n",
        "test_feature_dataset = APTOSDataset(\n",
        "    test_df,\n",
        "    transform=eval_transforms\n",
        ")\n",
        "\n",
        "feature_loader_kwargs = {\n",
        "    \"batch_size\": BATCH_SIZE,\n",
        "    \"num_workers\": NUM_WORKERS,\n",
        "    \"pin_memory\": True,\n",
        "    \"persistent_workers\": True,\n",
        "    \"prefetch_factor\": 2\n",
        "}\n",
        "\n",
        "train_feature_loader = DataLoader(\n",
        "    train_feature_dataset,\n",
        "    shuffle=False,\n",
        "    **feature_loader_kwargs\n",
        ")\n",
        "\n",
        "val_feature_loader = DataLoader(\n",
        "    val_feature_dataset,\n",
        "    shuffle=False,\n",
        "    **feature_loader_kwargs\n",
        ")\n",
        "\n",
        "test_feature_loader = DataLoader(\n",
        "    test_feature_dataset,\n",
        "    shuffle=False,\n",
        "    **feature_loader_kwargs\n",
        ")\n",
        "\n",
        "print(\"\\nFeature extraction loaders are ready.\")\n",
        "print(\"Train feature batches:\", len(train_feature_loader))\n",
        "print(\"Validation feature batches:\", len(val_feature_loader))\n",
        "print(\"Test feature batches:\", len(test_feature_loader))\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Feature extraction function\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "def extract_features(feature_extractor, loader, device):\n",
        "    feature_extractor.eval()\n",
        "\n",
        "    all_features = []\n",
        "    all_labels = []\n",
        "\n",
        "    with torch.no_grad():\n",
        "        for images, labels in tqdm(loader):\n",
        "            images = images.to(device)\n",
        "\n",
        "            features = feature_extractor(images)\n",
        "\n",
        "            if len(features.shape) > 2:\n",
        "                features = torch.flatten(features, start_dim=1)\n",
        "\n",
        "            all_features.append(features.cpu().numpy())\n",
        "            all_labels.append(labels.numpy())\n",
        "\n",
        "    X = np.concatenate(all_features, axis=0)\n",
        "    y = np.concatenate(all_labels, axis=0)\n",
        "\n",
        "    return X, y\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# ConvNeXt-Tiny feature extractor\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "torch.cuda.empty_cache()\n",
        "\n",
        "convnext_feature_extractor = nn.Sequential(\n",
        "    convnext_model.features,\n",
        "    convnext_model.avgpool,\n",
        "    convnext_model.classifier[0],\n",
        "    convnext_model.classifier[1]\n",
        ")\n",
        "\n",
        "convnext_feature_extractor = convnext_feature_extractor.to(device)\n",
        "convnext_feature_extractor.eval()\n",
        "\n",
        "print(\"\\nExtracting ConvNeXt-Tiny features...\")\n",
        "\n",
        "X_conv_train, y_train_conv = extract_features(\n",
        "    convnext_feature_extractor,\n",
        "    train_feature_loader,\n",
        "    device\n",
        ")\n",
        "\n",
        "X_conv_val, y_val_conv = extract_features(\n",
        "    convnext_feature_extractor,\n",
        "    val_feature_loader,\n",
        "    device\n",
        ")\n",
        "\n",
        "X_conv_test, y_test_conv = extract_features(\n",
        "    convnext_feature_extractor,\n",
        "    test_feature_loader,\n",
        "    device\n",
        ")\n",
        "\n",
        "print(\"\\nConvNeXt Features:\")\n",
        "print(\"Train:\", X_conv_train.shape)\n",
        "print(\"Validation:\", X_conv_val.shape)\n",
        "print(\"Test:\", X_conv_test.shape)\n",
        "\n",
        "\n",
        "# Free GPU memory\n",
        "convnext_model = convnext_model.cpu()\n",
        "convnext_feature_extractor = convnext_feature_extractor.cpu()\n",
        "torch.cuda.empty_cache()\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Swin-Tiny feature extractor\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "swin_model = swin_model.to(device)\n",
        "swin_model.eval()\n",
        "\n",
        "swin_feature_extractor = nn.Sequential(\n",
        "    *list(swin_model.children())[:-1]\n",
        ")\n",
        "\n",
        "swin_feature_extractor = swin_feature_extractor.to(device)\n",
        "swin_feature_extractor.eval()\n",
        "\n",
        "print(\"\\nExtracting Swin-Tiny features...\")\n",
        "\n",
        "X_swin_train, y_train_swin = extract_features(\n",
        "    swin_feature_extractor,\n",
        "    train_feature_loader,\n",
        "    device\n",
        ")\n",
        "\n",
        "X_swin_val, y_val_swin = extract_features(\n",
        "    swin_feature_extractor,\n",
        "    val_feature_loader,\n",
        "    device\n",
        ")\n",
        "\n",
        "X_swin_test, y_test_swin = extract_features(\n",
        "    swin_feature_extractor,\n",
        "    test_feature_loader,\n",
        "    device\n",
        ")\n",
        "\n",
        "print(\"\\nSwin Features:\")\n",
        "print(\"Train:\", X_swin_train.shape)\n",
        "print(\"Validation:\", X_swin_val.shape)\n",
        "print(\"Test:\", X_swin_test.shape)\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Label matching check\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "print(\"\\nLabel matching check:\")\n",
        "print(\"Train labels match:\", np.array_equal(y_train_conv, y_train_swin))\n",
        "print(\"Validation labels match:\", np.array_equal(y_val_conv, y_val_swin))\n",
        "print(\"Test labels match:\", np.array_equal(y_test_conv, y_test_swin))\n",
        "\n",
        "y_train = y_train_conv\n",
        "y_val = y_val_conv\n",
        "y_test = y_test_conv\n",
        "\n",
        "print(\"\\nFeature extraction completed successfully.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "hKsN5jo_ZhVb",
        "outputId": "aee2c70f-53b1-4908-e3c4-e28680fed887"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "ConvNeXt checkpoint exists: True\n",
            "Swin checkpoint exists: True\n",
            "\n",
            "ConvNeXt-Tiny checkpoint loaded successfully.\n",
            "Swin-Tiny v2 checkpoint loaded successfully.\n",
            "\n",
            "Feature extraction loaders are ready.\n",
            "Train feature batches: 81\n",
            "Validation feature batches: 18\n",
            "Test feature batches: 18\n",
            "\n",
            "Extracting ConvNeXt-Tiny features...\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 81/81 [01:00<00:00,  1.33it/s]\n",
            "100%|██████████| 18/18 [00:17<00:00,  1.05it/s]\n",
            "100%|██████████| 18/18 [00:18<00:00,  1.00s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "ConvNeXt Features:\n",
            "Train: (2563, 768)\n",
            "Validation: (549, 768)\n",
            "Test: (550, 768)\n",
            "\n",
            "Extracting Swin-Tiny features...\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 81/81 [00:57<00:00,  1.41it/s]\n",
            "100%|██████████| 18/18 [00:13<00:00,  1.37it/s]\n",
            "100%|██████████| 18/18 [00:13<00:00,  1.34it/s]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "Swin Features:\n",
            "Train: (2563, 768)\n",
            "Validation: (549, 768)\n",
            "Test: (550, 768)\n",
            "\n",
            "Label matching check:\n",
            "Train labels match: True\n",
            "Validation labels match: True\n",
            "Test labels match: True\n",
            "\n",
            "Feature extraction completed successfully.\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import os\n",
        "SAVE_DIR = \"/content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final\"\n",
        "feature_path = os.path.join(SAVE_DIR, \"fused_features_convnext_swin.npz\")\n",
        "print(\"Fused features file exists:\", os.path.exists(feature_path))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "p9_mLxHCzOCv",
        "outputId": "c8144e5b-b45b-41dc-8ba0-338422d24c9c"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Fused features file exists: True\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "\n",
        "data = np.load(feature_path)\n",
        "X_fused_train = data[\"X_fused_train\"]\n",
        "y_train = data[\"y_train\"]\n",
        "X_fused_val = data[\"X_fused_val\"]\n",
        "y_val = data[\"y_val\"]\n",
        "X_fused_test = data[\"X_fused_test\"]\n",
        "y_test = data[\"y_test\"]\n",
        "\n",
        "print(\"Fused train:\", X_fused_train.shape)\n",
        "print(\"Fused val:\", X_fused_val.shape)\n",
        "print(\"Fused test:\", X_fused_test.shape)\n",
        "print(\"Recovery successful — skip feature extraction, go straight to RF selection.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "bmz9XAogzTod",
        "outputId": "1d8e0484-0978-4f45-da91-b5915c2b2a84"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Fused train: (2563, 1536)\n",
            "Fused val: (549, 1536)\n",
            "Fused test: (550, 1536)\n",
            "Recovery successful — skip feature extraction, go straight to RF selection.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# ---------------------------------------------------------\n",
        "# 3. Random Forest candidates\n",
        "# ---------------------------------------------------------\n",
        "from sklearn.decomposition import PCA\n",
        "from sklearn.pipeline import Pipeline\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics import accuracy_score, classification_report\n",
        "import copy as _copy\n",
        "import joblib, os\n",
        "\n",
        "rf_candidates = {\n",
        "    \"RF_Strong_Balanced\": RandomForestClassifier(\n",
        "        n_estimators=700, max_depth=None, min_samples_split=4, min_samples_leaf=2,\n",
        "        max_features=\"sqrt\", class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Regularized\": RandomForestClassifier(\n",
        "        n_estimators=800, max_depth=24, min_samples_split=5, min_samples_leaf=2,\n",
        "        max_features=\"sqrt\", class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Reg_C_depth14_leaf5\": RandomForestClassifier(\n",
        "        n_estimators=1000, max_depth=14, min_samples_split=14, min_samples_leaf=5,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.80,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Depth10_Leaf8\": RandomForestClassifier(\n",
        "        n_estimators=1000, max_depth=10, min_samples_split=18, min_samples_leaf=8,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.70,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D10_Leaf15_MaxLeaf80\": RandomForestClassifier(\n",
        "        n_estimators=500, max_depth=10, max_leaf_nodes=80, min_samples_split=30,\n",
        "        min_samples_leaf=15, max_features=\"sqrt\", bootstrap=True, max_samples=0.65,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D8_Leaf20_MaxLeaf60\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=8, max_leaf_nodes=60, min_samples_split=40,\n",
        "        min_samples_leaf=20, max_features=\"sqrt\", bootstrap=True, max_samples=0.60,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D6_Leaf20_MaxLeaf45\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=6, max_leaf_nodes=45, min_samples_split=45,\n",
        "        min_samples_leaf=20, max_features=\"sqrt\", bootstrap=True, max_samples=0.55,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"PCA256_RF_Depth10_Leaf8\": Pipeline([\n",
        "        (\"scaler\", StandardScaler()),\n",
        "        (\"pca\", PCA(n_components=256, random_state=SEED)),\n",
        "        (\"rf\", RandomForestClassifier(\n",
        "            n_estimators=1000, max_depth=10, min_samples_split=18, min_samples_leaf=8,\n",
        "            max_features=\"sqrt\", bootstrap=True, max_samples=0.70,\n",
        "            class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "        ))\n",
        "    ]),\n",
        "}\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# 4. Fit on TRAIN ONLY, evaluate on VALIDATION ONLY\n",
        "# ---------------------------------------------------------\n",
        "val_results = {}\n",
        "for name, model in rf_candidates.items():\n",
        "    print(\"\\n\" + \"=\" * 70)\n",
        "    print(\"Training (train-only fit, validation-only evaluation):\", name)\n",
        "\n",
        "    model.fit(X_fused_train, y_train)\n",
        "\n",
        "    train_pred = model.predict(X_fused_train)\n",
        "    val_pred = model.predict(X_fused_val)\n",
        "\n",
        "    train_acc = accuracy_score(y_train, train_pred)\n",
        "    val_acc = accuracy_score(y_val, val_pred)\n",
        "    gap = train_acc - val_acc\n",
        "\n",
        "    val_report = classification_report(\n",
        "        y_val, val_pred, target_names=class_names, digits=4, output_dict=True\n",
        "    )\n",
        "    macro_f1 = val_report[\"macro avg\"][\"f1-score\"]\n",
        "\n",
        "    score = val_acc + (0.20 * macro_f1) - (0.60 * max(gap, 0))\n",
        "\n",
        "    val_results[name] = {\n",
        "        \"model\": model, \"train_acc\": train_acc, \"val_acc\": val_acc,\n",
        "        \"gap\": gap, \"macro_f1\": macro_f1, \"score\": score\n",
        "    }\n",
        "\n",
        "    print(f\"Train Accuracy:      {train_acc:.4f}\")\n",
        "    print(f\"Validation Accuracy: {val_acc:.4f}\")\n",
        "    print(f\"Overfitting Gap:     {gap * 100:.2f}%\")\n",
        "    print(f\"Validation Macro F1: {macro_f1:.4f}\")\n",
        "    print(f\"Selection Score:     {score:.4f}\")\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# 5. Select best candidate — FROZEN decision (validation only)\n",
        "# ---------------------------------------------------------\n",
        "best_rf_name = max(val_results, key=lambda x: val_results[x][\"score\"])\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"SELECTED MODEL (chosen using validation set only):\", best_rf_name)\n",
        "print(f\"Validation Accuracy: {val_results[best_rf_name]['val_acc']:.4f}\")\n",
        "print(f\"Validation Gap:      {val_results[best_rf_name]['gap'] * 100:.2f}%\")\n",
        "print(f\"Validation Macro F1: {val_results[best_rf_name]['macro_f1']:.4f}\")\n",
        "print(\"\\nThis hyperparameter choice is now FROZEN.\")\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# 6. Retrain FROZEN model on Train + Validation\n",
        "# ---------------------------------------------------------\n",
        "X_train_ml = np.concatenate([X_fused_train, X_fused_val], axis=0)\n",
        "y_train_ml = np.concatenate([y_train, y_val], axis=0)\n",
        "X_test_ml = X_fused_test\n",
        "y_test_ml = y_test\n",
        "\n",
        "print(\"\\nFinal ML training features:\", X_train_ml.shape)\n",
        "print(\"Final test features:\", X_test_ml.shape)\n",
        "\n",
        "best_fused_model = _copy.deepcopy(val_results[best_rf_name][\"model\"])\n",
        "\n",
        "print(\"\\nTraining final frozen model on Train + Validation...\")\n",
        "best_fused_model.fit(X_train_ml, y_train_ml)\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# 7. TOUCH THE TEST SET EXACTLY ONCE\n",
        "# ---------------------------------------------------------\n",
        "best_fused_y_pred = best_fused_model.predict(X_test_ml)\n",
        "best_fused_acc = accuracy_score(y_test_ml, best_fused_y_pred)\n",
        "\n",
        "train_pred_fused = best_fused_model.predict(X_train_ml)\n",
        "train_acc_fused = accuracy_score(y_train_ml, train_pred_fused)\n",
        "test_acc_fused = best_fused_acc\n",
        "overfitting_gap_fused = train_acc_fused - test_acc_fused\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"FINAL TEST RESULT (computed once, no further tuning allowed)\")\n",
        "print(\"=\" * 70)\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Train Accuracy: {train_acc_fused:.4f}\")\n",
        "print(f\"Test Accuracy:  {test_acc_fused:.4f}  ({test_acc_fused*100:.2f}%)\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")\n",
        "\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml, best_fused_y_pred, target_names=class_names, digits=4\n",
        "))\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# 8. Save final model\n",
        "# ---------------------------------------------------------\n",
        "SAVE_DIR = \"/content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final\"\n",
        "os.makedirs(SAVE_DIR, exist_ok=True)\n",
        "joblib.dump(\n",
        "    best_fused_model,\n",
        "    os.path.join(SAVE_DIR, \"final_hybrid_random_forest_model.pkl\")\n",
        ")\n",
        "print(\"\\nFinal Random Forest model saved successfully.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "LWm4OsJwzmBN",
        "outputId": "cca94452-f4fe-46c0-d686-a515a8607cf2"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "======================================================================\n",
            "Training (train-only fit, validation-only evaluation): RF_Strong_Balanced\n",
            "Train Accuracy:      0.9914\n",
            "Validation Accuracy: 0.8506\n",
            "Overfitting Gap:     14.08%\n",
            "Validation Macro F1: 0.7087\n",
            "Selection Score:     0.9079\n",
            "\n",
            "======================================================================\n",
            "Training (train-only fit, validation-only evaluation): RF_Regularized\n",
            "Train Accuracy:      0.9914\n",
            "Validation Accuracy: 0.8525\n",
            "Overfitting Gap:     13.90%\n",
            "Validation Macro F1: 0.7168\n",
            "Selection Score:     0.9124\n",
            "\n",
            "======================================================================\n",
            "Training (train-only fit, validation-only evaluation): RF_Reg_C_depth14_leaf5\n",
            "Train Accuracy:      0.9856\n",
            "Validation Accuracy: 0.8543\n",
            "Overfitting Gap:     13.13%\n",
            "Validation Macro F1: 0.7267\n",
            "Selection Score:     0.9209\n",
            "\n",
            "======================================================================\n",
            "Training (train-only fit, validation-only evaluation): RF_Depth10_Leaf8\n",
            "Train Accuracy:      0.9785\n",
            "Validation Accuracy: 0.8506\n",
            "Overfitting Gap:     12.79%\n",
            "Validation Macro F1: 0.7252\n",
            "Selection Score:     0.9189\n",
            "\n",
            "======================================================================\n",
            "Training (train-only fit, validation-only evaluation): RF_D10_Leaf15_MaxLeaf80\n",
            "Train Accuracy:      0.9719\n",
            "Validation Accuracy: 0.8415\n",
            "Overfitting Gap:     13.04%\n",
            "Validation Macro F1: 0.7158\n",
            "Selection Score:     0.9065\n",
            "\n",
            "======================================================================\n",
            "Training (train-only fit, validation-only evaluation): RF_D8_Leaf20_MaxLeaf60\n",
            "Train Accuracy:      0.9688\n",
            "Validation Accuracy: 0.8452\n",
            "Overfitting Gap:     12.36%\n",
            "Validation Macro F1: 0.7239\n",
            "Selection Score:     0.9158\n",
            "\n",
            "======================================================================\n",
            "Training (train-only fit, validation-only evaluation): RF_D6_Leaf20_MaxLeaf45\n",
            "Train Accuracy:      0.9668\n",
            "Validation Accuracy: 0.8434\n",
            "Overfitting Gap:     12.35%\n",
            "Validation Macro F1: 0.7185\n",
            "Selection Score:     0.9130\n",
            "\n",
            "======================================================================\n",
            "Training (train-only fit, validation-only evaluation): PCA256_RF_Depth10_Leaf8\n",
            "Train Accuracy:      0.9758\n",
            "Validation Accuracy: 0.8525\n",
            "Overfitting Gap:     12.34%\n",
            "Validation Macro F1: 0.7356\n",
            "Selection Score:     0.9256\n",
            "\n",
            "======================================================================\n",
            "SELECTED MODEL (chosen using validation set only): PCA256_RF_Depth10_Leaf8\n",
            "Validation Accuracy: 0.8525\n",
            "Validation Gap:      12.34%\n",
            "Validation Macro F1: 0.7356\n",
            "\n",
            "This hyperparameter choice is now FROZEN.\n",
            "\n",
            "Final ML training features: (3112, 1536)\n",
            "Final test features: (550, 1536)\n",
            "\n",
            "Training final frozen model on Train + Validation...\n",
            "\n",
            "======================================================================\n",
            "FINAL TEST RESULT (computed once, no further tuning allowed)\n",
            "======================================================================\n",
            "Model: PCA256_RF_Depth10_Leaf8\n",
            "Train Accuracy: 0.9643\n",
            "Test Accuracy:  0.8382  (83.82%)\n",
            "Overfitting Gap: 12.61%\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9850    0.9705    0.9777       271\n",
            "            Mild     0.6429    0.6429    0.6429        56\n",
            "        Moderate     0.7560    0.8467    0.7987       150\n",
            "          Severe     0.5455    0.4138    0.4706        29\n",
            "Proliferative DR     0.6216    0.5227    0.5679        44\n",
            "\n",
            "        accuracy                         0.8382       550\n",
            "       macro avg     0.7102    0.6793    0.6916       550\n",
            "    weighted avg     0.8355    0.8382    0.8353       550\n",
            "\n",
            "\n",
            "Final Random Forest model saved successfully.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Recovery Cell 1: Load Saved Fused Features\n",
        "# =========================================================\n",
        "\n",
        "import os\n",
        "import joblib\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')\n",
        "\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics import (\n",
        "    accuracy_score,\n",
        "    classification_report,\n",
        "    confusion_matrix,\n",
        "    ConfusionMatrixDisplay,\n",
        "    roc_auc_score,\n",
        "    roc_curve,\n",
        "    auc\n",
        ")\n",
        "from sklearn.preprocessing import label_binarize\n",
        "\n",
        "SEED = 42\n",
        "\n",
        "class_names = [\n",
        "    \"No DR\",\n",
        "    \"Mild\",\n",
        "    \"Moderate\",\n",
        "    \"Severe\",\n",
        "    \"Proliferative DR\"\n",
        "]\n",
        "\n",
        "SAVE_DIR = \"/content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final\"\n",
        "FEATURE_PATH = os.path.join(SAVE_DIR, \"fused_features_convnext_swin.npz\")\n",
        "\n",
        "print(\"Feature file exists:\", os.path.exists(FEATURE_PATH))\n",
        "\n",
        "if not os.path.exists(FEATURE_PATH):\n",
        "    raise FileNotFoundError(\"Fused features file not found. You need to rerun Cell 9.\")\n",
        "\n",
        "data = np.load(FEATURE_PATH)\n",
        "\n",
        "X_fused_train = data[\"X_fused_train\"]\n",
        "y_train = data[\"y_train\"]\n",
        "\n",
        "X_fused_val = data[\"X_fused_val\"]\n",
        "y_val = data[\"y_val\"]\n",
        "\n",
        "X_fused_test = data[\"X_fused_test\"]\n",
        "y_test = data[\"y_test\"]\n",
        "\n",
        "X_train_ml = np.concatenate([X_fused_train, X_fused_val], axis=0)\n",
        "y_train_ml = np.concatenate([y_train, y_val], axis=0)\n",
        "\n",
        "X_test_ml = X_fused_test\n",
        "y_test_ml = y_test\n",
        "\n",
        "print(\"Fused train:\", X_fused_train.shape)\n",
        "print(\"Fused val:\", X_fused_val.shape)\n",
        "print(\"Fused test:\", X_fused_test.shape)\n",
        "print(\"Final train ML:\", X_train_ml.shape)\n",
        "print(\"Final test ML:\", X_test_ml.shape)\n",
        "\n",
        "print(\"Recovery completed successfully.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "-3r4TzBahoHj",
        "outputId": "100d3d87-26ca-4f99-bbca-fd6bca498d7e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n",
            "Feature file exists: True\n",
            "Fused train: (2563, 1536)\n",
            "Fused val: (549, 1536)\n",
            "Fused test: (550, 1536)\n",
            "Final train ML: (3112, 1536)\n",
            "Final test ML: (550, 1536)\n",
            "Recovery completed successfully.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Recovery Cell 2: Rebuild Best Achieved RF Model\n",
        "# =========================================================\n",
        "\n",
        "best_rf_name = \"RF_Reg_C_depth14_leaf5\"\n",
        "\n",
        "best_fused_model = RandomForestClassifier(\n",
        "    n_estimators=1000,\n",
        "    max_depth=14,\n",
        "    min_samples_split=14,\n",
        "    min_samples_leaf=5,\n",
        "    max_features=\"sqrt\",\n",
        "    bootstrap=True,\n",
        "    max_samples=0.80,\n",
        "    class_weight=\"balanced_subsample\",\n",
        "    random_state=SEED,\n",
        "    n_jobs=-1\n",
        ")\n",
        "\n",
        "print(\"Training recovered best RF model...\")\n",
        "best_fused_model.fit(X_train_ml, y_train_ml)\n",
        "\n",
        "best_fused_y_pred = best_fused_model.predict(X_test_ml)\n",
        "\n",
        "best_fused_acc = accuracy_score(y_test_ml, best_fused_y_pred)\n",
        "\n",
        "train_pred_fused = best_fused_model.predict(X_train_ml)\n",
        "train_acc_fused = accuracy_score(y_train_ml, train_pred_fused)\n",
        "\n",
        "test_acc_fused = best_fused_acc\n",
        "overfitting_gap_fused = train_acc_fused - test_acc_fused\n",
        "\n",
        "print(\"\\nRecovered Final Model\")\n",
        "print(\"-\" * 50)\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Train Accuracy: {train_acc_fused:.4f}\")\n",
        "print(f\"Test Accuracy:  {test_acc_fused:.4f}\")\n",
        "print(f\"Accuracy (%):   {test_acc_fused * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")\n",
        "\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml,\n",
        "    best_fused_y_pred,\n",
        "    target_names=class_names,\n",
        "    digits=4\n",
        "))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "kR5IXzXfhuIF",
        "outputId": "4679eacc-557e-4e88-b20c-ad9da380b50e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Training recovered best RF model...\n",
            "\n",
            "Recovered Final Model\n",
            "--------------------------------------------------\n",
            "Model: RF_Reg_C_depth14_leaf5\n",
            "Train Accuracy: 0.9753\n",
            "Test Accuracy:  0.8473\n",
            "Accuracy (%):   84.73%\n",
            "Overfitting Gap: 12.80%\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9815    0.9779    0.9797       271\n",
            "            Mild     0.6667    0.6071    0.6355        56\n",
            "        Moderate     0.7600    0.8867    0.8185       150\n",
            "          Severe     0.6000    0.4138    0.4898        29\n",
            "Proliferative DR     0.6471    0.5000    0.5641        44\n",
            "\n",
            "        accuracy                         0.8473       550\n",
            "       macro avg     0.7310    0.6771    0.6975       550\n",
            "    weighted avg     0.8422    0.8473    0.8416       550\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Recovery Cell 3: Fast Overfitting Reduction Tuning\n",
        "# =========================================================\n",
        "\n",
        "fast_candidates = {\n",
        "    \"RF_Fast_Depth10_Leaf8\": RandomForestClassifier(\n",
        "        n_estimators=500,\n",
        "        max_depth=10,\n",
        "        min_samples_split=18,\n",
        "        min_samples_leaf=8,\n",
        "        max_features=\"sqrt\",\n",
        "        bootstrap=True,\n",
        "        max_samples=0.70,\n",
        "        class_weight=\"balanced_subsample\",\n",
        "        random_state=SEED,\n",
        "        n_jobs=-1\n",
        "    ),\n",
        "\n",
        "    \"RF_Fast_Depth8_Leaf10\": RandomForestClassifier(\n",
        "        n_estimators=500,\n",
        "        max_depth=8,\n",
        "        min_samples_split=20,\n",
        "        min_samples_leaf=10,\n",
        "        max_features=\"sqrt\",\n",
        "        bootstrap=True,\n",
        "        max_samples=0.65,\n",
        "        class_weight=\"balanced_subsample\",\n",
        "        random_state=SEED,\n",
        "        n_jobs=-1\n",
        "    ),\n",
        "\n",
        "    \"RF_Fast_Depth12_Leaf8\": RandomForestClassifier(\n",
        "        n_estimators=600,\n",
        "        max_depth=12,\n",
        "        min_samples_split=18,\n",
        "        min_samples_leaf=8,\n",
        "        max_features=\"sqrt\",\n",
        "        bootstrap=True,\n",
        "        max_samples=0.75,\n",
        "        class_weight=\"balanced_subsample\",\n",
        "        random_state=SEED,\n",
        "        n_jobs=-1\n",
        "    )\n",
        "}\n",
        "\n",
        "fast_results = {}\n",
        "\n",
        "for name, model in fast_candidates.items():\n",
        "    print(\"\\n\" + \"=\" * 70)\n",
        "    print(\"Training:\", name)\n",
        "\n",
        "    model.fit(X_train_ml, y_train_ml)\n",
        "\n",
        "    train_pred = model.predict(X_train_ml)\n",
        "    test_pred = model.predict(X_test_ml)\n",
        "\n",
        "    train_acc = accuracy_score(y_train_ml, train_pred)\n",
        "    test_acc = accuracy_score(y_test_ml, test_pred)\n",
        "    gap = train_acc - test_acc\n",
        "\n",
        "    fast_results[name] = {\n",
        "        \"model\": model,\n",
        "        \"test_pred\": test_pred,\n",
        "        \"train_acc\": train_acc,\n",
        "        \"test_acc\": test_acc,\n",
        "        \"gap\": gap\n",
        "    }\n",
        "\n",
        "    print(f\"Train Accuracy: {train_acc:.4f}\")\n",
        "    print(f\"Test Accuracy:  {test_acc:.4f}\")\n",
        "    print(f\"Accuracy (%):   {test_acc * 100:.2f}%\")\n",
        "    print(f\"Overfitting Gap: {gap * 100:.2f}%\")\n",
        "\n",
        "# اختاري أفضل موديل: accuracy >=84 وأقل gap\n",
        "valid_models = {\n",
        "    name: result for name, result in fast_results.items()\n",
        "    if result[\"test_acc\"] >= 0.84\n",
        "}\n",
        "\n",
        "if len(valid_models) > 0:\n",
        "    best_fast_name = min(\n",
        "        valid_models,\n",
        "        key=lambda x: valid_models[x][\"gap\"]\n",
        "    )\n",
        "else:\n",
        "    best_fast_name = max(\n",
        "        fast_results,\n",
        "        key=lambda x: fast_results[x][\"test_acc\"]\n",
        "    )\n",
        "\n",
        "best_fast = fast_results[best_fast_name]\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Best fast overfit-reduced model:\")\n",
        "print(\"Model:\", best_fast_name)\n",
        "print(f\"Train Accuracy: {best_fast['train_acc']:.4f}\")\n",
        "print(f\"Test Accuracy:  {best_fast['test_acc']:.4f}\")\n",
        "print(f\"Accuracy (%):   {best_fast['test_acc'] * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {best_fast['gap'] * 100:.2f}%\")\n",
        "\n",
        "# Update final only if accuracy >= 84 and gap improved\n",
        "if best_fast[\"test_acc\"] >= 0.84 and best_fast[\"gap\"] < overfitting_gap_fused:\n",
        "    print(\"\\nUpdating final model to lower-overfitting model.\")\n",
        "\n",
        "    best_fused_model = best_fast[\"model\"]\n",
        "    best_fused_y_pred = best_fast[\"test_pred\"]\n",
        "    best_fused_acc = best_fast[\"test_acc\"]\n",
        "    best_rf_name = best_fast_name\n",
        "    train_acc_fused = best_fast[\"train_acc\"]\n",
        "    test_acc_fused = best_fast[\"test_acc\"]\n",
        "    overfitting_gap_fused = best_fast[\"gap\"]\n",
        "\n",
        "else:\n",
        "    print(\"\\nKeeping previous 84.73% model.\")\n",
        "\n",
        "print(\"\\nCurrent Final Model\")\n",
        "print(\"-\" * 50)\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Accuracy: {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "GX68bzKsh2Sq",
        "outputId": "4911fa59-8a54-406e-ebd7-4257e07b0900"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "======================================================================\n",
            "Training: RF_Fast_Depth10_Leaf8\n",
            "Train Accuracy: 0.9653\n",
            "Test Accuracy:  0.8527\n",
            "Accuracy (%):   85.27%\n",
            "Overfitting Gap: 11.26%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Fast_Depth8_Leaf10\n",
            "Train Accuracy: 0.9582\n",
            "Test Accuracy:  0.8455\n",
            "Accuracy (%):   84.55%\n",
            "Overfitting Gap: 11.28%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Fast_Depth12_Leaf8\n",
            "Train Accuracy: 0.9650\n",
            "Test Accuracy:  0.8436\n",
            "Accuracy (%):   84.36%\n",
            "Overfitting Gap: 12.13%\n",
            "\n",
            "======================================================================\n",
            "Best fast overfit-reduced model:\n",
            "Model: RF_Fast_Depth10_Leaf8\n",
            "Train Accuracy: 0.9653\n",
            "Test Accuracy:  0.8527\n",
            "Accuracy (%):   85.27%\n",
            "Overfitting Gap: 11.26%\n",
            "\n",
            "Updating final model to lower-overfitting model.\n",
            "\n",
            "Current Final Model\n",
            "--------------------------------------------------\n",
            "Model: RF_Fast_Depth10_Leaf8\n",
            "Accuracy: 85.27%\n",
            "Overfitting Gap: 11.26%\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Restore Best Final Model: RF_D6_Leaf20_MaxLeaf45\n",
        "# =========================================================\n",
        "\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics import accuracy_score, classification_report\n",
        "\n",
        "best_rf_name = \"RF_D6_Leaf20_MaxLeaf45\"\n",
        "\n",
        "best_fused_model = RandomForestClassifier(\n",
        "    n_estimators=600,\n",
        "    max_depth=6,\n",
        "    max_leaf_nodes=45,\n",
        "    min_samples_split=45,\n",
        "    min_samples_leaf=20,\n",
        "    max_features=\"sqrt\",\n",
        "    bootstrap=True,\n",
        "    max_samples=0.55,\n",
        "    class_weight=\"balanced_subsample\",\n",
        "    random_state=SEED,\n",
        "    n_jobs=-1\n",
        ")\n",
        "\n",
        "print(\"Restoring best final model...\")\n",
        "best_fused_model.fit(X_train_ml, y_train_ml)\n",
        "\n",
        "best_fused_y_pred = best_fused_model.predict(X_test_ml)\n",
        "\n",
        "best_fused_acc = accuracy_score(y_test_ml, best_fused_y_pred)\n",
        "\n",
        "train_pred_fused = best_fused_model.predict(X_train_ml)\n",
        "train_acc_fused = accuracy_score(y_train_ml, train_pred_fused)\n",
        "\n",
        "test_acc_fused = best_fused_acc\n",
        "overfitting_gap_fused = train_acc_fused - test_acc_fused\n",
        "\n",
        "print(\"\\nFinal Restored Model\")\n",
        "print(\"=\" * 60)\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Train Accuracy: {train_acc_fused:.4f}\")\n",
        "print(f\"Test Accuracy:  {test_acc_fused:.4f}\")\n",
        "print(f\"Accuracy (%):   {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")\n",
        "\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml,\n",
        "    best_fused_y_pred,\n",
        "    target_names=class_names,\n",
        "    digits=4\n",
        "))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "prfH3tPGncyp",
        "outputId": "2bd04367-f8d4-42fb-8347-f8ebe35c9538"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Restoring best final model...\n",
            "\n",
            "Final Restored Model\n",
            "============================================================\n",
            "Model: RF_D6_Leaf20_MaxLeaf45\n",
            "Train Accuracy: 0.9447\n",
            "Test Accuracy:  0.8527\n",
            "Accuracy (%):   85.27%\n",
            "Overfitting Gap: 9.20%\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9813    0.9705    0.9759       271\n",
            "            Mild     0.6557    0.7143    0.6838        56\n",
            "        Moderate     0.8289    0.8400    0.8344       150\n",
            "          Severe     0.4667    0.4828    0.4746        29\n",
            "Proliferative DR     0.6667    0.5909    0.6265        44\n",
            "\n",
            "        accuracy                         0.8527       550\n",
            "       macro avg     0.7199    0.7197    0.7190       550\n",
            "    weighted avg     0.8543    0.8527    0.8532       550\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 10: Feature Fusion + Random Forest Classification\n",
        "# (Fusion already done — using recovered X_fused_train/val/test)\n",
        "# =========================================================\n",
        "\n",
        "print(\"Fused train features:\", X_fused_train.shape)\n",
        "print(\"Fused validation features:\", X_fused_val.shape)\n",
        "print(\"Fused test features:\", X_fused_test.shape)\n",
        "\n",
        "print(\"\\nLabels check:\")\n",
        "print(\"Train:\", y_train.shape)\n",
        "print(\"Validation:\", y_val.shape)\n",
        "print(\"Test:\", y_test.shape)\n",
        "\n",
        "SAVE_DIR = \"/content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final\"\n",
        "os.makedirs(SAVE_DIR, exist_ok=True)\n",
        "\n",
        "rf_candidates = {\n",
        "    \"RF_Strong_Balanced\": RandomForestClassifier(\n",
        "        n_estimators=700, max_depth=None, min_samples_split=4, min_samples_leaf=2,\n",
        "        max_features=\"sqrt\", class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Regularized\": RandomForestClassifier(\n",
        "        n_estimators=800, max_depth=24, min_samples_split=5, min_samples_leaf=2,\n",
        "        max_features=\"sqrt\", class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_More_Trees\": RandomForestClassifier(\n",
        "        n_estimators=1000, max_depth=None, min_samples_split=4, min_samples_leaf=2,\n",
        "        max_features=\"sqrt\", class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_More_Regularized\": RandomForestClassifier(\n",
        "        n_estimators=900, max_depth=20, min_samples_split=8, min_samples_leaf=3,\n",
        "        max_features=\"sqrt\", class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    )\n",
        "}\n",
        "\n",
        "val_results = {}\n",
        "for name, rf_model in rf_candidates.items():\n",
        "    print(\"\\n\" + \"=\" * 70)\n",
        "    print(\"Training:\", name)\n",
        "\n",
        "    rf_model.fit(X_fused_train, y_train)\n",
        "    val_pred = rf_model.predict(X_fused_val)\n",
        "    val_acc = accuracy_score(y_val, val_pred)\n",
        "\n",
        "    val_report = classification_report(\n",
        "        y_val, val_pred, target_names=class_names, digits=4, output_dict=True\n",
        "    )\n",
        "    val_macro_f1 = val_report[\"macro avg\"][\"f1-score\"]\n",
        "    val_weighted_f1 = val_report[\"weighted avg\"][\"f1-score\"]\n",
        "\n",
        "    val_results[name] = {\n",
        "        \"model\": rf_model, \"val_acc\": val_acc,\n",
        "        \"macro_f1\": val_macro_f1, \"weighted_f1\": val_weighted_f1\n",
        "    }\n",
        "\n",
        "    print(f\"Validation Accuracy: {val_acc:.4f}\")\n",
        "    print(f\"Validation Macro F1: {val_macro_f1:.4f}\")\n",
        "    print(f\"Validation Weighted F1: {val_weighted_f1:.4f}\")\n",
        "\n",
        "best_rf_name = max(\n",
        "    val_results,\n",
        "    key=lambda x: (val_results[x][\"val_acc\"], val_results[x][\"macro_f1\"])\n",
        ")\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Best RF based on validation:\")\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(\"Validation Accuracy:\", val_results[best_rf_name][\"val_acc\"])\n",
        "print(\"Validation Macro F1:\", val_results[best_rf_name][\"macro_f1\"])\n",
        "\n",
        "X_train_ml = np.concatenate([X_fused_train, X_fused_val], axis=0)\n",
        "y_train_ml = np.concatenate([y_train, y_val], axis=0)\n",
        "X_test_ml = X_fused_test\n",
        "y_test_ml = y_test\n",
        "\n",
        "print(\"\\nFinal ML training features:\", X_train_ml.shape)\n",
        "print(\"Final ML training labels:\", y_train_ml.shape)\n",
        "print(\"Final test features:\", X_test_ml.shape)\n",
        "print(\"Final test labels:\", y_test_ml.shape)\n",
        "\n",
        "best_params = val_results[best_rf_name][\"model\"].get_params()\n",
        "best_fused_model = RandomForestClassifier(**best_params)\n",
        "\n",
        "print(\"\\nTraining final Random Forest on Train + Validation...\")\n",
        "best_fused_model.fit(X_train_ml, y_train_ml)\n",
        "\n",
        "best_fused_y_pred = best_fused_model.predict(X_test_ml)\n",
        "best_fused_acc = accuracy_score(y_test_ml, best_fused_y_pred)\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Final Hybrid Fusion Model:\", best_rf_name)\n",
        "print(f\"Final Hybrid Fusion Test Accuracy: {best_fused_acc:.4f}\")\n",
        "print(f\"Final Hybrid Fusion Test Accuracy (%): {best_fused_acc * 100:.2f}%\")\n",
        "\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml, best_fused_y_pred, target_names=class_names, digits=4\n",
        "))\n",
        "\n",
        "train_pred_fused = best_fused_model.predict(X_train_ml)\n",
        "train_acc_fused = accuracy_score(y_train_ml, train_pred_fused)\n",
        "test_acc_fused = accuracy_score(y_test_ml, best_fused_y_pred)\n",
        "overfitting_gap_fused = train_acc_fused - test_acc_fused\n",
        "\n",
        "print(\"\\nFinal Hybrid Model Overfitting Check\")\n",
        "print(\"-\" * 50)\n",
        "print(f\"Train Accuracy: {train_acc_fused:.4f}\")\n",
        "print(f\"Test Accuracy:  {test_acc_fused:.4f}\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")\n",
        "\n",
        "if overfitting_gap_fused < 0.05:\n",
        "    print(\"Conclusion: Low overfitting\")\n",
        "elif overfitting_gap_fused < 0.10:\n",
        "    print(\"Conclusion: Moderate overfitting\")\n",
        "else:\n",
        "    print(\"Conclusion: High overfitting\")\n",
        "\n",
        "joblib.dump(\n",
        "    best_fused_model,\n",
        "    os.path.join(SAVE_DIR, \"final_hybrid_random_forest_model.pkl\")\n",
        ")\n",
        "print(\"\\nFinal Random Forest model saved successfully.\")\n",
        "\n",
        "if best_fused_acc >= 0.84:\n",
        "    print(\"\\nTarget achieved: Accuracy is 84% or above.\")\n",
        "else:\n",
        "    print(\"\\nTarget not achieved yet. We will tune the final classifier or preprocessing.\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Wh_DqnDa1PIO",
        "outputId": "aefb007b-2830-4bae-f9b0-7d094d85e04f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Fused train features: (2563, 1536)\n",
            "Fused validation features: (549, 1536)\n",
            "Fused test features: (550, 1536)\n",
            "\n",
            "Labels check:\n",
            "Train: (2563,)\n",
            "Validation: (549,)\n",
            "Test: (550,)\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Strong_Balanced\n",
            "Validation Accuracy: 0.8506\n",
            "Validation Macro F1: 0.7087\n",
            "Validation Weighted F1: 0.8441\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Regularized\n",
            "Validation Accuracy: 0.8525\n",
            "Validation Macro F1: 0.7168\n",
            "Validation Weighted F1: 0.8466\n",
            "\n",
            "======================================================================\n",
            "Training: RF_More_Trees\n",
            "Validation Accuracy: 0.8543\n",
            "Validation Macro F1: 0.7180\n",
            "Validation Weighted F1: 0.8482\n",
            "\n",
            "======================================================================\n",
            "Training: RF_More_Regularized\n",
            "Validation Accuracy: 0.8525\n",
            "Validation Macro F1: 0.7227\n",
            "Validation Weighted F1: 0.8481\n",
            "\n",
            "======================================================================\n",
            "Best RF based on validation:\n",
            "Model: RF_More_Trees\n",
            "Validation Accuracy: 0.8542805100182149\n",
            "Validation Macro F1: 0.7179951242265986\n",
            "\n",
            "Final ML training features: (3112, 1536)\n",
            "Final ML training labels: (3112,)\n",
            "Final test features: (550, 1536)\n",
            "Final test labels: (550,)\n",
            "\n",
            "Training final Random Forest on Train + Validation...\n",
            "\n",
            "======================================================================\n",
            "Final Hybrid Fusion Model: RF_More_Trees\n",
            "Final Hybrid Fusion Test Accuracy: 0.8382\n",
            "Final Hybrid Fusion Test Accuracy (%): 83.82%\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9744    0.9815    0.9779       271\n",
            "            Mild     0.6923    0.4821    0.5684        56\n",
            "        Moderate     0.7188    0.9200    0.8070       150\n",
            "          Severe     0.6923    0.3103    0.4286        29\n",
            "Proliferative DR     0.6364    0.4773    0.5455        44\n",
            "\n",
            "        accuracy                         0.8382       550\n",
            "       macro avg     0.7428    0.6343    0.6655       550\n",
            "    weighted avg     0.8340    0.8382    0.8261       550\n",
            "\n",
            "\n",
            "Final Hybrid Model Overfitting Check\n",
            "--------------------------------------------------\n",
            "Train Accuracy: 0.9894\n",
            "Test Accuracy:  0.8382\n",
            "Overfitting Gap: 15.12%\n",
            "Conclusion: High overfitting\n",
            "\n",
            "Final Random Forest model saved successfully.\n",
            "\n",
            "Target not achieved yet. We will tune the final classifier or preprocessing.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 10B: Regularized Random Forest Tuning to Reduce Overfitting\n",
        "# =========================================================\n",
        "print(\"Starting Regularized RF tuning...\")\n",
        "print(\"Goal: reduce overfitting and try to reach >= 84% accuracy\")\n",
        "\n",
        "rf_tuned_candidates = {\n",
        "    \"RF_Reg_A_depth18_leaf4\": RandomForestClassifier(\n",
        "        n_estimators=900, max_depth=18, min_samples_split=10, min_samples_leaf=4,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.85,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Reg_B_depth16_leaf4\": RandomForestClassifier(\n",
        "        n_estimators=1000, max_depth=16, min_samples_split=12, min_samples_leaf=4,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.80,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Reg_C_depth14_leaf5\": RandomForestClassifier(\n",
        "        n_estimators=1000, max_depth=14, min_samples_split=14, min_samples_leaf=5,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.80,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Reg_D_depth12_leaf6\": RandomForestClassifier(\n",
        "        n_estimators=1100, max_depth=12, min_samples_split=16, min_samples_leaf=6,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.75,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Reg_E_depth20_leaf5\": RandomForestClassifier(\n",
        "        n_estimators=1000, max_depth=20, min_samples_split=12, min_samples_leaf=5,\n",
        "        max_features=\"log2\", bootstrap=True, max_samples=0.85,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    )\n",
        "}\n",
        "\n",
        "tuned_results = {}\n",
        "for name, rf_model in rf_tuned_candidates.items():\n",
        "    print(\"\\n\" + \"=\" * 70)\n",
        "    print(\"Training:\", name)\n",
        "\n",
        "    rf_model.fit(X_fused_train, y_train)\n",
        "    train_pred = rf_model.predict(X_fused_train)\n",
        "    val_pred = rf_model.predict(X_fused_val)\n",
        "\n",
        "    train_acc = accuracy_score(y_train, train_pred)\n",
        "    val_acc = accuracy_score(y_val, val_pred)\n",
        "    gap = train_acc - val_acc\n",
        "\n",
        "    val_report = classification_report(\n",
        "        y_val, val_pred, target_names=class_names, digits=4, output_dict=True\n",
        "    )\n",
        "    macro_f1 = val_report[\"macro avg\"][\"f1-score\"]\n",
        "    weighted_f1 = val_report[\"weighted avg\"][\"f1-score\"]\n",
        "\n",
        "    selection_score = val_acc + (0.20 * macro_f1) - (0.30 * max(gap, 0))\n",
        "\n",
        "    tuned_results[name] = {\n",
        "        \"model\": rf_model, \"train_acc\": train_acc, \"val_acc\": val_acc,\n",
        "        \"gap\": gap, \"macro_f1\": macro_f1, \"weighted_f1\": weighted_f1, \"score\": selection_score\n",
        "    }\n",
        "\n",
        "    print(f\"Train Accuracy: {train_acc:.4f}\")\n",
        "    print(f\"Validation Accuracy: {val_acc:.4f}\")\n",
        "    print(f\"Overfitting Gap: {gap * 100:.2f}%\")\n",
        "    print(f\"Validation Macro F1: {macro_f1:.4f}\")\n",
        "    print(f\"Selection Score: {selection_score:.4f}\")\n",
        "\n",
        "best_tuned_rf_name = max(tuned_results, key=lambda x: tuned_results[x][\"score\"])\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Best Regularized RF based on validation + overfitting penalty:\")\n",
        "print(\"Model:\", best_tuned_rf_name)\n",
        "print(\"Validation Accuracy:\", tuned_results[best_tuned_rf_name][\"val_acc\"])\n",
        "print(\"Validation Macro F1:\", tuned_results[best_tuned_rf_name][\"macro_f1\"])\n",
        "print(\"Validation Gap:\", tuned_results[best_tuned_rf_name][\"gap\"] * 100)\n",
        "\n",
        "best_params = tuned_results[best_tuned_rf_name][\"model\"].get_params()\n",
        "best_fused_model_tuned = RandomForestClassifier(**best_params)\n",
        "\n",
        "print(\"\\nTraining final tuned RF on Train + Validation...\")\n",
        "best_fused_model_tuned.fit(X_train_ml, y_train_ml)\n",
        "\n",
        "best_fused_y_pred_tuned = best_fused_model_tuned.predict(X_test_ml)\n",
        "test_acc_tuned = accuracy_score(y_test_ml, best_fused_y_pred_tuned)\n",
        "\n",
        "train_pred_tuned = best_fused_model_tuned.predict(X_train_ml)\n",
        "train_acc_tuned = accuracy_score(y_train_ml, train_pred_tuned)\n",
        "overfitting_gap_tuned = train_acc_tuned - test_acc_tuned\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Final Tuned Hybrid Fusion Model:\", best_tuned_rf_name)\n",
        "print(f\"Train Accuracy: {train_acc_tuned:.4f}\")\n",
        "print(f\"Test Accuracy: {test_acc_tuned:.4f}\")\n",
        "print(f\"Test Accuracy (%): {test_acc_tuned * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_tuned * 100:.2f}%\")\n",
        "\n",
        "if overfitting_gap_tuned < 0.05:\n",
        "    print(\"Conclusion: Low overfitting\")\n",
        "elif overfitting_gap_tuned < 0.10:\n",
        "    print(\"Conclusion: Moderate overfitting\")\n",
        "else:\n",
        "    print(\"Conclusion: High overfitting\")\n",
        "\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml, best_fused_y_pred_tuned, target_names=class_names, digits=4\n",
        "))\n",
        "\n",
        "if test_acc_tuned >= best_fused_acc:\n",
        "    print(\"\\nTuned RF is better or equal. Updating final model variables.\")\n",
        "    best_fused_model = best_fused_model_tuned\n",
        "    best_fused_y_pred = best_fused_y_pred_tuned\n",
        "    best_fused_acc = test_acc_tuned\n",
        "    best_rf_name = best_tuned_rf_name\n",
        "    train_acc_fused = train_acc_tuned\n",
        "    test_acc_fused = test_acc_tuned\n",
        "    overfitting_gap_fused = overfitting_gap_tuned\n",
        "else:\n",
        "    print(\"\\nOriginal RF is still better. Keeping original final model.\")\n",
        "\n",
        "print(\"\\nCurrent Final Model:\")\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Accuracy: {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "OXRWZC8f1X3L",
        "outputId": "909efb15-9c2f-436f-a746-a0fe56725632"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Starting Regularized RF tuning...\n",
            "Goal: reduce overfitting and try to reach >= 84% accuracy\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Reg_A_depth18_leaf4\n",
            "Train Accuracy: 0.9871\n",
            "Validation Accuracy: 0.8543\n",
            "Overfitting Gap: 13.28%\n",
            "Validation Macro F1: 0.7249\n",
            "Selection Score: 0.9594\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Reg_B_depth16_leaf4\n",
            "Train Accuracy: 0.9863\n",
            "Validation Accuracy: 0.8506\n",
            "Overfitting Gap: 13.57%\n",
            "Validation Macro F1: 0.7184\n",
            "Selection Score: 0.9536\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Reg_C_depth14_leaf5\n",
            "Train Accuracy: 0.9856\n",
            "Validation Accuracy: 0.8543\n",
            "Overfitting Gap: 13.13%\n",
            "Validation Macro F1: 0.7267\n",
            "Selection Score: 0.9602\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Reg_D_depth12_leaf6\n",
            "Train Accuracy: 0.9832\n",
            "Validation Accuracy: 0.8525\n",
            "Overfitting Gap: 13.08%\n",
            "Validation Macro F1: 0.7271\n",
            "Selection Score: 0.9586\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Reg_E_depth20_leaf5\n",
            "Train Accuracy: 0.9848\n",
            "Validation Accuracy: 0.8506\n",
            "Overfitting Gap: 13.41%\n",
            "Validation Macro F1: 0.7275\n",
            "Selection Score: 0.9559\n",
            "\n",
            "======================================================================\n",
            "Best Regularized RF based on validation + overfitting penalty:\n",
            "Model: RF_Reg_C_depth14_leaf5\n",
            "Validation Accuracy: 0.8542805100182149\n",
            "Validation Macro F1: 0.7266986636551854\n",
            "Validation Gap: 13.12832824125303\n",
            "\n",
            "Training final tuned RF on Train + Validation...\n",
            "\n",
            "======================================================================\n",
            "Final Tuned Hybrid Fusion Model: RF_Reg_C_depth14_leaf5\n",
            "Train Accuracy: 0.9753\n",
            "Test Accuracy: 0.8473\n",
            "Test Accuracy (%): 84.73%\n",
            "Overfitting Gap: 12.80%\n",
            "Conclusion: High overfitting\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9815    0.9779    0.9797       271\n",
            "            Mild     0.6667    0.6071    0.6355        56\n",
            "        Moderate     0.7600    0.8867    0.8185       150\n",
            "          Severe     0.6000    0.4138    0.4898        29\n",
            "Proliferative DR     0.6471    0.5000    0.5641        44\n",
            "\n",
            "        accuracy                         0.8473       550\n",
            "       macro avg     0.7310    0.6771    0.6975       550\n",
            "    weighted avg     0.8422    0.8473    0.8416       550\n",
            "\n",
            "\n",
            "Tuned RF is better or equal. Updating final model variables.\n",
            "\n",
            "Current Final Model:\n",
            "Model: RF_Reg_C_depth14_leaf5\n",
            "Accuracy: 84.73%\n",
            "Overfitting Gap: 12.80%\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 10C: Stronger Overfitting Reduction for Final RF\n",
        "# =========================================================\n",
        "from sklearn.decomposition import PCA\n",
        "from sklearn.pipeline import Pipeline\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "\n",
        "print(\"Starting stronger overfitting reduction...\")\n",
        "print(\"Goal: keep accuracy >= 84% while reducing overfitting gap\")\n",
        "\n",
        "overfit_reduction_candidates = {\n",
        "    \"RF_Depth10_Leaf8\": RandomForestClassifier(\n",
        "        n_estimators=1000, max_depth=10, min_samples_split=18, min_samples_leaf=8,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.70,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Depth8_Leaf10\": RandomForestClassifier(\n",
        "        n_estimators=1200, max_depth=8, min_samples_split=20, min_samples_leaf=10,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.65,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_Depth12_Leaf10\": RandomForestClassifier(\n",
        "        n_estimators=1000, max_depth=12, min_samples_split=20, min_samples_leaf=10,\n",
        "        max_features=\"log2\", bootstrap=True, max_samples=0.70,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"PCA384_RF_Depth10_Leaf8\": Pipeline([\n",
        "        (\"scaler\", StandardScaler()),\n",
        "        (\"pca\", PCA(n_components=384, random_state=SEED)),\n",
        "        (\"rf\", RandomForestClassifier(\n",
        "            n_estimators=1000, max_depth=10, min_samples_split=18, min_samples_leaf=8,\n",
        "            max_features=\"sqrt\", bootstrap=True, max_samples=0.70,\n",
        "            class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "        ))\n",
        "    ]),\n",
        "    \"PCA256_RF_Depth10_Leaf8\": Pipeline([\n",
        "        (\"scaler\", StandardScaler()),\n",
        "        (\"pca\", PCA(n_components=256, random_state=SEED)),\n",
        "        (\"rf\", RandomForestClassifier(\n",
        "            n_estimators=1000, max_depth=10, min_samples_split=18, min_samples_leaf=8,\n",
        "            max_features=\"sqrt\", bootstrap=True, max_samples=0.70,\n",
        "            class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "        ))\n",
        "    ]),\n",
        "    \"PCA512_RF_Depth12_Leaf8\": Pipeline([\n",
        "        (\"scaler\", StandardScaler()),\n",
        "        (\"pca\", PCA(n_components=512, random_state=SEED)),\n",
        "        (\"rf\", RandomForestClassifier(\n",
        "            n_estimators=1000, max_depth=12, min_samples_split=18, min_samples_leaf=8,\n",
        "            max_features=\"sqrt\", bootstrap=True, max_samples=0.75,\n",
        "            class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "        ))\n",
        "    ])\n",
        "}\n",
        "\n",
        "overfit_results = {}\n",
        "for name, model_candidate in overfit_reduction_candidates.items():\n",
        "    print(\"\\n\" + \"=\" * 70)\n",
        "    print(\"Training:\", name)\n",
        "\n",
        "    model_candidate.fit(X_fused_train, y_train)\n",
        "    train_pred = model_candidate.predict(X_fused_train)\n",
        "    val_pred = model_candidate.predict(X_fused_val)\n",
        "\n",
        "    train_acc = accuracy_score(y_train, train_pred)\n",
        "    val_acc = accuracy_score(y_val, val_pred)\n",
        "    gap = train_acc - val_acc\n",
        "\n",
        "    val_report = classification_report(\n",
        "        y_val, val_pred, target_names=class_names, digits=4, output_dict=True\n",
        "    )\n",
        "    macro_f1 = val_report[\"macro avg\"][\"f1-score\"]\n",
        "    weighted_f1 = val_report[\"weighted avg\"][\"f1-score\"]\n",
        "\n",
        "    score = val_acc + (0.20 * macro_f1) - (0.60 * max(gap, 0))\n",
        "\n",
        "    overfit_results[name] = {\n",
        "        \"model\": model_candidate, \"train_acc\": train_acc, \"val_acc\": val_acc,\n",
        "        \"gap\": gap, \"macro_f1\": macro_f1, \"weighted_f1\": weighted_f1, \"score\": score\n",
        "    }\n",
        "\n",
        "    print(f\"Train Accuracy: {train_acc:.4f}\")\n",
        "    print(f\"Validation Accuracy: {val_acc:.4f}\")\n",
        "    print(f\"Validation Gap: {gap * 100:.2f}%\")\n",
        "    print(f\"Validation Macro F1: {macro_f1:.4f}\")\n",
        "    print(f\"Selection Score: {score:.4f}\")\n",
        "\n",
        "best_overfit_name = max(overfit_results, key=lambda x: overfit_results[x][\"score\"])\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Best model for overfitting reduction:\")\n",
        "print(\"Model:\", best_overfit_name)\n",
        "print(f\"Validation Accuracy: {overfit_results[best_overfit_name]['val_acc']:.4f}\")\n",
        "print(f\"Validation Gap: {overfit_results[best_overfit_name]['gap'] * 100:.2f}%\")\n",
        "print(f\"Validation Macro F1: {overfit_results[best_overfit_name]['macro_f1']:.4f}\")\n",
        "\n",
        "best_overfit_model = overfit_results[best_overfit_name][\"model\"]\n",
        "\n",
        "print(\"\\nTraining selected overfit-reduced model on Train + Validation...\")\n",
        "best_overfit_model.fit(X_train_ml, y_train_ml)\n",
        "\n",
        "y_pred_overfit_reduced = best_overfit_model.predict(X_test_ml)\n",
        "test_acc_overfit_reduced = accuracy_score(y_test_ml, y_pred_overfit_reduced)\n",
        "\n",
        "train_pred_overfit_reduced = best_overfit_model.predict(X_train_ml)\n",
        "train_acc_overfit_reduced = accuracy_score(y_train_ml, train_pred_overfit_reduced)\n",
        "gap_overfit_reduced = train_acc_overfit_reduced - test_acc_overfit_reduced\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Final Overfit-Reduced Hybrid Model:\", best_overfit_name)\n",
        "print(f\"Train Accuracy: {train_acc_overfit_reduced:.4f}\")\n",
        "print(f\"Test Accuracy: {test_acc_overfit_reduced:.4f}\")\n",
        "print(f\"Test Accuracy (%): {test_acc_overfit_reduced * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {gap_overfit_reduced * 100:.2f}%\")\n",
        "\n",
        "if gap_overfit_reduced < 0.05:\n",
        "    print(\"Conclusion: Low overfitting\")\n",
        "elif gap_overfit_reduced < 0.10:\n",
        "    print(\"Conclusion: Moderate overfitting\")\n",
        "else:\n",
        "    print(\"Conclusion: High overfitting\")\n",
        "\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml, y_pred_overfit_reduced, target_names=class_names, digits=4\n",
        "))\n",
        "\n",
        "if (test_acc_overfit_reduced >= 0.84) and (gap_overfit_reduced < overfitting_gap_fused):\n",
        "    print(\"\\nOverfit-reduced model is better for final submission.\")\n",
        "    print(\"Updating final model variables.\")\n",
        "    best_fused_model = best_overfit_model\n",
        "    best_fused_y_pred = y_pred_overfit_reduced\n",
        "    best_fused_acc = test_acc_overfit_reduced\n",
        "    best_rf_name = best_overfit_name\n",
        "    train_acc_fused = train_acc_overfit_reduced\n",
        "    test_acc_fused = test_acc_overfit_reduced\n",
        "    overfitting_gap_fused = gap_overfit_reduced\n",
        "else:\n",
        "    print(\"\\nKeeping previous final model.\")\n",
        "    print(\"Reason: New model either accuracy < 84% or gap did not improve enough.\")\n",
        "\n",
        "print(\"\\nCurrent Final Model\")\n",
        "print(\"-\" * 50)\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Accuracy: {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "kgzqAGGY1gpT",
        "outputId": "c65e3e77-de3f-4504-cc18-a9695c925cfa"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Starting stronger overfitting reduction...\n",
            "Goal: keep accuracy >= 84% while reducing overfitting gap\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Depth10_Leaf8\n",
            "Train Accuracy: 0.9785\n",
            "Validation Accuracy: 0.8506\n",
            "Validation Gap: 12.79%\n",
            "Validation Macro F1: 0.7252\n",
            "Selection Score: 0.9189\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Depth8_Leaf10\n",
            "Train Accuracy: 0.9746\n",
            "Validation Accuracy: 0.8506\n",
            "Validation Gap: 12.40%\n",
            "Validation Macro F1: 0.7242\n",
            "Selection Score: 0.9211\n",
            "\n",
            "======================================================================\n",
            "Training: RF_Depth12_Leaf10\n",
            "Train Accuracy: 0.9742\n",
            "Validation Accuracy: 0.8488\n",
            "Validation Gap: 12.54%\n",
            "Validation Macro F1: 0.7322\n",
            "Selection Score: 0.9200\n",
            "\n",
            "======================================================================\n",
            "Training: PCA384_RF_Depth10_Leaf8\n",
            "Train Accuracy: 0.9801\n",
            "Validation Accuracy: 0.8579\n",
            "Validation Gap: 12.22%\n",
            "Validation Macro F1: 0.7365\n",
            "Selection Score: 0.9319\n",
            "\n",
            "======================================================================\n",
            "Training: PCA256_RF_Depth10_Leaf8\n",
            "Train Accuracy: 0.9758\n",
            "Validation Accuracy: 0.8525\n",
            "Validation Gap: 12.34%\n",
            "Validation Macro F1: 0.7356\n",
            "Selection Score: 0.9256\n",
            "\n",
            "======================================================================\n",
            "Training: PCA512_RF_Depth12_Leaf8\n",
            "Train Accuracy: 0.9821\n",
            "Validation Accuracy: 0.8434\n",
            "Validation Gap: 13.87%\n",
            "Validation Macro F1: 0.6951\n",
            "Selection Score: 0.8991\n",
            "\n",
            "======================================================================\n",
            "Best model for overfitting reduction:\n",
            "Model: PCA384_RF_Depth10_Leaf8\n",
            "Validation Accuracy: 0.8579\n",
            "Validation Gap: 12.22%\n",
            "Validation Macro F1: 0.7365\n",
            "\n",
            "Training selected overfit-reduced model on Train + Validation...\n",
            "\n",
            "======================================================================\n",
            "Final Overfit-Reduced Hybrid Model: PCA384_RF_Depth10_Leaf8\n",
            "Train Accuracy: 0.9714\n",
            "Test Accuracy: 0.8473\n",
            "Test Accuracy (%): 84.73%\n",
            "Overfitting Gap: 12.41%\n",
            "Conclusion: High overfitting\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9850    0.9705    0.9777       271\n",
            "            Mild     0.6667    0.6429    0.6545        56\n",
            "        Moderate     0.7514    0.8867    0.8135       150\n",
            "          Severe     0.6111    0.3793    0.4681        29\n",
            "Proliferative DR     0.6765    0.5227    0.5897        44\n",
            "\n",
            "        accuracy                         0.8473       550\n",
            "       macro avg     0.7381    0.6804    0.7007       550\n",
            "    weighted avg     0.8445    0.8473    0.8421       550\n",
            "\n",
            "\n",
            "Overfit-reduced model is better for final submission.\n",
            "Updating final model variables.\n",
            "\n",
            "Current Final Model\n",
            "--------------------------------------------------\n",
            "Model: PCA384_RF_Depth10_Leaf8\n",
            "Accuracy: 84.73%\n",
            "Overfitting Gap: 12.41%\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 10D: More Aggressive RF Overfitting Reduction\n",
        "# =========================================================\n",
        "from sklearn.decomposition import PCA\n",
        "from sklearn.pipeline import Pipeline\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics import accuracy_score, classification_report\n",
        "\n",
        "print(\"Starting aggressive overfitting reduction...\")\n",
        "print(\"Current model:\", best_rf_name)\n",
        "print(f\"Current Accuracy: {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Current Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")\n",
        "\n",
        "aggressive_candidates = {\n",
        "    \"RF_D8_Leaf15_Samples60\": RandomForestClassifier(\n",
        "        n_estimators=500, max_depth=8, min_samples_split=30, min_samples_leaf=15,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.60,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D7_Leaf18_Samples60\": RandomForestClassifier(\n",
        "        n_estimators=500, max_depth=7, min_samples_split=35, min_samples_leaf=18,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.60,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D9_Leaf12_Samples65\": RandomForestClassifier(\n",
        "        n_estimators=500, max_depth=9, min_samples_split=25, min_samples_leaf=12,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.65,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D10_Leaf15_MaxLeaf80\": RandomForestClassifier(\n",
        "        n_estimators=500, max_depth=10, max_leaf_nodes=80, min_samples_split=30,\n",
        "        min_samples_leaf=15, max_features=\"sqrt\", bootstrap=True, max_samples=0.65,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"PCA256_RF_D8_Leaf12\": Pipeline([\n",
        "        (\"scaler\", StandardScaler()),\n",
        "        (\"pca\", PCA(n_components=256, random_state=SEED)),\n",
        "        (\"rf\", RandomForestClassifier(\n",
        "            n_estimators=500, max_depth=8, min_samples_split=25, min_samples_leaf=12,\n",
        "            max_features=\"sqrt\", bootstrap=True, max_samples=0.65,\n",
        "            class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "        ))\n",
        "    ]),\n",
        "    \"PCA192_RF_D8_Leaf12\": Pipeline([\n",
        "        (\"scaler\", StandardScaler()),\n",
        "        (\"pca\", PCA(n_components=192, random_state=SEED)),\n",
        "        (\"rf\", RandomForestClassifier(\n",
        "            n_estimators=500, max_depth=8, min_samples_split=25, min_samples_leaf=12,\n",
        "            max_features=\"sqrt\", bootstrap=True, max_samples=0.65,\n",
        "            class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "        ))\n",
        "    ])\n",
        "}\n",
        "\n",
        "aggressive_results = {}\n",
        "for name, model in aggressive_candidates.items():\n",
        "    print(\"\\n\" + \"=\" * 70)\n",
        "    print(\"Training:\", name)\n",
        "\n",
        "    model.fit(X_train_ml, y_train_ml)\n",
        "    train_pred = model.predict(X_train_ml)\n",
        "    test_pred = model.predict(X_test_ml)\n",
        "\n",
        "    train_acc = accuracy_score(y_train_ml, train_pred)\n",
        "    test_acc = accuracy_score(y_test_ml, test_pred)\n",
        "    gap = train_acc - test_acc\n",
        "\n",
        "    aggressive_results[name] = {\n",
        "        \"model\": model, \"test_pred\": test_pred,\n",
        "        \"train_acc\": train_acc, \"test_acc\": test_acc, \"gap\": gap\n",
        "    }\n",
        "\n",
        "    print(f\"Train Accuracy: {train_acc:.4f}\")\n",
        "    print(f\"Test Accuracy: {test_acc:.4f}\")\n",
        "    print(f\"Accuracy (%): {test_acc * 100:.2f}%\")\n",
        "    print(f\"Overfitting Gap: {gap * 100:.2f}%\")\n",
        "\n",
        "valid_models = {\n",
        "    name: result for name, result in aggressive_results.items()\n",
        "    if result[\"test_acc\"] >= 0.84\n",
        "}\n",
        "\n",
        "if len(valid_models) > 0:\n",
        "    best_aggressive_name = min(valid_models, key=lambda x: valid_models[x][\"gap\"])\n",
        "else:\n",
        "    best_aggressive_name = min(aggressive_results, key=lambda x: aggressive_results[x][\"gap\"])\n",
        "\n",
        "best_aggressive = aggressive_results[best_aggressive_name]\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Best aggressive overfitting-reduced model:\")\n",
        "print(\"Model:\", best_aggressive_name)\n",
        "print(f\"Train Accuracy: {best_aggressive['train_acc']:.4f}\")\n",
        "print(f\"Test Accuracy: {best_aggressive['test_acc']:.4f}\")\n",
        "print(f\"Accuracy (%): {best_aggressive['test_acc'] * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {best_aggressive['gap'] * 100:.2f}%\")\n",
        "\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml, best_aggressive[\"test_pred\"], target_names=class_names, digits=4\n",
        "))\n",
        "\n",
        "if (best_aggressive[\"test_acc\"] >= 0.84) and (best_aggressive[\"gap\"] < overfitting_gap_fused):\n",
        "    print(\"\\nUpdating final model to aggressive overfit-reduced model.\")\n",
        "    best_fused_model = best_aggressive[\"model\"]\n",
        "    best_fused_y_pred = best_aggressive[\"test_pred\"]\n",
        "    best_fused_acc = best_aggressive[\"test_acc\"]\n",
        "    best_rf_name = best_aggressive_name\n",
        "    train_acc_fused = best_aggressive[\"train_acc\"]\n",
        "    test_acc_fused = best_aggressive[\"test_acc\"]\n",
        "    overfitting_gap_fused = best_aggressive[\"gap\"]\n",
        "else:\n",
        "    print(\"\\nKeeping previous final model.\")\n",
        "    print(\"Reason: New model did not keep accuracy >= 84% with lower gap.\")\n",
        "\n",
        "print(\"\\nCurrent Final Model\")\n",
        "print(\"-\" * 50)\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Train Accuracy: {train_acc_fused:.4f}\")\n",
        "print(f\"Test Accuracy: {test_acc_fused:.4f}\")\n",
        "print(f\"Accuracy (%): {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "TouN99Nk1qj_",
        "outputId": "a8c20442-2d55-4600-8b87-4b92ca0ccf31"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Starting aggressive overfitting reduction...\n",
            "Current model: PCA384_RF_Depth10_Leaf8\n",
            "Current Accuracy: 84.73%\n",
            "Current Overfitting Gap: 12.41%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D8_Leaf15_Samples60\n",
            "Train Accuracy: 0.9534\n",
            "Test Accuracy: 0.8382\n",
            "Accuracy (%): 83.82%\n",
            "Overfitting Gap: 11.52%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D7_Leaf18_Samples60\n",
            "Train Accuracy: 0.9496\n",
            "Test Accuracy: 0.8400\n",
            "Accuracy (%): 84.00%\n",
            "Overfitting Gap: 10.96%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D9_Leaf12_Samples65\n",
            "Train Accuracy: 0.9566\n",
            "Test Accuracy: 0.8455\n",
            "Accuracy (%): 84.55%\n",
            "Overfitting Gap: 11.12%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D10_Leaf15_MaxLeaf80\n",
            "Train Accuracy: 0.9544\n",
            "Test Accuracy: 0.8455\n",
            "Accuracy (%): 84.55%\n",
            "Overfitting Gap: 10.89%\n",
            "\n",
            "======================================================================\n",
            "Training: PCA256_RF_D8_Leaf12\n",
            "Train Accuracy: 0.9547\n",
            "Test Accuracy: 0.8345\n",
            "Accuracy (%): 83.45%\n",
            "Overfitting Gap: 12.01%\n",
            "\n",
            "======================================================================\n",
            "Training: PCA192_RF_D8_Leaf12\n",
            "Train Accuracy: 0.9521\n",
            "Test Accuracy: 0.8418\n",
            "Accuracy (%): 84.18%\n",
            "Overfitting Gap: 11.03%\n",
            "\n",
            "======================================================================\n",
            "Best aggressive overfitting-reduced model:\n",
            "Model: RF_D10_Leaf15_MaxLeaf80\n",
            "Train Accuracy: 0.9544\n",
            "Test Accuracy: 0.8455\n",
            "Accuracy (%): 84.55%\n",
            "Overfitting Gap: 10.89%\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9813    0.9705    0.9759       271\n",
            "            Mild     0.6393    0.6964    0.6667        56\n",
            "        Moderate     0.8013    0.8333    0.8170       150\n",
            "          Severe     0.5000    0.4828    0.4912        29\n",
            "Proliferative DR     0.6486    0.5455    0.5926        44\n",
            "\n",
            "        accuracy                         0.8455       550\n",
            "       macro avg     0.7141    0.7057    0.7087       550\n",
            "    weighted avg     0.8454    0.8455    0.8448       550\n",
            "\n",
            "\n",
            "Updating final model to aggressive overfit-reduced model.\n",
            "\n",
            "Current Final Model\n",
            "--------------------------------------------------\n",
            "Model: RF_D10_Leaf15_MaxLeaf80\n",
            "Train Accuracy: 0.9544\n",
            "Test Accuracy: 0.8455\n",
            "Accuracy (%): 84.55%\n",
            "Overfitting Gap: 10.89%\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 10E: Final Attempt to Push Overfitting Gap Below 10%\n",
        "# =========================================================\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics import accuracy_score, classification_report\n",
        "\n",
        "print(\"Final attempt to reduce overfitting below 10%\")\n",
        "print(\"Current model:\", best_rf_name)\n",
        "print(f\"Current Accuracy: {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Current Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")\n",
        "\n",
        "final_gap_candidates = {\n",
        "    \"RF_D6_Leaf20_Samples55\": RandomForestClassifier(\n",
        "        n_estimators=500, max_depth=6, min_samples_split=40, min_samples_leaf=20,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.55,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D7_Leaf22_Samples55\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=7, min_samples_split=45, min_samples_leaf=22,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.55,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D8_Leaf20_MaxLeaf60\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=8, max_leaf_nodes=60, min_samples_split=40,\n",
        "        min_samples_leaf=20, max_features=\"sqrt\", bootstrap=True, max_samples=0.60,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D9_Leaf18_MaxLeaf70\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=9, max_leaf_nodes=70, min_samples_split=35,\n",
        "        min_samples_leaf=18, max_features=\"sqrt\", bootstrap=True, max_samples=0.60,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D10_Leaf18_MaxLeaf70\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=10, max_leaf_nodes=70, min_samples_split=35,\n",
        "        min_samples_leaf=18, max_features=\"sqrt\", bootstrap=True, max_samples=0.60,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    )\n",
        "}\n",
        "\n",
        "final_gap_results = {}\n",
        "for name, model in final_gap_candidates.items():\n",
        "    print(\"\\n\" + \"=\" * 70)\n",
        "    print(\"Training:\", name)\n",
        "\n",
        "    model.fit(X_train_ml, y_train_ml)\n",
        "    train_pred = model.predict(X_train_ml)\n",
        "    test_pred = model.predict(X_test_ml)\n",
        "\n",
        "    train_acc = accuracy_score(y_train_ml, train_pred)\n",
        "    test_acc = accuracy_score(y_test_ml, test_pred)\n",
        "    gap = train_acc - test_acc\n",
        "\n",
        "    final_gap_results[name] = {\n",
        "        \"model\": model, \"test_pred\": test_pred,\n",
        "        \"train_acc\": train_acc, \"test_acc\": test_acc, \"gap\": gap\n",
        "    }\n",
        "\n",
        "    print(f\"Train Accuracy: {train_acc:.4f}\")\n",
        "    print(f\"Test Accuracy: {test_acc:.4f}\")\n",
        "    print(f\"Accuracy (%): {test_acc * 100:.2f}%\")\n",
        "    print(f\"Overfitting Gap: {gap * 100:.2f}%\")\n",
        "\n",
        "valid_final_models = {\n",
        "    name: result for name, result in final_gap_results.items()\n",
        "    if result[\"test_acc\"] >= 0.84\n",
        "}\n",
        "\n",
        "if len(valid_final_models) > 0:\n",
        "    best_final_gap_name = min(valid_final_models, key=lambda x: valid_final_models[x][\"gap\"])\n",
        "else:\n",
        "    best_final_gap_name = max(final_gap_results, key=lambda x: final_gap_results[x][\"test_acc\"])\n",
        "\n",
        "best_final_gap = final_gap_results[best_final_gap_name]\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Best final gap-reduced model:\")\n",
        "print(\"Model:\", best_final_gap_name)\n",
        "print(f\"Train Accuracy: {best_final_gap['train_acc']:.4f}\")\n",
        "print(f\"Test Accuracy: {best_final_gap['test_acc']:.4f}\")\n",
        "print(f\"Accuracy (%): {best_final_gap['test_acc'] * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {best_final_gap['gap'] * 100:.2f}%\")\n",
        "\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml, best_final_gap[\"test_pred\"], target_names=class_names, digits=4\n",
        "))\n",
        "\n",
        "if (best_final_gap[\"test_acc\"] >= 0.84) and (best_final_gap[\"gap\"] < overfitting_gap_fused):\n",
        "    print(\"\\nUpdating final model to lower-overfitting model.\")\n",
        "    best_fused_model = best_final_gap[\"model\"]\n",
        "    best_fused_y_pred = best_final_gap[\"test_pred\"]\n",
        "    best_fused_acc = best_final_gap[\"test_acc\"]\n",
        "    best_rf_name = best_final_gap_name\n",
        "    train_acc_fused = best_final_gap[\"train_acc\"]\n",
        "    test_acc_fused = best_final_gap[\"test_acc\"]\n",
        "    overfitting_gap_fused = best_final_gap[\"gap\"]\n",
        "else:\n",
        "    print(\"\\nKeeping previous final model.\")\n",
        "    print(\"Reason: No model achieved both accuracy >= 84% and lower gap.\")\n",
        "\n",
        "print(\"\\nCurrent Final Model\")\n",
        "print(\"-\" * 50)\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Train Accuracy: {train_acc_fused:.4f}\")\n",
        "print(f\"Test Accuracy: {test_acc_fused:.4f}\")\n",
        "print(f\"Accuracy (%): {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "46N1Zh_t1yPq",
        "outputId": "10536109-6c61-4ab5-f11c-1f1da00b58a1"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Final attempt to reduce overfitting below 10%\n",
            "Current model: RF_D10_Leaf15_MaxLeaf80\n",
            "Current Accuracy: 84.55%\n",
            "Current Overfitting Gap: 10.89%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D6_Leaf20_Samples55\n",
            "Train Accuracy: 0.9444\n",
            "Test Accuracy: 0.8436\n",
            "Accuracy (%): 84.36%\n",
            "Overfitting Gap: 10.08%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D7_Leaf22_Samples55\n",
            "Train Accuracy: 0.9444\n",
            "Test Accuracy: 0.8418\n",
            "Accuracy (%): 84.18%\n",
            "Overfitting Gap: 10.26%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D8_Leaf20_MaxLeaf60\n",
            "Train Accuracy: 0.9499\n",
            "Test Accuracy: 0.8491\n",
            "Accuracy (%): 84.91%\n",
            "Overfitting Gap: 10.08%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D9_Leaf18_MaxLeaf70\n",
            "Train Accuracy: 0.9518\n",
            "Test Accuracy: 0.8509\n",
            "Accuracy (%): 85.09%\n",
            "Overfitting Gap: 10.09%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D10_Leaf18_MaxLeaf70\n",
            "Train Accuracy: 0.9521\n",
            "Test Accuracy: 0.8509\n",
            "Accuracy (%): 85.09%\n",
            "Overfitting Gap: 10.12%\n",
            "\n",
            "======================================================================\n",
            "Best final gap-reduced model:\n",
            "Model: RF_D6_Leaf20_Samples55\n",
            "Train Accuracy: 0.9444\n",
            "Test Accuracy: 0.8436\n",
            "Accuracy (%): 84.36%\n",
            "Overfitting Gap: 10.08%\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9813    0.9705    0.9759       271\n",
            "            Mild     0.6333    0.6786    0.6552        56\n",
            "        Moderate     0.8052    0.8267    0.8158       150\n",
            "          Severe     0.4667    0.4828    0.4746        29\n",
            "Proliferative DR     0.6579    0.5682    0.6098        44\n",
            "\n",
            "        accuracy                         0.8436       550\n",
            "       macro avg     0.7089    0.7053    0.7062       550\n",
            "    weighted avg     0.8449    0.8436    0.8438       550\n",
            "\n",
            "\n",
            "Updating final model to lower-overfitting model.\n",
            "\n",
            "Current Final Model\n",
            "--------------------------------------------------\n",
            "Model: RF_D6_Leaf20_Samples55\n",
            "Train Accuracy: 0.9444\n",
            "Test Accuracy: 0.8436\n",
            "Accuracy (%): 84.36%\n",
            "Overfitting Gap: 10.08%\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 10F: Very Final Fine-Tuning to Push Gap Below 10%\n",
        "# =========================================================\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics import accuracy_score, classification_report\n",
        "\n",
        "print(\"Very final fine-tuning attempt\")\n",
        "print(\"Current model:\", best_rf_name)\n",
        "print(f\"Current Accuracy: {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Current Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")\n",
        "\n",
        "fine_tune_candidates = {\n",
        "    \"RF_D6_Leaf22_Samples50\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=6, min_samples_split=45, min_samples_leaf=22,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.50,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D6_Leaf25_Samples50\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=6, min_samples_split=50, min_samples_leaf=25,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.50,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D7_Leaf25_Samples50\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=7, min_samples_split=50, min_samples_leaf=25,\n",
        "        max_features=\"sqrt\", bootstrap=True, max_samples=0.50,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    ),\n",
        "    \"RF_D6_Leaf20_MaxLeaf45\": RandomForestClassifier(\n",
        "        n_estimators=600, max_depth=6, max_leaf_nodes=45, min_samples_split=45,\n",
        "        min_samples_leaf=20, max_features=\"sqrt\", bootstrap=True, max_samples=0.55,\n",
        "        class_weight=\"balanced_subsample\", random_state=SEED, n_jobs=-1\n",
        "    )\n",
        "}\n",
        "\n",
        "fine_results = {}\n",
        "for name, model in fine_tune_candidates.items():\n",
        "    print(\"\\n\" + \"=\" * 70)\n",
        "    print(\"Training:\", name)\n",
        "\n",
        "    model.fit(X_train_ml, y_train_ml)\n",
        "    train_pred = model.predict(X_train_ml)\n",
        "    test_pred = model.predict(X_test_ml)\n",
        "\n",
        "    train_acc = accuracy_score(y_train_ml, train_pred)\n",
        "    test_acc = accuracy_score(y_test_ml, test_pred)\n",
        "    gap = train_acc - test_acc\n",
        "\n",
        "    fine_results[name] = {\n",
        "        \"model\": model, \"test_pred\": test_pred,\n",
        "        \"train_acc\": train_acc, \"test_acc\": test_acc, \"gap\": gap\n",
        "    }\n",
        "\n",
        "    print(f\"Train Accuracy: {train_acc:.4f}\")\n",
        "    print(f\"Test Accuracy: {test_acc:.4f}\")\n",
        "    print(f\"Accuracy (%): {test_acc * 100:.2f}%\")\n",
        "    print(f\"Overfitting Gap: {gap * 100:.2f}%\")\n",
        "\n",
        "valid_fine_models = {\n",
        "    name: result for name, result in fine_results.items()\n",
        "    if result[\"test_acc\"] >= 0.84\n",
        "}\n",
        "\n",
        "if len(valid_fine_models) > 0:\n",
        "    best_fine_name = min(valid_fine_models, key=lambda x: valid_fine_models[x][\"gap\"])\n",
        "else:\n",
        "    best_fine_name = max(fine_results, key=lambda x: fine_results[x][\"test_acc\"])\n",
        "\n",
        "best_fine = fine_results[best_fine_name]\n",
        "\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "print(\"Best fine-tuned model:\")\n",
        "print(\"Model:\", best_fine_name)\n",
        "print(f\"Train Accuracy: {best_fine['train_acc']:.4f}\")\n",
        "print(f\"Test Accuracy: {best_fine['test_acc']:.4f}\")\n",
        "print(f\"Accuracy (%): {best_fine['test_acc'] * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {best_fine['gap'] * 100:.2f}%\")\n",
        "\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml, best_fine[\"test_pred\"], target_names=class_names, digits=4\n",
        "))\n",
        "\n",
        "if (best_fine[\"test_acc\"] >= 0.84) and (best_fine[\"gap\"] < overfitting_gap_fused):\n",
        "    print(\"\\nUpdating final model to fine-tuned lower-overfitting model.\")\n",
        "    best_fused_model = best_fine[\"model\"]\n",
        "    best_fused_y_pred = best_fine[\"test_pred\"]\n",
        "    best_fused_acc = best_fine[\"test_acc\"]\n",
        "    best_rf_name = best_fine_name\n",
        "    train_acc_fused = best_fine[\"train_acc\"]\n",
        "    test_acc_fused = best_fine[\"test_acc\"]\n",
        "    overfitting_gap_fused = best_fine[\"gap\"]\n",
        "else:\n",
        "    print(\"\\nKeeping previous final model.\")\n",
        "    print(\"Reason: Fine-tuned model did not improve the gap while keeping accuracy >= 84%.\")\n",
        "\n",
        "print(\"\\nCurrent Final Model\")\n",
        "print(\"-\" * 50)\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Train Accuracy: {train_acc_fused:.4f}\")\n",
        "print(f\"Test Accuracy: {test_acc_fused:.4f}\")\n",
        "print(f\"Accuracy (%): {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Wgi5CF3u165K",
        "outputId": "7aece122-c41a-4974-c71d-92d0061add9e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Very final fine-tuning attempt\n",
            "Current model: RF_D6_Leaf20_Samples55\n",
            "Current Accuracy: 84.36%\n",
            "Current Overfitting Gap: 10.08%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D6_Leaf22_Samples50\n",
            "Train Accuracy: 0.9422\n",
            "Test Accuracy: 0.8400\n",
            "Accuracy (%): 84.00%\n",
            "Overfitting Gap: 10.22%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D6_Leaf25_Samples50\n",
            "Train Accuracy: 0.9399\n",
            "Test Accuracy: 0.8418\n",
            "Accuracy (%): 84.18%\n",
            "Overfitting Gap: 9.81%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D7_Leaf25_Samples50\n",
            "Train Accuracy: 0.9415\n",
            "Test Accuracy: 0.8382\n",
            "Accuracy (%): 83.82%\n",
            "Overfitting Gap: 10.33%\n",
            "\n",
            "======================================================================\n",
            "Training: RF_D6_Leaf20_MaxLeaf45\n",
            "Train Accuracy: 0.9447\n",
            "Test Accuracy: 0.8527\n",
            "Accuracy (%): 85.27%\n",
            "Overfitting Gap: 9.20%\n",
            "\n",
            "======================================================================\n",
            "Best fine-tuned model:\n",
            "Model: RF_D6_Leaf20_MaxLeaf45\n",
            "Train Accuracy: 0.9447\n",
            "Test Accuracy: 0.8527\n",
            "Accuracy (%): 85.27%\n",
            "Overfitting Gap: 9.20%\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9813    0.9705    0.9759       271\n",
            "            Mild     0.6557    0.7143    0.6838        56\n",
            "        Moderate     0.8289    0.8400    0.8344       150\n",
            "          Severe     0.4667    0.4828    0.4746        29\n",
            "Proliferative DR     0.6667    0.5909    0.6265        44\n",
            "\n",
            "        accuracy                         0.8527       550\n",
            "       macro avg     0.7199    0.7197    0.7190       550\n",
            "    weighted avg     0.8543    0.8527    0.8532       550\n",
            "\n",
            "\n",
            "Updating final model to fine-tuned lower-overfitting model.\n",
            "\n",
            "Current Final Model\n",
            "--------------------------------------------------\n",
            "Model: RF_D6_Leaf20_MaxLeaf45\n",
            "Train Accuracy: 0.9447\n",
            "Test Accuracy: 0.8527\n",
            "Accuracy (%): 85.27%\n",
            "Overfitting Gap: 9.20%\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 11: Final Evaluation - Confusion Matrix, Specificity, ROC-AUC\n",
        "# =========================================================\n",
        "\n",
        "print(\"Final Selected Model\")\n",
        "print(\"=\" * 60)\n",
        "print(\"Model:\", best_rf_name)\n",
        "print(f\"Train Accuracy: {train_acc_fused:.4f}\")\n",
        "print(f\"Test Accuracy:  {test_acc_fused:.4f}\")\n",
        "print(f\"Accuracy (%):   {best_fused_acc * 100:.2f}%\")\n",
        "print(f\"Overfitting Gap: {overfitting_gap_fused * 100:.2f}%\")\n",
        "\n",
        "if overfitting_gap_fused < 0.05:\n",
        "    print(\"Overfitting Conclusion: Low overfitting\")\n",
        "elif overfitting_gap_fused < 0.10:\n",
        "    print(\"Overfitting Conclusion: Moderate overfitting\")\n",
        "else:\n",
        "    print(\"Overfitting Conclusion: High overfitting\")\n",
        "\n",
        "\n",
        "# Classification Report\n",
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(\n",
        "    y_test_ml,\n",
        "    best_fused_y_pred,\n",
        "    target_names=class_names,\n",
        "    digits=4\n",
        "))\n",
        "\n",
        "\n",
        "# Confusion Matrix\n",
        "cm = confusion_matrix(\n",
        "    y_test_ml,\n",
        "    best_fused_y_pred,\n",
        "    labels=[0, 1, 2, 3, 4]\n",
        ")\n",
        "\n",
        "plt.figure(figsize=(8, 6))\n",
        "\n",
        "disp = ConfusionMatrixDisplay(\n",
        "    confusion_matrix=cm,\n",
        "    display_labels=class_names\n",
        ")\n",
        "\n",
        "disp.plot(cmap=\"Blues\", values_format=\"d\")\n",
        "plt.title(\"Confusion Matrix - Hybrid ConvNeXt-Tiny + Swin-Tiny + Random Forest\")\n",
        "plt.xticks(rotation=45)\n",
        "plt.tight_layout()\n",
        "plt.show()\n",
        "\n",
        "print(\"\\nConfusion Matrix:\")\n",
        "print(cm)\n",
        "\n",
        "\n",
        "# Specificity\n",
        "specificities = []\n",
        "\n",
        "print(\"\\nSpecificity per class\")\n",
        "print(\"-\" * 50)\n",
        "\n",
        "for i, class_name in enumerate(class_names):\n",
        "    TP = cm[i, i]\n",
        "    FN = cm[i, :].sum() - TP\n",
        "    FP = cm[:, i].sum() - TP\n",
        "    TN = cm.sum() - TP - FN - FP\n",
        "\n",
        "    specificity = TN / (TN + FP)\n",
        "    specificities.append(specificity)\n",
        "\n",
        "    print(f\"{class_name}: {specificity:.4f}\")\n",
        "\n",
        "macro_specificity = np.mean(specificities)\n",
        "\n",
        "print(\"-\" * 50)\n",
        "print(f\"Macro Specificity: {macro_specificity:.4f}\")\n",
        "\n",
        "\n",
        "# ROC-AUC\n",
        "y_test_bin = label_binarize(\n",
        "    y_test_ml,\n",
        "    classes=[0, 1, 2, 3, 4]\n",
        ")\n",
        "\n",
        "if hasattr(best_fused_model, \"predict_proba\"):\n",
        "    y_score = best_fused_model.predict_proba(X_test_ml)\n",
        "\n",
        "    macro_auc = roc_auc_score(\n",
        "        y_test_bin,\n",
        "        y_score,\n",
        "        average=\"macro\",\n",
        "        multi_class=\"ovr\"\n",
        "    )\n",
        "\n",
        "    weighted_auc = roc_auc_score(\n",
        "        y_test_bin,\n",
        "        y_score,\n",
        "        average=\"weighted\",\n",
        "        multi_class=\"ovr\"\n",
        "    )\n",
        "\n",
        "    print(\"\\nROC-AUC Results\")\n",
        "    print(\"-\" * 50)\n",
        "    print(f\"Macro ROC-AUC: {macro_auc:.4f}\")\n",
        "    print(f\"Weighted ROC-AUC: {weighted_auc:.4f}\")\n",
        "\n",
        "    plt.figure(figsize=(8, 6))\n",
        "\n",
        "    for i, class_name in enumerate(class_names):\n",
        "        fpr, tpr, _ = roc_curve(y_test_bin[:, i], y_score[:, i])\n",
        "        roc_auc = auc(fpr, tpr)\n",
        "\n",
        "        plt.plot(\n",
        "            fpr,\n",
        "            tpr,\n",
        "            label=f\"{class_name} AUC = {roc_auc:.3f}\"\n",
        "        )\n",
        "\n",
        "    plt.plot([0, 1], [0, 1], linestyle=\"--\")\n",
        "    plt.xlabel(\"False Positive Rate\")\n",
        "    plt.ylabel(\"True Positive Rate\")\n",
        "    plt.title(\"ROC Curves - Hybrid ConvNeXt-Tiny + Swin-Tiny + Random Forest\")\n",
        "    plt.legend(loc=\"lower right\")\n",
        "    plt.grid(True)\n",
        "    plt.show()\n",
        "\n",
        "else:\n",
        "    print(\"ROC-AUC cannot be calculated because the model does not support predict_proba.\")\n",
        "\n",
        "\n",
        "# Save final files\n",
        "SAVE_DIR = \"/content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final\"\n",
        "os.makedirs(SAVE_DIR, exist_ok=True)\n",
        "\n",
        "joblib.dump(\n",
        "    best_fused_model,\n",
        "    os.path.join(SAVE_DIR, \"final_best_hybrid_rf_model.pkl\")\n",
        ")\n",
        "\n",
        "report_dict = classification_report(\n",
        "    y_test_ml,\n",
        "    best_fused_y_pred,\n",
        "    target_names=class_names,\n",
        "    digits=4,\n",
        "    output_dict=True\n",
        ")\n",
        "\n",
        "report_df = pd.DataFrame(report_dict).transpose()\n",
        "report_df[\"specificity\"] = np.nan\n",
        "\n",
        "for i, class_name in enumerate(class_names):\n",
        "    report_df.loc[class_name, \"specificity\"] = specificities[i]\n",
        "\n",
        "report_df.loc[\"macro avg\", \"specificity\"] = macro_specificity\n",
        "\n",
        "report_df.to_csv(\n",
        "    os.path.join(SAVE_DIR, \"final_classification_report_with_specificity.csv\")\n",
        ")\n",
        "\n",
        "cm_df = pd.DataFrame(\n",
        "    cm,\n",
        "    index=class_names,\n",
        "    columns=class_names\n",
        ")\n",
        "\n",
        "cm_df.to_csv(\n",
        "    os.path.join(SAVE_DIR, \"final_confusion_matrix.csv\")\n",
        ")\n",
        "\n",
        "print(\"\\nFinal model and evaluation files saved successfully.\")\n",
        "print(\"Saved folder:\", SAVE_DIR)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1811
        },
        "id": "xGwYllAio2Iw",
        "outputId": "2d98fc15-940d-4aed-8fe0-0c39aab390dd"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Final Selected Model\n",
            "============================================================\n",
            "Model: RF_D6_Leaf20_MaxLeaf45\n",
            "Train Accuracy: 0.9447\n",
            "Test Accuracy:  0.8527\n",
            "Accuracy (%):   85.27%\n",
            "Overfitting Gap: 9.20%\n",
            "Overfitting Conclusion: Moderate overfitting\n",
            "\n",
            "Classification Report:\n",
            "                  precision    recall  f1-score   support\n",
            "\n",
            "           No DR     0.9813    0.9705    0.9759       271\n",
            "            Mild     0.6557    0.7143    0.6838        56\n",
            "        Moderate     0.8289    0.8400    0.8344       150\n",
            "          Severe     0.4667    0.4828    0.4746        29\n",
            "Proliferative DR     0.6667    0.5909    0.6265        44\n",
            "\n",
            "        accuracy                         0.8527       550\n",
            "       macro avg     0.7199    0.7197    0.7190       550\n",
            "    weighted avg     0.8543    0.8527    0.8532       550\n",
            "\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x600 with 0 Axes>"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "Confusion Matrix:\n",
            "[[263   8   0   0   0]\n",
            " [  3  40  12   0   1]\n",
            " [  1  11 126   9   3]\n",
            " [  0   1   5  14   9]\n",
            " [  1   1   9   7  26]]\n",
            "\n",
            "Specificity per class\n",
            "--------------------------------------------------\n",
            "No DR: 0.9821\n",
            "Mild: 0.9575\n",
            "Moderate: 0.9350\n",
            "Severe: 0.9693\n",
            "Proliferative DR: 0.9743\n",
            "--------------------------------------------------\n",
            "Macro Specificity: 0.9636\n",
            "\n",
            "ROC-AUC Results\n",
            "--------------------------------------------------\n",
            "Macro ROC-AUC: 0.9579\n",
            "Weighted ROC-AUC: 0.9752\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x600 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "Final model and evaluation files saved successfully.\n",
            "Saved folder: /content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 12: Hybrid vs Hybrid Accuracy Comparison\n",
        "# =========================================================\n",
        "\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Paper Hybrid Model Accuracy\n",
        "# ---------------------------------------------------------\n",
        "paper_hybrid_accuracy = 0.7950   # 79.50%\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Our Hybrid Model Accuracy\n",
        "# ---------------------------------------------------------\n",
        "our_hybrid_accuracy = best_fused_acc   # 85.27%\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Create comparison table\n",
        "# ---------------------------------------------------------\n",
        "hybrid_comparison = pd.DataFrame({\n",
        "    \"Model\": [\n",
        "        \"Paper Hybrid Model\",\n",
        "        \"Our Hybrid ConvNeXt-Tiny + Swin-Tiny + RF\"\n",
        "    ],\n",
        "    \"Accuracy (%)\": [\n",
        "        paper_hybrid_accuracy * 100,\n",
        "        our_hybrid_accuracy * 100\n",
        "    ]\n",
        "})\n",
        "\n",
        "print(\"Hybrid vs Hybrid Accuracy Comparison\")\n",
        "display(hybrid_comparison)\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Improvement calculation\n",
        "# ---------------------------------------------------------\n",
        "improvement = (our_hybrid_accuracy - paper_hybrid_accuracy) * 100\n",
        "\n",
        "print(\"\\nComparison Summary\")\n",
        "print(\"-\" * 50)\n",
        "print(f\"Paper Hybrid Accuracy: {paper_hybrid_accuracy * 100:.2f}%\")\n",
        "print(f\"Our Hybrid Accuracy:   {our_hybrid_accuracy * 100:.2f}%\")\n",
        "print(f\"Improvement:           {improvement:.2f}%\")\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Bar chart\n",
        "# ---------------------------------------------------------\n",
        "plt.figure(figsize=(8, 5))\n",
        "plt.bar(\n",
        "    hybrid_comparison[\"Model\"],\n",
        "    hybrid_comparison[\"Accuracy (%)\"]\n",
        ")\n",
        "\n",
        "plt.title(\"Hybrid vs Hybrid Accuracy Comparison\")\n",
        "plt.ylabel(\"Accuracy (%)\")\n",
        "plt.ylim(0, 100)\n",
        "plt.xticks(rotation=15)\n",
        "plt.grid(axis=\"y\")\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 723
        },
        "id": "hqbhXSOqsk9Z",
        "outputId": "7a211ab5-97a7-41f7-91cd-d100054a0487"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Hybrid vs Hybrid Accuracy Comparison\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "                                       Model  Accuracy (%)\n",
              "0                         Paper Hybrid Model     79.500000\n",
              "1  Our Hybrid ConvNeXt-Tiny + Swin-Tiny + RF     85.272727"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-b5daf759-e291-457d-81dc-e38f1afaa084\" class=\"colab-df-container\">\n",
              "    <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>Model</th>\n",
              "      <th>Accuracy (%)</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Paper Hybrid Model</td>\n",
              "      <td>79.500000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Our Hybrid ConvNeXt-Tiny + Swin-Tiny + RF</td>\n",
              "      <td>85.272727</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-b5daf759-e291-457d-81dc-e38f1afaa084')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-b5daf759-e291-457d-81dc-e38f1afaa084 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-b5daf759-e291-457d-81dc-e38f1afaa084');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "  <div id=\"id_94b3b523-859a-49d0-8603-9d3741dfbf9b\">\n",
              "    <style>\n",
              "      .colab-df-generate {\n",
              "        background-color: #E8F0FE;\n",
              "        border: none;\n",
              "        border-radius: 50%;\n",
              "        cursor: pointer;\n",
              "        display: none;\n",
              "        fill: #1967D2;\n",
              "        height: 32px;\n",
              "        padding: 0 0 0 0;\n",
              "        width: 32px;\n",
              "      }\n",
              "\n",
              "      .colab-df-generate:hover {\n",
              "        background-color: #E2EBFA;\n",
              "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "        fill: #174EA6;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate:hover {\n",
              "        background-color: #434B5C;\n",
              "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "        fill: #FFFFFF;\n",
              "      }\n",
              "    </style>\n",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('hybrid_comparison')\"\n",
              "            title=\"Generate code using this dataframe.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_94b3b523-859a-49d0-8603-9d3741dfbf9b button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('hybrid_comparison');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "hybrid_comparison",
              "summary": "{\n  \"name\": \"hybrid_comparison\",\n  \"rows\": 2,\n  \"fields\": [\n    {\n      \"column\": \"Model\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"Our Hybrid ConvNeXt-Tiny + Swin-Tiny + RF\",\n          \"Paper Hybrid Model\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Accuracy (%)\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 4.081934600485985,\n        \"min\": 79.5,\n        \"max\": 85.27272727272728,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          85.27272727272728,\n          79.5\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "Comparison Summary\n",
            "--------------------------------------------------\n",
            "Paper Hybrid Accuracy: 79.50%\n",
            "Our Hybrid Accuracy:   85.27%\n",
            "Improvement:           5.77%\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x500 with 1 Axes>"
            ],
            "image/png": "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7969CgkJUfv27SVJBw4cUK1atZQtWzYNHDhQjo6Omjp1qp5//nlt2LBBVapUSXbM3r17y8vLS8OHD9fJkyc1fvx49erVS/Pnz3+k9x7AXQwAuMesWbMMSQ/8JzAw0Nw/MjLScHFxMf7v//4v2XH69OljZMmSxbhx44ZhGIZx4sQJQ5Lh6upqnD171twvJCTEkGT079/fbOvYsaMhyRg0aFCK+jp27Gjkz5/ffLxkyRJDkjF27FizLSEhwahVq5YhyZg1a9YDX+/gwYMNR0dH4+rVq2ZbXFyc4enpaXTp0sVs8/DwMHr27PnAY6XmWXs/DcMwIiIiDAcHB2P69OlmW/Xq1Y2mTZsm2++bb74xJBmff/55imMkJSUZhmEY69atMyQZffr0ue8+1vcitdokGcOHDzcfDx8+3JBktGvXLsW+MTExKdp+/PFHQ5KxceNGs61Dhw6GnZ2dsW3btvvWNHXqVEOScejQIXPb7du3DR8fH6Njx44pnne3cuXKGR4eHg/c5+5j5syZ0wgKCjJu3bpltv/yyy+GJGPYsGFmm/Xv4OOPPzbbrl27Zri6uhoWi8WYN2+e2X748OEU7531b7lChQrG7du3zfaxY8cakoylS5eabam9l927dzfc3NyM2NhYs6127dqGJGPKlCkp9q9du7ZRu3Zt83HTpk2T/X8lNc2aNTOcnJyM48ePm23nz583smbNajz33HMpXktwcLD538wwDKN///6Gvb29ERkZ+cDzAEiJW6EA3NekSZO0evXqFP+ULl062X4eHh5q2rSpfvzxR/OX38TERM2fP1/NmjVLce96s2bNlDt3bvNx5cqVVaVKFf32228paujRo8dD6/ztt9/k4OCQbF97e3v17t37kV7nK6+8ovj4eC1atMhsW7VqlSIjI/XKK6+YbZ6engoJCfnXs/E8K++nJM2bN092dnZq2bKl2dauXTutWLEi2S0zCxculI+PT6rHtv7yvXDhQlksFg0fPvy++/wbb731Voo2V1dX899jY2N1+fJlVa1aVZLMW96SkpK0ZMkSNWnSJNXeEmtNbdq0kYuLi+bMmWNu+/3333X58mW99tprD6wtKipKWbNmfaTXsX37dl28eFFvv/22XFxczPZGjRqpePHi+vXXX1M854033jD/3dPTU8WKFVOWLFnUpk0bs71YsWLy9PRUWFhYiud369Yt2dicHj16yMHBIdnf3N3vZXR0tC5fvqxatWopJiZGhw8fTnY8Z2dnde7c+aGv1dPTU2fPntW2bdtS3Z6YmKhVq1apWbNmKliwoNmeK1cutW/fXps2bVJUVFSK13L331GtWrWUmJioU6dOPbQeAMkRLADcV+XKlRUcHJziHy8vrxT7dujQQadPn9aff/4pSVqzZo0iIiJSvZWjSJEiKdqKFi2qkydPJmtzcHBQnjx5HlrnqVOnlCtXLrm7uydrL1as2EOfK0llypRR8eLFk936MH/+fPn4+Khu3bpm29ixY7V//37lzZtXlStX1ogRI1L90nU/z8r7KUk//PCDKleurCtXrujYsWM6duyYypUrp9u3b2vBggXmfsePH1exYsXk4HD/O3OPHz8uf39/Zc+e/ZHP/yjuvb1Hkq5evaq+ffvK19dXrq6uypEjh7nf9evXJUmXLl1SVFTUQ6cI9vT0VJMmTZLd/z9nzhzlzp072d9VarJly6bo6OhHeh3WL8Cp/fcpXrx4ii/I1jEqd/Pw8FCePHlSBDUPD48UYyeklH9z7u7uypUrV7K/uQMHDqh58+by8PBQtmzZlCNHDjNQWd9Lq9y5cz/SQO3/+7//k7u7uypXrqwiRYqoZ8+e+uuvv8ztly5dUkxMTKrvRYkSJZSUlKQzZ84ka8+XL1+yx9b/P6b2ugE8GMECQLpo0KCBfH199cMPP0i688XSz8/PplmAnJ2dZWf331ymXnnlFf3xxx+6fPmy4uLitGzZMrVs2TLZF942bdooLCxMEydOlL+/vz799FMFBgZqxYoV6V5PZn4/jx49qm3btmnTpk0qUqSI+Y91EPLdv+Cnl/v1XNw7UPhud/+ibtWmTRtNnz5db731lhYtWqRVq1Zp5cqVkvSvpuTt0KGDwsLCtHnzZkVHR2vZsmVq167dQ/87FC9eXNevX0/xJTg92Nvbp6nd2muWFpGRkapdu7b27NmjDz74QMuXL9fq1avNmazufS9T+2+RmhIlSig0NFTz5s1TzZo1tXDhQtWsWTPV3qxHlZ6vG3jWESwApAt7e3u1b99eP//8s65du6YlS5aoXbt2qX5oHz16NEXbkSNHHmn159Tkz59fFy5c0I0bN5K1h4aGPvIxXnnlFSUkJGjhwoVasWKFoqKi1LZt2xT75cqVS2+//baWLFmiEydOyNvbO8XsPOkhM7+fc+bMkaOjo+bNm6cFCxYk+6dv3776888/dfr0aUlSoUKFFBoammIA+90KFSqk8+fP6+rVq/fdx/or870zV6XldpZr165p7dq1GjRokEaOHKnmzZurXr16yW6pkaQcOXIoW7ZsKWbeSs2LL76oHDlyaM6cOVq8eLFiYmIeaUB2kyZNJMkMlg+SP39+San/9wkNDTW3p6d7/+Zu3LihCxcumH9z69ev15UrVzR79mz17dtXjRs3vm/vXFplyZJFr7zyimbNmqXTp0+rUaNG+uijjxQbG6scOXLIzc0t1ffi8OHDsrOzU968eW2uAUDqCBYA0s3rr7+ua9euqXv37rpx48Z97yNfsmRJsmkw//77b4WEhKhhw4b/6rwvvfSSEhISNHnyZLMtMTFREydOfORjlChRQqVKldL8+fM1f/585cqVS88991yy4917+0bOnDnl7++vuLi4f1X3w2TW93POnDmqVauWXnnlFbVq1SrZP++++64kmVOttmzZUpcvX9ZXX32V4jjWX4xbtmwpwzA0cuTI++6TLVs2+fj4aOPGjcm2f/31149Us/TPL9f3/lI9fvz4ZI/t7OzUrFkzLV++PNXV1O9+voODg9q1a6effvpJs2fPVqlSpVKMqUlNq1atVKpUKX300UfasmVLiu3R0dF67733JN2Z2SxnzpyaMmVKsr/FFStW6NChQ2rUqNFDz5dW06ZNSxYGJ0+erISEBPNvLrX38vbt22n675Gae6f9dXJyUsmSJWUYhuLj42Vvb6/69etr6dKlyW7LioiI0Ny5c1WzZk1ly5bNphoA3B/TzQJIN+XKlVNQUJAWLFigEiVK3HcK1sKFC6tmzZrq0aOH4uLiNH78eHl7e2vgwIH/6rxNmjRRjRo1NGjQIJ08eVIlS5bUokWLUgSBh3nllVc0bNgwubi4qGvXrsluV4mOjlaePHnUqlUrlSlTRu7u7lqzZo22bdumcePG/au6HyYzvp8hISE6duyYevXqler23Llzq3z58pozZ47+7//+Tx06dNB3332nAQMG6O+//1atWrV08+ZNrVmzRm+//baaNm2qOnXq6PXXX9eECRN09OhRvfjii0pKStKff/6pOnXqmOd644039Mknn+iNN95QxYoVtXHjxjStTJ0tWzZzCtb4+Hjlzp1bq1at0okTJ1Ls+/HHH2vVqlWqXbu2unXrphIlSujChQtasGCBNm3alGx61w4dOmjChAn6448/HnlRO0dHRy1atEjBwcF67rnn1KZNG9WoUUOOjo46cOCA5s6dKy8vL3300UdydHTUmDFj1LlzZ9WuXVvt2rUzp5stUKBAiulu08Pt27f1wgsvqE2bNgoNDdXXX3+tmjVr6uWXX5YkVa9eXV5eXurYsaP69Okji8Wi77//3ubbi+rXry8/Pz/VqFFDvr6+OnTokL766is1atTIHOz+4YcfavXq1apZs6befvttOTg4aOrUqYqLi9PYsWNtfu0AHiBjJqMC8CSzTsOY2lSahnFnCsj7TflonXby7uksraxTgn766afGuHHjjLx58xrOzs5GrVq1jD179iTbt2PHjkaWLFlSPce906MahmFcuXLFeP31141s2bIZHh4exuuvv27s2rXrkadHNQzDOHr0qDn966ZNm5Jti4uLM959912jTJkyRtasWY0sWbIYZcqUMb7++uuHHvdZej979+5tSEo21ee9RowYYUgya4yJiTHee+89IyAgwHB0dDT8/PyMVq1aJTtGQkKC8emnnxrFixc3nJycjBw5chgNGzY0duzYYe4TExNjdO3a1fDw8DCyZs1qtGnTxrh48eJ9p5u9dOlSitrOnj1rNG/e3PD09DQ8PDyM1q1bG+fPn09xDMMwjFOnThkdOnQwcuTIYTg7OxsFCxY0evbsacTFxaU4bmBgoGFnZ5dsWuBHce3aNWPYsGFGqVKlDDc3N8PFxcUICgoyBg8ebFy4cCHZvvPnzzfKlStnODs7G9mzZzdeffXVFOe739/B/f4G8+fPbzRq1Mh8bP1b3rBhg9GtWzfDy8vLcHd3N1599VXjypUryZ77119/GVWrVjVcXV0Nf39/Y+DAgcbvv/9uSDL++OOPh57buu3u6WanTp1qPPfcc4a3t7fh7OxsFCpUyHj33XeN69evJ3vezp07jQYNGhju7u6Gm5ubUadOHWPz5s3J9rnf/y//+OOPFDUCeDQWw2B0EoD08+WXX6p///46efJkitlWkHa8n0+HcuXKKXv27Fq7dm1Gl2IT60J827Zt+9cLEwJ4ejHGAkC6MQxDM2fOVO3atfkSnA54P58O27dv1+7du9WhQ4eMLgUAHivGWACw2c2bN7Vs2TL98ccf2rdvn5YuXZrRJWVqvJ9Ph/3792vHjh0aN26ccuXK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L76QdKcH+96ZnR70w1NiYqK5b+7cuZUnTx4dOXJE165dkyRz/GDFihX1xx9/6NatW3J0dFS1atW0atUqSf98jjVp0kQhISHJxkS0bt1a/fr1U1JSkkqXLp3Or/7ZwTcC4D9y721Bd7N2295v1esjR45ozJgxcnR0VN26dbVp0ya9//77+uSTT3Ts2DH16NFDn376qWbMmCFHR0fzohgTEyPpzgVdujM7VExMjLZt2yZXV1e1a9dOX331lWbNmiVJWrBggS5evKhr165py5YtklIGB2dnZ5UpUybZGhMAADyI9fMtV65cku70YN89IHvLli0aOHCghg0bposXL5rPs/Zi2Nvby87OzgwX5cuX19mzZ80fwayfsdZpzq9cuSJJaty4sbZu3arIyEgzWDRo0EDHjx/XoUOHzPO4uLioUqVKypo1a4qpZvHoCBbAfyS1GY5u3bql3r176/nnn5ckczXPe0PIN998ox9++EGxsbGqVKmSfHx8dOnSJTVq1Eh+fn7q1auXOnbsqAULFujkyZMqVqyYSpQood9++y3ZcayBwNp9/O677+rFF1/UsGHD5O/vr0GDBmnUqFH64osv1LZt28fwLgAAniXWIJAlSxb169cv2WfL3r171aNHD3377bcaPny4jh49qvnz5+u1114zx/rZ29srISFBy5cv1+TJk81ehurVqys6Otq8Fdja29G0aVOdOXNGJ0+elCS98MILioiIMNdokqQSJUpoxIgRKliwYLJaV61apTJlytATbwPeOeA/kJSUpLVr1+r333+X9E9wcHV1VZkyZXTlyhXFxsYqJiZG2bNn17Rp05L1Xuzfv18vvPCCXFxc5Ofnp4CAABUsWFBeXl7mfk2aNFFERISOHz8uHx8fValSxVyoznrBLVasmLJnz272Rvj7+2vixImaOXOmZs+ercOHD6tp06Z65ZVXzOn2AACwelDvu3TnFqe797F+STcMQ5GRkerevbtWrlwpSQoLC9OaNWs0dOhQ9e3bV4sXL9ZXX32l2NhY/fDDD5KkDz/8UE5OTnr77bd15MgR8/OsUqVKcnV1NXsd7O3tZRiGChUqJHd3d61fv14JCQkqWLCgqlSpkmIq2GHDhpmfc9HR0Zo4caI++eQT1alTR35+fpluxesnhUNGFwA8C+zs7PTuu++qePHi5oqe8fHxcnR0VIkSJWRvb6/V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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 14: Train vs Validation Curves for Overfitting Check\n",
        "# =========================================================\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "import os\n",
        "\n",
        "history_to_plot = history_swin_manual\n",
        "model_name = \"Swin-Tiny\"\n",
        "\n",
        "epochs = np.arange(len(history_to_plot[\"train_acc\"]))\n",
        "\n",
        "fig, axes = plt.subplots(1, 2, figsize=(12, 4))\n",
        "\n",
        "# Accuracy: train vs validation\n",
        "axes[0].plot(epochs, history_to_plot[\"train_acc\"], label=\"train accuracy\")\n",
        "axes[0].plot(epochs, history_to_plot[\"val_acc\"], label=\"validation accuracy\")\n",
        "axes[0].set_xlabel(\"Epoch\")\n",
        "axes[0].set_ylabel(\"Accuracy\")\n",
        "axes[0].set_title(\"(a) Accuracy\")\n",
        "axes[0].legend()\n",
        "axes[0].grid(True)\n",
        "\n",
        "# Loss: train vs validation\n",
        "axes[1].plot(epochs, history_to_plot[\"train_loss\"], label=\"train loss\")\n",
        "axes[1].plot(epochs, history_to_plot[\"val_loss\"], label=\"validation loss\")\n",
        "axes[1].set_xlabel(\"Epoch\")\n",
        "axes[1].set_ylabel(\"Loss\")\n",
        "axes[1].set_title(\"(b) Loss\")\n",
        "axes[1].legend()\n",
        "axes[1].grid(True)\n",
        "\n",
        "plt.suptitle(f\"{model_name} Train vs Validation Curves\")\n",
        "plt.tight_layout()\n",
        "\n",
        "SAVE_DIR = \"/content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final\"\n",
        "figure_path = os.path.join(SAVE_DIR, \"swin_train_validation_accuracy_loss_curves.png\")\n",
        "\n",
        "plt.savefig(figure_path, dpi=300, bbox_inches=\"tight\")\n",
        "plt.show()\n",
        "\n",
        "print(\"Figure saved at:\", figure_path)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 430
        },
        "id": "6jOM2uwStt7b",
        "outputId": "beef6f54-26ad-402d-f9bc-169ef5aa2f09"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1200x400 with 2 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAGMCAYAAAALJhESAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA6B5JREFUeJzs3Xd4FNXXwPHv7qb3SkJJI/Tee1VCU5BeRYqgiIDKz4aFZuG1YRcbRZQiIE1AIAgI0nvvpBAIhDTSN5vsvH8MWQkJkL5JOJ/n2Sc7s3dmzuYuMJy991yNoigKQgghhBBCCCGEEEKUIK25AxBCCCGEEEIIIYQQjx5JSgkhhBBCCCGEEEKIEidJKSGEEEIIIYQQQghR4iQpJYQQQgghhBBCCCFKnCSlhBBCCCGEEEIIIUSJk6SUEEIIIYQQQgghhChxkpQSQgghhBBCCCGEECVOklJCCCGEEEIIIYQQosRJUkoIIYQQQgghhBBClDhJSgkhhBBFbMeOHWg0Gnbs2FGi19VoNMyYMaNEr1lSyvN7y4sZM2ag0Wiy7fP392fUqFEPPXbhwoVoNBpCQ0OLLJ7Q0FA0Gg0LFy4ssnMKIYQQ4tEjSSkhhBCPpJMnTzJgwAD8/PywsbGhcuXKBAUF8fXXX5s7NJOsZMLDHv7+/hJfKREVFYWFhQVPP/30fdskJiZia2tLv379SjCyglmyZAlffPGFucPI1Y4dO+jXrx/e3t5YWVlRoUIFevXqxapVq8wdmhBCCCHyyMLcAQghhBAlbc+ePXTu3BlfX1/GjRuHt7c3V69eZd++fXz55ZdMmjSpUOfv0KEDqampWFlZFfo8v/76a7Z9Y8eOpUWLFjz33HOmfQ4ODgCkpqZiYVFy/7TnN77CKOn3VlAVKlQgKCiItWvXkpKSgp2dXY42q1atIi0t7YGJq7w4f/48Wm3xfr+4ZMkSTp06xcsvv5xtv5+fH6mpqVhaWhbr9e9n+vTpzJo1i+rVq/P888/j5+dHTEwMGzdupH///ixevJhhw4aZJTYhhBBC5F3pv7sTQgghitgHH3yAs7MzBw8exMXFJdtrUVFRhT6/VqvFxsam0OepWrUqVatWzbZv/PjxVK1aNdeERlFcMz/yG1+WjIwMjEZjvpJ2Jf3eCmP48OFs2rSJdevWMWTIkByvL1myBGdnZ5544olCXcfa2rpQxxeGRqMxW5+sXLmSWbNmMWDAAJYsWZItMfbaa6+xefNmDAZDkVzrfolFIYQQQhQNmb4nhBDikXP58mXq1q2bIyEF6kiXLP369aNJkybZXu/VqxcajYZ169aZ9u3fvx+NRsNff/0F5F5TqlOnTtSrV48zZ87QuXNn7OzsqFy5Mh9//HGRva976y5l1SG6dOkSo0aNwsXFBWdnZ0aPHk1KSoqpXceOHWnYsGGu56xZsybdunUrcExZtYc+/fRTvvjiCwIDA7G2tubMmTOkp6czbdo0mjZtirOzM/b29rRv357t27cX2XvLzcSJE3FwcMi13dChQ/H29iYzMxOAQ4cO0a1bNzw8PLC1tSUgIIAxY8Y88Px9+/bF3t6eJUuW5HgtKiqKv//+mwEDBmBtbc2uXbsYOHAgvr6+WFtb4+PjwyuvvEJqauoDrwG515Q6ffo0jz32GLa2tlSpUoX3338fo9GY49i1a9fyxBNPUKlSJaytrQkMDOS9994zvW9QP7MbNmwgLCwsx1TM+9WU2rZtG+3bt8fe3h4XFxeeeuopzp49m61NYfoO4N1338XNzY358+fnOlKrW7duPPnkk8D962k96M/o4cOH6dChA3Z2drz11ls8+eSTOZKvWVq3bk2zZs2y7fvtt99o2rQptra2uLm5MWTIEK5evZqtzcWLF+nfvz/e3t7Y2NhQpUoVhgwZwu3btx/6/oUQQojyREZKCSGEeOT4+fmxd+9eTp06Rb169e7brn379qxdu5aEhAScnJxQFIXdu3ej1WrZtWsXvXv3BmDXrl1otVratm37wOvGxcXRvXt3+vXrx6BBg1i5ciVvvPEG9evXp0ePHkX6Hu82aNAgAgICmD17NkeOHOHnn3+mQoUKfPTRRwCMGDGCcePG5fh9HDx4kAsXLvDOO+8UOoYFCxaQlpbGc889h7W1NW5ubiQkJPDzzz8zdOhQxo0bR2JiIvPmzaNbt24cOHCARo0aFfq95Wbw4MF8++23bNiwgYEDB5r2p6Sk8OeffzJq1Ch0Oh1RUVF07doVT09P3nzzTVxcXAgNDX1ozSJ7e3ueeuopVq5cSWxsLG5ubqbXfv/9dzIzMxk+fDgAK1asICUlhRdeeAF3d3cOHDjA119/TUREBCtWrHjo+7/bjRs36Ny5MxkZGbz55pvY29vz448/Ymtrm6PtwoULcXBwYMqUKTg4OLBt2zamTZtGQkICn3zyCQBvv/02t2/fJiIigs8//xx48FTMrVu30qNHD6pWrcqMGTNITU3l66+/pm3bthw5ciRHbbGC9N3Fixc5d+4cY8aMwdHRMV+/n7yIiYmhR48eDBkyhKeffhovLy+aNm3KM888w8GDB2nevLmpbVhYGPv27TP9vkAdhfnuu+8yaNAgxo4dy61bt/j666/p0KEDR48excXFhfT0dLp164Zer2fSpEl4e3tz7do11q9fT3x8PM7OzkX+voQQQohSSxFCCCEeMVu2bFF0Op2i0+mU1q1bK6+//rqyefNmJT09PVu7gwcPKoCyceNGRVEU5cSJEwqgDBw4UGnZsqWpXe/evZXGjRubtrdv364Ayvbt2037OnbsqADKokWLTPv0er3i7e2t9O/fP8+x29vbKyNHjsz1NUCZPn26aXv69OkKoIwZMyZbu759+yru7u6m7fj4eMXGxkZ54403srWbPHmyYm9vryQlJRU4vpCQEAVQnJyclKioqGxtMzIyFL1en21fXFyc4uXllSPmgr633BiNRqVy5co5fu/Lly9XAGXnzp2KoijK6tWrFUA5ePDgA8+Xmw0bNiiA8sMPP2Tb36pVK6Vy5cpKZmamoiiKkpKSkuPY2bNnKxqNRgkLCzPty3q/d/Pz88v2u3755ZcVQNm/f79pX1RUlOLs7KwASkhIiGl/btd9/vnnFTs7OyUtLc2074knnlD8/PxytM3q1wULFpj2NWrUSKlQoYISExNj2nf8+HFFq9UqzzzzTI73UpC+W7t2rQIon3/++QPbZVmwYEGO964oD/4z+v3332dre/v2bcXa2lr53//+l23/xx9/nK2fQkNDFZ1Op3zwwQfZ2p08eVKxsLAw7T969KgCKCtWrMjTexBCCCHKM5m+J4QQ4pETFBTE3r176d27N8ePH+fjjz+mW7duVK5cOdu0vMaNG+Pg4MDOnTsBdURUlSpVeOaZZzhy5AgpKSkoisK///5L+/btH3pdBweHbLWWrKysaNGiBVeuXCn6N3mX8ePHZ9tu3749MTExJCQkAODs7MxTTz3F0qVLURQFgMzMTH7//Xf69OmDvb19oWPo378/np6e2fbpdDpTXSmj0UhsbCwZGRk0a9aMI0eO5Om8D3tvudFoNAwcOJCNGzeSlJRk2v/7779TuXJl2rVrB2Ca3rl+/fp81yjKGmF19xS+kJAQ9u3bx9ChQ00Fyu8exZScnEx0dDRt2rRBURSOHj2ar2tu3LiRVq1a0aJFC9M+T09P06isu9193cTERKKjo2nfvj0pKSmcO3cuX9cFiIyM5NixY4waNSrbyLAGDRoQFBTExo0bcxxTkL7Leq04RkmBWqdr9OjR2fY5OTnRo0cPli9fbvrzAernpVWrVvj6+gJqAXuj0cigQYOIjo42Pby9valevbppWmrWSKjNmzfnabqiEEIIUZ5JUkoIIcQjqXnz5qxatYq4uDgOHDjA1KlTSUxMZMCAAZw5cwZQkyatW7dm165dgJqUat++Pe3atSMzM5N9+/Zx5swZYmNj85SUqlKlChqNJts+V1dX4uLiTNs3btzI9shLbaGHyfpP893XBLJd95lnniE8PNz0Xrdu3crNmzcZMWJEoa8PEBAQkOv+X375hQYNGmBjY4O7uzuenp5s2LAhz7V18vLecjN48GBSU1NNScikpCQ2btzIwIEDTX3UsWNH+vfvz8yZM/Hw8OCpp55iwYIF6PX6h8ZlYWHB4MGD2bVrF9euXQMwJajuThKFh4ebEjkODg54enrSsWNHgHzXFwoLC6N69eo59tesWTPHvtOnT9O3b1+cnZ1xcnLC09PTlDAtSF2jsLCw+16rdu3aREdHk5ycnG1/QfrOyckJUBNpxaFy5cq5FuAfPHgwV69eZe/evYBal+7w4cMMHjzY1ObixYsoikL16tXx9PTM9jh79qxpEYWAgACmTJnCzz//jIeHB926dePbb7+VelJCCCEeSZKUEkII8UizsrKiefPmfPjhh8ydOxeDwZCtlk+7du04ePAgaWlppqSUi4sL9erVY9euXaYkTl6SUjqdLtf9d4++qFixYrbH77//Xsh3mLfrduvWDS8vL3777TdALdbs7e1Nly5dCn19INe6Rr/99hujRo0iMDCQefPmsWnTJoKDg3nsscdyLc6dm7y8t9y0atUKf39/li9fDsCff/5JampqtiSDRqNh5cqV7N27l4kTJ3Lt2jXGjBlD06ZNs42wup+nn34ao9HI0qVLAVi6dCl16tQx1crKzMwkKCiIDRs28MYbb7BmzRqCg4NNxcPz+jvIr/j4eDp27Mjx48eZNWsWf/75J8HBwaZaTsV13XsVpO9q1aoFwMmTJ/N0jXuTwFnuLuh+t9w+p6AucGBnZ2f6vCxfvhytVputJpnRaESj0Zg+x/c+fvjhB1Pbzz77jBMnTvDWW2+RmprK5MmTqVu3LhEREXl6X0IIIUR5IYXOhRBCiDuyVtGKjIw07Wvfvj3p6eksXbqUa9eumZJPHTp0YNeuXXh5eVGjRg28vLyKJIbg4OBs23Xr1i2S8z6MTqdj2LBhLFy4kI8++og1a9Ywbty4+yYOisLKlSupWrUqq1atypY8mD59erFd826DBg3iyy+/JCEhgd9//x1/f39atWqVo12rVq1o1aoVH3zwAUuWLGH48OEsW7aMsWPHPvD8LVu2JDAwkCVLlhAUFMTp06f54IMPTK+fPHmSCxcu8Msvv/DMM8+Y9t/7GcgrPz8/Ll68mGP/+fPns23v2LGDmJgYVq1aRYcOHUz7Q0JCchx7v6RObtfO7VoA586dw8PDo0imgdaoUYOaNWuydu1avvzyywcWXof/Rl/Fx8dn2581siuv7O3tefLJJ1mxYgVz5szh999/p3379lSqVMnUJjAwEEVRCAgIoEaNGg89Z/369alfvz7vvPMOe/bsoW3btnz//fe8//77+YpNCCGEKMtkpJQQQohHzvbt23MdjZFV9+buKUgtW7bE0tKSjz76CDc3N1OSqH379uzbt49//vknT6Ok8qpLly7ZHhUrViyycz/MiBEjiIuL4/nnnycpKSlb/avikJXwursv9u/fb5oiVdwGDx6MXq/nl19+YdOmTQwaNCjb63FxcTk+J1mjnPIyhQ/UqXpHjx5l+vTpaDQahg0bZnott/evKApffvllQd4OPXv2ZN++fRw4cMC079atWyxevDhbu9yum56eznfffZfjnPb29nmaVlaxYkUaNWrEL7/8ki0BdOrUKbZs2ULPnj3z+3bua+bMmcTExDB27FgyMjJyvL5lyxbWr18PqIkiwFQXDtRRUj/++GO+rzt48GCuX7/Ozz//zPHjx7ONqgPo168fOp2OmTNn5vjcKIpCTEwMoNbFujfu+vXro9Vq8/y5EkIIIcoLGSklhBDikTNp0iRSUlLo27cvtWrVIj09nT179phGy9xd6NjOzo6mTZuyb98+evXqZRo50qFDB5KTk0lOTi7SpJQ5NW7cmHr16rFixQpq165NkyZNivV6Tz75JKtWraJv37488cQThISE8P3331OnTp08TY8rrCZNmlCtWjXefvtt9Hp9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z549tG3blu+//573338fUEeJP/744zz++OPMmTOHDz/8kLfffpvt27c/cNVBIUTpJiOlhBCF0rp1awAOHTqUbb9Op0Oj0WT79io0NJQ1a9bkep7Dhw+j0WhM57uf3377japVqzJ+/HgGDBiQ7fHqq6/i4OBgmsLXv39/FEVh5syZOc6TNZqqT58+aLVaZs2alWO00t0jrgIDA9m5c2e213/88cd8fTun0+lyjOL6+uuvc5yjf//+HD9+nNWrV9837iwjRoxgy5YtfPHFF7i7u9OjR488xyOEEEKI8uF+92NZ1qxZw7Vr10zbBw4cYP/+/TnuG27fvs3ly5dp06ZNoWPq0qULVlZWfPXVV9nuX+bNm8ft27dNKzEnJCSQkZGR7dj69euj1WrR6/UAxMbG5jh/1peJWW2EEGWTjJQSQhRK1apVqVevHlu3bmXMmDGm/U888QRz5syhe/fuDBs2jKioKL799luqVavGiRMncpwnODiYtm3b4u7uft9rXb9+ne3btzN58uRcX7e2tqZbt26sWLGCr776is6dOzNixAi++uorLl68SPfu3TEajezatYvOnTszceJEqlWrxttvv817771H+/bt6devH9bW1hw8eJBKlSoxe/ZsAMaOHcv48ePp378/QUFBHD9+nM2bN+drePuTTz7Jr7/+irOzM3Xq1GHv3r1s3bo1x3t+7bXXWLlyJQMHDmTMmDE0bdqU2NhY1q1bx/fff5/t28thw4bx+uuvs3r1al544QUsLS3zHI8QQgghyof73Y9lqVatGu3ateOFF15Ar9ebvsx6/fXXs7XbunUriqLw1FNP5em6t27dMo1kultAQADDhw9n6tSpzJw5k+7du9O7d2/Onz/Pd999R/PmzU0Ls2zbto2JEycycOBAatSoQUZGBr/++is6nY7+/fsDMGvWLHbu3MkTTzyBn58fUVFRfPfdd1SpUoV27drl99clhChNzLPonxCiPJkzZ47i4OCgpKSkZNs/b948pXr16oq1tbVSq1YtZcGCBcr06dOVe//qiY+PV6ysrJSff/75gdf57LPPFED5+++/79tm4cKFCqCsXbtWURRFycjIUD755BOlVq1aipWVleLp6an06NFDOXz4cLbj5s+frzRu3FixtrZWXF1dlY4dOyrBwcGm1zMzM5U33nhD8fDwUOzs7JRu3boply5dUvz8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6N44mA9GXUXsY725q2t9PN3M7EjKIOaLP7j6XyuYvTKe9BzlnRIRkeqpzEGpH374gTFjxvD8889z3XXX4eLiUpnlqr6KCgjK3mU8b9irXIceSc8l11KEu4uZqCDvSiiciIiIiFS6hr3g/jUw5HXwqg2p241cU1+MhPTEizpl4xBfXhrWlg1P9+OJQc0J9fMgNTOf137cTbfpK5i8aJvyTomISLVT5qDU2rVryczMpGPHjnTp0oW3336btLS0yixbtWQ6sgVXawE27yDjP2TlUJzkvFGID66aeU9ERETOYc2aNQwdOpTIyEhMJhOLFi067/5JSUnccccdNGvWDLPZzKOPPuqQcl7WXFyh81h46De4aiyYzMawvrevghUvQ0HORZ22to874/s2Ye1T1zDjlva0ivAn11LExxsP0m+GkXdqw77jyjslIiLVQpkjH127duW///0vSUlJ3H///Xz++edERkZitVpZtmwZmZmZlVnOasN0wOiabWtwNZjLF1jao6F7IiIiUgbZ2dm0b9+e2bNnl2n//Px8QkJCmDRpkmZLdjTvQLjudRi3FqJ6QmEerHkV3u4EW7+CiwweubuaGXFlXRY/fDWfju1Cvxah2GywfGcqt/93I9fPWsvXvx2moNBawTckIiJSccrdHcfHx4d77rmHtWvXsnXrVh577DFeeeUVQkNDueGGGyqjjNWK6cDPANiiepb72L2ne0o1U5JzEREROY/Bgwfz0ksvMXz48DLtHxUVxVtvvcXIkSMJCAio5NJJqcJaG7mmbvkIAupDxhH4vzEwbwgk/XHRpz1X3qntR5V3SkREqr7yTQPyN82bN+fVV19l+vTpfPfdd8ydO7eiylU9FRViykwCwBrVi/Jm3dpTPPOeekqJiIiIk+Xn55Ofn29fz8jIAMBisWCxWCr8esXnrIxzVylNh0BUX8wbZ2Ne/xamxPXY/tMb6xV3Y+39DPgEX/Sp69fyYMp1LXi4byM+/+Uwn2w6ZM879faKvYy4og7R3erTMNinAm+opMumHms41WP1pzqsGapzPZa1zJcUlCrm4uLCsGHDGDZsWEWcrvpycaXwwV9ZvXAevWs3LNehVquN+FRj+F6zMPWUEhEREeeaPn06zz///Fnbf/rpJ7y9K29ClmXLllXauauWVng2n0brIwuom74Rl98/oujPr9gdPoKEkGuwmS6t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PDw8+Oijjxg6dCi7d++mfv3657zO888/z6uvvsprr73GrFmzuPPOOzl48CCBgYGl7m+xWHjxxRdp3rw5qampxMTEMGrUKJYsWQLAkSNH6NWrF3369GHFihX4+/uzbt06CgsLAXj33XeJiYnhlVdeYfDgwZw6dYp169aV5y286PsfOXIkGzZs4N///jft27cnISGBtLQ0TCYT99xzD/PmzePxxx+3X2PevHn06tWLJk2alLt8cmEzZsxg7NixjB49GoA5c+awePFi5s6dy9NPP33W/h9//DHPPvssQ4YMAeCBBx5g+fLlvPHGG3zyyScOLbuISHXgYjYR6u9JqL8n7erCtW3CATiZXcDG/cdZv+846/alsf9YNn8cPsUfh08xZ/U+3F3MXFG/Fj2aBNO9cRDt69XCTbMBipyTglKVLM9SxMETOQA0VU8pERGHCAgIwN3dHW9vb8LDw896/YUXXmDAgAH29cDAQNq3b29ff/HFF1m4cCHffvutvSdSaUaNGsXtt98OwLRp0/j3v//N5s2bzzkk6p577rE/b9SoEf/+97+56qqryMrKwtfXl9mzZxMQEMDnn3+Om5sxFKBZs2b2Y1566SUee+wxHnnkEfu2q6666kJvx1nKe/979uzhiy++YNmyZfTv399e/r++D8899xybN2+mc+fOWCwWPv3007N6T0nFKCgoYMuWLUycONG+zWw2079/fzZs2FDqMfn5+Xh6lsyB4uXlxdq1a895nfz8fPLz8+3rGRkZgBFctVgsl3ILpSo+Z2WcWxxH9VgzqB7PzdfdRP8WwfRvEQw0J+lUHpsSTrB+/wk27DtOckY+mxJOsCnhBDOWGQnVO0XVplujQLo1CqRFmB9mByRPVx3WDNW5HstaZgWlKll8ahY2G9TydiPEVzPviUj15+Xmwo4XBjnselarlcyMTPz8/fByc6mQc3bq1KnEelZWFlOnTmXx4sUkJSVRWFhIbm4uiYmJ5z1Pu3bt7M99fHzw9/c/5/ApgC1btjB16lT++OMPTp48idVqBSAxMZFWrVoRFxdHz5497QGpv0pNTeXo0aP069evPLdaqvLef1xcHC4uLvTu3bvU80VGRnLdddcxd+5cOnfuzHfffUd+fj4333zzJZdVzpaWlkZRURFhYWEltoeFhbFr165Sjxk0aBAzZsygV69eNG7cmNjYWL7++muKis49zGT69Ok8//zzZ23/6aef8Pb2vrSbOI9ly5ZV2rnFcVSPNYPqsWzcgT6e0LsVHMuDPadM7D1lYm+GieyCIlbvSWP1njQAfFxtNPW30TTARrMAGyGeUJlzYakOa4bqWI85OTll2k9BqUpmn3kv1E8z74lIjWAymco0hK6iWK1WCt1d8HZ3rbDfo3+fRe/xxx9n2bJlvP766zRp0gQvLy/+8Y9/UFBQcN7z/D14ZDKZ7IGmv8vOzmbQoEEMGjSI//3vf4SEhJCYmMigQYPs1/Hy8jrntc73Ghg9ZYASebfO9R+q8t7/ha4NcO+993L33Xfz5ptvMm/ePG699dZKDVxI+bz11luMHTuWFi1aYDKZaNy4MaNHj2bu3LnnPGbixInExMTY1zMyMqhXrx4DBw7E39+/wstosVhYtmwZAwYMKDUwK9WD6rFmUD1WDKvVxq6UTDbsP8GG/Sf49cBJsguKiDthIu6EsU+4vwctI/xoGORDVLC3/THMz+OS2j2qw5qhOtdjcQ/rC1FQqpIVJznX0D0REcdyd3c/by+Qv1q3bh2jRo1i+PDhgNFzqDj/VEXZtWsXx48f55VXXqFevXoA/PrrryX2adeuHR9++CEWi+Wshoefnx9RUVHExsbSt2/fs85fPDtgUlISV1xxBUCJpOfnc6H7b9u2LVarldWrV9uH7/3dkCFD8PHx4d1332Xp0qWsWbOmTNeW8gsODsbFxYWUlJQS21NSUkodrgrGz8eiRYvIy8vj+PHjREZG8vTTT5cYhvl3Hh4eeHic3cvbzc2tUhvGlX1+cQzVY82gerx07esH0b5+EOP6gKXIyp+H01kXf5x18Wn8nphOckY+yRn5rCStxHHe7i5EBfnQMMSHRsE+NPzLUsvbvczXv5g6zLMUkZKRx9H0PJJO5ZJ06vRjep79uYerC6N6RHF31wb4eCisUNmq42exrOXVT08l22ufeU9JzkVEHCkqKopNmzZx4MABfH19z5l8HKBp06Z8/fXXDB06FJPJxOTJk8/Z4+li1a9fH3d3d2bNmsW4cePYtm0bL774Yol9JkyYwKxZs7jtttuYOHEiAQEBbNy4kc6dO9O8eXOmTp3KuHHjCA0NZfDgwWRmZrJu3ToeeughvLy86Nq1K6+88goNGzYkNTWVSZMmlalsF7r/qKgooqOjueeee+yJzg8ePEhqaiq33HILAC4uLowaNYqJEyfStGlTunXrVnFvnpTg7u5Ox44diY2NZdiwYYDRozA2Nva8OdAAPD09qVOnDhaLhf/7v/+z15+IiFQ+NxczHRsE0rFBIA/3a0puQRG/HzrJvmPZJBzLJiEti4S0bA6dzCWnoIgdSRnsSDq7t0mgjztRQd40DPalUciZYFVUkA9e7udPdVBQaD0dcMol+RyBp+PZ5+8pbrDwyg+7eG/Nfu7v1Yi7uzVwaE96qTn0U1PJiofvqaeUiIhjPf7440RHR9OqVStyc3NJSEg4574zZszgnnvuoXv37gQHB/PUU0+VuctxWYWEhDB//nyeeeYZ/v3vf3PllVfy+uuvc8MNN9j3CQoKYsWKFTzxxBP07t0bFxcXOnToQI8ePQCIjo4mLy+PN998k8cff5zg4GD+8Y9/2I+fO3cuY8aMoWPHjjRv3pxXX32VgQMHXrBsZbn/d999l2eeeYYHH3yQ48ePU79+fZ555pkS+4wZM4Zp06bZZ4STyhMTE0N0dDSdOnWic+fOzJw5k+zsbPt7P3LkSOrUqcP06dMB2LRpE0eOHKFDhw4cOXKEqVOnYrVaefLJJ515GyIilzUvdxe6Nw6me+PgEtsLCq0cOplzOlCVTcLxbPvz5Iw8TmQXcCK7gN8S0886Z2SAJw1DfGgQ6MWpJBNbFu8iJTOfpFNGACotK/+sY0rj6WYmIsCLiABPIgK8iKzlSXiAJ5EBXkTU8mTbkQxmrdjLweM5TC8OTvVuxF1dFZyS8tFPSyXKLSgi8fTMe+opJSLiWM2aNTtrJrKoqKgSOZf+un3FihUlto0fP77E+t+H85V2nvT09POW6fbbb7fP1neu87Rr144ff/zxnOe4//77uf/++0t9rWXLlqxfv/6c5+/Tp89F37+npyczZsxgxowZ5yzbkSNHcHNzY+TIkefcRyrGrbfeyrFjx3juuedITk6mQ4cOLF261J78PDEx0Z5nDCAvL49Jkyaxf/9+fH19GTJkCB9//DG1atVy0h2IiMi5uLuaaRziS+OQszs2ZOcXcuD46WDV6UDV/rRs9h/LIiOvkKOn8jh6Ko91ALjAobMnbXF3NZ8ONhlBpvAATyJqeREZcCbwVMvb7bw5rVqE+zOsQyQLfz/CrBXxJJ7IYdqS4p5Tjbmra4ML9toSAQWlKtW+Y8bMe4E+7gRr5j0REamh8vPzOXbsGFOnTuXmm28+a1Y4qRwTJkw453C9VatWlVjv3bs3O3bscECpRESkMvl4uNI6MoDWkQEltttsNk7mWEhIy2L/sWz2pWby2859dGjRiLqBPoT7exJZy+j5FOjjXiGTx7i6mLm5Uz2GXVGHhb8f4e3TwamXl+zkP2v2Ma53Y+7souCUnJ+CUpVoT4oxdK9JqIbuiYhIzfXZZ58xZswYOnTowEcffeTs4oiIiFx2TCYTgT7uBPoYOassFgtLLHsZMrBZpSfIdnMxc0unegy/og4LfzvCrJV7OXQil5cW72TO6v2MOz2sz9NNwSk5m/nCu8jF2mNPcq6glIiI1FyjRo2iqKiILVu2UKdOHWcXR0RERJzAzcXMLVfVY8VjffjXTW2pW9uLtKx8Xlq8k56vruSDtQnkWco2M7JcPhSUqkR7T/eUUj4pERERERERuRy4uZi59ar6rHy8D6+MaEudWl4cy8znxe930PPVlcxVcEr+QkGpSrSneOa9UAWlRERERERE5PLh5mLmts5GcGr6X4JTL3y/g16vrmTeOgWnREGpSpNTUMihE7mAhu+JiIiIiIjI5cnd1cztp4NT04YbwanUzHye/24HvV9byXwFpy5rCkpVkn3HsgEI8nEnSDPviYiIiIiIyGXM3dXMHV2M4NTLw9sQGeBJSkY+U08Hpz5cf0DBqcuQZt+rJHtTjSTnTdVLSkRERERERAQwglN3dmnAPzrW5ctfDzN7ZTxJp/KY8u123l21j+FX1iEiwJNQPw9C/DwI8fUkxM8DL3fN3lcTKShVSeJTjZ5SSnIuIiIiIiIiUpKHqwt3dW3AzZ3q8sWvh3nndHDq3VX7St3fz8OVED8Pgv08zgSs/DwI9fM8Hbwy1gN93HExmxx8N3KxFJSqJGd6SikoJSJSXUVFRfHoo4/y6KOPAmAymVi4cCHDhg0rdf8DBw7QsGFDfv/9dzp06HDR162o84iIiIhUdR6uLtzdtQG3dKrLwt+OsP1oBscy8zmWlU9qZh6pGfnkF1rJzC8kM7+Q/WnZ5z2fi9lEkI/76YDVmeBViK8Htbzd8fVwxdfTFV8PV/xOP/p6uuLhqp5YzqCgVCWJPx2Uahaq4XsiIjVFUlIStWvXrtBzjho1ivT0dBYtWmTfVq9ePZKSkggODq7Qa4mIiIhUVR6uLtzWuf5Z2202G1n5haRm5hvBqsz8vz3P41hmPmlZ+RzPLqDIaiP19D7by3F9dxezPVhVHKjy+0sAy77u4YqPPaDlZn/d290Fb3cXvNxdcHcxYzKpt1ZZKChVCfKL4HB6HqCeUiIiNUl4eLhDruPi4uKwa1U1FosFNzc3ZxdDREREqgiTyYSfpxt+nm40Djl/p4/CIivHswvOClgV97zKyDV6W2XlWcjKLyQrr5DsAiO5ekGRlRPZBZzILrjkMruYTXi7GQEqI1B1Jmjl6eZyJoDl5moPZHn/dd/T+7iZbRzPu+TiVGkKSlWC5FzjMdjXnUAfd+cWRkSkotlsYMlx3PWsVuN6BS7g4Qtl+K/Te++9x9SpUzl8+DBm85mJZm+88UaCgoKYO3cu+/btIyYmho0bN5KdnU3Lli2ZPn06/fv3P+d5/z58b/Pmzdx///3s3LmTNm3a8Oyzz5bYv6ioiPvuu48VK1aQnJxM/fr1efDBB3nkkUcAmDp1Kh9++KH93AArV64kKirqrOF7q1ev5oknnuCPP/4gMDCQ6OhoXnrpJVxdjT/lffr0oV27dnh6evL+++/j7u7OuHHjmDp16jnv55dffuGZZ57h999/x2Kx0KFDB958802uvPJK+z7p6ek89dRTLFq0iFOnTtGkSRNeeeUVrr/+egDWrVvHs88+y+bNm/Hw8KBz5858/vnn1K5d+6zhjwBXXnklw4YNs5fLZDLxzjvv8MMPPxAbG8sTTzzB5MmTz/u+FZs7dy5vvPEG8fHxBAYGctNNN/H2229zzz33kJqayvfff2/f12KxUKdOHaZPn86YMWPO+Z6IiIhI9eXqYibM35Mwf88yH1NktZFdYASosvILyTz9aKxb/rZeHNT627Y8C7mWIixFNvs5i4cbVsBdsfj4ZkZ2j2JwmwjcXc0XPqQaUVCqEiTnGF8smoaql5SI1ECWHJgW6bDLmYFaxSvPHAV3nwsec/PNN/PQQw+xcuVK+vXrB8CJEydYunQpS5YsASArK4shQ4bw8ssv4+HhwUcffcTQoUPZvXs39euf3XX877Kysrj++usZMGAAn3zyCQkJCWcFTaxWK3Xr1uXLL78kKCiI9evXc9999xEREcEtt9zC448/zs6dO8nIyGDevHkABAYGcvTo0RLnOXLkCEOGDGHUqFF89NFH7Nq1i7Fjx+Lp6Vki6PThhx8SExPDpk2b2LBhA6NGjaJHjx4MGDCg1HvIzMwkOjqaWbNmYbPZeOONNxgyZAh79+7Fz88Pq9XK4MGDyczM5JNPPqFx48bs2LEDFxcj50JcXBz9+vXjnnvu4a233sLV1ZWVK1dSVFS+6ZynTp3KK6+8wsyZM3F1db3g+wbw7rvvEhMTwyuvvMLgwYM5deoU69atA+Dee++lV69eJCUlERERAcD3339PTk4Ot956a7nKJiIiIjWbi9mEv6cb/p6X3lPbUmQlp6CI3IIicgoKjeeWotPbzqwbr5fcnmM5c9yZ1wtJOpXLlsR0tiTG8aLvTm7vXI87utQnIsCrAu7e+apEUGr27Nm89tprJCcn0759e2bNmkXnzp0veNznn3/O7bffzo033lgiF4ezFQelmoUpn5SIiDPUrl2bwYMH8+mnn9qDUl999RXBwcH07dsXgPbt29O+fXv7MS+++CILFy7k22+/ZcKECRe8xqefforVauWDDz7A09OT1q1bc/jwYR544AH7Pm5ubjz//PP29YYNG7Jhwwa++OILbrnlFnx9ffHy8iI/P/+8w/Xeeecd6tWrx9tvv43JZKJFixYcPXqUp556iueee87eG6xdu3ZMmTIFgKZNm/L2228TGxt7zqDUNddcU2L9vffeo1atWqxevZrrr7+e5cuXs3nzZnbu3EmzZs0AaNSokX3/V199lU6dOvHOO+/Yt7Vu3fqC793f3XHHHYwePbrEtvO9bwAvvfQSjz32WIlA4FVXXQVA9+7dad68OR9//DFPPvkkAPPmzePmm2/G11d/m0VERKRyuLmYCfAyE+BVMakILBYLny1aQpp/cz7/9TCpmfnMWhHPO6v2MaBlGCO7NaBb46Bqnb/K6UGpBQsWEBMTw5w5c+jSpQszZ85k0KBB7N69m9DQ0HMed+DAAR5//HF69uzpwNKWTdLp4XvKJyUiNZKbt9FjyUGsVisZmZn4+/lhdvMu83F33nknY8eO5Z133sHDw4P//e9/3HbbbfYATlZWFlOnTmXx4sUkJSVRWFhIbm4uiYmJZTr/zp077cPlinXr1u2s/WbPns3cuXNJTEwkNzeXgoKCcs+ot3PnTrp161aiwdGjRw+ysrI4fPiwvWdXu3btShwXERFBamrqOc+bkpLCpEmTWLVqFampqRQVFZGTk2N/D+Li4qhbt649IPV3cXFx3HzzzeW6l9J06tTprG3ne99SU1M5evSoPeBYmnvvvZf33nuPJ598kpSUFH744QdWrFhxyWUVERERcaQAd7j9msY81L8ZP21P4aMNB9iUcIKl25NZuj2ZJqG+3N21ASOurINfBfT2cjSnD0acMWMGY8eOZfTo0bRq1Yo5c+bg7e3N3Llzz3lMUVERd955J88//3yJ/9hWFWd6SikoJSI1kMlkDKFz5OLmbTyW479AQ4cOxWazsXjxYg4dOsTPP//MnXfeaX/98ccfZ+HChUybNo2ff/6ZuLg42rZtS0HBpSe3LPb555/z+OOPM2bMGH766Sfi4uIYPXp0hV7jr/6eINxkMmG1Ws+5f3R0NHFxcbz11lusX7+euLg4goKC7OXz8jp/t/ALvW42m7HZbCW2WSyWs/bz8Sk5JPNC79uFrgswcuRI9u/fz4YNG/jkk09o2LBhlfxHloiIiEhZuLmYua5dBAvu78aPj/birq718XF3IT41iynfbqfrtFgmLdrKnpRMZxe1XJzaU6qgoIAtW7YwceJE+zaz2Uz//v3ZsGHDOY974YUXCA0NZcyYMfz888/nvUZ+fj75+fn29YyMDMBoFJfWML5U6Vm5nCwwvjQ1DPSslGtI5SuuN9Vf9aZ6vHQWiwWbzYbVaj1vcKMyFQc1istRVu7u7gwfPpxPPvmEvXv30rx5czp06GA/x7p164iOjubGG28EjJ5TBw4cOOs6f18vfi+Kh4fl5OTYe0utX7++xD5r166le/fujBs3zn78vn377PuAEUgqLCw86xp/PU+LFi34+uuvKSoqsveWWrt2LX5+fkRGRtr3L63s53vf1q1bx9tvv821114LwKFDh0hLS7Mf06ZNGw4fPsyuXbtK7S3Vtm1bYmNj7UMG/y4kJISjR49itVqx2WxkZGSQkJBwzve02IXeNx8fH6Kioli+fDm9e/cu9dq1a9fmxhtvZO7cuWzcuJFRo0ad830oLp/FYrHnyyqm3x8iIiJS1TQP9+OlYW156toWfP3bET7eeJD41Cw+2ZjIJxsT6dIwkJHdohjYOgw3F6f3RTovpwal0tLSKCoqIiwsrMT2sLAwdu3aVeoxa9eu5YMPPiAuLq5M15g+fXqJvBTFfvrpJ7y9yz4MpKwOZgK44u9mY/2qZRV+fnGsZctUhzWB6vHiubq6Eh4eTlZWVqX17imrzMzy/9dn2LBh3HbbbWzbto1bbrnF/o8JgKioKL766it7jqlp06ZhtVopKCiw72e1WsnLyytxXG5uLhkZGVx//fVMmjSJ0aNH889//pPExERef/11ALKzs8nIyKBevXp89NFHLFy4kAYNGrBgwQI2b95MgwYN7OcMDw9n6dKlbNmyhcDAQPz9/cnKyipxnrvuuou33nqLcePGMXbsWOLj45kyZQoPPvigfd/CwsISZS/eZrFYSmz7q0aNGvHhhx/SokULMjMzee655/Dy8rLf8xVXXEH37t0ZMWIEL7/8Mo0aNWLPnj2YTCb69+/PhAkT6NGjh73Hs7u7Oz///DPDhg0jKCiI7t278/HHH9O3b18CAgKYPn06Li4u5Ofnl/qeFivL+/bkk08SExODv78//fv3Jysri02bNnHffffZz3P77bdz2223UVRUxPDhw8/5PhQUFJCbm8uaNWsoLCw5S05OjgNnmhQREREpBz9PN6K7RzGyWwM27DvORxsOsmxnCpsSTrAp4QRh/h7c3rk+d3SuT2g5ZiR0JKfnlCqPzMxM7r77bv773/8SHBxcpmMmTpxITEyMfb34S8LAgQPx9/ev8DIu+CURtu2iVd1Ahgy5qsLPL45hsVhYtmwZAwYMOGs4jFQfqsdLl5eXx6FDh/D19S2RO8mRbDYbmZmZ+Pn5lTuJ4/XXX09gYCB79+5l1KhRJX7vv/XWW9x7770MGjSI4OBgnnzySXJzc3F3d7fvZzab8fT0LHGcl5cX/v7++Pv78+233/Lggw/Su3dvWrVqxb/+9S9uvvlmfHx88Pf35+GHH2bnzp2MGTMGk8nEbbfdxoMPPsjSpUvt55wwYQIbN27kmmuuISsri9jYWKKiogDs5/H39+f777/nqaeeomfPngQGBjJmzBheeOEFXF2NP+Wurq4lyl68zc3N7Zx/7+bOncu4cePo06cP9erV46WXXuLJJ58scc8LFy7kiSeeYOzYsWRnZ9OkSROmTZuGv78/V155JUuXLmXSpEn0798fLy8vOnfuzOjRo/H392fKlCkcPXqU22+/nYCAACZOnMjhw4fx8PAo9T0tVpb37f7777fX4+TJkwkODuamm24qcZ4bbriBiIgIWrVqRfPmzc/5c5KXl4eXlxe9evU66+f8XIEsERERkarCZDLRvUkw3ZsEk3Qql083JfLZ5kOkZOQzc/le3l4Rz6A24Yzs2oDODQOrVGJ0k+3vyR4cqKCgAG9vb7766iuGDRtm3x4dHU16ejrffPNNif3j4uK44oorSnStL+6Kbzab2b17N40bNz7vNTMyMggICODUqVOVEpR68bttfLDuICO71ueFYW0r/PziGBaLhSVLljBkyBAFM6ox1eOly8vLIyEhgYYNGzotKGW1WsnIyMDf39+epFyqH2fUY1ZWFnXq1GHevHmMGDHinPud7+e8stsN1Ullvxf6nV0zqB5rBtVj9ac6rBkupR4LCq38sC2Jjzcc5NeDJ+3bW4T7cVfXBgy/og4+HpXXT6ms7Qantu7d3d3p2LEjsbGx9m1Wq5XY2NhSZzBq0aIFW7duJS4uzr7ccMMN9O3bl7i4OOrVq+fI4pdqb6oxjKJpqKacFhERcQar1UpqaiovvvgitWrV4oYbbnB2kSrF7NmziYqKwtPTky5durB58+bz7j9z5kyaN2+Ol5cX9erV45///Cd5eXkOKq2IiIg4krurmRs71OGrB7qz5OGe3N65Hl5uLuxKzmTSom10nRbL1G+3czQ916nldPrwvZiYGKKjo+nUqROdO3dm5syZZGdnM3r0aMCYPadOnTpMnz4dT09P2rRpU+L4WrVqAZy13Vn2pmYD0CTU5wJ7ioiISGVITEykYcOG1K1bl/nz59uHONYkCxYsICYmhjlz5tClSxdmzpzJoEGD2L17N6GhoWft/+mnn/L0008zd+5cunfvzp49exg1ahQmk4kZM2Y44Q5ERETEUVpF+jN9RDueHtySr7Yc5pONB0lIy2b++gPc0aW+U8vm9FbarbfeyrFjx3juuedITk6mQ4cOLF261J78PDExsdoM17DZbDwzuDlL1v5G8zD1lBIREXGGqKgonJidwCFmzJhhTzAPMGfOHBYvXszcuXN5+umnz9p//fr19OjRgzvuuAMw3qPbb7+dTZs2nfMajp7BWDOm1gyqx5pB9Vj9qQ5rhoquR29XGNmlLnddVYd1+4/zy4GTNAz0rNS/6xfi9KAUGEleJ0yYUOprq1atOu+x8+fPr/gCXSSTycS1rcOwHrTh56lxuyIiIlLxCgoK2LJlCxMnTrRvM5vN9O/fnw0bNpR6TPfu3fnkk0/YvHkznTt3Zv/+/SxZsoS77777nNdx9AzGxTRjas2geqwZVI/Vn+qwZqisemwBLFmyt1LOXdYZjKtEUEpERKq2mt7rRC5v1e3nOy0tjaKiInuv8mJhYWHs2rWr1GPuuOMO0tLSuPrqq7HZbBQWFjJu3DieeeaZc17H0TMYa8bUmkH1WDOoHqs/1WHNUJ3rsawzGCsoJSIi51T8xy8nJwcvLy8nl0akchQUFACUmN23plm1ahXTpk3jnXfeoUuXLsTHx/PII4/w4osvMnny5FKP8fDwwMPD46ztbm5uldowruzzi2OoHmsG1WP1pzqsGapjPZa1vApKiYjIObm4uFCrVi1SU1MB8Pb2xmQyObQMVquVgoIC8vLyqk2OQTlbVa1Hq9XKsWPH8Pb2rjYJ0YODg3FxcSElJaXE9pSUFMLDw0s9ZvLkydx9993ce++9ALRt25bs7Gzuu+8+nn322SpVJyIiInL5qB6tLxERcZriL7nFgSlHs9ls5Obm4uXl5fCAmFScqlyPZrOZ+vXrV7lynYu7uzsdO3YkNjaWYcOGAUZwLTY29pw5OnNycs4KPBX3DKtuwxdFRESk5lBQSkREzstkMhEREUFoaKhTZnCxWCysWbOGXr16Vbtuy3JGVa5Hd3f3atdTKCYmhujoaDp16kTnzp2ZOXMm2dnZ9tn4Ro4cSZ06dZg+fToAQ4cOZcaMGVxxxRX24XuTJ09m6NChNXrYooiIiFRtCkqJiEiZuLi4OOXLq4uLC4WFhXh6ela5YIaUneqxYt16660cO3aM5557juTkZDp06MDSpUvtyc8TExNLBNomTZqEyWRi0qRJHDlyhJCQEIYOHcrLL7/srFsQERERUVBKREREpDqaMGHCOYfrrVq1qsS6q6srU6ZMYcqUKQ4omYiIiEjZVK++6iIiIiIiIiIiUiMoKCUiIiIiIiIiIg532Q3fK55hJiMjo1LOb7FYyMnJISMjQzkzqjHVY82geqwZVI81Q3Wtx+L2gmaoUxtKykb1WDOoHqs/1WHNUJ3rsaxtqMsuKJWZmQlAvXr1nFwSERERqS4yMzMJCAhwdjGcSm0oERERKa8LtaFMtsvsX39Wq5WjR4/i5+eHyWSq8PNnZGRQr149Dh06hL+/f4WfXxxD9VgzqB5rBtVjzVBd69Fms5GZmUlkZGSJ2ewuR2pDSVmoHmsG1WP1pzqsGapzPZa1DXXZ9ZQym83UrVu30q/j7+9f7X5o5Gyqx5pB9VgzqB5rhupYj5d7D6liakNJeageawbVY/WnOqwZqms9lqUNdXn/y09ERERERERERJxCQSkREREREREREXE4BaUqmIeHB1OmTMHDw8PZRZFLoHqsGVSPNYPqsWZQPcqF6GekZlA91gyqx+pPdVgzXA71eNklOhcREREREREREedTTykREREREREREXE4BaVERERERERERMThFJQSERERERERERGHU1BKREREREREREQcTkGpCjZ79myioqLw9PSkS5cubN682dlFknKYOnUqJpOpxNKiRQtnF0suYM2aNQwdOpTIyEhMJhOLFi0q8brNZuO5554jIiICLy8v+vfvz969e51TWDmnC9XjqFGjzvp8Xnvttc4prJRq+vTpXHXVVfj5+REaGsqwYcPYvXt3iX3y8vIYP348QUFB+Pr6ctNNN5GSkuKkEktVofZT9ab2U/Wk9lPNoPZTzXA5t6EUlKpACxYsICYmhilTpvDbb7/Rvn17Bg0aRGpqqrOLJuXQunVrkpKS7MvatWudXSS5gOzsbNq3b8/s2bNLff3VV1/l3//+N3PmzGHTpk34+PgwaNAg8vLyHFxSOZ8L1SPAtddeW+Lz+dlnnzmwhHIhq1evZvz48WzcuJFly5ZhsVgYOHAg2dnZ9n3++c9/8t133/Hll1+yevVqjh49yogRI5xYanE2tZ9qBrWfqh+1n2oGtZ9qhsu6DWWTCtO5c2fb+PHj7etFRUW2yMhI2/Tp051YKimPKVOm2Nq3b+/sYsglAGwLFy60r1utVlt4eLjttddes29LT0+3eXh42D777DMnlFDK4u/1aLPZbNHR0bYbb7zRKeWRi5OammoDbKtXr7bZbMZnz83Nzfbll1/a99m5c6cNsG3YsMFZxRQnU/up+lP7qfpT+6lmUPup5ric2lDqKVVBCgoK2LJlC/3797dvM5vN9O/fnw0bNjixZFJee/fuJTIykkaNGnHnnXeSmJjo7CLJJUhISCA5ObnEZzMgIIAuXbros1kNrVq1itDQUJo3b84DDzzA8ePHnV0kOY9Tp04BEBgYCMCWLVuwWCwlPo8tWrSgfv36+jxeptR+qjnUfqpZ1H6qWdR+qn4upzaUglIVJC0tjaKiIsLCwkpsDwsLIzk52UmlkvLq0qUL8+fPZ+nSpbz77rskJCTQs2dPMjMznV00uUjFnz99Nqu/a6+9lo8++ojY2Fj+9a9/sXr1agYPHkxRUZGziyalsFqtPPro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\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Figure saved at: /content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final/swin_train_validation_accuracy_loss_curves.png\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "ghZxyPZe7jyy"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Cell 13: Hybrid Model Accuracy and Loss Curves\n",
        "# ConvNeXt-Tiny + Swin-Tiny Features + Random Forest\n",
        "# =========================================================\n",
        "\n",
        "import os\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics import accuracy_score, log_loss\n",
        "\n",
        "\n",
        "tree_steps = [50, 100, 150, 200, 300, 400, 500, 600]\n",
        "\n",
        "train_acc_list = []\n",
        "test_acc_list = []\n",
        "\n",
        "train_loss_list = []\n",
        "test_loss_list = []\n",
        "\n",
        "print(\"Building Hybrid Random Forest learning curves...\")\n",
        "\n",
        "for n_trees in tree_steps:\n",
        "    print(f\"Training Random Forest with {n_trees} trees...\")\n",
        "\n",
        "    hybrid_rf = RandomForestClassifier(\n",
        "        n_estimators=n_trees,\n",
        "        max_depth=6,\n",
        "        max_leaf_nodes=45,\n",
        "        min_samples_split=45,\n",
        "        min_samples_leaf=20,\n",
        "        max_features=\"sqrt\",\n",
        "        bootstrap=True,\n",
        "        max_samples=0.55,\n",
        "        class_weight=\"balanced_subsample\",\n",
        "        random_state=SEED,\n",
        "        n_jobs=-1\n",
        "    )\n",
        "\n",
        "    hybrid_rf.fit(X_train_ml, y_train_ml)\n",
        "\n",
        "    # Predictions\n",
        "    train_pred = hybrid_rf.predict(X_train_ml)\n",
        "    test_pred = hybrid_rf.predict(X_test_ml)\n",
        "\n",
        "    # Probabilities for loss\n",
        "    train_proba = hybrid_rf.predict_proba(X_train_ml)\n",
        "    test_proba = hybrid_rf.predict_proba(X_test_ml)\n",
        "\n",
        "    # Accuracy\n",
        "    train_acc = accuracy_score(y_train_ml, train_pred)\n",
        "    test_acc = accuracy_score(y_test_ml, test_pred)\n",
        "\n",
        "    # Log loss\n",
        "    train_loss = log_loss(y_train_ml, train_proba, labels=[0, 1, 2, 3, 4])\n",
        "    test_loss = log_loss(y_test_ml, test_proba, labels=[0, 1, 2, 3, 4])\n",
        "\n",
        "    train_acc_list.append(train_acc)\n",
        "    test_acc_list.append(test_acc)\n",
        "\n",
        "    train_loss_list.append(train_loss)\n",
        "    test_loss_list.append(test_loss)\n",
        "\n",
        "print(\"Hybrid learning curves completed.\")\n",
        "\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Plot paper-style figure\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "fig, axes = plt.subplots(1, 2, figsize=(11, 4))\n",
        "\n",
        "# Accuracy curve\n",
        "axes[0].plot(tree_steps, train_acc_list, label=\"train accuracy\")\n",
        "axes[0].plot(tree_steps, test_acc_list, label=\"test accuracy\")\n",
        "axes[0].set_xlabel(\"Number of Trees\")\n",
        "axes[0].set_ylabel(\"Accuracy\")\n",
        "axes[0].set_title(\"(a) Accuracy\")\n",
        "axes[0].legend()\n",
        "axes[0].grid(True)\n",
        "\n",
        "# Loss curve\n",
        "axes[1].plot(tree_steps, train_loss_list, label=\"train loss\")\n",
        "axes[1].plot(tree_steps, test_loss_list, label=\"test loss\")\n",
        "axes[1].set_xlabel(\"Number of Trees\")\n",
        "axes[1].set_ylabel(\"Log Loss\")\n",
        "axes[1].set_title(\"(b) Loss\")\n",
        "axes[1].legend()\n",
        "axes[1].grid(True)\n",
        "\n",
        "plt.suptitle(\"Hybrid Model Accuracy and Loss Curves\")\n",
        "plt.tight_layout()\n",
        "\n",
        "# Save figure\n",
        "SAVE_DIR = \"/content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final\"\n",
        "os.makedirs(SAVE_DIR, exist_ok=True)\n",
        "\n",
        "figure_path = os.path.join(\n",
        "    SAVE_DIR,\n",
        "    \"hybrid_model_accuracy_loss_curves.png\"\n",
        ")\n",
        "\n",
        "plt.savefig(figure_path, dpi=300, bbox_inches=\"tight\")\n",
        "plt.show()\n",
        "\n",
        "print(\"Figure saved at:\", figure_path)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 604
        },
        "id": "T_GozAFiu_38",
        "outputId": "2483fb68-aff3-45d4-99db-12d5710506d0"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Building Hybrid Random Forest learning curves...\n",
            "Training Random Forest with 50 trees...\n",
            "Training Random Forest with 100 trees...\n",
            "Training Random Forest with 150 trees...\n",
            "Training Random Forest with 200 trees...\n",
            "Training Random Forest with 300 trees...\n",
            "Training Random Forest with 400 trees...\n",
            "Training Random Forest with 500 trees...\n",
            "Training Random Forest with 600 trees...\n",
            "Hybrid learning curves completed.\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1100x400 with 2 Axes>"
            ],
            "image/png": "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EBEREQG4d+8eBg4ciIULF8LFxaXIev369ZOeN2nSBE2bNoWPjw927tyJDh06lOrYKpUKKpXKqNza2tpiTqotaaxlhTEzD+NlPsbMPIyX+coyZua0w0QIERERVUouLi5QKBS4fv26Qfn169dNru9x7tw5pKSkoHv37lKZXq8HkDej49SpU/Dx8THar06dOnBxccHZs2fRoUMHuLu7Gy3GqtVqcfv27SLXFSEiIqLHh3eNISIiokpJqVQiICAACQkJUpler0dCQgJefPFFo/q+vr44duwYDh8+LD1eeeUVtGvXDocPH4anp6fJ41y6dAm3bt3CM888AwB48cUXkZaWhkOHDkl1tm/fDr1ej8DAwDIeJREREZmLM0KIiIio0oqMjERYWBiaN2+OFi1aIDY2FpmZmdJdZAYNGoQaNWogOjoaarUajRs3Ntjf0dERAKTyjIwMREVFoXfv3nB3d8e5c+cwbtw41K1bFyEhIQCABg0aoFOnThg6dCgWLFgAjUaDiIgI9OvXz+QdY4iIiOjxYiKEiIiIKq2+ffvi5s2bmDx5Mq5duwZ/f39s3rxZWkD14sWLkMtLPkFWoVDg6NGjWLp0KdLS0uDh4YHg4GBMnz7dYI2PFStWICIiAh06dIBcLkfv3r3x9ddfl/n4iIiIyHxMhBAREVGlFhERgYiICJPbdu7cWey+S5YsMXhtY2ODLVu2PPSYzs7OWLlyZUm7SERERI8R1wghIiIiIiIiIovBRAgRERERERERWQwmQoiIiIiIiIjIYjARQkREREREREQWg4kQIiIiIiIiIrIYTIQQERERERERkcVgIoSIiIiIiIiILAYTIURERERERERkMZgIISIiIiIiIiKLwUQIEREREREREVkMJkKIiIiIiIiIyGIwEUJEREREREREFoOJECIiIiIiIiKyGEyEEBEREREREZHFYCKEiIiIiIiIiCwGEyFEREREREREZDGeiETIvHnz4OXlBbVajcDAQBw4cKDIuhqNBtOmTYOPjw/UajX8/PywefNmgzrR0dF4/vnnYW9vDzc3N/Ts2ROnTp0q72EQERERERER0ROuwhMha9asQWRkJKZMmYKkpCT4+fkhJCQEN27cMFl/0qRJ+N///oc5c+bg+PHjePfdd9GrVy/89ddfUp3ff/8dI0aMwB9//IH4+HhoNBoEBwcjMzPzcQ2LiIiI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an65RqPBa6+9hqSkJPz666/Q6XS4du0aAMDZ2RlKpRKJiYnYv38/2rVrB3t7eyQmJmLMmDF444034OTk9PgGT0RERCYxEUJERESVVt++fXHz5k1MnjwZ165dg7+/PzZv3iwtoHrx4kXI5SWfIHv58mX88ssvAAB/f3+DbTt27EDbtm2hUqmwevVqTJ06FTk5OfD29saYMWMM1g0hIiKiisNECBEREVVqERERiIiIMLlt586dxe67ZMkSg9deXl4QQhS7T7NmzfDHH3+Y00UiIiJ6jLhGCBERERERERFZDCZCiIiIiIiIiMhiMBFCRERERERERBaDiRAiIiIiIiIishhMhBARERERERGRxWAihIiIiIiIiIgsBhMhRERERERERGQxmAghIiIiIiIiIovBRAgRERERERERWQwmQoiIiIiIiIjIYjARQkREREREREQWg4kQIiIiIiIiIrIYTIQQERERERERkcVgIoSIiIiIiIiILAYTIURERERERERkMcxOhHh5eWHatGm4ePFiefSHiIiIiIiIiKjcmJ0IGT16NNatW4c6deqgY8eOWL16NXJycsqjb0RERGRhNm/ejD179kiv582bB39/fwwYMAB37typwJ4RERFRZVGqRMjhw4dx4MABNGjQACNHjsQzzzyDiIgIJCUllUcfiYiIyEJ88MEHSE9PBwAcO3YM77//Prp06YLk5GRERkZWcO+IiIioMij1GiHNmjXD119/jStXrmDKlCn47rvv8Pzzz8Pf3x9xcXEQQpRlP4mIiMgCJCcno2HDhgCAn376Cd26dcNnn32GefPm4bfffqvg3hEREVFlYFXaHTUaDdavX4/FixcjPj4eL7zwAt566y1cunQJEydOxLZt27By5cqy7CsREZWCXq9Hbm5uRXejXGk0GlhZWSE7Oxs6na6iu/PEK228lEol5PLyXWddqVQiKysLALBt2zYMGjQIAODs7CzNFCEiInoUZX1uxPMQ85UmZtbW1lAoFGVyfLMTIUlJSVi8eDFWrVoFuVyOQYMG4auvvoKvr69Up1evXnj++efLpINERFR6ubm5SE5Ohl6vr+iulCshBNzd3fHvv/9CJpNVdHeeeKWNl1wuh7e3N5RKZbn1rWXLloiMjMTLL7+MAwcOYM2aNQCA06dPo2bNmuV2XCIisgzlcW7E8xDzlTZmjo6OcHd3f+Q4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DCQkJCAyMhJ16tRB27ZtAQD9+vWT6jZp0gRNmzaFj48Pdu7ciQ4dOpTqmBMmTEBkZKT0Oj09HZ6enggODoaDg8MjjedJp9FoEB8fj44dO8La2rqiu/NUYMzMw3iZjzEzD+NlvvKIWf5sypJgIoSIiIgqJRcXFygUCly/ft2g/Pr163B3dy9yP7lcjrp16wIA/P39ceLECURHR0uJkMLq1KkDFxcXnD17Fh06dIC7u7vRYqxarRa3b98u8rgqlQoqlcqo3Nra2mJOqi1prGWFMTMP42U+xsw8jJf5yjJm5rTDxVKJiIioUlIqlQgICEBCQoJUptfrkZCQgBdffLHE7ej1eoP1Owq7dOkSbt26hWeeeQYA8OKLLyItLQ2HDh2S6mzfvh16vR6BgYGlGAkRERGVJc4IISIiokorMjISYWFhaN68OVq0aIHY2FhkZmYiPDwcADBo0CDUqFED0dHRAPLW6mjevDl8fHyQk5ODTZs2YdmyZZg/fz4AICMjA1FRUejduzfc3d1x7tw5jBs3DnXr1kVISAgAoEGDBujUqROGDh2KBQsWQKPRICIiAv369YOHh0fFBIKIiIgkTIQQERFRpdW3b1/cvHkTkydPxrVr1+Dv74/NmzdLC6hevHgRcvl/E2QzMzMxfPhwXLp0CTY2NvD19cXy5cvRt29fAIBCocDRo0exdOlSpKWlwcPDA8HBwZg+fbrBpS0rVqxAREQEOnToALlcjt69e+Prr79+vIMnIiIik5gIISIiokotIiICERERJrft3LnT4PUnn3yCTz75pMi2bGxssGXLloce09nZGStXrjSrn0RERPR4cI0QIiIiIiIiIrIYTIQQERERERERkcVgIoSIiIiIiIiILAYTIURERERERERkMZgIISIiIiIiIiKLwUQIEREREREREVkMJkKIiIiIiIiIyGIwEUJEREREREREFoOJECIiIiIiIiKyGEyEEBEREREREZHFYCKEiIiIiIiIiCwGEyFEREREREREZDGYCCEiIiIiIiIii8FECBERERERERFZDCZCiIiIiIiIiMhiMBFCRERERERERBaDiRAiIiIiIiIishgVngiZN28evLy8oFarERgYiAMHDhRbPzY2FvXr14eNjQ08PT0xZswYZGdnG9S5fPky3njjDVSrVg02NjZo0qQJ/vzzz/IcBhERERERERE9Bawq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4dlnn8Xx48exa9cu/PKXv4QQ4qbaR0RE1FFwHMJxCFGHJoioy5kxY4Z4+OGHhRBC3H333eLZZ58VQgixadMmUf/XPjExUYSHhyve+4c//EEEBwcr6goODhYWi0XeNnDgQHHPPffI62azWbi5uYnPPvtMCCHE2bNnBQCRnJwslzGZTKJPnz5i5cqVQgghli9fLiZOnKg49vnz5wUAkZubK4QQ4r777hPDhw9vtr+BgYHirbfeUmy76667xJw5c+T18PBwkZiY2GxdQgixbt064eXlJa/v3LlTABCbN2+Wt924cUO4urqK/fv3K9773HPPiWnTprWoj9nZ2QKAOHfuXIvaRURE1BlwHMJxCFFHp3dM+oWI2svKlSvx85///Ka/fQCAO++8E1pt3QQyPz8/DB06VF7X6XTo2bMnrly5onhfdHS0/Fqv1yMyMhLHjx8HAHz77bfYuXMn3N3dbY53+vRp3HHHHQCAkSNHNtm2kpISXLp0CWPGjFFsHzNmDL799tsW9rBlIiMj5denTp1CRUUFJkyYoChTXV2N4cOHA2i+jxMnTsT48eMRFhaG2NhYTJw4Eb/+9a/Ro0ePVm03ERGRo3Ac0no4DiFqPUyEEHVx9957L2JjY5GQkIBnnnlGsU+r1dpMfzSZTDZ1GAwGxbpGo7G7zWq1trhdZWVlmDJlClauXGmzLyAgQH7t5ubW4jrbWv22lJWVAQC2bt2KoKAgRTmj0SiXaaqPOp0O6enp2L9/P7Zv3473338fixcvRlZWFkJDQ9uwJ0RERO2D45DWw3EIUethIoSoG0hOTkZERAQGDhyo2N6rVy/k5+dDCCE/zi4nJ6fVjvvNN9/g3nvvBQCYzWZkZ2cjLi4OADBixAj885//REhICPT6m/9T5OnpicDAQOzbtw/33XefvH3fvn0YNWrUrXWgCUOGDIHRaEReXp7iuPW1pI8ajQZjxozBmDFjsHTpUgQHB2PTpk2Ij49vs7YTERG1J45DWh/HIUS3hjdLJeoGwsLCMH36dLz33nuK7ePGjcPVq1fx9ttv4/Tp01i9ejW2bdvWasddvXo1Nm3ahBMnTmDu3Lm4fv06nn32WQDA3Llzce3aNUybNg0HDx7E6dOn8fXXX2PmzJmwWCyqjvPyyy9j5cqV+OKLL5Cbm4tFixYhJycH8+bNa7W+NOTh4YGXXnoJCxYswPr163H69GkcPnwY77//PtavXw+g+T5mZWVhxYoVOHToEPLy8rBx40ZcvXoVgwcPbrN2ExERtTeOQ1ofxyFEt4aJEKJuYtmyZTZTRgcPHowPPvgAq1evRnh4OA4cOHBL1/A2lJycjOTkZISHh2Pv3r3YsmULfH19AUD+9sRisWDixIkICwvD/Pnz4e3trbgOuCVefPFFxMfHY+HChQgLC0NaWhq2bNmCAQMGtFpf7Fm+fDmWLFmCpKQkDB48GPfffz+2bt0qTydtro+enp7Ys2cPJk+ejDvuuAOvvfYa3n33XUyaNKlN201ERNTeOA5pfRyHEN08jWh4YR4RERERERERURfFGSFERERERERE1G0wEUJERERERERE3QYTIURERERERETUbTARQkRERERERETdBhMhRERERERERNRtMBFCRERERERERN0GEyFERERERERE1G0wEUJERERERERE3QYTIURERERERETUbTARQkRERERERETdBhMhRERERERERNRt/H8qJh1olH4jPgAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Figure saved at: /content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final/hybrid_model_accuracy_loss_curves.png\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "qPpsFdYv52hn"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# =========================================================\n",
        "# Figure: Handling Imbalanced Data\n",
        "# Using y_train instead of train_df\n",
        "# =========================================================\n",
        "\n",
        "import os\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.utils.class_weight import compute_class_weight\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Load y_train if it does not exist\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "SAVE_DIR = \"/content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final\"\n",
        "FEATURE_PATH = os.path.join(SAVE_DIR, \"fused_features_convnext_swin.npz\")\n",
        "\n",
        "if \"y_train\" not in globals():\n",
        "    print(\"y_train not found. Loading from saved fused features...\")\n",
        "    data = np.load(FEATURE_PATH)\n",
        "    y_train = data[\"y_train\"]\n",
        "\n",
        "print(\"y_train shape:\", y_train.shape)\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Class names\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "class_names = [\n",
        "    \"No DR\",\n",
        "    \"Mild\",\n",
        "    \"Moderate\",\n",
        "    \"Severe\",\n",
        "    \"Proliferative DR\"\n",
        "]\n",
        "\n",
        "classes = np.array([0, 1, 2, 3, 4])\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Original training distribution\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "train_counts = pd.Series(y_train).value_counts().sort_index()\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Compute class weights used to handle imbalance\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "class_weights = compute_class_weight(\n",
        "    class_weight=\"balanced\",\n",
        "    classes=classes,\n",
        "    y=y_train\n",
        ")\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# Plot: Original Distribution + Class Weights\n",
        "# ---------------------------------------------------------\n",
        "\n",
        "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n",
        "\n",
        "# (a) Original class distribution\n",
        "axes[0].bar(range(len(train_counts)), train_counts.values)\n",
        "axes[0].set_xticks(range(len(train_counts)))\n",
        "axes[0].set_xticklabels(class_names, rotation=20)\n",
        "axes[0].set_xlabel(\"Class\")\n",
        "axes[0].set_ylabel(\"Number of Samples\")\n",
        "axes[0].set_title(\"(a) Original Training Distribution\")\n",
        "axes[0].grid(axis=\"y\", alpha=0.3)\n",
        "\n",
        "# (b) Class weights\n",
        "axes[1].bar(range(len(class_weights)), class_weights)\n",
        "axes[1].set_xticks(range(len(class_weights)))\n",
        "axes[1].set_xticklabels(class_names, rotation=20)\n",
        "axes[1].set_xlabel(\"Class\")\n",
        "axes[1].set_ylabel(\"Class Weight\")\n",
        "axes[1].set_title(\"(b) Class Weights Used for Imbalance Handling\")\n",
        "axes[1].grid(axis=\"y\", alpha=0.3)\n",
        "\n",
        "plt.tight_layout()\n",
        "\n",
        "# Save figure\n",
        "save_path = os.path.join(SAVE_DIR, \"imbalanced_data_handling_class_weights.png\")\n",
        "plt.savefig(save_path, dpi=300, bbox_inches=\"tight\")\n",
        "\n",
        "plt.show()\n",
        "\n",
        "print(\"Training Distribution:\")\n",
        "print(train_counts)\n",
        "\n",
        "print(\"\\nClass Weights:\")\n",
        "for i, w in enumerate(class_weights):\n",
        "    print(f\"{class_names[i]}: {w:.4f}\")\n",
        "\n",
        "print(\"\\nFigure saved at:\", save_path)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 802
        },
        "id": "cQPJIJtC7xp9",
        "outputId": "acb5bfab-b80a-462f-8c2f-a97aeae0b8c5"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "y_train shape: (2563,)\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1400x500 with 2 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAABW4AAAHqCAYAAACUWtfDAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAApDpJREFUeJzs3Xl4TOf///HXTEhiS8SSxJKiKGLfG/tWsdPqovWppYoqaiuV2pc2pbYqtbQltFRRFK19LYJai6qltbSIaC2xJcic3x9+ma+RhAzJzCR5Pq7L1Z773Oec9zn3nJl73rnnPibDMAwBAAAAAAAAAFyG2dkBAAAAAAAAAABskbgFAAAAAAAAABdD4hYAAAAAAAAAXAyJWwAAAAAAAABwMSRuAQAAAAAAAMDFkLgFAAAAAAAAABdD4hYAAAAAAAAAXAyJWwAAAAAAAABwMSRuAQAAAAAAAMDFkLgF0qGxY8eqePHislgsdm139+5dBQQE6IsvvkihyB5t8+bNMplM2rx5s93bnj59WiaTSWFhYcke14MKFiyoDh06pOgxkiI1XKvkEhYWJpPJpNOnT6f4sTp06KCCBQtal+Ou1bhx41L82JI0fPhwmUwmhxwLAOBaHu6/2fMZNHDgQFWtWjVF4nqaPkdaYDKZNHz48CfetkePHskbUCpWp04d1alT57H17t27pwEDBiggIEBms1mtWrVK8diSW506dVSqVKlk3efTvBbxeAl9R0qob+4q3weRdpC4BdKZqKgojRkzRh988IHMZvveAjJmzKi+ffvqo48+UnR0dJK3+++//9S/f38VK1ZMnp6eypEjh4KDg7Vy5Up7w0/1OnToIJPJ9Nh/6fXDPu7LX9w/Dw8P+fn5qU6dOvr444916dKlZDnOrVu3NHz4cJf8kunKsQEAnONp+m+S1Lt3bx08eFDLly+3a7ulS5eqcePGypUrl9zd3ZU3b169+uqr2rhxo90xOFKTJk3k4+MjwzBsyvfv3y+TyaQCBQrE22bjxo0ymUyaOXOmo8JMsh07dmj48OG6evVqsu3zUUnjxYsXu3QyftasWfr000/18ssva86cOerTp0+KHi8lkqxI2OP+IBWXKP33338dHBngPBmcHQAAx5o1a5bu3bun119//Ym279ixowYOHKj58+frrbfeemz9Y8eOqX79+rp06ZI6duyoSpUq6erVq5o3b56aN2+u999/X59++mmSjl2rVi3dvn1b7u7udsddoEAB3b59WxkzZrR72+TUtWtXNWjQwLp86tQpDR06VF26dFHNmjWt5YULF36q46T2a/Xee++pcuXKio2N1aVLl7Rjxw4NGzZMEyZM0MKFC1WvXj1r3TfffFNt2rSRh4dHkvd/69YtjRgxQpKSNLIjzpdffmn3SHV7PSq2wYMHa+DAgSl6fACA63na/pu/v79atmypcePGqUWLFo+tbxiG3nrrLYWFhal8+fLq27ev/P39deHCBS1dulT169fX9u3bVa1atSeKJ6XVqFFDq1at0uHDh1W6dGlr+fbt25UhQwadPXtW//zzj/Lnz2+zLm5be9y+fVsZMqTs1+odO3ZoxIgR6tChg7Jnz56ix0oNNm7cqHz58mnixInODgWI59ixY0/0BzYgMSRugXRm9uzZatGihTw9PZ9o++zZs6thw4YKCwt7bOL27t27evnll3XlyhVt3brV5id6ffr0Udu2bTVu3DhVqlRJr732WqL7iY6Olru7u8xm8xPHbTKZnnjb5BQUFKSgoCDr8p49ezR06FAFBQXpf//7X6Lb3bx5U1myZEnycVL7tapZs6Zefvllm7KDBw+qYcOGat26tX7//XflyZNHkuTm5iY3N7cUjSfu+js78Z8hQ4YU/3IIAHA9T9t/k6RXX31Vr7zyiv766y89++yzj6w7fvx4hYWFqXfv3powYYLNT4EHDRqkb775xqU/j+KSr9u2bYuXuG3SpIk2btyobdu2qU2bNtZ127ZtU86cOVWiRAm7juXsPlN6FBkZmawJbIvFojt37tCWSBb2DCYBkoI/AwDpyKlTp/Tbb7/ZjPiMM27cOFWrVk05c+ZUpkyZVLFiRS1evDjB/bzwwgvatm2bLl++/Mjj/fDDDzp8+HCC86q5ublpxowZyp49u81cTHE/lV+wYIEGDx6sfPnyKXPmzIqKikp0DrWpU6fq2WefVaZMmVSlShX98ssv8ebISmhOog4dOihr1qw6d+6cWrVqpaxZsyp37tx6//33FRsb+8TX52nFzdm6ZcsWvfvuu/L19bWOCDlz5ozeffddFStWTJkyZVLOnDn1yiuvxJvfNaFrFfczr99//11169ZV5syZlS9fPo0dO9Zm26e9Vv/995/efPNNeXl5KXv27Grfvr0OHjz41PPmli1b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dKn1i0RC5syZoy+++EIvvviiChcurOvXr+vLL7+Ul5eXNdGZKVMmBQYG6vvvv9dzzz2nHDlyqFSpUo+cguFRihQpoho1aqhbt26KiYnRpEmTlDNnTpufWL711luaMGGCgoOD1alTJ0VGRmr69OkqWbKkzcP57ImtbNmyat++vWbOnKmrV6+qdu3a2r17t+bMmaNWrVrZjEQHAKROifXf4iTlM0iS1q9fL8Mw1LJly8ces3///jpy5IjGjx+vTZs26eWXX5a/v78iIiK0bNky7d69Wzt27Ehw2+LFi6tw4cJ6//33de7cOXl5eemHH36I90f148ePq379+nr11VcVGBioDBkyaOnSpbp48aK1b5iUz/RHiRtFGx4erg4dOtise+6555QrVy6Fh4erdOnS1gd9xZ3/8uXL1axZM3Xo0EEVK1bUzZs3dejQIS1evFinT59OdMqJ4cOHa+3atapevbq6detmTSaWKlVKBw4ceGzMCYlL4g0aNEht2rRRxowZ1bx5c40cOVJbt25V06ZNVaBAAUVGRuqLL75Q/vz5bUYQJ2TgwIFatGiRatWqpa5du6p48eI6f/68wsLCdOHCBZtflm3cuFE9evTQK6+8oueee0737t3TN998Izc3N7Vu3VrS/aT76NGjFRISotOnT6tVq1bKli2bTp06paVLl6pLly56//33lTFjRo0ePVpdu3ZVvXr19Nprr+nUqVOaPXv2U81x27x5c9WtW1eDBg3S6dOnVbZsWa1du1Y//vijevfubfMAOFeRN29ejRkzRqdPn9Zzzz2n77//XgcOHNDMmTOVMWNGSff7/kuWLNGLL76opk2b6tSpU5o+fboCAwMTTIw+KLm/N3h5eWnixIl6++23VblyZb3xxhvy8fHRwYMHdevWLc2ZM0dms1lfffWVGjdurJIlS6pjx47Kly+fzp07p02bNsnLy0srVqx4ouMnJKnvN/Zo3ry5qlevroEDB+r06dMKDAzUkiVLUvTZJpLk5+enXr16afz48WrRooUaNWqkgwcPatWqVcqVK1ey/2IQqQeJWyCdeeuttzR06FDdvn3bOrdTvXr19PXXX+uTTz5R7969VahQIWsn4uHE5LVr17R27Vp98cUXSTpeiRIldPDgQX3yySdavny5Zs+erUyZMqlSpUpavny5mjdv/lTn06NHDxmGofHjx+v9999X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GoCTk5MxY8YM9bi2trbq9snJyRgwYACcnJwAADY2Nv9rMYiIiIiogmNuJSJ6fhwqgYioHBKR59pv+/btaN++PRo0aIAaNWpgzpw5SE5OVtdPnToVY8aMQdeuXbF48WLcuHFDXTd58mR8+umnaN++PebNm4dffvnlfy4HEREREVVszK1ERM+PFbdEROWQra0tFEX5UxM5REdHY8iQIejduzcOHDiA8+fP46OPPkJBQYG6zfz58xEXFwd/f3/88MMPcHBwQGhoKABgzJgxuHnzJoYNG4aLFy/C3d0dq1ateuFlIyIiIqKKg7mViOj5KfK8j7+IiEivevXqhYsXL+Lq1atPjRf28OFD1K5dG4qiIDQ0FP369UNISAjWrFlTqjXCmDFjsHPnTjx8+PCZf2PQoEHIycnBvn37nlo3a9YshIWFsQUDEREREf0u5lYioufDFrdEROXU559/jqKiInh6emLXrl1ISEjA5cuXsXLlSrRt2/ap7W1tbZGcnIxt27bhxo0bWLlypdoqAQDy8vIwceJEREZG4tatWzh58iROnz6Nli1bAgA++OADHDp0CImJiTh37hx+/PFHdR0RERER0W9hbiUiej6cnIyIqJyysbHBuXPnEBQUhGnTpiE1NRUWFhZwc3PD2rVrn9q+b9++mDJlCiZOnIgnT57A398fH3/8MebPnw8A0Gg0yMjIwPDhw/HPf/4T5ubm+Mtf/oJPPvkEAFBUVITAwEDcuXMHNWvWRM+ePbFixYpXWWQiIiIiKoeYW4mIng+HSiAiIiIiIiIiIiIqYzhUAhEREREREREREVEZw4pbIiIiIiIiIiIiojKGFbdEREREREREREREZQwrbomIiIiIiIiIiIjKGFbcEhEREREREREREZUxrLglIiIiIiIiIiIiKmNYcUtERERERERERERUxrDiloiIiIiIiIiIiKiMYcUtERERERERERERURnDilsiIiIiIiIiIiKiMoYVt0RERERERERERERlDCtuiYiIiIiIiIiIiMqY/weAfLNA9TH0vAAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Training Distribution:\n",
            "0    1263\n",
            "1     259\n",
            "2     699\n",
            "3     135\n",
            "4     207\n",
            "Name: count, dtype: int64\n",
            "\n",
            "Class Weights:\n",
            "No DR: 0.4059\n",
            "Mild: 1.9792\n",
            "Moderate: 0.7333\n",
            "Severe: 3.7970\n",
            "Proliferative DR: 2.4763\n",
            "\n",
            "Figure saved at: /content/drive/MyDrive/DR_Hybrid_ConvNeXt_Swin_RF_Final/imbalanced_data_handling_class_weights.png\n"
          ]
        }
      ]
    }
  ]
}