{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3932c217-056b-4a3e-8998-93a40bacffcb",
   "metadata": {},
   "source": [
    "# Assignment 2\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "ff4ba75d-9021-4059-9c7b-05e9281b6641",
   "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>age</th>\n",
       "      <th>bp</th>\n",
       "      <th>sg</th>\n",
       "      <th>al</th>\n",
       "      <th>su</th>\n",
       "      <th>pc</th>\n",
       "      <th>pcc</th>\n",
       "      <th>ba</th>\n",
       "      <th>bgr</th>\n",
       "      <th>bu</th>\n",
       "      <th>...</th>\n",
       "      <th>hemo</th>\n",
       "      <th>pcv</th>\n",
       "      <th>wc</th>\n",
       "      <th>htn</th>\n",
       "      <th>dm</th>\n",
       "      <th>cad</th>\n",
       "      <th>appet</th>\n",
       "      <th>pe</th>\n",
       "      <th>ane</th>\n",
       "      <th>classification</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>48.0</td>\n",
       "      <td>80.0</td>\n",
       "      <td>1.020</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>121.000000</td>\n",
       "      <td>36.0</td>\n",
       "      <td>...</td>\n",
       "      <td>15.4</td>\n",
       "      <td>32</td>\n",
       "      <td>72</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7.0</td>\n",
       "      <td>50.0</td>\n",
       "      <td>1.020</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>147.943503</td>\n",
       "      <td>18.0</td>\n",
       "      <td>...</td>\n",
       "      <td>11.3</td>\n",
       "      <td>26</td>\n",
       "      <td>56</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>62.0</td>\n",
       "      <td>80.0</td>\n",
       "      <td>1.010</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>423.000000</td>\n",
       "      <td>53.0</td>\n",
       "      <td>...</td>\n",
       "      <td>9.6</td>\n",
       "      <td>19</td>\n",
       "      <td>70</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>48.0</td>\n",
       "      <td>70.0</td>\n",
       "      <td>1.005</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>56.0</td>\n",
       "      <td>...</td>\n",
       "      <td>11.2</td>\n",
       "      <td>20</td>\n",
       "      <td>62</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>51.0</td>\n",
       "      <td>80.0</td>\n",
       "      <td>1.010</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>106.000000</td>\n",
       "      <td>26.0</td>\n",
       "      <td>...</td>\n",
       "      <td>11.6</td>\n",
       "      <td>23</td>\n",
       "      <td>68</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 23 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    age    bp     sg   al   su  pc  pcc  ba         bgr    bu  ...  hemo  pcv  \\\n",
       "0  48.0  80.0  1.020  1.0  0.0   1    0   0  121.000000  36.0  ...  15.4   32   \n",
       "1   7.0  50.0  1.020  4.0  0.0   1    0   0  147.943503  18.0  ...  11.3   26   \n",
       "2  62.0  80.0  1.010  2.0  3.0   1    0   0  423.000000  53.0  ...   9.6   19   \n",
       "3  48.0  70.0  1.005  4.0  0.0   0    1   0  117.000000  56.0  ...  11.2   20   \n",
       "4  51.0  80.0  1.010  2.0  0.0   1    0   0  106.000000  26.0  ...  11.6   23   \n",
       "\n",
       "   wc  htn  dm  cad  appet  pe  ane  classification  \n",
       "0  72    1   4    1      0   0    0               0  \n",
       "1  56    0   3    1      0   0    0               0  \n",
       "2  70    0   4    1      1   0    1               0  \n",
       "3  62    1   3    1      1   1    1               0  \n",
       "4  68    0   3    1      0   0    0               0  \n",
       "\n",
       "[5 rows x 23 columns]"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import warnings\n",
    "from sklearn.exceptions import ConvergenceWarning\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.preprocessing import StandardScaler, LabelEncoder\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.feature_selection import SelectKBest, chi2, RFE\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\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\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n",
    "from sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrix, classification_report\n",
    "\n",
    "data = pd.read_csv('kidney_disease_clean_final.csv')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "bc60ab3e-8d9d-43b6-908e-4b3aaabb32a0",
   "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>age</th>\n",
       "      <th>bp</th>\n",
       "      <th>sg</th>\n",
       "      <th>al</th>\n",
       "      <th>su</th>\n",
       "      <th>pc</th>\n",
       "      <th>pcc</th>\n",
       "      <th>ba</th>\n",
       "      <th>bgr</th>\n",
       "      <th>bu</th>\n",
       "      <th>...</th>\n",
       "      <th>hemo</th>\n",
       "      <th>pcv</th>\n",
       "      <th>wc</th>\n",
       "      <th>htn</th>\n",
       "      <th>dm</th>\n",
       "      <th>cad</th>\n",
       "      <th>appet</th>\n",
       "      <th>pe</th>\n",
       "      <th>ane</th>\n",
       "      <th>classification</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "      <td>398.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>51.395887</td>\n",
       "      <td>76.502591</td>\n",
       "      <td>1.017429</td>\n",
       "      <td>1.014164</td>\n",
       "      <td>0.451429</td>\n",
       "      <td>0.972362</td>\n",
       "      <td>0.123116</td>\n",
       "      <td>0.075377</td>\n",
       "      <td>147.943503</td>\n",
       "      <td>57.512401</td>\n",
       "      <td>...</td>\n",
       "      <td>12.534582</td>\n",
       "      <td>29.851759</td>\n",
       "      <td>64.374372</td>\n",
       "      <td>0.374372</td>\n",
       "      <td>3.306533</td>\n",
       "      <td>1.090452</td>\n",
       "      <td>0.206030</td>\n",
       "      <td>0.195980</td>\n",
       "      <td>0.153266</td>\n",
       "      <td>0.376884</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>16.972717</td>\n",
       "      <td>13.483687</td>\n",
       "      <td>0.005370</td>\n",
       "      <td>1.274561</td>\n",
       "      <td>1.031829</td>\n",
       "      <td>0.591067</td>\n",
       "      <td>0.358303</td>\n",
       "      <td>0.300036</td>\n",
       "      <td>74.936192</td>\n",
       "      <td>49.366667</td>\n",
       "      <td>...</td>\n",
       "      <td>2.719296</td>\n",
       "      <td>10.508753</td>\n",
       "      <td>28.197630</td>\n",
       "      <td>0.494857</td>\n",
       "      <td>0.590869</td>\n",
       "      <td>0.320358</td>\n",
       "      <td>0.411134</td>\n",
       "      <td>0.403741</td>\n",
       "      <td>0.367615</td>\n",
       "      <td>0.485216</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>50.000000</td>\n",
       "      <td>1.005000</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>22.000000</td>\n",
       "      <td>1.500000</td>\n",
       "      <td>...</td>\n",
       "      <td>3.100000</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.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>42.000000</td>\n",
       "      <td>70.000000</td>\n",
       "      <td>1.015000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>101.000000</td>\n",
       "      <td>27.250000</td>\n",
       "      <td>...</td>\n",
       "      <td>10.900000</td>\n",
       "      <td>22.000000</td>\n",
       "      <td>49.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>54.000000</td>\n",
       "      <td>78.251295</td>\n",
       "      <td>1.017429</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>125.000000</td>\n",
       "      <td>44.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>12.534582</td>\n",
       "      <td>30.000000</td>\n",
       "      <td>71.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>64.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>1.020000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.451429</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>150.000000</td>\n",
       "      <td>60.750000</td>\n",
       "      <td>...</td>\n",
       "      <td>14.675000</td>\n",
       "      <td>39.000000</td>\n",
       "      <td>92.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>90.000000</td>\n",
       "      <td>180.000000</td>\n",
       "      <td>1.025000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>490.000000</td>\n",
       "      <td>391.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>17.800000</td>\n",
       "      <td>44.000000</td>\n",
       "      <td>92.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 23 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "              age          bp          sg          al          su          pc  \\\n",
       "count  398.000000  398.000000  398.000000  398.000000  398.000000  398.000000   \n",
       "mean    51.395887   76.502591    1.017429    1.014164    0.451429    0.972362   \n",
       "std     16.972717   13.483687    0.005370    1.274561    1.031829    0.591067   \n",
       "min      2.000000   50.000000    1.005000    0.000000    0.000000    0.000000   \n",
       "25%     42.000000   70.000000    1.015000    0.000000    0.000000    1.000000   \n",
       "50%     54.000000   78.251295    1.017429    0.500000    0.000000    1.000000   \n",
       "75%     64.000000   80.000000    1.020000    2.000000    0.451429    1.000000   \n",
       "max     90.000000  180.000000    1.025000    5.000000    5.000000    2.000000   \n",
       "\n",
       "              pcc          ba         bgr          bu  ...        hemo  \\\n",
       "count  398.000000  398.000000  398.000000  398.000000  ...  398.000000   \n",
       "mean     0.123116    0.075377  147.943503   57.512401  ...   12.534582   \n",
       "std      0.358303    0.300036   74.936192   49.366667  ...    2.719296   \n",
       "min      0.000000    0.000000   22.000000    1.500000  ...    3.100000   \n",
       "25%      0.000000    0.000000  101.000000   27.250000  ...   10.900000   \n",
       "50%      0.000000    0.000000  125.000000   44.000000  ...   12.534582   \n",
       "75%      0.000000    0.000000  150.000000   60.750000  ...   14.675000   \n",
       "max      2.000000    2.000000  490.000000  391.000000  ...   17.800000   \n",
       "\n",
       "              pcv          wc         htn          dm         cad       appet  \\\n",
       "count  398.000000  398.000000  398.000000  398.000000  398.000000  398.000000   \n",
       "mean    29.851759   64.374372    0.374372    3.306533    1.090452    0.206030   \n",
       "std     10.508753   28.197630    0.494857    0.590869    0.320358    0.411134   \n",
       "min      0.000000    0.000000    0.000000    0.000000    0.000000    0.000000   \n",
       "25%     22.000000   49.000000    0.000000    3.000000    1.000000    0.000000   \n",
       "50%     30.000000   71.000000    0.000000    3.000000    1.000000    0.000000   \n",
       "75%     39.000000   92.000000    1.000000    4.000000    1.000000    0.000000   \n",
       "max     44.000000   92.000000    2.000000    5.000000    3.000000    2.000000   \n",
       "\n",
       "               pe         ane  classification  \n",
       "count  398.000000  398.000000      398.000000  \n",
       "mean     0.195980    0.153266        0.376884  \n",
       "std      0.403741    0.367615        0.485216  \n",
       "min      0.000000    0.000000        0.000000  \n",
       "25%      0.000000    0.000000        0.000000  \n",
       "50%      0.000000    0.000000        0.000000  \n",
       "75%      0.000000    0.000000        1.000000  \n",
       "max      2.000000    2.000000        1.000000  \n",
       "\n",
       "[8 rows x 23 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "65f6c9a6-4fde-4d42-bb23-4d2c88f566c1",
   "metadata": {},
   "outputs": [],
   "source": [
    "numerical_cols = data.select_dtypes(include=np.number).columns \n",
    "categorical_cols = data.select_dtypes(include='object').columns "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e05afe87-0177-4bde-a761-5dc2c3137e10",
   "metadata": {},
   "outputs": [],
   "source": [
    "imputer = SimpleImputer(strategy='mean') \n",
    "data[numerical_cols] = imputer.fit_transform(data[numerical_cols])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e2bb4b20-4ada-46b9-8f70-2316cbe6006e",
   "metadata": {},
   "outputs": [],
   "source": [
    "label_encoders = {}\n",
    "for column in data.select_dtypes(include=['object']).columns:\n",
    " le = LabelEncoder()\n",
    " data[column] = le.fit_transform(data[column])\n",
    " label_encoders[column] = le "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "0ceedfe8-e434-47dc-a2a4-107f0cbdfa5a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age               0\n",
       "bp                0\n",
       "sg                0\n",
       "al                0\n",
       "su                0\n",
       "pc                0\n",
       "pcc               0\n",
       "ba                0\n",
       "bgr               0\n",
       "bu                0\n",
       "sc                0\n",
       "sod               0\n",
       "pot               0\n",
       "hemo              0\n",
       "pcv               0\n",
       "wc                0\n",
       "htn               0\n",
       "dm                0\n",
       "cad               0\n",
       "appet             0\n",
       "pe                0\n",
       "ane               0\n",
       "classification    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##Check Missing Values\n",
    "data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9e00ddc6-c4d7-4d94-900a-f103d3ec38e5",
   "metadata": {},
   "outputs": [],
   "source": [
    "for column in data.select_dtypes(include=['float64']).columns:\n",
    " mean_value = data[column].mean() \n",
    " data[column] = data[column].fillna(mean_value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "863eda76-e21a-405a-833d-757ae2d0fafc",
   "metadata": {},
   "outputs": [],
   "source": [
    "for column in data.select_dtypes(include=['object']).columns:\n",
    " mode_value = data[column].mode()[0] \n",
    " data[column] = data[column].fillna(mode_value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0f111d93-7149-443f-8107-68a455413c32",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age               0\n",
       "bp                0\n",
       "sg                0\n",
       "al                0\n",
       "su                0\n",
       "pc                0\n",
       "pcc               0\n",
       "ba                0\n",
       "bgr               0\n",
       "bu                0\n",
       "sc                0\n",
       "sod               0\n",
       "pot               0\n",
       "hemo              0\n",
       "pcv               0\n",
       "wc                0\n",
       "htn               0\n",
       "dm                0\n",
       "cad               0\n",
       "appet             0\n",
       "pe                0\n",
       "ane               0\n",
       "classification    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "683fbe67-0d12-4738-b838-5522834c72e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = data.drop('classification', axis=1).values \n",
    "y = data['classification'].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "2dc1c887-0d50-4e4c-8985-6f96d99c4847",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b8e6b302-1b0b-4b67-83db-10ffe55dad67",
   "metadata": {},
   "outputs": [],
   "source": [
    "scaler = StandardScaler() \n",
    "X_train_scaled = scaler.fit_transform(X_train) \n",
    "X_test_scaled = scaler.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "399d58bf-1f9f-4699-90a8-df1ea54f2547",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report\n",
    "\n",
    "# دالة تقييم نموذج التصنيف\n",
    "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')\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",
    "    report = classification_report(y_true, y_pred)\n",
    "\n",
    "    metrics = {\n",
    "        'Model Name': model_name,\n",
    "        'Accuracy': accuracy,\n",
    "        'Precision': precision,\n",
    "        'Recall': recall,\n",
    "        'F1 Score': f1,\n",
    "        'Classification Report': report,\n",
    "        'Confusion Matrix': cm\n",
    "    }\n",
    "\n",
    "    plt.figure(figsize=(4, 4))\n",
    "    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False,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\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "5520b87e-0b59-41ea-b19f-0aed620901ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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xoWb97H658v4824WUi/cMuif0LEudvzfdWz97VpplkpmUqbDJCoqCufPn8e2bdsKHaPV5t+ldT+7pCt7ctzNyMC5c+f0ty9euIATaWlwcnKCh6enBSuj8uxeVi7OPXJQ/X5WLu7cz9a333nk7K7sXMGf97Jw8ZbhbmsqH8p0mHh6esLKyuIX6T/Rjh07ijf79dHfnjY1BgDwUreX8dnkzy1VFhGVMxoReeJO7uaWCZWWHotSLF0CVRBrBza1dAlFKtMf+8+fP4/+/ftbugwiInqMMh0mN27cwJIlSyxdBhERPYZFj5msW7euyP5Tp06VUiVERKTComESEREBjUaDog7baDSaUqyIiIiKw6K7uTw8PLBq1Srk5uYW+Hfo0CFLlkdEREayaJg0adKkyMB43FYLERGVDRbdzTV69GhkZGQU2u/v74/t27eXYkVERFQcFg2TsLCwIvsdHR0RHh5eStUQEVFxlelTg4mIqHxgmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMoYJEREpY5gQEZEyhgkRESljmBARkTKGCRERKWOYEBGRMo2IiKWLIMvLzMxETEwMxo4dC61Wa+ly6AnGde3JxDAhAMDt27fh5OSEW7duoUqVKpYuh55gXNeeTNzNRUREyhgmRESkjGFCRETKGCYEANBqtYiOjuYBUSpxXNeeTDwAT0REyrhlQkREyhgmRESkjGFCRETKGCZERKSMYVKBzJkzB7Vr14a9vT2aNGmCXbt2FTl+586daNKkCezt7eHn54e5c+eWUqVUXv33v/9F165d4enpCY1Gg8TExMfe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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: RandomForestClassifier\n",
      "Accuracy: 0.9833\n",
      "Precision: 0.9833\n",
      "Recall: 0.9833\n",
      "F1 Score: 0.9833\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.99      0.99      0.99        75\n",
      "         1.0       0.98      0.98      0.98        45\n",
      "\n",
      "    accuracy                           0.98       120\n",
      "   macro avg       0.98      0.98      0.98       120\n",
      "weighted avg       0.98      0.98      0.98       120\n",
      "\n",
      "\n",
      "\n",
      "Confusion Matrix:\n",
      "[[74  1]\n",
      " [ 1 44]]\n",
      "\n",
      "\n",
      "Best hyperparameters found by GridSearchCV:\n",
      "{'max_depth': None, 'min_samples_leaf': 1, 'min_samples_split': 2, 'n_estimators': 100}\n"
     ]
    }
   ],
   "source": [
    "##Random Forest Classifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "rf_classifier = RandomForestClassifier(random_state=42)\n",
    "\n",
    "param_grid = {\n",
    "    'n_estimators': [100, 200],\n",
    "    'max_depth': [None, 10],\n",
    "    'min_samples_split': [2, 5],\n",
    "    'min_samples_leaf': [1, 2]\n",
    "}\n",
    "\n",
    "grid_search = GridSearchCV(estimator=rf_classifier, param_grid=param_grid, cv=5, scoring='accuracy')\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "# أفضل نموذج\n",
    "best_rf = grid_search.best_estimator_\n",
    "\n",
    "# التنبؤ\n",
    "y_pred = best_rf.predict(X_test)\n",
    "\n",
    "# التقييم\n",
    "evaluation_results = evaluate_model(\"RandomForestClassifier\", y_test, y_pred)\n",
    "\n",
    "# الطباعة النهائية\n",
    "for key, value in evaluation_results.items():\n",
    "    if key in ['Classification Report', 'Confusion Matrix']:\n",
    "        print(f\"\\n{key}:\\n{value}\\n\")\n",
    "    elif isinstance(value, float):  \n",
    "        print(f\"{key}: {value:.4f}\")\n",
    "    else:\n",
    "        print(f\"{key}: {value}\")\n",
    "\n",
    "print(\"\\nBest hyperparameters found by GridSearchCV:\")\n",
    "print(grid_search.best_params_)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "bcd022b0-a8ca-4ebc-a95b-0ca13ebd6a25",
   "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: LogisticRegression\n",
      "Accuracy: 0.9583\n",
      "Precision: 0.9587\n",
      "Recall: 0.9583\n",
      "F1 Score: 0.9584\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.97      0.96      0.97        75\n",
      "         1.0       0.93      0.96      0.95        45\n",
      "\n",
      "    accuracy                           0.96       120\n",
      "   macro avg       0.95      0.96      0.96       120\n",
      "weighted avg       0.96      0.96      0.96       120\n",
      "\n",
      "\n",
      "Best hyperparameters found by GridSearchCV:\n",
      "{'logreg__C': 1, 'logreg__solver': 'lbfgs'}\n"
     ]
    }
   ],
   "source": [
    "#Logistic Regression Classifier\n",
    "warnings.filterwarnings(\"ignore\", category=ConvergenceWarning)\n",
    "\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import GridSearchCV, train_test_split\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report\n",
    "\n",
    "# Logistic Regression مع Pipeline\n",
    "pipeline = Pipeline([\n",
    "    ('scaler', StandardScaler()),\n",
    "    ('logreg', LogisticRegression(max_iter=5000, random_state=42))\n",
    "])\n",
    "\n",
    "# GridSearchCV مع Hyperparameters\n",
    "param_grid = {\n",
    "    'logreg__C': [0.01, 0.1, 1, 10],\n",
    "    'logreg__solver': ['lbfgs', 'saga'],  # solvers مناسبة للـ multiclass\n",
    "}\n",
    "\n",
    "grid_search = GridSearchCV(estimator=pipeline, param_grid=param_grid, cv=5, scoring='accuracy')\n",
    "\n",
    "# تدريب النموذج\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "# أفضل نموذج\n",
    "best_model = grid_search.best_estimator_\n",
    "\n",
    "# التنبؤ على البيانات الاختبارية\n",
    "y_pred = best_model.predict(X_test)\n",
    "\n",
    "# تقييم النموذج\n",
    "evaluation_results = evaluate_model('LogisticRegression', y_test, y_pred)\n",
    "\n",
    "# طباعة النتائج\n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(f\"\\n{key}:\\n{value}\")\n",
    "    elif key == 'Confusion Matrix':\n",
    "        continue  # تم عرضها في Heatmap\n",
    "    elif isinstance(value, float):\n",
    "        print(f\"{key}: {value:.4f}\")\n",
    "    else:\n",
    "        print(f\"{key}: {value}\")\n",
    "\n",
    "# أفضل معلمات GridSearch\n",
    "print(\"\\nBest hyperparameters found by GridSearchCV:\")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "f6df2705-ee73-4297-b9b9-1dfd00bd1552",
   "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: DecisionTreeClassifier\n",
      "Accuracy: 0.9750\n",
      "Precision: 0.9750\n",
      "Recall: 0.9750\n",
      "F1 Score: 0.9749\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.97      0.99      0.98        75\n",
      "         1.0       0.98      0.96      0.97        45\n",
      "\n",
      "    accuracy                           0.97       120\n",
      "   macro avg       0.98      0.97      0.97       120\n",
      "weighted avg       0.98      0.97      0.97       120\n",
      "\n",
      "\n",
      "\n",
      "Confusion Matrix:\n",
      "[[74  1]\n",
      " [ 2 43]]\n",
      "\n",
      "\n",
      "Best hyperparameters found by GridSearchCV:\n",
      "{'criterion': 'entropy', 'max_depth': None, 'min_samples_leaf': 1, 'min_samples_split': 2}\n"
     ]
    }
   ],
   "source": [
    "# DecisionTree Classifier\n",
    "dt_classifier = DecisionTreeClassifier(random_state=42)\n",
    "\n",
    "# شبكة المعلمات (hyperparameters)\n",
    "param_grid = {\n",
    "    'criterion': ['gini', 'entropy', 'log_loss'],  # دوال قياس جودة الانقسام\n",
    "    'max_depth': [None, 5, 10, 20, 30],            # عمق الشجرة\n",
    "    'min_samples_split': [2, 5, 10],               # الحد الأدنى لتقسيم العقدة\n",
    "    'min_samples_leaf': [1, 2, 4]                  # الحد الأدنى للأوراق\n",
    "}\n",
    "\n",
    "grid_search = GridSearchCV(estimator=dt_classifier, param_grid=param_grid, cv=5, scoring='accuracy')\n",
    "\n",
    "# تدريب النموذج\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "# أفضل نموذج\n",
    "best_dt = grid_search.best_estimator_\n",
    "\n",
    "# التنبؤ\n",
    "y_pred = best_dt.predict(X_test)\n",
    "\n",
    "# التقييم\n",
    "evaluation_results = evaluate_model(\"DecisionTreeClassifier\", y_test, y_pred)\n",
    "\n",
    "# الطباعة النهائية\n",
    "for key, value in evaluation_results.items():\n",
    "    if key in ['Classification Report', 'Confusion Matrix']:\n",
    "        print(f\"\\n{key}:\\n{value}\\n\")\n",
    "    elif isinstance(value, float):  \n",
    "        print(f\"{key}: {value:.4f}\")\n",
    "    else:\n",
    "        print(f\"{key}: {value}\")\n",
    "\n",
    "print(\"\\nBest hyperparameters found by GridSearchCV:\")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "a71b6502-c4fd-4a47-a2b0-0ade14d316d1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXUAAAGHCAYAAABPp8LaAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAALPlJREFUeJzt3XlYVNX/B/D3ZZthEVRIFgUFSb9KLohmoIapWYaWYRmlBkKaZotL5tdM0cwos7TMFffU1FJLzUxzSxNzicqFbHFP+QniFgrB8Pn90cN8HVmcgYGRw/v1PDyPc86Zcz93GN/cOffOjCYiAiIiUoKdrQsgIiLrYagTESmEoU5EpBCGOhGRQhjqREQKYagTESmEoU5EpBCGOhGRQhjqREQKYahXEb/88gv69++PwMBA6PV6uLm5oVWrVpg8eTKysrIqdNupqamIjIyEh4cHNE3DtGnTrL4NTdMwfvx4q897O4sWLYKmadA0DTt27CjSLyIIDg6Gpmno2LFjmbYxc+ZMLFq0yKL77Nixo8SaymrlypUICQmBs7MzNE3DTz/9ZLW5i5OWloZ+/fohKCgIer0eXl5eaNWqFV588UVcvXoVeXl58Pb2xn333VfiHAUFBQgICEDz5s0B/O9x0TStxMe0U6dO0DQNDRo0qIC9qgKE7nhz584VBwcHCQkJkRkzZsj27dtl8+bN8vbbb0tgYKD07NmzQrffsmVLufvuu2Xjxo2SkpIi58+ft/o2UlJS5MyZM1af93YWLlwoAKRGjRrSt2/fIv3bt2839kdGRpZpGyEhIRbf98qVK5KSkiJXrlwp0zZvdeHCBXF0dJQePXrIjh07JCUlRbKzs60yd3F+/PFHcXZ2llatWsnChQtl+/bt8tlnn8kbb7whwcHBcuLECRERGTFihACQI0eOFDvPN998IwBk2rRpImL6+2jfvn2R8cePHxdN08Td3V3q169fUbt3R2Oo3+H27Nkj9vb28vDDD0tOTk6R/tzcXPnyyy8rtAYHBwcZPHhwhW7DVgpD/bnnnhNnZ+ciIdq3b18JDw8vUzAXsuS+//zzj+Tl5ZVpO6XZvXu3AJCVK1dabc7S/ig8++yz4urqKlevXi22v6CgQEREjh49KgBkxIgRxY576qmnxMnJSTIzM0Xkf6H+3HPPCQD57bffTMa/8cYbUq9ePenWrRtDne5M3bt3FwcHBzl9+rRZ4w0Gg7z77rvSuHFjcXJykrvuukv69etX5Cg4MjJSQkJCZN++fdK+fXtxdnaWwMBASUpKEoPBICL/C7xbf0REEhMTpbgXeoX3KTwSExHZunWrREZGSu3atUWv14u/v79ER0ebhAIASUxMNJnr0KFD8uijj0rNmjVFp9NJixYtZNGiRSZjCv+TL1++XF5//XXx9fWVGjVqSOfOneXXX3+97eNVWO/WrVvF2dlZZs+ebey7fPmyODs7S3JycrHBPH78eLn33nulVq1aUqNGDQkNDZV58+YZA0tEpH79+kUev8KwKax9yZIlMnz4cPHz8xNN0yQtLc3Yt337dhERycjIkHr16kl4eLj8888/xvmPHDkiLi4uxb7KKBQbG1ukhpv35csvv5T77rtPnJ2dxc3NTbp06SJ79uwxmaPw933w4EHp1auX1KxZU3x8fErcZlRUlPj6+po8FiUJDw+XOnXqFPljdunSJdHr9fLkk08a2wofl5UrV4q/v7/897//NfYZDAbx9/eXMWPGSFRUVLUNda6p38EMBgO2bduGsLAw+Pv7m3WfwYMHY9SoUXjwwQexbt06TJw4EZs2bUJERAQyMzNNxqanp6NPnz7o27cv1q1bh27dumH06NFYunQpACAqKgopKSkAgCeeeAIpKSnG2+Y6efIkoqKi4OTkhAULFmDTpk1455134Orqin/++afE+x07dgwRERE4cuQIPvroI6xZswZNmzZFXFwcJk+eXGT866+/jlOnTmHevHmYO3cufv/9d/To0QMGg8GsOt3d3fHEE09gwYIFxrZPP/0UdnZ2eOqpp0rct+effx6rVq3CmjVrEB0djZdeegkTJ040jlm7di2CgoIQGhpqfPzWrl1rMs/o0aNx+vRpzJ49G+vXr0edOnWKbMvLywsrVqzA/v37MWrUKADA9evX8eSTTyIgIACzZ88ucd/Gjh2LGTNmAADefvttpKSkYObMmQCA5cuX47HHHoO7uzs+/fRTzJ8/H5cuXULHjh2xe/fuInNFR0cjODgYn332WanbDA8Px/nz59GnTx/s3LkTN27cKHFsQkICLly4gK+++sqkffny5cjJyUFCQkKR+9jZ2SEuLg5Lliwx/o43b96Ms2fPon///iVuq1qw9V8VKll6eroAkJiYGLPGp6WlCQB54YUXTNp/+OEHASCvv/66sS0yMlIAyA8//GAytmnTpvLQQw+ZtAGQIUOGmLSZe6T++eefCwD56aefSq0dtxypx8TEiE6nK/IKpVu3buLi4iKXL18Wkf8duT3yyCMm41atWiUAJCUlpdTtFta7f/9+41yHDx8WEZE2bdpIXFyciNx+CcVgMEheXp68+eab4unpaXKEWtJ9C7d3//33l9hXeKRe6N133xUAsnbtWomNjRVnZ2f55ZdfSt3Hm+f77LPPTGr28/OTZs2aGV+diYhcu3ZN6tSpIxEREca2wt/3uHHjbrstEZGcnBzp2bOn8ZWBvb29hIaGypgxY+TChQsmY69duyZubm7y6KOPmrSHhYWJv7+/SW0370fh+vmGDRtEROTJJ5+Ujh07iojwSJ3UsH37dgBAXFycSfu9996LJk2aYOvWrSbtPj4+uPfee03amjdvjlOnTlmtppYtW8LJyQkDBw7E4sWLcfz4cbPut23bNnTu3LnIK5S4uDhcv369yCuGRx991OR24dUSluxLZGQkGjZsiAULFuDQoUPYv38/4uPjS62xS5cu8PDwgL29PRwdHTFu3DhcvHgRFy5cMHu7vXr1MnvsyJEjERUVhaeffhqLFy/G9OnT0axZM7Pvf7Njx47h3Llz6NevH+zs/hcFbm5u6NWrF/bu3Yvr16+XqVadToe1a9fi6NGjmDp1KmJiYpCRkYFJkyahSZMmOHbsmMn2evfujY0bN+L//u//AACHDx/GwYMHERcXZ1LbzQIDA9GxY0csWLAAFy9exJdfflnq76u6YKjfwby8vODi4oITJ06YNf7ixYsAAF9f3yJ9fn5+xv5Cnp6eRcbpdLpSXypbqmHDhvj2229Rp04dDBkyBA0bNkTDhg3x4Ycflnq/ixcvlrgfhf03u3VfdDodAFi0L5qmoX///li6dClmz56NRo0aoUOHDsWO3bdvH7p27QoASE5Oxvfff4/9+/djzJgxFm+3uP0srca4uDjk5OTAx8cH/fr1M/u+t7rd86WgoACXLl0qc60A0KRJEwwdOhRLly7F6dOn8cEHH+DixYsYO3asybiEhATk5+fjk08+AQAsWLDA+PsoTUJCAtavX48PPvgAzs7OeOKJJyyqT0UM9TuYvb09OnfujIMHD+Ls2bO3HV8YbOfPny/Sd+7cOXh5eVmtNr1eDwDIzc01ab913R4AOnTogPXr1+PKlSvYu3cvwsPDMXToUKxYsaLE+T09PUvcDwBW3ZebxcXFITMzE7Nnzy41UFasWAFHR0ds2LABvXv3RkREBFq3bl2mbWqaZvbY8+fPY8iQIWjZsiUuXryIV199tUzbBG7/fLGzs0OtWrXKXOutNE3DsGHDULNmTRw+fNikLyIiAk2aNMHChQuRl5eHpUuXolOnTggMDCx1zujoaLi4uOCdd95BTEwMnJ2dy1yfKhjqd7jRo0dDRDBgwIBiTyzm5eVh/fr1AP590wUA44nOQvv370daWho6d+5stboK39jxyy+/mLQX1lIce3t7tG3b1njS7scffyxxbOfOnbFt2zZjiBdasmQJXFxcSn3DSnnUrVsXI0eORI8ePRAbG1viOE3T4ODgAHt7e2PbjRs3jEeaN7PWqx+DwYCnn34amqbh66+/RlJSEqZPn441a9aUab7GjRujbt26WL58OeSmb7XMzs7G6tWrER4eDhcXlzLNXdwfCuDfPxZXr141vuK6WXx8PI4ePYo33ngDGRkZZi2lODs7Y9y4cejRowcGDx5cplpV42DrAqh04eHhmDVrFl544QWEhYVh8ODBCAkJQV5eHlJTUzF37lzcc8896NGjBxo3boyBAwdi+vTpsLOzQ7du3XDy5EmMHTsW/v7+GDZsmNXqeuSRR1C7dm0kJCTgzTffhIODAxYtWoQzZ86YjJs9eza2bduGqKgoBAQEICcnx3iFSZcuXUqcPzExERs2bMADDzyAcePGoXbt2li2bBm++uorTJ48GR4eHlbbl1u98847tx0TFRWFDz74AM888wwGDhyIixcvYsqUKcZln5s1a9YMK1aswMqVK43vrizLOnhiYiJ27dqFzZs3w8fHByNGjMDOnTuRkJCA0NDQ2x7V3srOzg6TJ09Gnz590L17dzz//PPIzc3Fe++9h8uXL5v1OJRk4MCBuHz5Mnr16oV77rkH9vb2+PXXXzF16lTY2dkZr+C52bPPPovXX38d7733HmrWrIno6GiztjV8+HAMHz68zLUqx9Znask8P/30k8TGxkpAQIA4OTmJq6urhIaGyrhx40yuJii8Tr1Ro0bi6OgoXl5e0rdv3xKvU79VbGxskasGUMzVLyIi+/btk4iICHF1dZW6detKYmKizJs3z+Tql5SUFHn88celfv36otPpxNPTUyIjI2XdunVFtlHcdeo9evQQ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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: SVM\n",
      "Accuracy: 0.9667\n",
      "Precision: 0.9667\n",
      "Recall: 0.9667\n",
      "F1 Score: 0.9667\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.97      0.97      0.97        75\n",
      "         1.0       0.96      0.96      0.96        45\n",
      "\n",
      "    accuracy                           0.97       120\n",
      "   macro avg       0.96      0.96      0.96       120\n",
      "weighted avg       0.97      0.97      0.97       120\n",
      "\n",
      "\n",
      "\n",
      "Confusion Matrix:\n",
      "[[73  2]\n",
      " [ 2 43]]\n",
      "\n",
      "\n",
      "Best hyperparameters found by GridSearchCV:\n",
      "{'C': 0.1, 'gamma': 'scale', 'kernel': 'linear'}\n"
     ]
    }
   ],
   "source": [
    "# Support Vector Machine\n",
    "svm_classifier = SVC(random_state=42)\n",
    "\n",
    "# شبكة المعلمات (hyperparameters)\n",
    "param_grid = {\n",
    "    'C': [0.1, 1, 10],           # قوة التنظيم\n",
    "    'kernel': ['linear', 'rbf'], # نوع kernel\n",
    "    'gamma': ['scale', 'auto']   # معلمة gamma (لـ rbf)\n",
    "}\n",
    "\n",
    "grid_search = GridSearchCV(estimator=svm_classifier, param_grid=param_grid, cv=5, scoring='accuracy')\n",
    "\n",
    "# تدريب النموذج\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "# أفضل نموذج\n",
    "best_svm = grid_search.best_estimator_\n",
    "\n",
    "# التنبؤ\n",
    "y_pred = best_svm.predict(X_test)\n",
    "\n",
    "# التقييم\n",
    "evaluation_results = evaluate_model(\"SVM\", y_test, y_pred)\n",
    "\n",
    "# الطباعة النهائية\n",
    "for key, value in evaluation_results.items():\n",
    "    if key in ['Classification Report', 'Confusion Matrix']:\n",
    "        print(f\"\\n{key}:\\n{value}\\n\")\n",
    "    elif isinstance(value, float):  \n",
    "        print(f\"{key}: {value:.4f}\")\n",
    "    else:\n",
    "        print(f\"{key}: {value}\")\n",
    "\n",
    "print(\"\\nBest hyperparameters found by GridSearchCV:\")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "1ca2e4dd-8283-45be-ad2b-b01d024e33da",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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QURU6Rj1mMPGjRvv23/y5MlyqoSIiO5l1HDo1q0bNBoN7nfYQ6PRlGNFREQEGHm3kpubG9atW4f8/HyDfz/++KMxyyMiqrSMGg5BQUH3DYAHbVUQEVHZMOpupeHDhyMrq+gf9vD398euXbvKsSIiIgKMHA6tW7e+b7+NjQ1CQ0PLqRoiIipQoU9lJSIi42A4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESkYDkREpGA4EBGRguFAREQKhgMRESk0IiLGLoKMLzs7G7GxsRg1ahS0Wq2xy6EnGNe1xwPDgQAAmZmZsLOzw19//YWqVasauxx6gnFdezxwtxIRESkYDkREpGA4EBGRguFAAACtVouYmBgeIKQyx3Xt8cAD0kREpOCWAxERKRgORESkYDgQEZGC4UBERAqGQyUye/Zs1KxZE5aWlggKCsLevXvvO37Pnj0ICgqCpaUlfH19MWfOnHKqlB5X//vf/9ClSxe4u7tDo9EgISHhgffhelYxMRwqidWrV2PIkCEYPXo0UlJS0Lp1a4SFheHs2bMGx586dQqdOnVC69atkZKSgg8++ADvvPMO1q1bV86V0+MkKysLjRs3xhdffFGs8VzPKi6eylpJtGjRAk2bNkVcXJyurV69eujWrRtiY2OV8SNHjsTGjRuRmpqqa+vfvz9+/vlnJCUllUvN9HjTaDTYsGEDunXrVuQYrmcVF7ccKoF//vkHP/zwA9q3b6/X3r59exw4cMDgfZKSkpTxHTp0QHJyMnJycsqsVqpcuJ5VXAyHSuDatWvIy8uDi4uLXruLiwvS0tIM3ictLc3g+Nzc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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: KNeighborsClassifier\n",
      "Accuracy: 0.9417\n",
      "Precision: 0.9436\n",
      "Recall: 0.9417\n",
      "F1 Score: 0.9420\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.97      0.93      0.95        75\n",
      "         1.0       0.90      0.96      0.92        45\n",
      "\n",
      "    accuracy                           0.94       120\n",
      "   macro avg       0.93      0.94      0.94       120\n",
      "weighted avg       0.94      0.94      0.94       120\n",
      "\n",
      "\n",
      "\n",
      "Confusion Matrix:\n",
      "[[70  5]\n",
      " [ 2 43]]\n",
      "\n",
      "\n",
      "Best hyperparameters found by GridSearchCV:\n",
      "{'metric': 'manhattan', 'n_neighbors': 7, 'weights': 'uniform'}\n"
     ]
    }
   ],
   "source": [
    "#KNeighborsClassifier\n",
    "knn_classifier = KNeighborsClassifier()\n",
    "\n",
    "# شبكة المعلمات (hyperparameters)\n",
    "param_grid = {\n",
    "    'n_neighbors': [3, 5, 7, 9],         # عدد الجيران\n",
    "    'weights': ['uniform', 'distance'],  # طريقة وزن الجيران\n",
    "    'metric': ['euclidean', 'manhattan', 'minkowski'] # المسافة\n",
    "}\n",
    "\n",
    "grid_search = GridSearchCV(estimator=knn_classifier, param_grid=param_grid, cv=5, scoring='accuracy')\n",
    "\n",
    "# تدريب النموذج\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "# أفضل نموذج\n",
    "best_knn = grid_search.best_estimator_\n",
    "\n",
    "# التنبؤ\n",
    "y_pred = best_knn.predict(X_test)\n",
    "\n",
    "# التقييم\n",
    "evaluation_results = evaluate_model(\"KNeighborsClassifier\", y_test, y_pred)\n",
    "\n",
    "# الطباعة النهائية\n",
    "for key, value in evaluation_results.items():\n",
    "    if key in ['Classification Report', 'Confusion Matrix']:\n",
    "        print(f\"\\n{key}:\\n{value}\\n\")\n",
    "    elif isinstance(value, float):  \n",
    "        print(f\"{key}: {value:.4f}\")\n",
    "    else:\n",
    "        print(f\"{key}: {value}\")\n",
    "\n",
    "print(\"\\nBest hyperparameters found by GridSearchCV:\")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "30e43d17-2035-4a7a-9863-a79c0da8686b",
   "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: GaussianNB\n",
      "Accuracy: 0.9083\n",
      "Precision: 0.9167\n",
      "Recall: 0.9083\n",
      "F1 Score: 0.9094\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.97      0.88      0.92        75\n",
      "         1.0       0.83      0.96      0.89        45\n",
      "\n",
      "    accuracy                           0.91       120\n",
      "   macro avg       0.90      0.92      0.90       120\n",
      "weighted avg       0.92      0.91      0.91       120\n",
      "\n",
      "\n",
      "Best hyperparameters found by GridSearchCV:\n",
      "{'gnb__var_smoothing': 1e-08}\n"
     ]
    }
   ],
   "source": [
    "#GaussianNB\n",
    "\n",
    "pipeline = Pipeline([\n",
    "    ('scaler', StandardScaler()),\n",
    "    ('gnb', GaussianNB())\n",
    "])\n",
    "\n",
    "\n",
    "param_grid = {\n",
    "    'gnb__var_smoothing': [1e-09, 1e-08, 1e-07, 1e-06]\n",
    "}\n",
    "\n",
    "grid_search = GridSearchCV(estimator=pipeline, param_grid=param_grid, cv=5, scoring='accuracy')\n",
    "\n",
    "\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "\n",
    "best_gnb = grid_search.best_estimator_\n",
    "\n",
    "\n",
    "y_pred = best_gnb.predict(X_test)\n",
    "\n",
    "evaluation_results = evaluate_model('GaussianNB', y_test, y_pred)\n",
    "\n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(f\"\\n{key}:\\n{value}\")\n",
    "    elif key == 'Confusion Matrix':\n",
    "        continue  \n",
    "    elif isinstance(value, float):\n",
    "        print(f\"{key}: {value:.4f}\")\n",
    "    else:\n",
    "        print(f\"{key}: {value}\")\n",
    "\n",
    "# أفضل المعلمات\n",
    "print(\"\\nBest hyperparameters found by GridSearchCV:\")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "0a390c0e-2dbb-4dac-b0e2-0f81f2891e27",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- Feature Selection using SelectKBest (chi2) ---\n",
      "Features ranked by score:\n",
      "       Feature        Score\n",
      "8    Feature_8  2425.945316\n",
      "9    Feature_9  2356.038155\n",
      "10  Feature_10   356.045345\n",
      "3    Feature_3   228.131081\n",
      "14  Feature_14   181.300036\n",
      "13  Feature_13   124.632183\n",
      "0    Feature_0   110.018377\n",
      "4    Feature_4   101.546551\n",
      "1    Feature_1    81.285087\n",
      "16  Feature_16    77.739511\n",
      "15  Feature_15    52.335214\n",
      "19  Feature_19    43.385135\n",
      "20  Feature_20    40.976432\n",
      "21  Feature_21    30.755031\n",
      "11  Feature_11    28.701899\n",
      "6    Feature_6     9.521372\n",
      "17  Feature_17     5.702301\n",
      "12  Feature_12     4.091405\n",
      "5    Feature_5     1.901435\n",
      "7    Feature_7     1.551842\n",
      "18  Feature_18     0.898176\n",
      "2    Feature_2     0.005494\n",
      "\n",
      "Top 10 features selected by SelectKBest: ['Feature_8', 'Feature_9', 'Feature_10', 'Feature_3', 'Feature_14', 'Feature_13', 'Feature_0', 'Feature_4', 'Feature_1', 'Feature_16']\n"
     ]
    }
   ],
   "source": [
    "# chi2 \n",
    "if isinstance(X, np.ndarray):\n",
    "    X_df = pd.DataFrame(X, columns=[f'Feature_{i}' for i in range(X.shape[1])])\n",
    "else:\n",
    "    X_df = X.copy()\n",
    "\n",
    "\n",
    "print(\"\\n--- Feature Selection using SelectKBest (chi2) ---\")\n",
    "\n",
    "X_non_negative = X_df.abs()\n",
    "\n",
    "kbest_selector = SelectKBest(score_func=chi2, k='all')\n",
    "kbest_selector.fit(X_non_negative, y)\n",
    "\n",
    "feature_scores = pd.DataFrame({\n",
    "    'Feature': X_df.columns,\n",
    "    'Score': kbest_selector.scores_\n",
    "}).sort_values(by='Score', ascending=False)\n",
    "\n",
    "print(\"Features ranked by score:\")\n",
    "print(feature_scores)\n",
    "\n",
    "top_k = 10\n",
    "selected_features_kbest = feature_scores['Feature'].head(top_k).tolist()\n",
    "print(f\"\\nTop {top_k} features selected by SelectKBest: {selected_features_kbest}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "aa773960-a01a-4c7c-9d5e-70e5102a1d69",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- Feature Selection using RFE (LogisticRegression) ---\n",
      "\n",
      "Top 10 features selected by RFE: ['Feature_3', 'Feature_4', 'Feature_6', 'Feature_7', 'Feature_10', 'Feature_12', 'Feature_13', 'Feature_16', 'Feature_19', 'Feature_20']\n"
     ]
    }
   ],
   "source": [
    "#RFE ----------------------------\n",
    "print(\"\\n--- Feature Selection using RFE (LogisticRegression) ---\")\n",
    "model = LogisticRegression(max_iter=1000, solver='lbfgs')\n",
    "rfe_selector = RFE(model, n_features_to_select=top_k)\n",
    "rfe_selector.fit(X_df, y)\n",
    "\n",
    "selected_features_rfe = X_df.columns[rfe_selector.support_].tolist()\n",
    "print(f\"\\nTop {top_k} features selected by RFE: {selected_features_rfe}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "374fefca-0198-4edb-90bd-219ea63dbe29",
   "metadata": {},
   "outputs": [],
   "source": [
    "if isinstance(X, np.ndarray):\n",
    "    X_df = pd.DataFrame(X, columns=[f'Feature_{i}' for i in range(X.shape[1])])\n",
    "else:\n",
    "    X_df = X.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "522c304d-02b6-45ab-a047-558057f6abc8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== Models on features from RFE ===\n",
      "\n",
      "\n",
      "LogisticRegression Results:\n",
      "Accuracy: 0.95\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.98      0.94      0.96        52\n",
      "         1.0       0.90      0.96      0.93        28\n",
      "\n",
      "    accuracy                           0.95        80\n",
      "   macro avg       0.94      0.95      0.95        80\n",
      "weighted avg       0.95      0.95      0.95        80\n",
      "\n",
      "==================================================\n",
      "\n",
      "DecisionTreeClassifier Results:\n",
      "Accuracy: 0.9375\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.98      0.92      0.95        52\n",
      "         1.0       0.87      0.96      0.92        28\n",
      "\n",
      "    accuracy                           0.94        80\n",
      "   macro avg       0.93      0.94      0.93        80\n",
      "weighted avg       0.94      0.94      0.94        80\n",
      "\n",
      "==================================================\n",
      "\n",
      "RandomForestClassifier Results:\n",
      "Accuracy: 0.9625\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.98      0.96      0.97        52\n",
      "         1.0       0.93      0.96      0.95        28\n",
      "\n",
      "    accuracy                           0.96        80\n",
      "   macro avg       0.96      0.96      0.96        80\n",
      "weighted avg       0.96      0.96      0.96        80\n",
      "\n",
      "==================================================\n",
      "\n",
      "SVC Results:\n",
      "Accuracy: 0.9375\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "         0.0       1.00      0.90      0.95        52\n",
      "         1.0       0.85      1.00      0.92        28\n",
      "\n",
      "    accuracy                           0.94        80\n",
      "   macro avg       0.92      0.95      0.93        80\n",
      "weighted avg       0.95      0.94      0.94        80\n",
      "\n",
      "==================================================\n",
      "\n",
      "KNeighborsClassifier Results:\n",
      "Accuracy: 0.9375\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.98      0.92      0.95        52\n",
      "         1.0       0.87      0.96      0.92        28\n",
      "\n",
      "    accuracy                           0.94        80\n",
      "   macro avg       0.93      0.94      0.93        80\n",
      "weighted avg       0.94      0.94      0.94        80\n",
      "\n",
      "==================================================\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# ---- Models ----\n",
    "models = {\n",
    "    'LogisticRegression': LogisticRegression(max_iter=1000, solver='lbfgs', random_state=42),\n",
    "    'DecisionTreeClassifier': DecisionTreeClassifier(random_state=42),\n",
    "    'RandomForestClassifier': RandomForestClassifier(random_state=42),\n",
    "    'SVC': SVC(probability=True, random_state=42),\n",
    "    'KNeighborsClassifier': KNeighborsClassifier()\n",
    "}\n",
    "\n",
    "# ---- Evaluation Function ----\n",
    "def evaluate_model(name, y_true, y_pred):\n",
    "    return {\n",
    "        'Accuracy': accuracy_score(y_true, y_pred),\n",
    "        'Classification Report': classification_report(y_true, y_pred)\n",
    "    }\n",
    "\n",
    "\n",
    "\n",
    "# ---- Evaluate on RFE ----\n",
    "print(\"\\n=== Models on features from RFE ===\\n\")\n",
    "for name, model in models.items():\n",
    "    model.fit(X_train_rfe, y_train_rfe)\n",
    "    y_pred_rfe = model.predict(X_test_rfe)\n",
    "    results = evaluate_model(name, y_test_rfe, y_pred_rfe)\n",
    "    \n",
    "    print(f\"\\n{name} Results:\")\n",
    "    print(\"Accuracy:\", results['Accuracy'])\n",
    "    print(\"Classification Report:\\n\", results['Classification Report'])\n",
    "    print(\"=\"*50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dbb3c917-3745-409d-99b5-71262d7ed2ef",
   "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.13.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
