{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "7e0333c4-0cd3-4e24-9212-6c9a8169b11d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import time\n",
    "import numbers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "508a9583-ea8b-4a12-8829-3556eac3f264",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.preprocessing import LabelEncoder, MinMaxScaler\n",
    "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report, confusion_matrix, roc_curve, roc_auc_score\n",
    "from sklearn.datasets import load_diabetes\n",
    "from sklearn.preprocessing import StandardScaler, LabelEncoder\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score\n",
    "from sklearn.feature_selection import SelectKBest, chi2, f_classif, RFE\n",
    "from sklearn.datasets import load_diabetes, load_iris"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "cfea0b9c-98a5-4cc0-99f4-d0be37e221d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>year</th>\n",
       "      <th>gender</th>\n",
       "      <th>age</th>\n",
       "      <th>location</th>\n",
       "      <th>race:AfricanAmerican</th>\n",
       "      <th>race:Asian</th>\n",
       "      <th>race:Caucasian</th>\n",
       "      <th>race:Hispanic</th>\n",
       "      <th>race:Other</th>\n",
       "      <th>hypertension</th>\n",
       "      <th>heart_disease</th>\n",
       "      <th>smoking_history</th>\n",
       "      <th>bmi</th>\n",
       "      <th>hbA1c_level</th>\n",
       "      <th>blood_glucose_level</th>\n",
       "      <th>diabetes</th>\n",
       "      <th>clinical_notes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2020</td>\n",
       "      <td>Female</td>\n",
       "      <td>32.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>27.32</td>\n",
       "      <td>5.0</td>\n",
       "      <td>100</td>\n",
       "      <td>0</td>\n",
       "      <td>Overweight, advised dietary and exercise modif...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2015</td>\n",
       "      <td>Female</td>\n",
       "      <td>29.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>19.95</td>\n",
       "      <td>5.0</td>\n",
       "      <td>90</td>\n",
       "      <td>0</td>\n",
       "      <td>Healthy BMI range.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2015</td>\n",
       "      <td>Male</td>\n",
       "      <td>18.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>23.76</td>\n",
       "      <td>4.8</td>\n",
       "      <td>160</td>\n",
       "      <td>0</td>\n",
       "      <td>Young patient, generally lower risk but needs ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2015</td>\n",
       "      <td>Male</td>\n",
       "      <td>41.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>27.32</td>\n",
       "      <td>4.0</td>\n",
       "      <td>159</td>\n",
       "      <td>0</td>\n",
       "      <td>Overweight, advised dietary and exercise modif...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2016</td>\n",
       "      <td>Female</td>\n",
       "      <td>52.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>23.75</td>\n",
       "      <td>6.5</td>\n",
       "      <td>90</td>\n",
       "      <td>0</td>\n",
       "      <td>Healthy BMI range. High HbA1c level, indicativ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   year  gender   age location  race:AfricanAmerican  race:Asian  \\\n",
       "0  2020  Female  32.0  Alabama                     0           0   \n",
       "1  2015  Female  29.0  Alabama                     0           1   \n",
       "2  2015    Male  18.0  Alabama                     0           0   \n",
       "3  2015    Male  41.0  Alabama                     0           0   \n",
       "4  2016  Female  52.0  Alabama                     1           0   \n",
       "\n",
       "   race:Caucasian  race:Hispanic  race:Other  hypertension  heart_disease  \\\n",
       "0               0              0           1             0              0   \n",
       "1               0              0           0             0              0   \n",
       "2               0              0           1             0              0   \n",
       "3               1              0           0             0              0   \n",
       "4               0              0           0             0              0   \n",
       "\n",
       "  smoking_history    bmi  hbA1c_level  blood_glucose_level  diabetes  \\\n",
       "0           never  27.32          5.0                  100         0   \n",
       "1           never  19.95          5.0                   90         0   \n",
       "2           never  23.76          4.8                  160         0   \n",
       "3           never  27.32          4.0                  159         0   \n",
       "4           never  23.75          6.5                   90         0   \n",
       "\n",
       "                                      clinical_notes  \n",
       "0  Overweight, advised dietary and exercise modif...  \n",
       "1                                 Healthy BMI range.  \n",
       "2  Young patient, generally lower risk but needs ...  \n",
       "3  Overweight, advised dietary and exercise modif...  \n",
       "4  Healthy BMI range. High HbA1c level, indicativ...  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('diabetes_dataset_with_notes.csv')\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6682db2b-f08b-4f1d-91e3-85059143c04b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>year</th>\n",
       "      <th>age</th>\n",
       "      <th>race:AfricanAmerican</th>\n",
       "      <th>race:Asian</th>\n",
       "      <th>race:Caucasian</th>\n",
       "      <th>race:Hispanic</th>\n",
       "      <th>race:Other</th>\n",
       "      <th>hypertension</th>\n",
       "      <th>heart_disease</th>\n",
       "      <th>bmi</th>\n",
       "      <th>hbA1c_level</th>\n",
       "      <th>blood_glucose_level</th>\n",
       "      <th>diabetes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.00000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.00000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2018.360820</td>\n",
       "      <td>41.885856</td>\n",
       "      <td>0.202230</td>\n",
       "      <td>0.200150</td>\n",
       "      <td>0.198760</td>\n",
       "      <td>0.19888</td>\n",
       "      <td>0.199980</td>\n",
       "      <td>0.07485</td>\n",
       "      <td>0.039420</td>\n",
       "      <td>27.320767</td>\n",
       "      <td>5.527507</td>\n",
       "      <td>138.058060</td>\n",
       "      <td>0.085000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.345239</td>\n",
       "      <td>22.516840</td>\n",
       "      <td>0.401665</td>\n",
       "      <td>0.400114</td>\n",
       "      <td>0.399069</td>\n",
       "      <td>0.39916</td>\n",
       "      <td>0.399987</td>\n",
       "      <td>0.26315</td>\n",
       "      <td>0.194593</td>\n",
       "      <td>6.636783</td>\n",
       "      <td>1.070672</td>\n",
       "      <td>40.708136</td>\n",
       "      <td>0.278883</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>2015.000000</td>\n",
       "      <td>0.080000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>10.010000</td>\n",
       "      <td>3.500000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>2019.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>23.630000</td>\n",
       "      <td>4.800000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2019.000000</td>\n",
       "      <td>43.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.320000</td>\n",
       "      <td>5.800000</td>\n",
       "      <td>140.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>2019.000000</td>\n",
       "      <td>60.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>29.580000</td>\n",
       "      <td>6.200000</td>\n",
       "      <td>159.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>2022.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>95.690000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>300.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                year            age  race:AfricanAmerican     race:Asian  \\\n",
       "count  100000.000000  100000.000000         100000.000000  100000.000000   \n",
       "mean     2018.360820      41.885856              0.202230       0.200150   \n",
       "std         1.345239      22.516840              0.401665       0.400114   \n",
       "min      2015.000000       0.080000              0.000000       0.000000   \n",
       "25%      2019.000000      24.000000              0.000000       0.000000   \n",
       "50%      2019.000000      43.000000              0.000000       0.000000   \n",
       "75%      2019.000000      60.000000              0.000000       0.000000   \n",
       "max      2022.000000      80.000000              1.000000       1.000000   \n",
       "\n",
       "       race:Caucasian  race:Hispanic     race:Other  hypertension  \\\n",
       "count   100000.000000   100000.00000  100000.000000  100000.00000   \n",
       "mean         0.198760        0.19888       0.199980       0.07485   \n",
       "std          0.399069        0.39916       0.399987       0.26315   \n",
       "min          0.000000        0.00000       0.000000       0.00000   \n",
       "25%          0.000000        0.00000       0.000000       0.00000   \n",
       "50%          0.000000        0.00000       0.000000       0.00000   \n",
       "75%          0.000000        0.00000       0.000000       0.00000   \n",
       "max          1.000000        1.00000       1.000000       1.00000   \n",
       "\n",
       "       heart_disease            bmi    hbA1c_level  blood_glucose_level  \\\n",
       "count  100000.000000  100000.000000  100000.000000        100000.000000   \n",
       "mean        0.039420      27.320767       5.527507           138.058060   \n",
       "std         0.194593       6.636783       1.070672            40.708136   \n",
       "min         0.000000      10.010000       3.500000            80.000000   \n",
       "25%         0.000000      23.630000       4.800000           100.000000   \n",
       "50%         0.000000      27.320000       5.800000           140.000000   \n",
       "75%         0.000000      29.580000       6.200000           159.000000   \n",
       "max         1.000000      95.690000       9.000000           300.000000   \n",
       "\n",
       "            diabetes  \n",
       "count  100000.000000  \n",
       "mean        0.085000  \n",
       "std         0.278883  \n",
       "min         0.000000  \n",
       "25%         0.000000  \n",
       "50%         0.000000  \n",
       "75%         0.000000  \n",
       "max         1.000000  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "7eaceb6a-594b-4db7-b8c1-874889ded4c4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "year                    0\n",
       "gender                  0\n",
       "age                     0\n",
       "location                0\n",
       "race:AfricanAmerican    0\n",
       "race:Asian              0\n",
       "race:Caucasian          0\n",
       "race:Hispanic           0\n",
       "race:Other              0\n",
       "hypertension            0\n",
       "heart_disease           0\n",
       "smoking_history         0\n",
       "bmi                     0\n",
       "hbA1c_level             0\n",
       "blood_glucose_level     0\n",
       "diabetes                0\n",
       "clinical_notes          0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e2ef479f-c2e1-44fa-9db3-75db4b618460",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "year                      int64\n",
       "gender                   object\n",
       "age                     float64\n",
       "location                 object\n",
       "race:AfricanAmerican      int64\n",
       "race:Asian                int64\n",
       "race:Caucasian            int64\n",
       "race:Hispanic             int64\n",
       "race:Other                int64\n",
       "hypertension              int64\n",
       "heart_disease             int64\n",
       "smoking_history          object\n",
       "bmi                     float64\n",
       "hbA1c_level             float64\n",
       "blood_glucose_level       int64\n",
       "diabetes                  int64\n",
       "clinical_notes           object\n",
       "dtype: object"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e6ec9f27-1d85-4ffe-8e5b-8637ed2aff43",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>year</th>\n",
       "      <th>gender</th>\n",
       "      <th>age</th>\n",
       "      <th>location</th>\n",
       "      <th>race:AfricanAmerican</th>\n",
       "      <th>race:Asian</th>\n",
       "      <th>race:Caucasian</th>\n",
       "      <th>race:Hispanic</th>\n",
       "      <th>race:Other</th>\n",
       "      <th>hypertension</th>\n",
       "      <th>heart_disease</th>\n",
       "      <th>smoking_history</th>\n",
       "      <th>bmi</th>\n",
       "      <th>hbA1c_level</th>\n",
       "      <th>blood_glucose_level</th>\n",
       "      <th>diabetes</th>\n",
       "      <th>clinical_notes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2020</td>\n",
       "      <td>Female</td>\n",
       "      <td>32.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>27.32</td>\n",
       "      <td>5.0</td>\n",
       "      <td>100</td>\n",
       "      <td>0</td>\n",
       "      <td>Overweight, advised dietary and exercise modif...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2015</td>\n",
       "      <td>Female</td>\n",
       "      <td>29.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>19.95</td>\n",
       "      <td>5.0</td>\n",
       "      <td>90</td>\n",
       "      <td>0</td>\n",
       "      <td>Healthy BMI range.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2015</td>\n",
       "      <td>Male</td>\n",
       "      <td>18.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>23.76</td>\n",
       "      <td>4.8</td>\n",
       "      <td>160</td>\n",
       "      <td>0</td>\n",
       "      <td>Young patient, generally lower risk but needs ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2015</td>\n",
       "      <td>Male</td>\n",
       "      <td>41.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>27.32</td>\n",
       "      <td>4.0</td>\n",
       "      <td>159</td>\n",
       "      <td>0</td>\n",
       "      <td>Overweight, advised dietary and exercise modif...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2016</td>\n",
       "      <td>Female</td>\n",
       "      <td>52.0</td>\n",
       "      <td>Alabama</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>23.75</td>\n",
       "      <td>6.5</td>\n",
       "      <td>90</td>\n",
       "      <td>0</td>\n",
       "      <td>Healthy BMI range. High HbA1c level, indicativ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99995</th>\n",
       "      <td>2018</td>\n",
       "      <td>Female</td>\n",
       "      <td>33.0</td>\n",
       "      <td>Wyoming</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>never</td>\n",
       "      <td>21.21</td>\n",
       "      <td>6.5</td>\n",
       "      <td>90</td>\n",
       "      <td>0</td>\n",
       "      <td>Healthy BMI range. High HbA1c level, indicativ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99996</th>\n",
       "      <td>2016</td>\n",
       "      <td>Female</td>\n",
       "      <td>80.0</td>\n",
       "      <td>Wyoming</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>No Info</td>\n",
       "      <td>36.66</td>\n",
       "      <td>5.7</td>\n",
       "      <td>100</td>\n",
       "      <td>0</td>\n",
       "      <td>Elderly patient with increased risk of chronic...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99997</th>\n",
       "      <td>2018</td>\n",
       "      <td>Male</td>\n",
       "      <td>46.0</td>\n",
       "      <td>Wyoming</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>ever</td>\n",
       "      <td>36.12</td>\n",
       "      <td>6.2</td>\n",
       "      <td>158</td>\n",
       "      <td>0</td>\n",
       "      <td>Obese category, increased risk for diabetes an...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99998</th>\n",
       "      <td>2018</td>\n",
       "      <td>Female</td>\n",
       "      <td>51.0</td>\n",
       "      <td>Wyoming</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>not current</td>\n",
       "      <td>29.29</td>\n",
       "      <td>6.0</td>\n",
       "      <td>155</td>\n",
       "      <td>0</td>\n",
       "      <td>Overweight, advised dietary and exercise modif...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99999</th>\n",
       "      <td>2016</td>\n",
       "      <td>Male</td>\n",
       "      <td>13.0</td>\n",
       "      <td>Wyoming</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>No Info</td>\n",
       "      <td>17.16</td>\n",
       "      <td>5.0</td>\n",
       "      <td>90</td>\n",
       "      <td>0</td>\n",
       "      <td>Young patient, generally lower risk but needs ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>100000 rows × 17 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       year  gender   age location  race:AfricanAmerican  race:Asian  \\\n",
       "0      2020  Female  32.0  Alabama                     0           0   \n",
       "1      2015  Female  29.0  Alabama                     0           1   \n",
       "2      2015    Male  18.0  Alabama                     0           0   \n",
       "3      2015    Male  41.0  Alabama                     0           0   \n",
       "4      2016  Female  52.0  Alabama                     1           0   \n",
       "...     ...     ...   ...      ...                   ...         ...   \n",
       "99995  2018  Female  33.0  Wyoming                     0           0   \n",
       "99996  2016  Female  80.0  Wyoming                     0           1   \n",
       "99997  2018    Male  46.0  Wyoming                     0           1   \n",
       "99998  2018  Female  51.0  Wyoming                     1           0   \n",
       "99999  2016    Male  13.0  Wyoming                     0           0   \n",
       "\n",
       "       race:Caucasian  race:Hispanic  race:Other  hypertension  heart_disease  \\\n",
       "0                   0              0           1             0              0   \n",
       "1                   0              0           0             0              0   \n",
       "2                   0              0           1             0              0   \n",
       "3                   1              0           0             0              0   \n",
       "4                   0              0           0             0              0   \n",
       "...               ...            ...         ...           ...            ...   \n",
       "99995               0              0           1             0              0   \n",
       "99996               0              0           0             0              0   \n",
       "99997               0              0           0             0              0   \n",
       "99998               0              0           0             0              0   \n",
       "99999               0              1           0             0              0   \n",
       "\n",
       "      smoking_history    bmi  hbA1c_level  blood_glucose_level  diabetes  \\\n",
       "0               never  27.32          5.0                  100         0   \n",
       "1               never  19.95          5.0                   90         0   \n",
       "2               never  23.76          4.8                  160         0   \n",
       "3               never  27.32          4.0                  159         0   \n",
       "4               never  23.75          6.5                   90         0   \n",
       "...               ...    ...          ...                  ...       ...   \n",
       "99995           never  21.21          6.5                   90         0   \n",
       "99996         No Info  36.66          5.7                  100         0   \n",
       "99997            ever  36.12          6.2                  158         0   \n",
       "99998     not current  29.29          6.0                  155         0   \n",
       "99999         No Info  17.16          5.0                   90         0   \n",
       "\n",
       "                                          clinical_notes  \n",
       "0      Overweight, advised dietary and exercise modif...  \n",
       "1                                     Healthy BMI range.  \n",
       "2      Young patient, generally lower risk but needs ...  \n",
       "3      Overweight, advised dietary and exercise modif...  \n",
       "4      Healthy BMI range. High HbA1c level, indicativ...  \n",
       "...                                                  ...  \n",
       "99995  Healthy BMI range. High HbA1c level, indicativ...  \n",
       "99996  Elderly patient with increased risk of chronic...  \n",
       "99997  Obese category, increased risk for diabetes an...  \n",
       "99998  Overweight, advised dietary and exercise modif...  \n",
       "99999  Young patient, generally lower risk but needs ...  \n",
       "\n",
       "[100000 rows x 17 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b47a5629-e621-46de-9d5c-00adfff9494a",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_clean = df.copy()\n",
    "df_clean.drop(['year', 'location', 'clinical_notes'], axis=1, inplace=True)\n",
    "df_clean['gender'] = df_clean['gender'].map({'Male': 0, 'Female': 1})\n",
    "df_clean['smoking_history'] = df_clean['smoking_history'].astype('category').cat.codes\n",
    "df_clean.fillna(df_clean.median(numeric_only=True), inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3888c246-e667-4f29-b1f6-11e97ffbf297",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Missing values after cleaning:\n",
      "gender                  0\n",
      "age                     0\n",
      "race:AfricanAmerican    0\n",
      "race:Asian              0\n",
      "race:Caucasian          0\n",
      "race:Hispanic           0\n",
      "race:Other              0\n",
      "hypertension            0\n",
      "heart_disease           0\n",
      "smoking_history         0\n",
      "bmi                     0\n",
      "hbA1c_level             0\n",
      "blood_glucose_level     0\n",
      "diabetes                0\n",
      "dtype: int64\n",
      "\n",
      "Data Types after encoding:\n",
      "gender                  float64\n",
      "age                     float64\n",
      "race:AfricanAmerican      int64\n",
      "race:Asian                int64\n",
      "race:Caucasian            int64\n",
      "race:Hispanic             int64\n",
      "race:Other                int64\n",
      "hypertension              int64\n",
      "heart_disease             int64\n",
      "smoking_history            int8\n",
      "bmi                     float64\n",
      "hbA1c_level             float64\n",
      "blood_glucose_level       int64\n",
      "diabetes                  int64\n",
      "dtype: object\n"
     ]
    }
   ],
   "source": [
    "print(\"Missing values after cleaning:\")\n",
    "print(df_clean.isnull().sum())\n",
    "print(\"\\nData Types after encoding:\")\n",
    "print(df_clean.dtypes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1b27d48b-70e8-450b-9fed-5379cf55f34e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>gender</th>\n",
       "      <th>age</th>\n",
       "      <th>race:AfricanAmerican</th>\n",
       "      <th>race:Asian</th>\n",
       "      <th>race:Caucasian</th>\n",
       "      <th>race:Hispanic</th>\n",
       "      <th>race:Other</th>\n",
       "      <th>hypertension</th>\n",
       "      <th>heart_disease</th>\n",
       "      <th>smoking_history</th>\n",
       "      <th>bmi</th>\n",
       "      <th>hbA1c_level</th>\n",
       "      <th>blood_glucose_level</th>\n",
       "      <th>diabetes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>32.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>27.32</td>\n",
       "      <td>5.0</td>\n",
       "      <td>100</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>19.95</td>\n",
       "      <td>5.0</td>\n",
       "      <td>90</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>18.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>23.76</td>\n",
       "      <td>4.8</td>\n",
       "      <td>160</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.0</td>\n",
       "      <td>41.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>27.32</td>\n",
       "      <td>4.0</td>\n",
       "      <td>159</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>23.75</td>\n",
       "      <td>6.5</td>\n",
       "      <td>90</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   gender   age  race:AfricanAmerican  race:Asian  race:Caucasian  \\\n",
       "0     1.0  32.0                     0           0               0   \n",
       "1     1.0  29.0                     0           1               0   \n",
       "2     0.0  18.0                     0           0               0   \n",
       "3     0.0  41.0                     0           0               1   \n",
       "4     1.0  52.0                     1           0               0   \n",
       "\n",
       "   race:Hispanic  race:Other  hypertension  heart_disease  smoking_history  \\\n",
       "0              0           1             0              0                4   \n",
       "1              0           0             0              0                4   \n",
       "2              0           1             0              0                4   \n",
       "3              0           0             0              0                4   \n",
       "4              0           0             0              0                4   \n",
       "\n",
       "     bmi  hbA1c_level  blood_glucose_level  diabetes  \n",
       "0  27.32          5.0                  100         0  \n",
       "1  19.95          5.0                   90         0  \n",
       "2  23.76          4.8                  160         0  \n",
       "3  27.32          4.0                  159         0  \n",
       "4  23.75          6.5                   90         0  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_clean.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "74211838-0bc5-4399-b305-8e7970700cde",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "diabetes\n",
       "0    91500\n",
       "1     8500\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['diabetes'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "532aed84-d283-47fa-a4cb-a54bdec00730",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df_clean.copy() \n",
    "label_encoders = {}\n",
    "\n",
    "for column in df.select_dtypes(include=['object']).columns:\n",
    "    le = LabelEncoder()\n",
    "    df[column] = le.fit_transform(df[column])\n",
    "    label_encoders[column] = le"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "1679ec42-2252-4697-a889-d64b4a63c72b",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = df.drop('diabetes', axis=1)\n",
    "y = df['diabetes']\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "8fc1bbcf-c20f-4447-8cb3-d8ab510dda59",
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate_model(model_name, y_true, y_pred):\n",
    "    accuracy = accuracy_score(y_true, y_pred)\n",
    "    precision = precision_score(y_true, y_pred, average='weighted', zero_division=0)\n",
    "    recall = recall_score(y_true, y_pred, average='weighted', zero_division=0)\n",
    "    f1 = f1_score(y_true, y_pred, average='weighted', zero_division=0)\n",
    "    cm = confusion_matrix(y_true, y_pred)\n",
    "\n",
    "    report = classification_report(y_true, y_pred)\n",
    "\n",
    "    plt.figure(figsize=(4, 4))\n",
    "    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False,\n",
    "                xticklabels=np.unique(y_true), yticklabels=np.unique(y_true))\n",
    "    plt.title(f'Confusion Matrix for {model_name}')\n",
    "    plt.xlabel('Predicted Label')\n",
    "    plt.ylabel('True Label')\n",
    "    plt.grid(False)\n",
    "    plt.show()\n",
    "\n",
    "    return {\n",
    "        'Model Name': model_name,\n",
    "        'Accuracy': accuracy,\n",
    "        'Precision': precision,\n",
    "        'Recall': recall,\n",
    "        'F1 Score': f1,\n",
    "        'Classification Report': report\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "4edd1e8b-c69b-4287-958f-0b616b286995",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==== Logistic Regression  ====\n",
      "Model Name: LogisticRegression\n",
      "Accuracy: 0.9608\n",
      "Precision: 0.9587\n",
      "Recall: 0.9608\n",
      "F1 Score: 0.9579\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.97      0.99      0.98     18297\n",
      "           1       0.88      0.63      0.73      1703\n",
      "\n",
      "    accuracy                           0.96     20000\n",
      "   macro avg       0.92      0.81      0.86     20000\n",
      "weighted avg       0.96      0.96      0.96     20000\n",
      "\n",
      "\n",
      "Time taken: 8.39 seconds\n"
     ]
    }
   ],
   "source": [
    "logreg = LogisticRegression(max_iter=5000)\n",
    "start_time = time.time()\n",
    "logreg.fit(X_train, y_train)\n",
    "end_time = time.time()\n",
    "y_pred = logreg.predict(X_test)\n",
    "evaluation_results = evaluate_model('LogisticRegression', y_test, y_pred)\n",
    "print(\"==== Logistic Regression  ====\")\n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(f\"\\n{key}:\\n{value}\") \n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: {value}\")\n",
    "print(\"\\nTime taken: {:.2f} seconds\".format(end_time - start_time))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "58322eea-7731-4401-92cc-f45c43e65585",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model Name: Decision Tree\n",
      "Accuracy: 0.9517\n",
      "Precision: 0.9525\n",
      "Recall: 0.9517\n",
      "F1 Score: 0.9521\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.98      0.97      0.97     18297\n",
      "           1       0.71      0.73      0.72      1703\n",
      "\n",
      "    accuracy                           0.95     20000\n",
      "   macro avg       0.84      0.85      0.85     20000\n",
      "weighted avg       0.95      0.95      0.95     20000\n",
      "\n",
      "\n",
      "Time taken: 0.53 seconds\n"
     ]
    }
   ],
   "source": [
    "dt = DecisionTreeClassifier()\n",
    "start_time = time.time()\n",
    "dt.fit(X_train, y_train)\n",
    "end_time = time.time()\n",
    "y_pred = dt.predict(X_test)\n",
    "evaluation_results = evaluate_model('Decision Tree', y_test, y_pred)\n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(f\"\\n{key}:\\n{value}\")\n",
    "    else:\n",
    "        if isinstance(value, float):\n",
    "            print(f\"{key}: {value:.4f}\")\n",
    "        else:\n",
    "            print(f\"{key}: {value}\")\n",
    "\n",
    "print(\"\\nTime taken: {:.2f} seconds\".format(end_time - start_time))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "87c81b60-d4c2-4cc6-b2bc-93a355b447bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model Name: Random Forest\n",
      "Accuracy: 0.9711\n",
      "Precision: 0.9711\n",
      "Recall: 0.9711\n",
      "F1 Score: 0.9689\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.97      1.00      0.98     18297\n",
      "           1       0.97      0.68      0.80      1703\n",
      "\n",
      "    accuracy                           0.97     20000\n",
      "   macro avg       0.97      0.84      0.89     20000\n",
      "weighted avg       0.97      0.97      0.97     20000\n",
      "\n",
      "\n",
      "Time taken: 10.80 seconds\n"
     ]
    }
   ],
   "source": [
    "rf = RandomForestClassifier()\n",
    "start_time = time.time()\n",
    "rf.fit(X_train, y_train)\n",
    "end_time = time.time()\n",
    "y_pred = rf.predict(X_test)\n",
    "evaluation_results = evaluate_model('Random Forest', y_test, y_pred)\n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(f\"\\n{key}:\\n{value}\")\n",
    "    else:\n",
    "        if isinstance(value, float): \n",
    "            print(f\"{key}: {value:.4f}\")\n",
    "        else:\n",
    "            print(f\"{key}: {value}\")\n",
    "print(\"\\nTime taken: {:.2f} seconds\".format(end_time - start_time))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "e025ca17-5232-469e-bf0b-d6f4a31f948e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==== Support Vector Machine SVM ====\n",
      "Model Name: SVM\n",
      "Accuracy: 0.9467\n",
      "Precision: 0.9497\n",
      "Recall: 0.9467\n",
      "F1 Score: 0.9354\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.94      1.00      0.97     18297\n",
      "           1       1.00      0.37      0.55      1703\n",
      "\n",
      "    accuracy                           0.95     20000\n",
      "   macro avg       0.97      0.69      0.76     20000\n",
      "weighted avg       0.95      0.95      0.94     20000\n",
      "\n",
      "\n",
      "Time taken: 66.95 seconds\n"
     ]
    }
   ],
   "source": [
    "svm = SVC()\n",
    "start_time = time.time()\n",
    "svm.fit(X_train, y_train)\n",
    "end_time = time.time()\n",
    "y_pred = svm.predict(X_test)\n",
    "evaluation_results = evaluate_model('SVM', y_test, y_pred)\n",
    "print(\"==== Support Vector Machine SVM ====\")\n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(f\"\\n{key}:\\n{value}\") \n",
    "    else:\n",
    "        if isinstance(value, float):  \n",
    "            print(f\"{key}: {value:.4f}\")\n",
    "        else:\n",
    "            print(f\"{key}: {value}\")\n",
    "print(\"\\nTime taken: {:.2f} seconds\".format(end_time - start_time))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "64afe3e6-1fac-4f87-ad87-2604ba786a9d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGJCAYAAABl4S8zAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAMcNJREFUeJzt3Qd0FNXbx/EnIZBQQ+/SpAhKkyYgIIJioQk2EKmCVOkiKlUFxEIXFMUCqKh0LIBUpXcbIiiC0mvoAZJ5z3N99/53NxtIIMluku/nnD3JzuzO3pmdvb+5c+/sBjmO4wgAACIS7O8CAAACB6EAALAIBQCARSgAACxCAQBgEQoAAItQAABYhAIAwCIUAAAWoXANu3fvlvvvv1/Cw8MlKChI5s2bl6DL//vvv81yP/roowRdbnJ2zz33mFtCOXfunDzzzDOSN29es6179eqVYMtG8qf7xNChQ2/4ud27d7/u43T5+tjjx49LchDwofDnn3/Ks88+K8WKFZOwsDDJkiWL1KxZU8aNGycXL15M1Ndu06aN/Pzzz/Laa6/J9OnTpXLlypJStG3b1uyouj19bUcNRJ2vtzfffDPeyz948KD5MGzfvl38acSIESZ0u3TpYt7Dp59+OlFfr0iRItKwYcMY0/W106RJIw888IBcunQp1ufq9u7Ro0eMeStXrjTzvvrqK0nuvvnmm3hVxHqQoOveqFGjWA+sbmQfhW8hEsC+/vpreeyxxyQ0NFRat24td9xxh1y+fFl+/PFH6d+/v/z666/y3nvvJcpra0W5bt06eemll+J0NHAjChcubF4nbdq04g8hISFy4cIFWbhwoTz++OMe82bOnGlCOLYKLC6hMGzYMFPRVahQIc7PW7JkiSSk5cuXy1133SVDhgwRf9FtqSFcv35909rU7XotU6dOlYEDB0r+/PklJdJQmDRpUryP0BctWiRbtmyRSpUqJVhZ9POnnwMkg5bC3r175cknnzQV52+//WZaBh07dpRu3brJZ599Zqbdfvvtifb6x44dM3+zZs2aaK+hRzhaQegRpD9o2NarV89sT2+ffvqpPPzww0lWFg0nlS5dOnNLKEePHk3Q9/Dq1avmwCSuPv/8c9PivPfee2X+/PnXDQTdp6OiomTUqFESCOK7vomlUKFCki1bNnOgkZD0/UgJoeA4ToKdOQnYUBg9erQ5H/zBBx9Ivnz5YswvXry49OzZ02PnfeWVV+TWW281lZ0eob744osSGRnps3mvrY2qVauanUJPTX3yySf2MXoEo2GktEWilbc+T+kRn+t/X+cN3S1dulTuvvtuUyllypRJSpUqZcp0vT4FPbqtVauWZMyY0Ty3SZMmsnPnTp+vt2fPHlMmfZz2fbRr185WsHHRsmVL+fbbb+X06dN22qZNm8zpI53n7eTJk9KvXz8pW7asWSc9/fTggw/Kjh07PE51VKlSxfyv5XGdhnKtp54O0FafHvXVrl1bMmTIYLeLd5+CVqj6Hnmvf4MGDUwloS0SX1ynW/TgQlucrjLoNneFRYcOHSRPnjxm+eXLl5ePP/441lMTY8eOtfuWHpDExRdffCGtWrUy67NgwYLrBoLSfUtbxdpaiG3d3B04cEDat29v1kPLpqEybdo0j8dopT548GBzhK37iO5Xun+tWLEiXuv7+++/y6OPPirZs2c366KnU3W93F25csVU3CVKlDCPyZEjh/kM6GdB6b6qrQTlek+8Pze+ZM6cWXr37m1atVu3br3u43V/1v6jW265xayD1hevv/66REdHX7dPYeXKlWbdtPy6Dd59912fn28Xbf3p/uza/t99953Px2mfgrbI9TOj20XrL++WeHzrscWLF5uypk+f3pQzLvXOdTkBqkCBAk6xYsXi/Pg2bdroV4A7jz76qDNp0iSndevW5n7Tpk09Hle4cGGnVKlSTp48eZwXX3zRmThxonPnnXc6QUFBzi+//GIes2PHDmfMmDHm+S1atHCmT5/uzJ07176OLsPbkCFDzONddFnp0qVzKleu7IwbN86ZMmWK069fP6d27dr2MXv37jXP+fDDD+20pUuXOiEhIU7JkiWd0aNHO8OGDXNy5szpZMuWzTze+/UqVqzoNGvWzHnnnXecZ555xkx7/vnn47S9MmbM6Jw5c8YJCwtzPvjgAzuvV69ezm233WbL98Ybb9h5mzZtcm699VbnhRdecN59911n+PDh5r0KDw93Dhw4YB5z+PBhM12f26lTJ7P99Pbnn3+a+XXq1HHy5s3r5MqVy+nRo4dZzrx58+w8vbmcOnXKKViwoFOlShXn6tWrZppuS122LjM2Wgadr9uuQoUKtgznzp1zLly44JQuXdpJmzat07t3b2f8+PFOrVq1zDLHjh0b4/0pU6aM2RdHjRpl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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==== K-Nearest Neighbors Evaluation KNN ====\n",
      "Model Name: K-Nearest Neighbors\n",
      "Accuracy: 0.9543\n",
      "Precision: 0.9518\n",
      "Recall: 0.9543\n",
      "F1 Score: 0.9490\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.96      0.99      0.98     18297\n",
      "           1       0.88      0.53      0.66      1703\n",
      "\n",
      "    accuracy                           0.95     20000\n",
      "   macro avg       0.92      0.76      0.82     20000\n",
      "weighted avg       0.95      0.95      0.95     20000\n",
      "\n",
      "\n",
      "Time taken: 0.96 seconds\n"
     ]
    }
   ],
   "source": [
    "knn = KNeighborsClassifier()\n",
    "start_time = time.time()\n",
    "knn.fit(X_train, y_train)\n",
    "end_time = time.time()\n",
    "y_pred = knn.predict(X_test)\n",
    "evaluation_results = evaluate_model('K-Nearest Neighbors', y_test, y_pred)\n",
    "print(\"==== K-Nearest Neighbors Evaluation KNN ====\")\n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(f\"\\n{key}:\\n{value}\") \n",
    "    else:\n",
    "        if isinstance(value, numbers.Number):\n",
    "            print(f\"{key}: {value:.4f}\")\n",
    "        else:\n",
    "            print(f\"{key}: {value}\")\n",
    "print(\"\\nTime taken: {:.2f} seconds\".format(end_time - start_time))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "58daf3cf-295f-4624-8542-ae439368c1e5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==== Naive Bayes ====\n",
      "Model Name: Naive Bayes\n",
      "Accuracy: 0.9057\n",
      "Precision: 0.9239\n",
      "Recall: 0.9057\n",
      "F1 Score: 0.9130\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.97      0.93      0.95     18297\n",
      "           1       0.46      0.66      0.54      1703\n",
      "\n",
      "    accuracy                           0.91     20000\n",
      "   macro avg       0.71      0.79      0.75     20000\n",
      "weighted avg       0.92      0.91      0.91     20000\n",
      "\n",
      "\n",
      "Time taken: 0.06 seconds\n"
     ]
    }
   ],
   "source": [
    "nb = GaussianNB()\n",
    "start_time = time.time()\n",
    "nb.fit(X_train, y_train)\n",
    "end_time = time.time()\n",
    "y_pred = nb.predict(X_test)\n",
    "evaluation_results = evaluate_model('Naive Bayes', y_test, y_pred)\n",
    "print(\"==== Naive Bayes ====\")\n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(f\"\\n{key}:\\n{value}\") \n",
    "    else:\n",
    "        if isinstance(value, numbers.Number):\n",
    "            print(f\"{key}: {value:.4f}\")\n",
    "        else:\n",
    "            print(f\"{key}: {value}\")\n",
    "print(\"\\nTime taken: {:.2f} seconds\".format(end_time - start_time))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "b3833155-dd20-4ad5-9f24-4485b72271b4",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = load_diabetes()\n",
    "X = df.data\n",
    "y = df.target\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "21fcfea9-f7da-4430-ab44-d8c6df2e1c7c",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = load_diabetes()\n",
    "X = pd.DataFrame(data.data, columns=data.feature_names)\n",
    "y = data.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "fbd7d4bb-3690-43bb-89b0-678f79f84993",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " الميزات المختارة باستخدام SelectKBest:\n",
      "Index(['gender', 'age', 'race:Asian', 'race:Other', 'hypertension',\n",
      "       'heart_disease', 'smoking_history', 'bmi', 'hbA1c_level',\n",
      "       'blood_glucose_level'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "k = 10\n",
    "selector = SelectKBest(score_func=f_classif, k=k)\n",
    "X_new_kbest = selector.fit_transform(X_train, y_train)\n",
    "selected_indices_kbest = selector.get_support(indices=True)\n",
    "selected_features_kbest = X_train.columns[selected_indices_kbest]\n",
    "print(\" الميزات المختارة باستخدام SelectKBest:\")\n",
    "print(selected_features_kbest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "27396aec-c14a-4458-ad80-31a17d7bec5d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " أهم الميزات باستخدام RandomForest Feature Importance:\n",
      "                Feature  Importance\n",
      "11          hbA1c_level    0.404526\n",
      "12  blood_glucose_level    0.316947\n",
      "10                  bmi    0.105446\n",
      "1                   age    0.093226\n",
      "9       smoking_history    0.027921\n",
      "7          hypertension    0.011926\n",
      "8         heart_disease    0.009256\n",
      "0                gender    0.006869\n",
      "5         race:Hispanic    0.004943\n",
      "3            race:Asian    0.004916\n"
     ]
    }
   ],
   "source": [
    "model_rf = RandomForestClassifier()\n",
    "model_rf.fit(X_train, y_train)\n",
    "importances = model_rf.feature_importances_\n",
    "feature_names = X_train.columns\n",
    "feature_importance_df = pd.DataFrame({\n",
    "    'Feature': feature_names,\n",
    "    'Importance': importances\n",
    "})\n",
    "feature_importance_df = feature_importance_df.sort_values(by='Importance', ascending=False)\n",
    "print(\"\\n أهم الميزات باستخدام RandomForest Feature Importance:\")\n",
    "print(feature_importance_df.head(10)) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "217a02af-88d4-46db-99a3-169ece4b2b4e",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_kbest = X_train[selected_features_kbest]\n",
    "X_test_kbest = X_test[selected_features_kbest]\n",
    "\n",
    "top_features_rf = feature_importance_df['Feature'].head(10).values\n",
    "X_train_rf = X_train[top_features_rf]\n",
    "X_test_rf = X_test[top_features_rf]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "887d2b3b-d812-4475-a337-8c9c185b1fdf",
   "metadata": {},
   "outputs": [],
   "source": [
    "features = [\n",
    "    'gender', 'age',\n",
    "    'race:AfricanAmerican', 'race:Asian', 'race:Caucasian',\n",
    "    'race:Hispanic', 'race:Other',\n",
    "    'hypertension', 'heart_disease',\n",
    "    'smoking_history', 'bmi', 'hbA1c_level', 'blood_glucose_level'\n",
    "]\n",
    "target = 'diabetes'\n",
    "X = df[features]\n",
    "y = df[target]\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "993e5c26-f2a7-412c-a41c-e20ee86ceb3a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: start;\n",
       "  justify-content: space-between;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>RandomForestClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(random_state=42)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(random_state=42)"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = RandomForestClassifier(random_state=42)\n",
    "model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "bd1e9ad3-de34-47bd-809b-34b11c687199",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Logistic Regression: Accuracy = 0.96\n",
      "Decision Tree: Accuracy = 0.95\n",
      "Random Forest: Accuracy = 0.97\n",
      "KNN: Accuracy = 0.95\n",
      "SVM: Accuracy = 0.95\n",
      "Gradient Boosting: Accuracy = 0.97\n"
     ]
    }
   ],
   "source": [
    "models = {\n",
    "    'Logistic Regression': LogisticRegression(max_iter=1000),\n",
    "    'Decision Tree': DecisionTreeClassifier(),\n",
    "    'Random Forest': RandomForestClassifier(),\n",
    "    'KNN': KNeighborsClassifier(),\n",
    "    'SVM': SVC(),\n",
    "    'Gradient Boosting': GradientBoostingClassifier()\n",
    "}\n",
    "\n",
    "for name, model in models.items():\n",
    "    model.fit(X_train, y_train)\n",
    "    y_pred = model.predict(X_test)\n",
    "    acc = accuracy_score(y_test, y_pred)\n",
    "    print(f'{name}: Accuracy = {acc:.2f}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "174b9341-5f4d-4204-8f06-600acb3dd866",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = model.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "9b8edf88-e7fe-4fa3-9edd-7728f99e76e3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.97\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"Accuracy: {accuracy:.2f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "c9825e67-24e0-493d-a19d-2ff297f6bb6d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion Matrix:\n",
      "[[18285    12]\n",
      " [  540  1163]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "cm = confusion_matrix(y_test, y_pred)\n",
    "print(f\"Confusion Matrix:\\n{cm}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "799fb19f-2081-4ef7-bd08-90c03d02b4f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.97      1.00      0.99     18297\n",
      "           1       0.99      0.68      0.81      1703\n",
      "\n",
      "    accuracy                           0.97     20000\n",
      "   macro avg       0.98      0.84      0.90     20000\n",
      "weighted avg       0.97      0.97      0.97     20000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "report = classification_report(y_test, y_pred)\n",
    "print(f\"Classification Report:\\n{report}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "ed04e4ac-9555-4128-a22c-584eede21adb",
   "metadata": {},
   "outputs": [],
   "source": [
    "param_grids = {\n",
    "    'Logistic Regression': {\n",
    "        'C': [0.1, 1, 10],\n",
    "        'solver': ['liblinear', 'lbfgs']\n",
    "    },\n",
    "    'Decision Tree': {\n",
    "        'max_depth': [5, 10, 20],\n",
    "        'min_samples_split': [2, 5, 10]\n",
    "    },\n",
    "    'Random Forest': {\n",
    "        'n_estimators': [100, 200],\n",
    "        'max_depth': [10, 20],\n",
    "        'min_samples_split': [2, 5]\n",
    "    },\n",
    "    'KNN': {\n",
    "        'n_neighbors': [3, 5, 7],\n",
    "        'weights': ['uniform', 'distance']\n",
    "    },\n",
    "    'SVM': {\n",
    "        'C': [0.1, 1, 10],\n",
    "        'kernel': ['linear', 'rbf']\n",
    "    },\n",
    "    'Gradient Boosting': {\n",
    "        'n_estimators': [100, 200],\n",
    "        'learning_rate': [0.05, 0.1],\n",
    "        'max_depth': [3, 5]\n",
    "    }\n",
    "}\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2ffc9fe3-637e-4074-8c0e-6b5bf25b760c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " Grid Search for: Logistic Regression\n",
      " Best Parameters: {'C': 10, 'solver': 'liblinear'}\n",
      " Accuracy on test data: 0.96\n",
      "\n",
      " Grid Search for: Decision Tree\n",
      " Best Parameters: {'max_depth': 5, 'min_samples_split': 2}\n",
      " Accuracy on test data: 0.97\n",
      "\n",
      " Grid Search for: Random Forest\n",
      " Best Parameters: {'max_depth': 20, 'min_samples_split': 5, 'n_estimators': 100}\n",
      " Accuracy on test data: 0.97\n",
      "\n",
      " Grid Search for: KNN\n",
      " Best Parameters: {'n_neighbors': 7, 'weights': 'uniform'}\n",
      " Accuracy on test data: 0.95\n",
      "\n",
      " Grid Search for: SVM\n"
     ]
    }
   ],
   "source": [
    "\n",
    "base_models = {\n",
    "    'Logistic Regression': LogisticRegression(max_iter=1000),\n",
    "    'Decision Tree': DecisionTreeClassifier(),\n",
    "    'Random Forest': RandomForestClassifier(),\n",
    "    'KNN': KNeighborsClassifier(),\n",
    "    'SVM': SVC(),\n",
    "    'Gradient Boosting': GradientBoostingClassifier()\n",
    "}\n",
    "\n",
    "best_models = {}\n",
    "for name in base_models:\n",
    "    print(f\"\\n Grid Search for: {name}\")\n",
    "    grid = GridSearchCV(base_models[name], param_grids[name], cv=5, n_jobs=-1)\n",
    "    grid.fit(X_train, y_train)\n",
    "    \n",
    "    print(\" Best Parameters:\", grid.best_params_)\n",
    "    best_model = grid.best_estimator_\n",
    "    best_models[name] = best_model\n",
    "    from sklearn.metrics import accuracy_score\n",
    "    y_pred = best_model.predict(X_test)\n",
    "    acc = accuracy_score(y_test, y_pred)\n",
    "    print(f\" Accuracy on test data: {acc:.2f}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a31233ec-c1d4-4104-aa8e-aa0b51cd6768",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6a2189ae-8dff-41dc-81a4-647e91772ac2",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
