{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "85536a33",
   "metadata": {},
   "outputs": [],
   "source": [
    "#import pandas library\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3f1287e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Load the uploaded file \n",
    "df = pd.read_csv('diabetes.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "dbe99527",
   "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": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "333211c0",
   "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": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "07f634ff",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      " #   Column                    Non-Null Count  Dtype  \n",
      "---  ------                    --------------  -----  \n",
      " 0   Pregnancies               768 non-null    int64  \n",
      " 1   Glucose                   768 non-null    int64  \n",
      " 2   BloodPressure             768 non-null    int64  \n",
      " 3   SkinThickness             768 non-null    int64  \n",
      " 4   Insulin                   768 non-null    int64  \n",
      " 5   BMI                       768 non-null    float64\n",
      " 6   DiabetesPedigreeFunction  768 non-null    float64\n",
      " 7   Age                       768 non-null    int64  \n",
      " 8   Outcome                   768 non-null    int64  \n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e7606a45",
   "metadata": {},
   "outputs": [],
   "source": [
    "#import numpy library to process the missing value\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9f1d5a83",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Define columns that has zero value \n",
    "cols_with_missing = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "1344472b",
   "metadata": {},
   "outputs": [],
   "source": [
    "#replace z value with null value \n",
    "df[cols_with_missing] = df[cols_with_missing].replace(0,np.nan)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "c4f5da91",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      " #   Column                    Non-Null Count  Dtype  \n",
      "---  ------                    --------------  -----  \n",
      " 0   Pregnancies               768 non-null    int64  \n",
      " 1   Glucose                   763 non-null    float64\n",
      " 2   BloodPressure             733 non-null    float64\n",
      " 3   SkinThickness             541 non-null    float64\n",
      " 4   Insulin                   394 non-null    float64\n",
      " 5   BMI                       757 non-null    float64\n",
      " 6   DiabetesPedigreeFunction  768 non-null    float64\n",
      " 7   Age                       768 non-null    int64  \n",
      " 8   Outcome                   768 non-null    int64  \n",
      "dtypes: float64(6), int64(3)\n",
      "memory usage: 54.1 KB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(None,\n",
       "    Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       " 0            6    148.0           72.0           35.0      NaN  33.6   \n",
       " 1            1     85.0           66.0           29.0      NaN  26.6   \n",
       " 2            8    183.0           64.0            NaN      NaN  23.3   \n",
       " 3            1     89.0           66.0           23.0     94.0  28.1   \n",
       " 4            0    137.0           40.0           35.0    168.0  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": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.info() ,df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "f464ecf6",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_filled = df.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "45526f6d",
   "metadata": {},
   "outputs": [],
   "source": [
    "#replace nullvalue with median value \n",
    "for col in cols_with_missing:\n",
    "    median = df_filled[col].median()\n",
    "    df_filled[col] = df_filled[col].fillna(median)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "6eef7b67",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      " #   Column                    Non-Null Count  Dtype  \n",
      "---  ------                    --------------  -----  \n",
      " 0   Pregnancies               768 non-null    int64  \n",
      " 1   Glucose                   768 non-null    float64\n",
      " 2   BloodPressure             768 non-null    float64\n",
      " 3   SkinThickness             768 non-null    float64\n",
      " 4   Insulin                   768 non-null    float64\n",
      " 5   BMI                       768 non-null    float64\n",
      " 6   DiabetesPedigreeFunction  768 non-null    float64\n",
      " 7   Age                       768 non-null    int64  \n",
      " 8   Outcome                   768 non-null    int64  \n",
      "dtypes: float64(6), int64(3)\n",
      "memory usage: 54.1 KB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(None,\n",
       "    Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       " 0            6    148.0           72.0           35.0    125.0  33.6   \n",
       " 1            1     85.0           66.0           29.0    125.0  26.6   \n",
       " 2            8    183.0           64.0           29.0    125.0  23.3   \n",
       " 3            1     89.0           66.0           23.0     94.0  28.1   \n",
       " 4            0    137.0           40.0           35.0    168.0  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": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_filled.info(),df_filled.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "9a49aff2",
   "metadata": {},
   "outputs": [],
   "source": [
    "missing_after = df_filled.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "58ecf666",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "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\n"
     ]
    }
   ],
   "source": [
    "#print the missing data after replace null to median value \n",
    "print(missing_after)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "24eceeaa",
   "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.0</td>\n",
       "      <td>72.0</td>\n",
       "      <td>35.0</td>\n",
       "      <td>125.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.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>125.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.0</td>\n",
       "      <td>64.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>125.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.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>94.0</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.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>35.0</td>\n",
       "      <td>168.0</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.0           72.0           35.0    125.0  33.6   \n",
       "1            1     85.0           66.0           29.0    125.0  26.6   \n",
       "2            8    183.0           64.0           29.0    125.0  23.3   \n",
       "3            1     89.0           66.0           23.0     94.0  28.1   \n",
       "4            0    137.0           40.0           35.0    168.0  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": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_filled.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "1527109d",
   "metadata": {},
   "outputs": [],
   "source": [
    "#use train test spliti from sklearn library (i imported one functons from sklearn library ,it' will be more speed )\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "c0b54849",
   "metadata": {},
   "outputs": [],
   "source": [
    "#we dromed outcome col because it will contain our result \n",
    "X = df_filled.drop('Outcome',axis=1)\n",
    "#create variable name y that will be contain the prediction\n",
    "y = df_filled['Outcome']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "5bea39e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "#sepirate the data betwen training 80% and testing 20%\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "45d423e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "#to select model , it's  import the libraries\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "a3d88df2",
   "metadata": {},
   "outputs": [],
   "source": [
    "#define the value that we need to tested \n",
    "param_grid = {\n",
    "    'C': [0.01, 0.1, 1, 10, 100],\n",
    "    'solver': ['liblinear', 'lbfgs'],\n",
    "    'max_iter': [500, 1000, 2000, 5000]  # زدنا التكرارات أكثر\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "56f13ee7",
   "metadata": {},
   "outputs": [],
   "source": [
    "#create the model \n",
    "log_reg = LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "0922a93d",
   "metadata": {},
   "outputs": [],
   "source": [
    "#prepare grid search\n",
    "grid_search = GridSearchCV(\n",
    "estimator=log_reg,\n",
    "    param_grid=param_grid,\n",
    "    cv=5,\n",
    "    scoring='accuracy',\n",
    "    n_jobs=1\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "b8eafe12",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=LogisticRegression(), n_jobs=1,\n",
       "             param_grid={'C': [0.01, 0.1, 1, 10, 100],\n",
       "                         'max_iter': [500, 1000, 2000, 5000],\n",
       "                         'solver': ['liblinear', 'lbfgs']},\n",
       "             scoring='accuracy')"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#train the model\n",
    "grid_search.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "171fbb9e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best of params wht grid search found\n",
      "{'C': 1, 'max_iter': 500, 'solver': 'lbfgs'}\n"
     ]
    }
   ],
   "source": [
    "print('best of params wht grid search found')\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "c8151fb2",
   "metadata": {},
   "outputs": [],
   "source": [
    "#predict training data \n",
    "y_pred = grid_search.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "ab0f5e2d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "تقرير التصنيف Classification Report:\n",
      "\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.75      0.81      0.78       100\n",
      "           1       0.59      0.50      0.54        54\n",
      "\n",
      "    accuracy                           0.70       154\n",
      "   macro avg       0.67      0.66      0.66       154\n",
      "weighted avg       0.69      0.70      0.70       154\n",
      "\n",
      "مصفوفة الالتباس Confusion Matrix:\n",
      "\n",
      "[[81 19]\n",
      " [27 27]]\n",
      "الدقة (Accuracy): 0.7012987012987013\n"
     ]
    }
   ],
   "source": [
    "print(\"\\nتقرير التصنيف Classification Report:\\n\")\n",
    "print(classification_report(y_test, y_pred))\n",
    "\n",
    "print(\"مصفوفة الالتباس Confusion Matrix:\\n\")\n",
    "print(confusion_matrix(y_test, y_pred))\n",
    "\n",
    "print(\"الدقة (Accuracy):\", accuracy_score(y_test, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "57ff2563",
   "metadata": {},
   "outputs": [],
   "source": [
    "#import libraries\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.metrics import classification_report,confusion_matrix,accuracy_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "92812b2b",
   "metadata": {},
   "outputs": [],
   "source": [
    "#prepare param_grade for each model (Random Forest)\n",
    "param_grid_rf = {\n",
    "    'n_estimators': [50, 100, 200],          \n",
    "    'max_depth': [None, 10, 20, 30],         \n",
    "    'min_samples_split': [2, 5, 10]          \n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "122416f1",
   "metadata": {},
   "outputs": [],
   "source": [
    "#SVM\n",
    "param_grid_svm = {\n",
    "    'C': [0.1, 1, 10],\n",
    "    'kernel': ['linear', 'rbf'],              \n",
    "    'gamma': ['scale', 'auto']             \n",
    "}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "41bc2fa0",
   "metadata": {},
   "outputs": [],
   "source": [
    "#prepare grid search for each model\n",
    "rf_model = RandomForestClassifier(random_state=42)\n",
    "\n",
    "grid_search_rf = GridSearchCV(\n",
    "    estimator=rf_model,\n",
    "    param_grid=param_grid_rf,\n",
    "    cv=5,\n",
    "    scoring='accuracy',\n",
    "    n_jobs=-1\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "850fd3f4",
   "metadata": {},
   "outputs": [],
   "source": [
    "#SVM Grid Search\n",
    "svm_model = SVC()\n",
    "\n",
    "grid_search_svm = GridSearchCV(\n",
    "    estimator=svm_model,\n",
    "    param_grid=param_grid_svm,\n",
    "    cv=5,\n",
    "    scoring='accuracy',\n",
    "    n_jobs=-1\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "7c9f7692",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=SVC(), n_jobs=-1,\n",
       "             param_grid={'C': [0.1, 1, 10], 'gamma': ['scale', 'auto'],\n",
       "                         'kernel': ['linear', 'rbf']},\n",
       "             scoring='accuracy')"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#train the  model \n",
    "grid_search_rf.fit(X_train, y_train)\n",
    "grid_search_svm.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "ddbe0303",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "🔵 Random Forest Best Params: {'max_depth': None, 'min_samples_split': 2, 'n_estimators': 100}\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.80      0.88      0.84       100\n",
      "           1       0.73      0.59      0.65        54\n",
      "\n",
      "    accuracy                           0.78       154\n",
      "   macro avg       0.76      0.74      0.75       154\n",
      "weighted avg       0.77      0.78      0.77       154\n",
      "\n",
      "Confusion Matrix:\n",
      " [[88 12]\n",
      " [22 32]]\n",
      "Accuracy: 0.7792207792207793\n",
      "\n",
      "==================================================\n",
      "\n",
      "🟠 SVM Best Params: {'C': 10, 'gamma': 'scale', 'kernel': 'rbf'}\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.75      0.88      0.81       100\n",
      "           1       0.68      0.46      0.55        54\n",
      "\n",
      "    accuracy                           0.73       154\n",
      "   macro avg       0.71      0.67      0.68       154\n",
      "weighted avg       0.73      0.73      0.72       154\n",
      "\n",
      "Confusion Matrix:\n",
      " [[88 12]\n",
      " [29 25]]\n",
      "Accuracy: 0.7337662337662337\n"
     ]
    }
   ],
   "source": [
    "#evaluate the mode\n",
    "print(\"🔵 Random Forest Best Params:\", grid_search_rf.best_params_)\n",
    "y_pred_rf = grid_search_rf.predict(X_test)\n",
    "print(classification_report(y_test, y_pred_rf))\n",
    "print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_pred_rf))\n",
    "print(\"Accuracy:\", accuracy_score(y_test, y_pred_rf))\n",
    "\n",
    "print(\"\\n\" + \"=\"*50 + \"\\n\")\n",
    "\n",
    "# SVM\n",
    "print(\"🟠 SVM Best Params:\", grid_search_svm.best_params_)\n",
    "y_pred_svm = grid_search_svm.predict(X_test)\n",
    "print(classification_report(y_test, y_pred_svm))\n",
    "print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_pred_svm))\n",
    "print(\"Accuracy:\", accuracy_score(y_test, y_pred_svm))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "987e9657",
   "metadata": {},
   "outputs": [],
   "source": [
    "#4(Use two feature selection methods to identify the most important features from the datasets- first one)\n",
    "from sklearn.feature_selection import SelectKBest, chi2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "aaf6c5b3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SelectKBest(k=5, score_func=<function chi2 at 0x00000191E22D3160>)"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#selected best of 5 featurs\n",
    "selector = SelectKBest(score_func=chi2, k=5)\n",
    "selector.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "4638a9ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "🔵 Top Features selected by SelectKBest (chi2):\n",
      "Index(['Glucose', 'SkinThickness', 'Insulin', 'BMI', 'Age'], dtype='object')\n"
     ]
    }
   ],
   "source": [
    "#apply the selected features\n",
    "selected_features_kbest = X_train.columns[selector.get_support()]\n",
    "print(\"🔵 Top Features selected by SelectKBest (chi2):\")\n",
    "print(selected_features_kbest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "65fba73e",
   "metadata": {},
   "outputs": [],
   "source": [
    "#seconde one \n",
    "#to evaluate the inportant model use Random forest\n",
    "rf = RandomForestClassifier(random_state=42)\n",
    "rf.fit(X_train, y_train)\n",
    "importances = rf.feature_importances_\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "378b9013",
   "metadata": {},
   "outputs": [],
   "source": [
    "#arrange the important featurs\n",
    "feature_importances_rf = pd.Series(importances, index=X_train.columns)\n",
    "feature_importances_rf = feature_importances_rf.sort_values(ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "e3bf94d2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "🟠 Top Features selected by Random Forest Importance:\n",
      "Glucose                     0.274086\n",
      "BMI                         0.161903\n",
      "DiabetesPedigreeFunction    0.125020\n",
      "Age                         0.112985\n",
      "Insulin                     0.091224\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "print(\"\\n🟠 Top Features selected by Random Forest Importance:\")\n",
    "print(feature_importances_rf.head(5))  # نعرض أهم 5 خصائص"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "05c34911",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsMAAAHFCAYAAAAXPfTCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABezElEQVR4nO3deVwV1f8/8Ndlu5ddQTaVRUTABdwQNVPcEFxSM3dTyN00clcqE9QSF9LUXD6mYGruZqaIC4pp4pqoKSIuBCVquYArgpzfH/6Yb5d7QTDogvN6Ph7zqDtzZuY9h0FeHM6dqxBCCBARERERyZCergsgIiIiItIVhmEiIiIiki2GYSIiIiKSLYZhIiIiIpIthmEiIiIiki2GYSIiIiKSLYZhIiIiIpIthmEiIiIiki2GYSIiIiKSLYZhIio2hUJRrCU+Pr7Ma/nuu+/Qt29feHh4QE9PDy4uLoW2ffToEcaOHYuqVatCpVKhQYMG2LhxY7HOExYWBoVCgb///ruUKv/vLV26FNHR0f/JuY4dO4awsDA8ePCgWO3z+1fbsmTJknJRY3k1ePBgBAYGSq9TU1PV+k9PTw+VK1dGu3btsG/fPp3VGR8f/5/9u1Bchd1zVapU0XVpWsXExCAsLExjfU5ODmrWrImFCxf+5zW9SQx0XQARVRwJCQlqr2fOnIlDhw7h4MGDauvr1KlT5rWsXbsWt27dgq+vL/Ly8pCTk1No2x49euDUqVOIiIiAu7s7vv/+e/Tr1w95eXno379/mdeqa0uXLkWVKlUQHBxc5uc6duwYwsPDERwcjEqVKhV7v9jYWFhaWqqtq1GjRilX99Lr1lienD17FmvWrMGJEyc0tn300Ufo378/Xrx4gcuXLyM8PBydOnXCwYMH0apVKx1UWz717NkTEyZMUFtnaGioo2qKFhMTg2+++UYjEBsaGuLzzz/HuHHjMHDgQFhbW+umwAqOYZiIiq1Zs2Zqr21sbKCnp6ex/r+wd+9e6Om9/ONWly5d8Ntvv2ltFxMTg/3790sBGADatGmD33//HZMmTUKfPn2gr6//n9X9X3ry5AlMTEx0XUaxNG7cuNyOyhXX06dPoVKpoFAoyvxcERER8PX1hY+Pj8Y2Jycn6XuyRYsWqFWrFvz8/LBq1SqG4X+ws7Mrk3+7Xrx4gdzcXCiVylI/tjb9+vXD+PHjsWLFCnzyySf/yTnfNJwmQUSl6t69e/jwww9RrVo1GBkZwdXVFZ9++imys7PV2ikUCowZMwYrVqyAu7s7lEol6tSpU+zpC/lB+FV++OEHmJmZoVevXmrrP/jgA9y8eVPryNqrtG7dGvXq1UNCQgLeeustGBsbw8XFBVFRUQCA3bt3o1GjRjAxMYGXlxdiY2PV9s+fGnD27Fn06NEDFhYWsLS0xPvvv4+//vpLrW1eXh7mzp0LT09PKJVK2NraYtCgQfjjjz+01vTzzz/jrbfegomJCQYPHgwXFxdcvHgRhw8flv4UnD+l5NmzZ5gwYQIaNGgAS0tLWFlZoXnz5vjxxx81rjn/67V27VrUrl0bJiYmqF+/Pnbt2qV2XZMmTQLwclS3tKbNCCGwdOlSNGjQAMbGxqhcuTJ69uyJ69evq7Xbv38/unXrhurVq0OlUsHNzQ0jRoxQm+LyqhoVCoXWP0e7uLiojaxHR0dDoVBg3759GDx4MGxsbGBiYiLd55s2bULz5s1hamoKMzMzBAQE4OzZs2rHvH79Ovr27YuqVatCqVTCzs4O7dq1Q2JiYpH9cfv2bfzwww8YOHBgsfovPzDfvn1bbf0333yDVq1awdbWFqampvDy8sLcuXM1/sqSf2+dOnUKLVu2hImJCVxdXREREYG8vDy1tpcvX0ZgYCBMTExQpUoVjBw5Eg8fPtRa1+rVq1G/fn2oVCpYWVnh3XffRVJSklqb4OBgmJmZ4fLlywgICICpqSkcHBwQEREBADh+/DjefvttmJqawt3dHWvWrClWnxRHWloa3n//fdja2kKpVKJ27dqIjIxUu+b8qSlz587FrFmzUKNGDSiVShw6dAgAcPr0aXTt2hVWVlZQqVRo2LAhNm/erHaeJ0+eYOLEiahRo4bUFz4+PtiwYYPUB9988w0A9ekdqampAAAjIyP06dMH//vf/yCEKLXrlxVBRPSagoKChKmpqfT66dOnwtvbW5iamor58+eLffv2iWnTpgkDAwPRqVMntX0BCEdHR1GnTh2xYcMGsXPnThEYGCgAiC1btpSojs6dOwtnZ2et25o1ayaaNGmisf63334TAMSKFSuKPPb06dMFAPHXX39J6/z8/IS1tbXw8PAQq1atEnv37hVdunQRAER4eLjw8vISGzZsEDExMaJZs2ZCqVSKP//8U+OYzs7OYtKkSWLv3r3iq6++EqampqJhw4bi+fPnUtvhw4cLAGLMmDEiNjZWLF++XNjY2AhHR0eNmqysrISjo6NYvHixOHTokDh8+LD49ddfhaurq2jYsKFISEgQCQkJ4tdffxVCCPHgwQMRHBws1q5dKw4ePChiY2PFxIkThZ6enlizZo1aPwAQLi4uwtfXV2zevFnExMSI1q1bCwMDA3Ht2jUhhBDp6enio48+EgDE9u3bpfNlZma+sn9v3bolcnJypCU3N1dqM2zYMGFoaCgmTJggYmNjxffffy88PT2FnZ2duHXrltRu2bJlYvbs2WLnzp3i8OHDYs2aNaJ+/frCw8ND6tNX1QhATJ8+XaNOZ2dnERQUJL2OiooSAES1atXE8OHDxZ49e8TWrVtFbm6u+OKLL4RCoRCDBw8Wu3btEtu3bxfNmzcXpqam4uLFi9IxPDw8hJubm1i7dq04fPiw2LZtm5gwYYI4dOhQof0lhBDfffedACAuXbqktv7GjRsCgJg3b57a+vx7/aOPPlJbP27cOLFs2TIRGxsrDh48KBYsWCCqVKkiPvjgA7V2+fd7rVq1xPLly8X+/fvFhx9+KACo3Se3bt0Stra2olq1aiIqKkrExMSIAQMGCCcnJwFA7bq+/PJLAUD069dP7N69W3z33XfC1dVVWFpaiitXrkjtgoKChJGRkahdu7b4+uuvxf79+8UHH3wgAIjQ0FDh7u6u8T14+vTpIvtPiJdf5w8//FDtnsvJyRF5eXlCCCHu3LkjqlWrJmxsbMTy5ctFbGysGDNmjAAgRo0apdHn1apVE23atBFbt24V+/btEzdu3BAHDx4URkZGomXLlmLTpk0iNjZWBAcHCwAiKipKOsaIESOEiYmJ+Oqrr8ShQ4fErl27REREhFi8eLEQQoirV6+Knj17CgDS/ZqQkCCePXsmHWPTpk0CgDh//vwrr500MQwT0WsrGIaXL18uAIjNmzertZszZ44AIPbt2yetAyCMjY3Vwkxubq7w9PQUbm5uJaqjqDBcq1YtERAQoLH+5s2bAoD48ssvizx2YWG44A/du3fvCn19fWFsbKwWfBMTEwUAsWjRIo1jjhs3Tu1c69evFwDEunXrhBBCJCUlST+0/+nEiRMCgPjkk080aoqLi9O4hrp16wo/P78ir1OIl/2fk5MjhgwZIho2bKi2DYCws7MTWVlZ0rpbt24JPT09MXv2bGndvHnzBABx48aNV55PiP/ri4JLtWrVhBBCJCQkCAAiMjJSbb/09HRhbGwsJk+erPW4eXl5IicnR/z+++8CgPjxxx+LVWNJw/CgQYPU2qWlpQkDAwON4Pnw4UNhb28vevfuLYQQ4u+//xYAxMKFCwvtm8KMGjVKGBsbS8EtX34wmzNnjsjJyRHPnj0TiYmJonnz5sLBwaHIr8mLFy9ETk6O+O6774S+vr64d++etC3/3jpx4oTaPnXq1FH73poyZYpQKBQiMTFRrZ2/v79aGL5//74wNjbW+AU5LS1NKJVK0b9/f2ldUFCQACC2bdsmrcvJyRE2NjYCgPSLnRD/9z04fvz4Qq8zn7Z7DoBYuXKlEEKIqVOnar3mUaNGCYVCIZKTk4UQ/9fnNWvWVPslVgghPD09RcOGDUVOTo7a+i5duggHBwfx4sULIYQQ9erVE927dy+y3tGjR4uixi9TUlIEALFs2bJXXjtp4jQJIio1Bw8ehKmpKXr27Km2Pv/Py3FxcWrr27VrBzs7O+m1vr4++vTpg6tXr2pMA/g3iprD+brzOx0cHNC4cWPptZWVFWxtbdGgQQNUrVpVWl+7dm0AwO+//65xjAEDBqi97t27NwwMDKQ/seb/t+Ab33x9fVG7dm2N/qxcuTLatm1bouvYsmULWrRoATMzMxgYGMDQ0BCrVq3S+HM18HKutbm5ufTazs4Otra2Wq+tpA4cOIBTp05JS0xMDABg165dUCgUeP/995Gbmyst9vb2qF+/vtoUjDt37mDkyJFwdHSUrsXZ2RkAtF5PaXjvvffUXu/duxe5ubkYNGiQWr0qlQp+fn5SvVZWVqhZsybmzZuHr776CmfPntWYclCYmzdvwsbGptB7d8qUKTA0NJSenPLbb7/hp59+0njiytmzZ9G1a1dYW1tDX18fhoaGGDRoEF68eIErV66otbW3t4evr6/aOm9vb7Wv/aFDh1C3bl3Ur19frV3BN6kmJCTg6dOnGve1o6Mj2rZtq3FfKxQKdOrUSXptYGAANzc3ODg4oGHDhtL6/O/B4t6PvXv3VrvnTp06he7duwN4+W9ZnTp1NK45ODgYQgiNNw137dpV7c13V69exeXLl6Xv8X/eC506dUJGRgaSk5MBvPx+3rNnD6ZOnYr4+Hg8ffq0WPX/k62tLQDgzz//LPG+xDfQEVEpunv3Luzt7TV+SNva2sLAwAB3795VW29vb69xjPx1d+/eRfXq1f91TdbW1hrnBV7ObQZe/gB9Hdr2MzIy0lhvZGQE4OX83IIKXr+BgYFavfn/dXBw0Ni3atWqGj/0tbUryvbt29G7d2/06tULkyZNgr29PQwMDLBs2TKsXr1ao722d6orlcrX+uFdUP369bW+ge727dsQQqj90vRPrq6uAF7Ore7QoQNu3ryJadOmwcvLC6ampsjLy0OzZs1KpUZtCvZ5/rzcJk2aaG2fP9ddoVAgLi4OM2bMwNy5czFhwgRYWVlhwIAB+OKLL9R+6Sgo/416hfn444/x/vvvIzs7G8ePH8dnn32Gbt264dy5c9LXMC0tDS1btoSHhwe+/vpruLi4QKVS4eTJkxg9erRGfxXna3/37l2tTwApeJ+/6r7ev3+/2joTExON69X2vZa/Xtv3mjY2NjZa34CYX6O2xzXm/6Jb8N+Uwu6DiRMnYuLEiVrPkT+XfdGiRahevTo2bdqEOXPmQKVSISAgAPPmzUOtWrWKdS35/VNW9/mbjmGYiEqNtbU1Tpw4ASGEWiC+c+cOcnNzNcLOrVu3NI6Rv660HhHk5eWFDRs2IDc3FwYG//dP3oULFwAA9erVK5XzvI5bt26hWrVq0uvc3FzcvXtXuvb8/2ZkZGj8YnDz5k2N/izpKPe6detQo0YNbNq0SW3fgm921KUqVapAoVDgyJEjWt+dn7/ut99+w7lz5xAdHY2goCBp+9WrV0t0PqVSqfX6tf1CBWj2ef7XZOvWrdKodGGcnZ2xatUqAMCVK1ewefNmhIWF4fnz51i+fHmh+1WpUgW//vprodurV68uhbwWLVrA3t4e77//PqZPny49u3nHjh14/Pgxtm/frlbnq968VxRra+siv6f/2Q54eV8XpO2+1gVra+tC6wPwyu+9/O2hoaHo0aOH1nN4eHgAAExNTREeHo7w8HDcvn1bGiV+5513cPny5WLVm//LfXnou4qI0ySIqNS0a9cOjx49wo4dO9TWf/fdd9L2f4qLi1N7h/uLFy+wadMm1KxZs1RGhQHg3XffxaNHj7Bt2za19WvWrEHVqlXRtGnTUjnP61i/fr3a682bNyM3NxetW7cGAGnKw7p169TanTp1CklJSRr9WZjCRm8VCgWMjIzUfpDfunVL69Mkiis/nJbWCFWXLl0ghMCff/4JHx8fjcXLywvA/4WRgoF5xYoVJarRxcUF58+fV1t38OBBPHr0qFj1BgQEwMDAANeuXdNab2Ejke7u7vjss8/g5eVVZNAFAE9PT9y9exeZmZnFqmnAgAFo3bo1Vq5cKf01QVt/CSGwcuXKYh1TmzZt2uDixYs4d+6c2vrvv/9e7XXz5s1hbGyscV//8ccfOHjwYLHv67LUrl07XLp0SeNr8d1330GhUKBNmzZF7u/h4YFatWrh3Llzhd4H2kb/7ezsEBwcjH79+iE5ORlPnjwB8Orvq/wnq/wXz3h/E3FkmIhKzaBBg/DNN98gKCgIqamp8PLywtGjR/Hll1+iU6dOaN++vVr7KlWqoG3btpg2bRpMTU2xdOlSXL58uViPV7t06RIuXboE4GWAe/LkCbZu3Qrg5Q+E/B8KHTt2hL+/P0aNGoWsrCy4ublhw4YNiI2Nxbp163T6jOHt27fDwMAA/v7+uHjxIqZNm4b69eujd+/eAF7+QB0+fDgWL14MPT09dOzYEampqZg2bRocHR0xbty4Yp3Hy8sLGzduxKZNm+Dq6gqVSgUvLy906dIF27dvx4cffoiePXsiPT0dM2fOhIODA1JSUl7rmvLD6ddff42goCAYGhrCw8OjyD/7F6VFixYYPnw4PvjgA5w+fRqtWrWCqakpMjIycPToUXh5eWHUqFHw9PREzZo1MXXqVAghYGVlhZ9++knjT+6vqnHgwIGYNm0aPv/8c/j5+eHSpUtYsmSJxgeCFMbFxQUzZszAp59+iuvXryMwMBCVK1fG7du3cfLkSWkU8Pz58xgzZgx69eqFWrVqwcjICAcPHsT58+cxderUIs/RunVrCCFw4sQJdOjQoVh1zZkzB02bNsXMmTPx7bffwt/fH0ZGRujXrx8mT56MZ8+eYdmyZbh//36xjqfN2LFjsXr1anTu3BmzZs2CnZ0d1q9frzG6WalSJUybNg2ffPIJBg0ahH79+uHu3bsIDw+HSqXC9OnTX7uG0jJu3Dh899136Ny5M2bMmAFnZ2fs3r0bS5cuxahRo+Du7v7KY6xYsQIdO3ZEQEAAgoODUa1aNdy7dw9JSUn49ddfsWXLFgBA06ZN0aVLF3h7e6Ny5cpISkrC2rVr0bx5c+k54fn37Jw5c9CxY0fo6+vD29tbmoZ1/Phx6Ovr8znSr0uHb94jogqu4NMkhHj5ju6RI0cKBwcHYWBgIJydnUVoaKjaY4CEePlu7tGjR4ulS5eKmjVrCkNDQ+Hp6SnWr19frHMX9hQCaHkawMOHD0VISIiwt7cXRkZGwtvbW2zYsKFE5yn4NIm6detqtHV2dhadO3fWWJ9/rQWPeebMGfHOO+8IMzMzYW5uLvr16ydu376ttu+LFy/EnDlzhLu7uzA0NBRVqlQR77//vkhPT1drV1hNQgiRmpoqOnToIMzNzaVHuuWLiIgQLi4uQqlUitq1a4uVK1dK9RV1Df+85n8+ZUEIIUJDQ0XVqlWFnp6exiO1CtLWv9qsXr1aNG3aVJiamgpjY2NRs2ZNMWjQILUnely6dEn4+/sLc3NzUblyZdGrVy+Rlpam9Z4orMbs7GwxefJk4ejoKIyNjYWfn59ITEws9GkSp06d0lrvjh07RJs2bYSFhYVQKpXC2dlZ9OzZUxw4cEAIIcTt27dFcHCw8PT0FKampsLMzEx4e3uLBQsWqD1WTpsXL14IFxcXjaeMFPZotXy9evUSBgYG4urVq0IIIX766SdRv359oVKpRLVq1cSkSZPEnj17NL5mhd1bQUFBGk9xyf8aqFQqYWVlJYYMGSJ+/PFHrffBt99+K7y9vYWRkZGwtLQU3bp1U3v0XP45Cv4bU1RNhX0PFlTY/fxPv//+u+jfv7+wtrYWhoaGwsPDQ8ybN096CoQQr+7zc+fOid69ewtbW1thaGgo7O3tRdu2bcXy5culNlOnThU+Pj6icuXKQqlUCldXVzFu3Djx999/S22ys7PF0KFDhY2NjVAoFBpPQ2nZsqV45513XnndpJ1CCD6hmYj+ewqFAqNHj5bmMMpJWFgYwsPD8ddff3GOH72WyMhIfPHFF/jzzz9hbGys63JIh65du4ZatWph79698Pf313U5FRLnDBMREVUwo0ePhqWlpfTJZCRfs2bNQrt27RiE/wWGYSIiogpGpVJh7dq1Wp+wQfKRm5uLmjVr8peif4nTJIiIiIhItjgyTERERESyxTBMRERERLLFMExEREREssUP3SAqQl5eHm7evAlzc/MSf9QtERER6YYQAg8fPkTVqlWhp1f02C/DMFERbt68CUdHR12XQURERK8hPT0d1atXL7INwzBREfI/QjY9PR0WFhY6roaIiIiKIysrC46OjsX6KHiGYaIi5E+NsLCwYBgmIiKqYIozxZFvoCMiIiIi2WIYJiIiIiLZYhgmIiIiItliGCYiIiIi2WIYJiIiIiLZYhgmIiIiItliGCYiIiIi2WIYJiIiIiLZYhgmIiIiItniJ9ARFUO96XuhpzTRdRlERERvjNSIzrouAQBHhomIiIhIxhiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIapVCkUCuzYsUPXZRAREREVC8MwFdutW7fw8ccfw83NDSqVCnZ2dnj77bexfPlyPHnyRNflEREREZUYnzNMxXL9+nW0aNEClSpVwpdffgkvLy/k5ubiypUrWL16NapWrYquXbvqukwiIiKiEuHIMBXLhx9+CAMDA5w+fRq9e/dG7dq14eXlhffeew+7d+/GO++8o7FPfHw8FAoFHjx4IK1LTEyEQqFAamqqtO6XX36Bn58fTExMULlyZQQEBOD+/fsAgOzsbISEhMDW1hYqlQpvv/02Tp06Je17//59DBgwADY2NjA2NkatWrUQFRUlbf/zzz/Rp08fVK5cGdbW1ujWrZvauYmIiEjeGIbple7evYt9+/Zh9OjRMDU11dpGoVC81rETExPRrl071K1bFwkJCTh69CjeeecdvHjxAgAwefJkbNu2DWvWrMGvv/4KNzc3BAQE4N69ewCAadOm4dKlS9izZw+SkpKwbNkyVKlSBQDw5MkTtGnTBmZmZvj5559x9OhRmJmZITAwEM+fP9daT3Z2NrKystQWIiIienNxmgS90tWrVyGEgIeHh9r6KlWq4NmzZwCA0aNHY86cOSU+9ty5c+Hj44OlS5dK6+rWrQsAePz4MZYtW4bo6Gh07NgRALBy5Urs378fq1atwqRJk5CWloaGDRvCx8cHAODi4iIdZ+PGjdDT08O3334rhfWoqChUqlQJ8fHx6NChg0Y9s2fPRnh4eImvg4iIiComjgxTsRUc/T158iQSExNRt25dZGdnv9Yx80eGtbl27RpycnLQokULaZ2hoSF8fX2RlJQEABg1ahQ2btyIBg0aYPLkyTh27JjU9syZM7h69SrMzc1hZmYGMzMzWFlZ4dmzZ7h27ZrWc4aGhiIzM1Na0tPTX+u6iIiIqGLgyDC9kpubGxQKBS5fvqy23tXVFQBgbGysdT89vZe/awkhpHU5OTlqbQrb95/7FQzhQghpXceOHfH7779j9+7dOHDgANq1a4fRo0dj/vz5yMvLQ+PGjbF+/XqNY9vY2Gg9p1KphFKpLLQmIiIierNwZJheydraGv7+/liyZAkeP35c7P3yA2dGRoa0LjExUa2Nt7c34uLitO7v5uYGIyMjHD16VFqXk5OD06dPo3bt2mrnCQ4Oxrp167Bw4UL873//AwA0atQIKSkpsLW1hZubm9piaWlZ7OsgIiKiNxfDMBXL0qVLkZubCx8fH2zatAlJSUlITk7GunXrcPnyZejr62vs4+bmBkdHR4SFheHKlSvYvXs3IiMj1dqEhobi1KlT+PDDD3H+/HlcvnwZy5Ytw99//w1TU1OMGjUKkyZNQmxsLC5duoRhw4bhyZMnGDJkCADg888/x48//oirV6/i4sWL2LVrlxSUBwwYgCpVqqBbt244cuQIbty4gcOHD+Pjjz/GH3/8UfadRkREROUewzAVS82aNXH27Fm0b98eoaGhqF+/Pnx8fLB48WJMnDgRM2fO1NjH0NAQGzZswOXLl1G/fn3MmTMHs2bNUmvj7u6Offv24dy5c/D19UXz5s3x448/wsDg5QyeiIgIvPfeexg4cCAaNWqEq1evYu/evahcuTIAwMjICKGhofD29karVq2gr6+PjRs3AgBMTEzw888/w8nJCT169EDt2rUxePBgPH36FBYWFmXcY0RERFQRKMQ/J3QSkZqsrCxYWlrCcexm6ClNdF0OERHRGyM1onOZHTv/53dmZuYrB8A4MkxEREREssUwTERERESyxTBMRERERLLFMExEREREssUwTERERESyxU+gIyqG38ID+Dg2IiKiNxBHhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhItgx0XQBRRVBv+l7oKU10XQYRvUFSIzrrugQiAkeGiYiIiEjGGIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGqdwKDg6GQqGQFmtrawQGBuL8+fNSm/xtx48fV9s3Ozsb1tbWUCgUiI+PV2u/Y8eO/+gKiIiIqLxjGKZyLTAwEBkZGcjIyEBcXBwMDAzQpUsXtTaOjo6IiopSW/fDDz/AzMzsvyyViIiIKiCGYSrXlEol7O3tYW9vjwYNGmDKlClIT0/HX3/9JbUJCgrCxo0b8fTpU2nd6tWrERQUpIuSiYiIqAJhGKYK49GjR1i/fj3c3NxgbW0trW/cuDFq1KiBbdu2AQDS09Px888/Y+DAgSU+R3Z2NrKystQWIiIienMxDFO5tmvXLpiZmcHMzAzm5ubYuXMnNm3aBD099Vv3gw8+wOrVqwEAUVFR6NSpE2xsbEp8vtmzZ8PS0lJaHB0dS+U6iIiIqHxiGKZyrU2bNkhMTERiYiJOnDiBDh06oGPHjvj999/V2r3//vtISEjA9evXER0djcGDB7/W+UJDQ5GZmSkt6enppXEZREREVE4Z6LoAoqKYmprCzc1Net24cWNYWlpi5cqVmDVrlrTe2toaXbp0wZAhQ/Ds2TN07NgRDx8+LPH5lEollEplqdRORERE5R9HhqlCUSgU0NPTU3uzXL7BgwcjPj4egwYNgr6+vg6qIyIiooqGI8NUrmVnZ+PWrVsAgPv372PJkiV49OgR3nnnHY22gYGB+Ouvv2BhYfFfl0lEREQVFMMwlWuxsbFwcHAAAJibm8PT0xNbtmxB69atNdoqFApUqVLlP66QiIiIKjKGYSq3oqOjER0dXWQbIUSh2ypVqqSxvaj2REREJD+cM0xEREREssUwTERERESyxTBMRERERLLFMExEREREssUwTERERESyxadJEBXDb+EBfH4xERHRG4gjw0REREQkWwzDRERERCRbDMNEREREJFsMw0REREQkWwzDRERERCRbDMNEREREJFsMw0REREQkWwzDRERERCRbDMNEREREJFsMw0REREQkWwzDRERERCRbDMNEREREJFsMw0REREQkWwzDRERERCRbDMNEREREJFsMw0REREQkWwzDRERERCRbDMNEREREJFsMw0REREQkWwzDRERERCRbDMNEREREJFsMw0REREQkWwa6LoCoIqg3fS/0lCa6LoPojZMa0VnXJRCRzHFkmIiIiIhki2GYiIiIiGSLYZiIiIiIZIthmIiIiIhki2GYiIiIiGSrTMKwQqHAjh07it0+LCwMDRo0KItSyqWC1xscHIzu3bvrrJ6KQG73CBEREf03ShSG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0CEsWrQIP/74o9YpC926dcO4ceMwZswYNGjQAMeOHcO0adM02rm5uaFHjx7o1KkTOnTogHr16qk9dWHo0KH49ttvER0dDS8vL/j5+SE6OlqammFgYIBFixZhxYoVqFq1Krp161as/czMzDBnzhz4+PigSZMmSE1NRUxMjDQloCgKhQIxMTFo1aoVBg8eDHd3d/Tt2xepqamws7MDAPTp0weff/45pkyZgsaNG+P333/HqFGjijzuV199hebNm6NLly5o3749WrRoIT0arije3t44fPgwUlJS0LJlSzRs2BDTpk2T5soCL9+MN2jQIEyYMAEeHh7o2rUrTpw4UaypAIaGhtiwYQMuX76M+vXrY86cOZg1a9Yr9ysoKCgICxcuxNKlS1G3bl106dJF7SkQkZGR2L9/PxwdHdGwYUOtxwgJCcGECRMwYcIEeHl5ITY2Fjt37kStWrVKXA8RERHJl0Jom4xK5crjx49RrVo1REZGYsiQIbouR1aysrJgaWkJx7Gboac00XU5RG+c1IjOui6BiN5A+T+/MzMzNR7aUFCpvYGOSs/Zs2dx+fJl+Pr6IjMzU3osWf5oNxERERGVDobhcmr+/PlITk6GkZERGjdujCNHjqBKlSq6LouIiIjojcIwXA41bNgQZ86c0XUZRERERG+8Uvk4ZiIiIiKiiohhmIiIiIhki9MkiIrht/CAV74blYiIiCoejgwTERERkWwxDBMRERGRbDEMExEREZFsMQwTERERkWwxDBMRERGRbDEMExEREZFsMQwTERERkWwxDBMRERGRbDEMExEREZFsMQwTERERkWwxDBMRERGRbDEMExEREZFsMQwTERERkWwxDBMRERGRbDEMExEREZFsMQwTERERkWwxDBMRERGRbDEMExEREZFsMQwTERERkWwxDBMRERGRbDEMExEREZFsMQwTERERkWwZ6LoAooqg3vS90FOa6LoMIp1Kjeis6xKIiEodR4aJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhqlcO3bsGPT19REYGKjrUoiIiOgNxDBM5drq1avx0Ucf4ejRo0hLS9N1OURERPSGYRimcuvx48fYvHkzRo0ahS5duiA6Olpt+86dO1GrVi0YGxujTZs2WLNmDRQKBR48eCC1OXbsGFq1agVjY2M4OjoiJCQEjx8//m8vhIiIiMothmEqtzZt2gQPDw94eHjg/fffR1RUFIQQAIDU1FT07NkT3bt3R2JiIkaMGIFPP/1Ubf8LFy4gICAAPXr0wPnz57Fp0yYcPXoUY8aMKfSc2dnZyMrKUluIiIjozcUwTOXWqlWr8P777wMAAgMD8ejRI8TFxQEAli9fDg8PD8ybNw8eHh7o27cvgoOD1fafN28e+vfvj7Fjx6JWrVp46623sGjRInz33Xd49uyZ1nPOnj0blpaW0uLo6Fim10hERES6xTBM5VJycjJOnjyJvn37AgAMDAzQp08frF69WtrepEkTtX18fX3VXp85cwbR0dEwMzOTloCAAOTl5eHGjRtazxsaGorMzExpSU9PL4OrIyIiovLCQNcFEGmzatUq5Obmolq1atI6IQQMDQ1x//59CCGgUCjU9smfQpEvLy8PI0aMQEhIiMbxnZyctJ5XqVRCqVSWwhUQERFRRcAwTOVObm4uvvvuO0RGRqJDhw5q29577z2sX78enp6eiImJUdt2+vRptdeNGjXCxYsX4ebmVuY1ExERUcXEMEzlzq5du3D//n0MGTIElpaWatt69uyJVatWYfv27fjqq68wZcoUDBkyBImJidLTJvJHjKdMmYJmzZph9OjRGDZsGExNTZGUlIT9+/dj8eLF//VlERERUTnEOcNU7qxatQrt27fXCMLAy5HhxMRE3L9/H1u3bsX27dvh7e2NZcuWSU+TyJ/m4O3tjcOHDyMlJQUtW7ZEw4YNMW3aNDg4OPyn10NERETll0IUnGhJVEF98cUXWL58eam+6S0rK+vlUyXGboae0qTUjktUEaVGdNZ1CURExZL/8zszMxMWFhZFtuU0Caqwli5diiZNmsDa2hq//PIL5s2bV+QzhImIiIgKYhimCislJQWzZs3CvXv34OTkhAkTJiA0NFTXZREREVEFwjBMFdaCBQuwYMECXZdBREREFRjfQEdEREREssWRYaJi+C084JUT8ImIiKji4cgwEREREckWwzARERERyRbDMBERERHJFsMwEREREckWwzARERERyRbDMBERERHJFsMwEREREckWwzARERERyRbDMBERERHJFsMwEREREckWwzARERERyRbDMBERERHJFsMwEREREckWwzARERERyRbDMBERERHJFsMwEREREckW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QF5eXolqKskxjI2NX3k8pVKJ9u3bY/fu3fjjjz9eec78sJx/zry8PISHhyMxMVFaLly4gJSUFKhUKjg6OiI5ORnffPMNjI2N8eGHH6JVq1bIycmBubk5fv31V2zYsAEODg74/PPPUb9+fTx48EBrHaGhocjMzJSW9PT0V14fERERVVwMw+VMnTp18PjxY+l1165d8f3332Po0KHYuHGjDivTztvbG3/88QeuXLlSaBs9PT2sXbsWjRs3Rtu2bXHz5s0SnaNRo0ZITk6Gm5ubxqKn9/IWNjY2RteuXbFo0SLEx8cjISEBFy5cAPBySkr79u0xd+5cnD9/HqmpqTh48KDWcymVSlhYWKgtRERE9ObinGEduXv3Lnr16oXBgwfD29sb5ubmOH36NObOnYtu3bqptX333Xexdu1aDBw4EAYGBuXqaQh+fn5o1aoV3nvvPXz11Vdwc3PD5cuXoVAo1OYp6+vrY/369ejXrx/atm2L+Ph42NvbF+scn3/+Obp06QJHR0f06tULenp6OH/+PC5cuIBZs2YhOjoaL168QNOmTWFiYoK1a9fC2NgYzs7O2LVrF65fv45WrVqhcuXKiImJQV5eHjw8PMqqS4iIiKgCYRjWETMzMzRt2hQLFizAtWvXkJOTA0dHRwwbNgyffPKJRvuePXsiLy8PAwcOhJ6eHnr06KGDqrXbtm0bJk6ciH79+uHx48dwc3NDRESERjsDAwNs2LABffr0kQJxcQQEBGDXrl2YMWMG5s6dC0NDQ3h6emLo0KEAgEqVKiEiIgLjx4/Hixcv4OXlhZ9++gnW1taoVKkStm/fjrCwMDx79gy1atXChg0bULdu3dLsAiIiIqqgFEIIoesiiMqrrKysl2+kG7sZekoTXZdDZSg1QvvzvYmIqOLJ//mdmZn5yimPnDNMRERERLLFMExEREREssUwTERERESyxTBMRERERLLFMExEREREssVHqxEVw2/hAfwADiIiojcQR4aJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLYYhomIiIhIthiGiYiIiEi2GIaJiIiISLb4ccxERRBCAACysrJ0XAkREREVV/7P7fyf40VhGCYqwt27dwEAjo6OOq6EiIiISurhw4ewtLQssg3DMFERrKysAABpaWmv/Gai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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#addetional - drawing chart for important features \n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "feature_importances_rf.head(10).plot(kind='barh')\n",
    "plt.title('Top 10 Important Features (Random Forest)')\n",
    "plt.xlabel('Importance Score')\n",
    "plt.gca().invert_yaxis()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "d31e3b90",
   "metadata": {},
   "outputs": [],
   "source": [
    "#5.Apply machine learning models to the selected features and evaluate the models\n",
    "selected_features = ['Glucose', 'BMI', 'Age', 'BloodPressure', 'DiabetesPedigreeFunction']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "88c54329",
   "metadata": {},
   "outputs": [],
   "source": [
    "#select the important featurs\n",
    "X_train_selected = X_train[selected_features]\n",
    "X_test_selected = X_test[selected_features]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "11c22f7c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(max_iter=1000, random_state=42)"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#applied Logistic Regression & Random forest\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "model = LogisticRegression(max_iter=1000, random_state=42)\n",
    "model.fit(X_train_selected, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "54c72f9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "#predict \n",
    "y_pred_selected = model.predict(X_test_selected)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "61bfbb34",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 0 0\n",
      " 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1\n",
      " 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1\n",
      " 0 0 0 0 1 0]\n"
     ]
    }
   ],
   "source": [
    "print(y_pred_selected)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "c1f261fe",
   "metadata": {},
   "outputs": [],
   "source": [
    "#evaluate the result on the seleceted featurs\n",
    "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "d9bb5567",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "🔵 تقييم النموذج باستخدام الخصائص المختارة:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.76      0.82      0.79       100\n",
      "           1       0.61      0.52      0.56        54\n",
      "\n",
      "    accuracy                           0.71       154\n",
      "   macro avg       0.68      0.67      0.67       154\n",
      "weighted avg       0.71      0.71      0.71       154\n",
      "\n",
      "Confusion Matrix:\n",
      " [[82 18]\n",
      " [26 28]]\n",
      "Accuracy: 0.7142857142857143\n"
     ]
    }
   ],
   "source": [
    "print(\"🔵 تقييم النموذج باستخدام الخصائص المختارة:\")\n",
    "print(classification_report(y_test, y_pred_selected))\n",
    "print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_pred_selected))\n",
    "print(\"Accuracy:\", accuracy_score(y_test, y_pred_selected))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "de083f68",
   "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.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
