{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f5fd6443-38e6-4398-b7b0-d58307ec299c",
   "metadata": {},
   "source": [
    "<div style=\"text-align: center; font-family: Arial, sans-serif;\">\n",
    "\n",
    "  <h1 style=\"color: navy; font-size: 36px; font-weight: bold;\">\n",
    "    Practical Machine Learning and Data Exploration\n",
    "  </h1>\n",
    "\n",
    "  <h3 style=\"color:black darkred; font-size: 28px;\">\n",
    "    Waleed Mohammed Rasheedy\n",
    "  </h3>\n",
    "\n",
    "  <h3 style=\"color: black; font-size: 24px;\">\n",
    "    2021204005\n",
    "  </h3>\n",
    "\n",
    "  <h2 style=\"color:black darkred; font-size: 28px;\">\n",
    "    Master’s Student, Master of Science in Artificial Intelligence Updated\n",
    "   </h2>\n",
    "\n",
    "   <h2 style=\"color:black darkred; font-size: 28px;\">\n",
    "    College of Informatics, Midocean University\n",
    "   </h2>\n",
    "\n",
    "   <h2 style=\"color:black darkred; font-size: 28px;\">\n",
    "    Under Supervision of<strong> Dr. Hager Saleh</strong>\n",
    "   </h2>\n",
    "\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3f360b7e-840d-495c-8e59-b94d3ee340ff",
   "metadata": {},
   "source": [
    "### Importing Required Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "id": "75d14627-8836-4b8e-a2d1-19278a74daec",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler, LabelEncoder\n",
    "from sklearn.metrics import accuracy_score,classification_report,confusion_matrix\n",
    "from sklearn.feature_selection import SelectKBest, chi2, RFE\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score ,f1_score,classification_report\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import classification_report"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a620171c-7c08-4718-9dfc-e4759b083a92",
   "metadata": {},
   "source": [
    "### Data Collection and Initial Exploration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "id": "c40ecd74-4e5a-4835-afb3-92c87a5f47b3",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('diabetes.csv')\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "id": "cf16332e-7739-4337-ad27-8e83cdf432c7",
   "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>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 242,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "id": "02a40107-1d8c-42e0-9094-161bdf246d12",
   "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>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 243,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    " data.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "id": "c775cee0-b149-4331-94b4-7f737b180369",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pregnancies                   int64\n",
       "Glucose                       int64\n",
       "BloodPressure                 int64\n",
       "SkinThickness                 int64\n",
       "Insulin                       int64\n",
       "BMI                         float64\n",
       "DiabetesPedigreeFunction    float64\n",
       "Age                           int64\n",
       "Outcome                       int64\n",
       "dtype: object"
      ]
     },
     "execution_count": 244,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 245,
   "id": "e4dd2f3b-9cee-49fe-946d-7c2c0197e07c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pregnancies                 0\n",
       "Glucose                     0\n",
       "BloodPressure               0\n",
       "SkinThickness               0\n",
       "Insulin                     0\n",
       "BMI                         0\n",
       "DiabetesPedigreeFunction    0\n",
       "Age                         0\n",
       "Outcome                     0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 245,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.isnull().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "63d758f3-c8f6-4f90-88f6-282b0708e55b",
   "metadata": {},
   "source": [
    "## Data Cleaning"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb802d9c-855c-4299-b6e6-7464d1af6020",
   "metadata": {},
   "source": [
    "Replacing Invalid Zeros with NaN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "id": "948128b6-690f-4cdc-8939-8493bbb5728f",
   "metadata": {},
   "outputs": [],
   "source": [
    "invalid_zeros = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']\n",
    "data[invalid_zeros] = data[invalid_zeros].replace(0, np.nan)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f3ccdcb-83c2-4a0f-aa3a-f98789768a62",
   "metadata": {},
   "source": [
    "### Handling Outliers using IQR Method"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "id": "8ffc429f-b1b3-45f3-9fd5-c893327a26ac",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sum of null values in each column:\n",
      "Pregnancies                   4\n",
      "Glucose                       5\n",
      "BloodPressure                49\n",
      "SkinThickness               230\n",
      "Insulin                     398\n",
      "BMI                          19\n",
      "DiabetesPedigreeFunction     29\n",
      "Age                           9\n",
      "Outcome                       0\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "def replace_outliers_with_nan(column):\n",
    " Q1 = column.quantile(0.25)\n",
    " Q3 = column.quantile(0.75)\n",
    " IQR = Q3 - Q1\n",
    " lower_bound = Q1 - 1.5 * IQR\n",
    " upper_bound = Q3 + 1.5 * IQR\n",
    " # Replace outliers with NaN\n",
    " return column.where((column >= lower_bound) & (column <= upper_bound), np.nan)\n",
    "# Replace outliers with NaN for each feature\n",
    "for col in data.columns:\n",
    " data[col] = replace_outliers_with_nan(data[col])\n",
    "\n",
    "null_counts = data.isnull().sum()\n",
    "print(\"Sum of null values in each column:\")\n",
    "print(null_counts)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8330dfce-b05e-4d82-a820-929624b74fb1",
   "metadata": {},
   "source": [
    "### Filling Missing Values with Mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "id": "ed2da41f-59e0-4ee8-aea0-6eebb700a6ff",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Fill missing values in columns with mean\n",
    "for column in data.select_dtypes(include=['float64','int64']).columns:\n",
    " mean_value = data[column].mean() # Get the mode (most frequent value)\n",
    " data[column] = data[column].fillna(mean_value)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76346b09-896d-4f8b-b60e-19aaf8349559",
   "metadata": {},
   "source": [
    "### Feature and Target Separation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 249,
   "id": "c480e234-bbdc-4d04-a740-8dcfce9a60f4",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = data.drop('Outcome', axis=1).values # Replace 'classification' with your target colucolumn \n",
    "y = data['Outcome'].values\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "id": "42825764-5319-4188-bf55-87ef0f1669fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Outcome\n",
       "0    500\n",
       "1    268\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 250,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['Outcome'].value_counts()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "353391e3-84a8-4c2d-a36c-bc7f13c299da",
   "metadata": {},
   "source": [
    "### Splitting the Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "id": "2021fec9-00b0-4718-ad4f-19510e4e7539",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.30, random_state=42,stratify=y)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "223f36a3-5e58-4af9-8bd1-32f8f31cac58",
   "metadata": {},
   "source": [
    "### Model Evaluation Function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "id": "b9da6077-7d1f-4d20-a333-c7ce9bf714bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate_model(model_name, y_true, y_pred):\n",
    "    # Calculate metrics\n",
    " accuracy = accuracy_score(y_true, y_pred)\n",
    " precision = precision_score(y_true, y_pred, average='weighted') \n",
    " recall = recall_score(y_true, y_pred, average='weighted')\n",
    " f1 = f1_score(y_true, y_pred, average='weighted')\n",
    " cm = confusion_matrix(y_true, y_pred)\n",
    " \n",
    " # Create a report\n",
    " report = classification_report(y_true, y_pred)\n",
    " \n",
    " \n",
    " # Output results\n",
    " metrics = {\n",
    " 'Model Name': model_name,\n",
    " 'Accuracy': accuracy,\n",
    " 'Precision': precision,\n",
    " 'Recall': recall,\n",
    " 'F1 Score': f1,\n",
    " \n",
    " 'Classification Report': report\n",
    " }\n",
    " # Plot Confusion Matrix\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.show()\n",
    " \n",
    " return metrics"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e17afa22-a0bf-441e-be09-fbbb0b11fc8c",
   "metadata": {},
   "source": [
    "# Model Training and Evaluation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "742aaf0c-bffb-423c-8560-babbc3707809",
   "metadata": {},
   "source": [
    "### Random Forest Classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "id": "22b8ff7c-7542-433c-8a5b-09eb63845efa",
   "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: \n",
      "RandomForestClassifier\n",
      "Accuracy: 0.7273\n",
      "Precision: 0.7185\n",
      "Recall: 0.7273\n",
      "F1 Score: 0.7186\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.76      0.85      0.80       150\n",
      "           1       0.64      0.51      0.57        81\n",
      "\n",
      "    accuracy                           0.73       231\n",
      "   macro avg       0.70      0.68      0.68       231\n",
      "weighted avg       0.72      0.73      0.72       231\n",
      "\n"
     ]
    }
   ],
   "source": [
    "rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42) \n",
    "# Train the model\n",
    "rf_classifier.fit(X_train, y_train)\n",
    "# Make predictions\n",
    "y_pred = rf_classifier.predict(X_test)\n",
    "# Evaluate the model\n",
    "evaluation_results = evaluate_model('RandomForestClassifier', y_test, y_pred)\n",
    "# Print the evaluation results\n",
    "for key, value in evaluation_results.items():\n",
    " if key == 'Classification Report':\n",
    "  print(value) # Print report separately for better readability\n",
    " else:\n",
    "  print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n{value}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c8dc5ea-3adf-471e-90e4-916c4d3f1343",
   "metadata": {},
   "source": [
    "### Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "id": "5c2d51ca-f927-4131-a709-50017344c61c",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sea_user\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:469: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n"
     ]
    },
    {
     "data": {
      "image/png": "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eOedd3Dz5s1i90lqairc3d0LTZGtUqUKLCwsyiSjKlzwm5ubo127djh06BDOnz//0P4FO+nixYuFll24cAGurq5Gq83a2hoAkJ2dbdBe8MS5V+vWrbF582Zcv34d+/fvR0hICEaMGIH169cXO76Li0ux2wHAqNtyr4iICFy9ehULFy5E3759i+23fv16WFpaIj4+Hj179kSLFi3QpEmTR1pnaeaJX7x4EUOHDkWjRo2QmpqKMWPGPNI6gYc/X8zMzODk5PTItZZk/SV5jF1cXPShda+UlJQSreell17Czp07cf36dezZswdVq1bFa6+9VuhdY0lUrlwZAEr0ejQzM0OTJk3QpEkTdO3aFdu2bUPdunURHR2Nc+fOAfjfNm7atEn/j8S9fz/99BOA/z1WpdkP9z9WBesaN25cketKTEzUT2fV6XSIjo7GiRMnkJKSggULFmD//v3o1q2bfjxfX18sW7YMKSkpOHnyJEaOHImYmBhERkYWu08KHku578cQL1++jNzc3DJ5XVe44AfuPkgiggEDBuDOnTuFlufk5GDz5s0AgOeeew4A8Pnnnxv0SUxMRFJSEtq1a2e0ugrm8h87dsygvaCWopibm6N58+aYP38+AODnn38utm+7du2wa9cufQgUWL16NWxtbcts+qeXlxciIyPRrVs3hIeHF9tPo9HAwsIC5ubm+rbMzEysWbOmUF9jvYvKy8tDr169oNFosHXrVkyfPh3z5s3DV1999Ujj1axZE15eXli7dq3BCzEjIwNffvklQkJCynS6Zkkf49DQUBw/fhy//fabQb8HHTgURavVIjQ0FDNmzABw94OJBe1Ayd6ldezYEebm5liwYEGp1l2wnvnz5yMrKwsffPABAKBTp06wsLDAqVOn9P9I3P8H3H2s3N3dsXHjRoMxz549i3379pVo/TVr1kSNGjVw9OjRYtdV1OdV3NzcEBERgV69euHkyZOFTv8BQGBgICZMmID69es/9HV969YtxMXFGbSvXr1av9zYKuQ8/pCQECxYsABDhgxBcHAwBg8ejLp16yInJweHDx/G4sWLUa9ePXTr1g01a9bEwIEDMW/ePJiZmaFz5844c+YMJk6cCG9vb4wcOdJodXXp0gXOzs7o378/pkyZAgsLC6xcuVJ/JFNg4cKF2LVrF1544QX4+PggKysLy5cvBwC0b9++2PGj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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: \n",
      "LogisticRegression\n",
      "Accuracy: 0.7316\n",
      "Precision: 0.7234\n",
      "Recall: 0.7316\n",
      "F1 Score: 0.7237\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.77      0.85      0.80       150\n",
      "           1       0.65      0.52      0.58        81\n",
      "\n",
      "    accuracy                           0.73       231\n",
      "   macro avg       0.71      0.68      0.69       231\n",
      "weighted avg       0.72      0.73      0.72       231\n",
      "\n"
     ]
    }
   ],
   "source": [
    "LR = LogisticRegression()\n",
    "# Train the model\n",
    "LR.fit(X_train, y_train)\n",
    "# Make predictions\n",
    "y_pred = LR.predict(X_test)\n",
    "# Evaluate the model\n",
    "evaluation_results = evaluate_model('LogisticRegression', y_test, y_pred)\n",
    "# Print the evaluation results\n",
    "\n",
    "\n",
    "for key, value in evaluation_results.items():\n",
    " if key == 'Classification Report':\n",
    "  print(value) # Print report separately for better readability\n",
    " else:\n",
    "  print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n{value}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42964c6a-3497-4e9e-9b60-74b797c54f9e",
   "metadata": {},
   "source": [
    "### Decision Tree Classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "id": "35abdd73-082b-4eba-93f5-f7dfbc2060d2",
   "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: \n",
      "DecisionTreeClassifier\n",
      "Accuracy: 0.7100\n",
      "Precision: 0.7144\n",
      "Recall: 0.7100\n",
      "F1 Score: 0.7118\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.79      0.76      0.77       150\n",
      "           1       0.58      0.62      0.60        81\n",
      "\n",
      "    accuracy                           0.71       231\n",
      "   macro avg       0.68      0.69      0.69       231\n",
      "weighted avg       0.71      0.71      0.71       231\n",
      "\n"
     ]
    }
   ],
   "source": [
    "DT = DecisionTreeClassifier()\n",
    "# Train the model\n",
    "DT.fit(X_train, y_train)\n",
    "# Make predictions\n",
    "y_pred = DT.predict(X_test)\n",
    "# Evaluate the model\n",
    "evaluation_results = evaluate_model('DecisionTreeClassifier', y_test, y_pred)\n",
    "# Print the evaluation results\n",
    "\n",
    "for key, value in evaluation_results.items():\n",
    " if key == 'Classification Report':\n",
    "  print(value) # Print report separately for better readability\n",
    " else:\n",
    "  print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n{value}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "793ffd62-96f1-417c-97e6-6f63dfa2659c",
   "metadata": {},
   "source": [
    "### Support Vector Machine"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "id": "9a321255-aaa8-4926-bd4a-b18e99e43d11",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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WlxcXMTe3l6qVq0qixcvNumT3V1NIg9vZQZg1v9xj979lZvs7uBatGiRlC1bVnQ6nQQFBUlkZKR8+eWXZnePXLx4UZo1aybOzs7ZPqfyeO2PDsu6+2vHjh1iY2NjtowSExPF399fatasKampqTnWn9u8Nm7cKKGhoaLX68XR0VGaNGlico+/yD93fz16W3puvvvuO+nRo4dUqFBBXFxcxM7OTry9vaVdu3Zmd+RlZmZKVFSUBAUFiV6vlxo1asju3btzfU7lgw8+EA8PD9HpdFK/fn05fPiwyTSz7jo6ceKENGzYUAwGg7i6ukq/fv3Mbr9OSUmRkSNHSkBAgGi1WvH29pZ+/frl+IxGdo4fPy5169YVBweHJz6n8qiEhASxt7cXADnemrto0SIJDQ0VR0dHMRgMUrJkSXnnnXfM3vPWrVslLCxMHB0dxcHBQSpUqGBy+31qaqr06tVLPDw8RKPRmD2n8qzLIDuP3v2V2zJ4fPtPTU2VYcOGia+vr+j1eqlWrZps3Lgx2/1TSkqKjB07VkqXLi329vbi5uYmjRs3NnnWKqd92ON3Hub2nEp27+3xWu7evSsfffSR8TlBFxcXqVy5sgwePNjkFvAn0fxf0URUgPbu3YtGjRph3bp1ePPNN3Pt261bN6xfvz7b35si+rf719xSTERE1o+hQkREyvD0FxERKcMjFSIiUoahQkREyjBUiIhIGYYKEREpU6BP1FuKIeTJf8+ZSIWbh2ZaugR6QeitZG/NIxUiIlKGoUJERMowVIiISBmGChERKcNQISIiZRgqRESkDEOFiIiUYagQEZEyDBUiIlKGoUJERMowVIiISBmGChERKcNQISIiZRgqRESkDEOFiIiUYagQEZEyDBUiIlKGoUJERMowVIiISBmGChERKcNQISIiZRgqRESkDEOFiIiUYagQEZEyDBUiIlKGoUJERMowVIiISBmGChERKcNQISIiZRgqRESkDEOFiIiUYagQEZEyDBUiIlKGoUJERMowVIiISBmGChERKcNQISIiZRgqRESkDEOFiIiUYagQEZEyDBUiIlKGoUJERMowVIiISBmGChERKcNQISIiZRgqRESkDEOFiIiUYagQEZEyDBUiIlKGoUJERMowVIiISBmGChERKcNQISIiZRgqRESkDEOFiIiUYagQEZEyDBUiIlKGoUJERMowVIiI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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: \n",
      "Support Vector Machine\n",
      "Accuracy: 0.7403\n",
      "Precision: 0.7357\n",
      "Recall: 0.7403\n",
      "F1 Score: 0.7208\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.75      0.91      0.82       150\n",
      "           1       0.71      0.43      0.54        81\n",
      "\n",
      "    accuracy                           0.74       231\n",
      "   macro avg       0.73      0.67      0.68       231\n",
      "weighted avg       0.74      0.74      0.72       231\n",
      "\n"
     ]
    }
   ],
   "source": [
    "SVM = SVC()\n",
    "# Train the model\n",
    "SVM.fit(X_train, y_train)\n",
    "# Make predictions\n",
    "y_pred = SVM.predict(X_test)\n",
    "# Evaluate the model\n",
    "evaluation_results = evaluate_model('Support Vector Machine', y_test, y_pred)\n",
    "# Print the evaluation results\n",
    "for key, value in evaluation_results.items():\n",
    " if key == 'Classification Report':\n",
    "  print(value) # Print report separately for better readability\n",
    " else:\n",
    "  print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n{value}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46b0625c-3cfa-4ffe-baa2-daaa0ba503bf",
   "metadata": {},
   "source": [
    "###  Naïve Bayes Classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "id": "84a8cefc-1272-41ae-88f8-7074a666ff53",
   "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: \n",
      "Naïve Bayes\n",
      "Accuracy: 0.7359\n",
      "Precision: 0.7338\n",
      "Recall: 0.7359\n",
      "F1 Score: 0.7347\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.79      0.81      0.80       150\n",
      "           1       0.63      0.60      0.62        81\n",
      "\n",
      "    accuracy                           0.74       231\n",
      "   macro avg       0.71      0.71      0.71       231\n",
      "weighted avg       0.73      0.74      0.73       231\n",
      "\n"
     ]
    }
   ],
   "source": [
    "gnb = GaussianNB()\n",
    "# Train the model\n",
    "gnb.fit(X_train, y_train)\n",
    "# Make predictions\n",
    "y_pred = gnb.predict(X_test)\n",
    "# Evaluate the model\n",
    "evaluation_results = evaluate_model('Naïve Bayes', y_test, y_pred)\n",
    "# Print the evaluation results\n",
    "for key, value in evaluation_results.items():\n",
    " if key == 'Classification Report':\n",
    "  print(value) # Print report separately for better readability\n",
    " else:\n",
    "  print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n{value}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "691a2052-329b-4823-94be-d744c80ec474",
   "metadata": {},
   "source": [
    "###  K-Nearest Neighbors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "id": "a026372f-d572-45d6-bcd1-604f15d7d618",
   "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: \n",
      "KNeighbors\n",
      "Accuracy: 0.6667\n",
      "Precision: 0.6416\n",
      "Recall: 0.6667\n",
      "F1 Score: 0.6302\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.69      0.88      0.77       150\n",
      "           1       0.55      0.27      0.36        81\n",
      "\n",
      "    accuracy                           0.67       231\n",
      "   macro avg       0.62      0.58      0.57       231\n",
      "weighted avg       0.64      0.67      0.63       231\n",
      "\n"
     ]
    }
   ],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=2)\n",
    "knn.fit(X_train, y_train)\n",
    "# Make predictions\n",
    "y_pred = knn.predict(X_test)\n",
    "# Evaluate the model\n",
    "evaluation_results = evaluate_model('KNeighbors', y_test, y_pred)\n",
    "# Print the evaluation results \n",
    "for key, value in evaluation_results.items():\n",
    " if key == 'Classification Report':\n",
    "  print(value) # Print report separately for better readability\n",
    " else:\n",
    "  print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n{value}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a06ede79-8ad0-4842-b1bf-e44761c2cc89",
   "metadata": {},
   "source": [
    "### Splitting the Dataset into Training and Testing Sets\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12869511-e070-4d0f-906b-dc7d0f3017b6",
   "metadata": {},
   "source": [
    "### Feature Selection Using SelectKBest (Chi-Squared Test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "id": "3b719522-1b40-4878-a74e-00ef39fb93be",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, \n",
    "test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 260,
   "id": "94984f9e-fa9d-483f-9253-d1e72671bba6",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_df = data.drop('Outcome', axis=1) \n",
    "y = data['Outcome']\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_df, y, test_size=0.2, random_state=42)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 261,
   "id": "999f95f3-0496-4fc5-af15-9c9f8b93bc72",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                    Feature        Score\n",
      "1                   Glucose  1090.446204\n",
      "4                   Insulin   509.705007\n",
      "7                       Age   226.137110\n",
      "5                       BMI    78.780304\n",
      "3             SkinThickness    64.929169\n",
      "0               Pregnancies    57.628926\n",
      "2             BloodPressure    29.034836\n",
      "6  DiabetesPedigreeFunction     1.812593\n"
     ]
    }
   ],
   "source": [
    "select_feature = SelectKBest(chi2, k=8).fit(X_train, y_train)\n",
    "\n",
    "# إنشاء جدول بالنتائج\n",
    "results_df = pd.DataFrame({\n",
    "    'Feature': X_train.columns,\n",
    "    'Score': select_feature.scores_\n",
    "})\n",
    "\n",
    "# عرض النتائج مرتبة تنازليًا حسب الأهمية\n",
    "results_df = results_df.sort_values(by='Score', ascending=False)\n",
    "print(results_df)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 262,
   "id": "8ca4763e-2be9-45c2-aaae-19c0fe3385c2",
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate_model(model_name, y_true, y_pred):\n",
    " \n",
    " # Calculate metrics\n",
    " accuracy = accuracy_score(y_true, y_pred)\n",
    " precision = precision_score(y_true, y_pred, average='weighted') \n",
    " recall = recall_score(y_true, y_pred, average='weighted')\n",
    " f1 = f1_score(y_true, y_pred, average='weighted')\n",
    " # Output results\n",
    " metrics = {\n",
    " 'Model Name': model_name,\n",
    " 'Accuracy': accuracy,\n",
    " 'Precision': precision,\n",
    " 'Recall': recall,\n",
    " 'F1 Score': f1,\n",
    " \n",
    " \n",
    " }\n",
    " \n",
    " return metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d4095e0a-bb6d-4219-bcae-0b1153ca2df7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "029083ea-bff4-4d08-95bd-55c3941dbe7f",
   "metadata": {},
   "source": [
    "## Hyperparameter Tuning for Random Forest Using GridSearchCV"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ec434e5-3e73-4380-bf77-42082d2e00f0",
   "metadata": {},
   "source": [
    "### Random Forest Tuning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 263,
   "id": "41a68093-2e5e-4139-a177-af2eb76a1b81",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model Name: \n",
      "RandomForestClassifier\n",
      "Accuracy: 0.7597\n",
      "Precision: 0.7656\n",
      "Recall: 0.7597\n",
      "F1 Score: 0.7619\n",
      "\n",
      "Best hyperparameters found by GridSearchCV:\n",
      "{'max_depth': 10, 'min_samples_leaf': 4, 'min_samples_split': 10, 'n_estimators': 100}\n"
     ]
    }
   ],
   "source": [
    "# Define the Random Forest Classifier\n",
    "rf_classifier = RandomForestClassifier(random_state=42)\n",
    "# Define the hyperparameters for grid search\n",
    "param_grid = {\n",
    " 'n_estimators': [100, 200, 300],\n",
    " 'max_depth': [None, 10, 20, 30],\n",
    " 'min_samples_split': [2, 5, 10],\n",
    " 'min_samples_leaf': [1, 2, 4]\n",
    "}\n",
    "# Initialize GridSearchCV\n",
    "grid_search = GridSearchCV(estimator=rf_classifier, param_grid=param_grid, cv=5, scoring='accuracy',n_jobs=-1)\n",
    "# Fit the grid search to the data\n",
    "grid_search.fit(X_train, y_train)\n",
    "# Get the best estimator from grid search\n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "# Make predictions using the best model\n",
    "y_pred = best_rf_classifier.predict(X_test)\n",
    "# Evaluate the model\n",
    "evaluation_results = evaluate_model('RandomForestClassifier', y_test, y_pred)\n",
    "# Print the evaluation results\n",
    "for key, value in evaluation_results.items():\n",
    " if key == 'Classification Report':\n",
    "  print(value) # Print report separately for better readability\n",
    " else:\n",
    "  print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n{value}\")\n",
    "# Print the best parameters found by grid search\n",
    "print(\"\\nBest hyperparameters found by GridSearchCV:\")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 265,
   "id": "06d6bb3f-3dc6-4587-8bce-8f712fecbd16",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_selected = select_feature.transform(X_train)\n",
    "X_test_selected = select_feature.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 269,
   "id": "e1d33cfd-b6a6-4ee4-9e17-7fa23f992274",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Selected Features by RFE:\n",
      "Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',\n",
      "       'BMI', 'DiabetesPedigreeFunction', 'Age'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_selection import RFE\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "\n",
    "# إنشاء النموذج\n",
    "clf_rf_2 = RandomForestClassifier(random_state=43)\n",
    "\n",
    "# تعريف RFE لاختيار 8 خصائص\n",
    "rfe_selector = RFE(estimator=clf_rf_2, n_features_to_select=8)\n",
    "\n",
    "# تدريب RFE على بيانات التدريب\n",
    "X_train_selected_rfe = rfe_selector.fit_transform(X_train, y_train)\n",
    "X_test_selected_rfe = rfe_selector.transform(X_test)\n",
    "\n",
    "# عرض أسماء الخصائص المختارة\n",
    "selected_features = X_train.columns[rfe_selector.support_]\n",
    "print(\"Selected Features by RFE:\")\n",
    "print(selected_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 270,
   "id": "8a5b2752-9e5d-48d8-aca1-24561caae4c6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Selected Features (RFE): [0 1 2 3 4 5 6 7]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_selection import RFE\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "clf_rf_2 = RandomForestClassifier(random_state=43)\n",
    "\n",
    "rfe_selector = RFE(estimator=clf_rf_2, n_features_to_select=8)\n",
    "\n",
    "X_train_selected_rfe = rfe_selector.fit_transform(X_train, y_train)\n",
    "X_test_selected_rfe = rfe_selector.transform(X_test)\n",
    "# Get the selected feature indices\n",
    "selected_features = rfe_selector.get_support(indices=True)\n",
    "print(\"Selected Features (RFE):\", selected_features)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a03188a-b5cc-43cd-ab15-4e133901a3ae",
   "metadata": {},
   "source": [
    "### Decision Tree Tuning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 271,
   "id": "080ffae1-68e6-4e9f-9900-0bc926555749",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model Name: \n",
      "RandomForestClassifier\n",
      "Accuracy: 0.7597\n",
      "Precision: 0.7656\n",
      "Recall: 0.7597\n",
      "F1 Score: 0.7619\n",
      "\n",
      "Best hyperparameters found by GridSearchCV:\n",
      "{'max_depth': 10, 'min_samples_leaf': 4, 'min_samples_split': 10, 'n_estimators': 100}\n"
     ]
    }
   ],
   "source": [
    "# Define the Random Forest Classifier\n",
    "rf_classifier = RandomForestClassifier(random_state=42)\n",
    "# Define the hyperparameters for grid search\n",
    "param_grid = {\n",
    " 'n_estimators': [100, 200, 300],\n",
    " 'max_depth': [None, 10, 20, 30],\n",
    " 'min_samples_split': [2, 5, 10],\n",
    " 'min_samples_leaf': [1, 2, 4]\n",
    "}\n",
    "# Initialize GridSearchCV\n",
    "grid_search = GridSearchCV(estimator=rf_classifier, \n",
    "param_grid=param_grid, cv=5, scoring='accuracy', n_jobs=-1)\n",
    "# Fit the grid search to the data\n",
    "grid_search.fit(X_train_selected_rfe, y_train)\n",
    "# Get the best estimator from grid search\n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "# Make predictions using the best model\n",
    "y_pred = best_rf_classifier.predict(X_test_selected_rfe)\n",
    "# Evaluate the model\n",
    "evaluation_results = evaluate_model('RandomForestClassifier', y_test, \n",
    "y_pred)\n",
    "# Print the evaluation results\n",
    "for key, value in evaluation_results.items():\n",
    " print(f\"{key}: {value:.4f}\" if isinstance(value, float) else\n",
    "f\"{key}: \\n{value}\")\n",
    "# Print the best parameters found by grid search\n",
    "print(\"\\nBest hyperparameters found by GridSearchCV:\")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "429b4891-cb12-4c72-8fc7-116b81d99d30",
   "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.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
