{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "ca385c14-bb36-4099-ae6d-3514f3d60e29",
   "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": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# imports\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, classification_report\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from sklearn.feature_selection import SelectKBest, chi2,RFE\n",
    "from sklearn.preprocessing import StandardScaler, LabelEncoder\n",
    "\n",
    "# load data\n",
    "df = pd.read_csv(\"diabetes.csv\")\n",
    "\n",
    "#preview first 5 \n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b1a9c24f-d548-4985-8d61-8b9a79a89e2f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pregnancies                   int64\n",
       "Glucose                       int64\n",
       "BloodPressure                 int64\n",
       "SkinThickness                 int64\n",
       "Insulin                       int64\n",
       "BMI                         float64\n",
       "DiabetesPedigreeFunction    float64\n",
       "Age                           int64\n",
       "Outcome                       int64\n",
       "dtype: object"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# get data type \n",
    "df.dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "fb8fa071-98db-4976-a5cd-ada44b19585f",
   "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": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#data summery \n",
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "322f32f9-b969-4173-bb10-7a8084997a19",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pregnancies                 0\n",
       "Glucose                     0\n",
       "BloodPressure               0\n",
       "SkinThickness               0\n",
       "Insulin                     0\n",
       "BMI                         0\n",
       "DiabetesPedigreeFunction    0\n",
       "Age                         0\n",
       "Outcome                     0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# count of missing values for each catagoriee \n",
    "df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "db56298c-8c45-4b33-9e8e-eec5b45e6b1d",
   "metadata": {},
   "outputs": [],
   "source": [
    "#no missing values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e9e33d88-e61f-40d1-8fee-50892f9cdc96",
   "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",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>763</th>\n",
       "      <td>10</td>\n",
       "      <td>101</td>\n",
       "      <td>76</td>\n",
       "      <td>48</td>\n",
       "      <td>180</td>\n",
       "      <td>32.9</td>\n",
       "      <td>0.171</td>\n",
       "      <td>63</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>764</th>\n",
       "      <td>2</td>\n",
       "      <td>122</td>\n",
       "      <td>70</td>\n",
       "      <td>27</td>\n",
       "      <td>0</td>\n",
       "      <td>36.8</td>\n",
       "      <td>0.340</td>\n",
       "      <td>27</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>765</th>\n",
       "      <td>5</td>\n",
       "      <td>121</td>\n",
       "      <td>72</td>\n",
       "      <td>23</td>\n",
       "      <td>112</td>\n",
       "      <td>26.2</td>\n",
       "      <td>0.245</td>\n",
       "      <td>30</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>766</th>\n",
       "      <td>1</td>\n",
       "      <td>126</td>\n",
       "      <td>60</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>30.1</td>\n",
       "      <td>0.349</td>\n",
       "      <td>47</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>767</th>\n",
       "      <td>1</td>\n",
       "      <td>93</td>\n",
       "      <td>70</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "      <td>30.4</td>\n",
       "      <td>0.315</td>\n",
       "      <td>23</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>768 rows × 9 columns</p>\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",
       "763           10      101             76             48      180  32.9   \n",
       "764            2      122             70             27        0  36.8   \n",
       "765            5      121             72             23      112  26.2   \n",
       "766            1      126             60              0        0  30.1   \n",
       "767            1       93             70             31        0  30.4   \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  \n",
       "..                        ...  ...      ...  \n",
       "763                     0.171   63        0  \n",
       "764                     0.340   27        0  \n",
       "765                     0.245   30        0  \n",
       "766                     0.349   47        1  \n",
       "767                     0.315   23        0  \n",
       "\n",
       "[768 rows x 9 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# preprocessing the data \n",
    "# converting object data to numarical data \n",
    "\n",
    "label_incoder = LabelEncoder()\n",
    "for column in df.select_dtypes(include = ['object']).columns:\n",
    "    df[column] = label_incoder.fit_transform(df[column])\n",
    "\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "db81ad24-791f-448e-bcf2-474f33cfd380",
   "metadata": {},
   "outputs": [],
   "source": [
    "# handeling missing values for numarical data using mean\n",
    "for column in df.select_dtypes(include = ['float64']).columns:\n",
    "    fillValue = df[column].mean() \n",
    "    df[column] = df[column].fillna(fillValue)\n",
    "for column in df.select_dtypes(include = ['int64']).columns:\n",
    "    fillValue = df[column].mean() \n",
    "    df[column] = df[column].fillna(fillValue)\n",
    "\n",
    "# handeling missing values for catagorical data using mode\n",
    "for column in df.select_dtypes(include = ['object']).columns:\n",
    "    fillValue = df[column].mode()[0]\n",
    "    df[column] = df[column].fillna(fillValue)\n",
    "\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "96e04299-de38-472e-a2cf-51028f78c55e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pregnancies                 0\n",
       "Glucose                     0\n",
       "BloodPressure               0\n",
       "SkinThickness               0\n",
       "Insulin                     0\n",
       "BMI                         0\n",
       "DiabetesPedigreeFunction    0\n",
       "Age                         0\n",
       "Outcome                     0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "56467830-6a15-4209-84fa-11a6a46ed85b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "df218e67-02b2-4759-961b-d1fbe6ae35f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ8AAAJOCAYAAAAZP6bBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABYzUlEQVR4nO3dd5gV1f0/8M8CW+hK7wgWVAQLiCIqdkVRjLEhFqJJNHaxJugXNRgVS2JsGB9rIPYuVhQ0RlRUsMWWiF2sCCodzu8Pf3vDZXdhwR12WV+v5+HRO3Nm7jkz954z8965MwUppRQAAAAAkIE61V0BAAAAAGov4RMAAAAAmRE+AQAAAJAZ4RMAAAAAmRE+AQAAAJAZ4RMAAAAAmRE+AQAAAJAZ4RMAAAAAmRE+AQAAAJAZ4VMNc/bZZ0dBQUF89dVXyy273XbbxXbbbbdS7/OnP/0p7r333kqVff/996OgoCAuvvjilXqvLJx55pnRqVOnqFevXqyxxhqZvlfpPin9V1RUFF26dIkTTjghvv3220zfe3VWUFAQZ599dnVXAyiHsaZyVuVYU+qZZ56JwYMHR6dOnaK4uDgaNmwY3bt3j5NPPjneeuutvLJDhw6NtdZaa5XUC6gZ9N+VU53nCnXq1Im2bdvG7rvvHv/617/yypZuqxtvvDHTOpVn4sSJUVBQEBMnTsxNGzp0aF7di4uLo1u3bjFixIiYO3fuKq8jtVu96q4A1eNPf/pT7LvvvrH33ntXd1VW2H333RfnnXdeDB8+PAYMGBDFxcWr5H0feeSRaNq0aXz33Xfx0EMPxWWXXRYvvPBCPPvss1FQULBK6rA6mTRpUnTo0KG6qwFUI2PNijnzzDPjvPPOi759+8aZZ54Z6667bixcuDBeffXVuOmmm+LSSy+NhQsXRt26dTOvC/Dzpv9ecaXnCosXL44PP/wwRo0aFdttt108//zzsdlmm62SOqyM+vXrx5NPPhkRETNmzIhbbrklzj333Hjrrbfitttuq+baUZsIn1jtvP766xERcfzxx0erVq2qZJ2zZ8+OBg0aLLNMr169okWLFhERsfPOO8fXX38df//73+PZZ5+Nfv36rfR6a6stt9yyuqsAsNJW9Vhzyy23xHnnnRdHHXVUXHXVVXl/1Nh5551j2LBhcdVVV1VJPQBqs5pwrrDVVltFnz59Yu21144777yzRodPderUyTtuHzBgQLz//vtx++23x6WXXhrt27cvd7k5c+ZE/fr1V1U1f7JFixbFwoULV1kYSVl+dldDffTRR7HPPvtEkyZNomnTpnHwwQfHl19+udzlvvnmmzj66KOjffv2UVRUFF27do3hw4fHvHnzcmUKCgrihx9+iJtuuil3iWVlLsldvHhxnHfeedGpU6coKSmJ3r17xxNPPFGm3DPPPBM77rhjNG7cOBo0aBBbbbVVjBs3Lm9+YWFhnHLKKXnL3XjjjVFQUBDXXXddhXVYa6214swzz4yIiNatW+f9tGvx4sUxatSoWH/99aO4uDhatWoVhx56aHz88cd569huu+1io402iqeffjq22mqraNCgQRx++OHLbf/SSjvpDz74YLnrnTVrVpxyyinRpUuXKCoqivbt28eJJ54YP/zwQ946v/322zjiiCOiWbNm0ahRo9hjjz3ivffeK/MTttLLe994440YPHhwNG3aNFq3bh2HH354zJw5M2+dV155ZWy77bbRqlWraNiwYfTo0SNGjRoVCxYsKHe7TJ48ObbZZpto0KBBdO3aNS644IJYvHhxmXqefPLJ0bVr19y23n333fN+ElLez+6mT58eRx55ZHTo0CH388VzzjknFi5cmFfu6quvjo033jgaNWoUjRs3jvXXXz/+8Ic/VHLPAJVlrClfdYw1I0eOjBYtWsSf//zncq+mLSgoiGOOOWaZVz0t6+cc5fXJb731VgwePDhat24dxcXF0alTpzj00EPz9uPrr78egwYNijXXXDNKSkpik002iZtuuilvPYsXL46RI0dGt27don79+rHGGmtEz54947LLLssr9+6778ZBBx0UrVq1iuLi4thggw3iyiuvrLA9QMX03+WrSecKTZs2jYiIwsLC5ZZd3jYpVZk+OeLH/n233XaLBg0aRIsWLeKoo46K7777rtJ1X/o8Z6211oqBAwfG3XffHZtuummUlJTEOeecExFVd3w/e/bs3PlSSUlJNGvWLHr37h233HJLrkxFPyVd+mfopePhqFGjYuTIkdGlS5coLi6OCRMmRETEiy++GHvttVc0a9YsSkpKYtNNN43bb7+90tuHlZSoUUaMGJEiInXu3Dmdeuqp6dFHH02XXnppatiwYdp0003T/Pnzc2X79++f+vfvn3s9Z86c1LNnz9SwYcN08cUXp8ceeyydddZZqV69emn33XfPlZs0aVKqX79+2n333dOkSZPSpEmT0htvvFFhnaZNm5YiInXs2DFtvfXW6a677kp33HFH2nzzzVNhYWF69tlnc2UnTpyYCgsLU69evdJtt92W7r333rTLLrukgoKCdOutt+bKXXDBBSki0n333ZdSSun1119PDRo0SAcffPAyt8/LL7+cjjjiiBQR6ZFHHkmTJk1KH330UUoppd/+9rcpItKxxx6bHnnkkTR69OjUsmXL1LFjx/Tll1/mbbdmzZqljh07pssvvzxNmDAhPfXUU8vdJ0uuI6WUTjrppBQR6bHHHlvmen/44Ye0ySabpBYtWqRLL700jR8/Pl122WWpadOmaYcddkiLFy9OKaW0aNGitPXWW6eSkpJ0wQUXpMceeyydc845ad11100RkUaMGFGmTt26dUv/93//lx5//PF06aWXpuLi4vSrX/2qTD2vvvrq9Mgjj6Qnn3wy/fnPf04tWrQoU65///6pefPmad11102jR49Ojz/+eDr66KNTRKSbbropV27WrFmpe/fuqWHDhuncc89Njz76aLrrrrvSCSeckJ588slcuaXr/Nlnn6WOHTumzp07p2uuuSaNHz8+/fGPf0zFxcVp6NChuXK33HJLioh03HHHpcceeyyNHz8+jR49Oh1//PEV7iNgxRhratZY88knn6SISIMHD15mvZZ22GGHpc6dO5fZhjfccEOZskv3yVOnTk2NGjVKa621Vho9enR64okn0pgxY9L++++fZs2alVJK6a233kqNGzdOa6+9drr55pvTuHHj0uDBg1NEpAsvvDC3rvPPPz/VrVs3jRgxIj3xxBPpkUceSX/5y1/S2WefnSvzxhtvpKZNm6YePXqkm2++OT322GPp5JNPTnXq1MkrByyb/rtm9d9L7pPp06enBQsWpHnz5qV33303HXDAAam4uDi9+uqrZbbVkv10ZbdJZfvk6dOnp1atWqX27dunG264IT300ENpyJAhqVOnTiki0oQJE3JlDzvssNSwYcMybfrFL36RIiK98847KaWUOnfunNq2bZu6du2arr/++jRhwoT0wgsvVOnx/ZFHHpkaNGiQLr300jRhwoT04IMPpgsuuCBdfvnleftmyc/0ku0obzxs37592n777dOdd96ZHnvssTRt2rT05JNPpqKiorTNNtuk2267LT3yyCNp6NChFY6fVB3hUw1T2nmddNJJedPHjh2bIiKNGTMmN23pL9/o0aNTRKTbb789b9kLL7wwLyRJKaWGDRumww47rFJ1Kv3ytmvXLs2ZMyc3fdasWalZs2Zpp512yk3bcsstU6tWrdJ3332Xm7Zw4cK00UYbpQ4dOuSClsWLF6fdd989rbHGGun1119PG264YVp//fXT999/v9z6lBcGvfnmmyki0tFHH51X9vnnn08Rkf7whz/kpvXv3z9FRHriiScq1f6lB5QZM2akMWPGpPr166eOHTvmtklF6z3//PNTnTp10uTJk/Om33nnnSki0kMPPZRSSmncuHEpItLVV19dZvmKwqdRo0bllT366KNTSUlJbjsvbdGiRWnBggXp5ptvTnXr1k3ffPNNme3y/PPP5y2z4YYbpl133TX3+txzz00RkR5//PFlbbYydT7yyCNTo0aN0gcffJBX7uKLL04RkTuoOfbYY9Maa6yxzHUDP42xpmaNNc8991yKiHTGGWeUmbdw4cK0YMGC3L8l+/efEj7tsMMOaY011khffPFFhfU68MADU3Fxcfrwww/zpg8YMCA1aNAgffvttymllAYOHJg22WSTZbZx1113TR06dEgzZ87Mm37sscemkpKSvPEIqJj+u2b130u+39L/mjRpku6+++5yt9WS/XRlt0ll++TTTz89FRQUpKlTp+aV23nnnSsMn0rHmC+//DJddtllqaCgIG2++ea5cp07d05169ZNb7/9dt46q/L4fqONNkp77733MsusaPi09tpr5wWyKaW0/vrrp0033TQtWLAgb/rAgQNT27Zt06JFi5ZZB1aen93VUEOGDMl7vf/++0e9evVylwqW58knn4yGDRvGvvvumzd96NChERHlXva6IvbZZ58oKSnJvW7cuHHsueee8fTTT8eiRYvihx9+iOeffz723XffaNSoUa5c3bp145BDDomPP/443n777Yj48XLem2++ORo3bhy9e/eOadOmxe233x4NGzZcqbqVbpfStpbq06dPbLDBBmXavuaaa8YOO+ywQu/Rpk2bKCwsjDXXXDMOPvjg2GyzzeKRRx7J2yblrffBBx+MjTbaKDbZZJNYuHBh7t+uu+6a98SJp556KiJ+3NdLGjx4cIV12muvvfJe9+zZM+bOnRtffPFFbtqUKVNir732iubNm0fdunWjsLAwDj300Fi0aFG88847ZdrYp0+fMussveQ2IuLhhx+O9dZbL3baaacK61WeBx98MLbffvto165d3nYYMGBARPyv/X369Ilvv/02Bg8eHPfdd1+lnuYCrBxjzYpZFWPN0po3bx6FhYW5f3fddddPWl/Ejz9teOqpp2L//fePli1bVljuySefjB133DE6duyYN33o0KExe/bsmDRpUkT82P5XXnkljj766Hj00Udj1qxZeeXnzp0bTzzxRPziF7+IBg0a5I0Bu+++e8ydOzeee+65n9wu+DnRf6+YVdF/jx8/PiZPnhwvvPBCPPjgg7HTTjvFgQceGPfcc0+Fy6zINqlsnzxhwoTo3r17bLzxxnnlDjrooArrUDrGtGzZMk488cQYMGBAmXr37Nkz1ltvvbxpVXl836dPn3j44YfjjDPOiIkTJ8acOXMq3G6Vtddee+X97PE///lPvPXWW7nvz9Lj0WeffZbb3lQ94VMN1aZNm7zX9erVi+bNm8fXX39d4TJff/11tGnTpsy9Ilq1ahX16tVb5rIrU6fSafPnz4/vv/8+ZsyYESmlaNu2bZly7dq1y9WxVPPmzWOvvfaKuXPnxm677RY9evRY6bqVrrei91667eWVW57SAWXq1Knx1VdfxTPPPBMbbrjhctf7+eefx6uvvpp38lBYWBiNGzeOlFKu8/3666+jXr160axZs7zlW7duXWGdmjdvnve69AZ6pZ31hx9+GNtss0188skncdlll8U///nPmDx5cu4eG0t36kuvr3SdS5b78ssvV+opdp9//nk88MADZbZD9+7dIyJy2+GQQw6J66+/Pj744IP45S9/Ga1atYotttgiHn/88RV+T2DZjDUrJquxpvREYsmgv9TEiRNj8uTJMXr06BWtboVmzJgRixYtWm5f/vXXX1dqO//+97+Piy++OJ577rkYMGBANG/ePHbcccd48cUXc+UWLlwYl19+eZkxYPfdd4+I8IcGWEH67xWzKs4VNt544+jdu3dsvvnmsccee8Qdd9wR66yzThxzzDEVLrMi26SyfXLpfl5aedMifnza3eTJk2Py5Mnx6quvxrfffhvjxo0rc6Pxis5zqur4/q9//Wucfvrpce+998b2228fzZo1i7333jvefffdcutdGUvX+fPPP4+IiFNOOaVMnY8++ui8OlP1PO2uhpo+fXreF37hwoXx9ddflxsOlGrevHk8//zzkVLKG1S++OKLWLhwYe7pCz+lTuVNKyoqikaNGkW9evWiTp068dlnn5Up9+mnn0ZE5NXh8ccfj6uvvjr69OkT99xzT9x1113xy1/+cqXqVrpdPvvsszIH059++mmZtpd3M9fl2XjjjZe7Dctbb4sWLaJ+/fpx/fXXl7tM6TqbN28eCxcujG+++SYvgCpvu1fWvffeGz/88EPcfffd0blz59z0qVOnrvQ6W7ZsWebGjJXRokWL6NmzZ5x33nnlzi8dOCMifvWrX8WvfvWr+OGHH+Lpp5+OESNGxMCBA+Odd97Jawfw0xhrVkxWY027du2ie/fu8fjjj8fcuXPzrhzYZJNNIiLi+++/X+56Spdb8sbBEVHmpKpZs2ZRt27d5fblzZs3r9R2rlevXgwbNiyGDRsW3377bYwfPz7+8Ic/xK677hofffRRrLnmmrm/4ld0EtalS5fltg/4H/33ilkV5wpLq1OnTnTv3j3uuOOO+OKLL8p98t6aa65Z6W1S2T65efPmFe6LiurZu3fv5banovOcqjq+b9iwYZxzzjlxzjnnxOeff567CmrPPffMPdSopKSkzMOVIioOjJauc+k2+v3vfx/77LNPuct069at3On8dK58qqHGjh2b9/r222+PhQsXLvNJEzvuuGN8//33ce+99+ZNv/nmm3PzSy19NUtl3H333TF37tzc6++++y4eeOCB2GabbaJu3brRsGHD2GKLLeLuu+/OW/fixYtjzJgx0aFDh9ylmp999lkcfPDB0b9//3j22Wdjr732iiOOOCKmTZu2QnUqVXpZ7JgxY/KmT548Od588828tq9qAwcOjP/+97/RvHnz6N27d5l/pU9m6N+/f0RE3HbbbXnL33rrrSv93qUd7pKPFE0pxbXXXrvS6xwwYEC888478eSTT67QcgMHDozXX3891l577XK3w5KDU6mGDRvGgAEDYvjw4TF//vx44403VrreQFnGmhWT5VgzfPjw+Oqrr2LYsGGRUlqpdbRu3TpKSkri1VdfzZt+33335b2uX79+9O/fP+64445l/oV3xx13jCeffDJ3YlPq5ptvjgYNGuQ9mrvUGmusEfvuu28cc8wx8c0338T7778fDRo0iO233z6mTJkSPXv2LHcMWNYJM1CW/nvFVMe5wqJFi+K1116L4uLiaNKkSbllVmSbVLZP3n777eONN96IV155Ja/cP/7xj6psXkRkd3zfunXrGDp0aAwePDjefvvtmD17dkT8+NS9d955J++PLF9//XU8++yzlapvt27dYt11141XXnml3Pr27t07GjduvJJbg+Vx5VMNdffdd0e9evVi5513jjfeeCPOOuus2HjjjcvcD2hJhx56aFx55ZVx2GGHxfvvvx89evSIZ555Jv70pz/F7rvvnnePnh49esTEiRPjgQceiLZt20bjxo2Xm/LWrVs3dt555xg2bFgsXrw4Lrzwwpg1a1buMZsREeeff37svPPOsf3228cpp5wSRUVFcdVVV8Xrr78et9xySxQUFMSiRYti8ODBUVBQEP/4xz+ibt26ceONN8Ymm2wSBxxwQDzzzDNRVFS0QturW7du8dvf/jYuv/zyqFOnTgwYMCDef//9OOuss6Jjx45x0kknrdD6qtKJJ54Yd911V2y77bZx0kknRc+ePWPx4sXx4YcfxmOPPRYnn3xybLHFFrHbbrtFv3794uSTT45Zs2ZFr169YtKkSbkDgjp1Vjwr3nnnnaOoqCgGDx4cp512WsydOzeuvvrqmDFjxk9qz2233RaDBg2KM844I/r06RNz5syJp556KgYOHBjbb799ucude+658fjjj8dWW20Vxx9/fHTr1i3mzp0b77//fjz00EMxevTo6NChQ/zmN7+J+vXrR79+/aJt27Yxffr0OP/886Np06ax+eabr3S9gbKMNTVnrBk8eHC88cYbcd5558Urr7wSQ4cOjXXXXTcWL14cH330Ufz973+PiFjmQXFBQUEcfPDBcf3118faa68dG2+8cbzwwgvlnnBceumlsfXWW8cWW2wRZ5xxRqyzzjrx+eefx/333x/XXHNNNG7cOEaMGJG7n8f//d//RbNmzWLs2LExbty4GDVqVO4x4nvuuWdstNFG0bt372jZsmV88MEH8Ze//CU6d+4c6667bkREXHbZZbH11lvHNttsE7/73e9irbXWiu+++y7+85//xAMPPLDCf9CAnzv9d83pv0u99NJLuX7x888/j+uvvz7eeuutOOmkk/KuaF1aZbZJRFS6Tz7xxBPj+uuvjz322CNGjhwZrVu3jrFjx+auHqpKVXl8v8UWW8TAgQOjZ8+eseaaa8abb74Zf//736Nv377RoEGDiPjx53vXXHNNHHzwwfGb3/wmvv766xg1alSF4V55rrnmmhgwYEDsuuuuMXTo0Gjfvn1888038eabb8bLL78cd9xxR5VvJ/6/6rrTOeUrfVrCSy+9lPbcc8/UqFGj1Lhx4zR48OD0+eef55Ut727/X3/9dTrqqKNS27ZtU7169VLnzp3T73//+zR37ty8clOnTk39+vVLDRo0SBFR7lMDSpU+LeDCCy9M55xzTurQoUMqKipKm266aXr00UfLlP/nP/+Zdthhh9SwYcNUv379tOWWW6YHHnggN3/48OGpTp06ZZ4g8eyzz6Z69eqlE044oVLbaMknWKT045PcLrzwwrTeeuulwsLC1KJFi3TwwQfnHq9aqn///ql79+7LfI/KvN/SlrXe77//Pp155pmpW7duqaioKPe46ZNOOilNnz49V+6bb75Jv/rVr9Iaa6yRGjRokHbeeefcU5Auu+yy5dbphhtuSBGRpk2blpv2wAMPpI033jiVlJSk9u3bp1NPPTU9/PDDZZ52UVH9l356REopzZgxI51wwgmpU6dOqbCwMLVq1Srtscce6a233sqViaWerJRSSl9++WU6/vjjU5cuXVJhYWFq1qxZ6tWrVxo+fHju6SU33XRT2n777VPr1q1TUVFRateuXdp///3zHlML/DTGmpo31pR6+umn0wEHHJA6dOiQCgsLU4MGDdKGG26Yfve736UXX3wxr2x5/fPMmTPTr3/969S6devUsGHDtOeee6b333+/3D753//+d9pvv/1S8+bNU1FRUerUqVMaOnRo3n587bXX0p577pmaNm2aioqK0sYbb1zmaXqXXHJJ2mqrrVKLFi1y6zniiCPS+++/n1du2rRp6fDDD0/t27dPhYWFqWXLlmmrrbZKI0eOXOHtBD9X+u+a13+X97S7Zs2apS222CJdf/31eU9Pq+ippMvbJqUq0yen9GP/vvPOO6eSkpLUrFmzdMQRR6T77ruvwqfdLU/nzp3THnvsUe68qjq+P+OMM1Lv3r3TmmuumYqLi1PXrl3TSSedlL766qu897vpppvSBhtskEpKStKGG26YbrvttgqfdnfRRReVW+dXXnkl7b///qlVq1apsLAwtWnTJu2www5p9OjRy90WrLyClFby2m5glfjHP/4RQ4YMiX/961+x1VZbVXd1AAAAYIUIn6AGueWWW+KTTz6JHj16RJ06deK5556Liy66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RJMmTeLWW2+N0aNHr9D6nn766RgxYkR07do1rrzyynjooYfiyiuvjK5du8aIESPi6aefzqglq3fdqsKSwVOfPn3iiiuuiD59+kRExCeffBJDhgypzuoBUI2WDp46dOiwzPm1WVUcD1T18RPwozvvvLPc71ZBQUF88sknUadOnTjooINizJgxcdBBB0VhYWH861//iuHDh+fWkdUxf3WeSwifgNXa/Pnz44477og111wz7rjjjhg4cGA0b948Bg4cmDd9/vz5lVrfokWL4qqrroq+ffvGyJEjo3v37tGgQYPo3r17jBw5Mvr27RtXX3113l8xVpWaXLeqMHPmzFzw9NBDD8WoUaNio402ilGjRsVDDz0UET8GUDNnzqzOagJQDe6///7c/5955pkxceLEGDNmTEycODHOPPPMcsvVVlVxPFDVx0/A/4wfP77Md2vHHXeMhQsX5soMHTo0OnToEL/97W9j3LhxuQBqzpw5mR3zV/e5RKV/djdv3ryYN29e7vWsWbOqrBIffPBBjVoPVcc+YXl+6mfkvvvui0WLFsURRxwR9erld2n16tWLww8/PC655JK47777Yr/99lvu+l599dWYPn16nHXWWVGnTn4+X6dOnRgyZEgcc8wx8eqrr8amm276k+q+ompy3apijCj9a0+fPn2iQYMGefMaNGgQm2++eUyePDmGDx8eV1xxxU+rcC2lz111bOtls31qhpq0H37qOLHkPZ522mmnvHk77bRTjBw5Mleutt//qSqOB6r6+Gl5atJnsTrUtvbXtvZUldLtsnjx4jLfrWuuuSYiInc8u+R3q6ioKPbdd9+45ZZb4pprron+/ftncsxf3ecSlQ6fzj///DjnnHOqvAIRUea3jdQe9i1Z+/TTTyMiom/fvuXOL51eWm55vvnmm4iI6NKlS7nzS6eXlluVanLdqmKM+PzzzyMi4tBDDy13/iGHHBKTJ0/OlaMsfS41hc8iS6uqc4mlf2pXqnXr1j+b8aEqjgeq+vhpefQJtYv9uXxLf7c+/vjjiPjf8ezS363dd989brnllvj4448zO+av7nOJSodPv//972PYsGG517NmzYqOHTtWSSWGDx8enTt3/snr+eCDD3wRapiq2rfUXj/1e9uuXbuIiJg0aVIMHDiwzPxJkybllVueZs2aRUTEtGnTonv37mXmT5s2La/cqlST61YVY0Tr1q3jyy+/jJtvvjlGjRpVZv7f//73XDnKp89ddRxzLJvPYs1Qkz6nVXUuUXoCt7SfS/AUUTXHA1V9/LQ8P/c+oSZ9F6vCz31/VmTJ/bz0d6tDhw7x4osv5o5nl/5uld5iokOHDpkd81f3uUSlw6fi4uIoLi7OpBKdO3eO9dZbL5N1U73sW7I2aNCgGD16dFx33XWx22675V3eunDhwrj++uujbt26MWjQoEqtr2fPntGmTZsYO3ZsjBw5Mu+S1MWLF8fYsWOjbdu20bNnzypvy+pct6oYI84777wYNGhQvPDCCzF79uy8n97Nnj07Jk+enCtH+fS51BQ+iyztp44Tw4YNy/30bvz48Xk/vRs/fnxeudquKo4Hqvr4aXn0CbWL/blsderUKfPdOvLII+Pee++NyZMnR506dfK+W/Pnz48777wzV66oqCiTY/7qPpdww3FgtVZUVBT77bdfzJgxI/bbb7944IEH4quvvooHHnggb3pRUVGl1le3bt04+uijY9KkSXHmmWfGG2+8EbNnz4433ngjzjzzzJg0aVL87ne/i7p162bcstWrblWhadOm0b59+4j48dLjU089NV599dU49dRTY/fdd4+IiPbt20fTpk2rs5oAVIMl7+M0cuTI2G677eKAAw6I7bbbLne/p6XL1VZVcTxQ1cdPwP/stNNOZb5b48ePzwt5b7jhhvjoo4/immuuiT322CMWLFgQ/fr1i/r162d2zF/d5xKVvvIJoKY66qijIiLijjvuiEsuuSQ3vW7dunHggQfm5lfWtttuG+ecc05cddVVccwxx+Smt23bNs4555zYdtttq6biK6Em160qjB07NoYMGRKffPJJTJ48OXe1U8SPwdPYsWOrsXYAVKeJEyfGdtttl3u99E/tJk6cuGorVI2q4nigqo+fgB/tu+++0axZs3K/W+3bt49PPvkkbrnllrjlllty8/r165d3dX9Wx/zVeS4hfAJqhaOOOioOP/zwuO++++LTTz+Ndu3axaBBg1b6L3bbbrtt9OvXL1599dX45ptvolmzZtGzZ88acVVRTa5bVRg7dmzMnDkzhg8fHp9//nm0bt06zjvvPFc8ARATJ06M+++/P+/pd8OGDftZXPG0tKo4Hqjq4yfgR8v6bs2ZMyeuueaa+Pjjj6NDhw5x5JFHRv369cusI6tj/uo6lxA+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AADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADIjPAJAAAAgMwInwAAAADITL2VXTClFBERs2bNqrLKALBqlfbhpX16VTFGANQOxgkAKrIiY8RKh0/fffddRER07NhxZVcBQA3x3XffRdOmTat0fRHGCIDawjgBQEUqM0YUpJX8M8bixYvj008/jcaNG0dBQcFKVXDWrFnRsWPH+Oijj6JJkyYrtY7qVhvaEKEdNUltaEOEdtQky2pDSim+++67aNeuXdSpU3W/xDZG1Ey2adWzTauebVq1fur2rKnjRG3/nNTm9tXmtkXU7vZp2+orq/atyBix0lc+1alTJzp06LCyi+dp0qTJar+Da0MbIrSjJqkNbYjQjpqkojZU5V+ySxkjajbbtOrZplXPNq1aP2V71uRxorZ/Tmpz+2pz2yJqd/u0bfWVRfsqO0a44TgAAAAAmRE+AQAAAJCZag2fiouLY8SIEVFcXFyd1fhJakMbIrSjJqkNbYjQjppkdW3D6lrvmsw2rXq2adWzTatWbd2etbVdpWpz+2pz2yJqd/u0bfVVE9q30jccBwAAAIDl8bM7AAAAADIjfAIAAAAgM8InAAAAADKTefh01VVXRZcuXaKkpCR69eoV//znP5dZ/qmnnopevXpFSUlJdO3aNUaPHp11FSt0/vnnx+abbx6NGzeOVq1axd577x1vv/32MpeZOHFiFBQUlPn31ltvraJal3X22WeXqU+bNm2WuUxN2g+l1lprrXK37THHHFNu+ZqwL55++unYc889o127dlFQUBD33ntv3vyUUpx99tnRrl27qF+/fmy33XbxxhtvLHe9d911V2y44YZRXFwcG264Ydxzzz0ZteBHy2rHggUL4vTTT48ePXpEw4YNo127dnHooYfGp59+usx13njjjeXun7lz51ZLOyIihg4dWqY+W2655XLXuyr3x/LaUN42LSgoiIsuuqjCdVbHvqiMFR0/+NHy+vyV7Xd+Tqqi7543b14cd9xx0aJFi2jYsGHstdde8fHHH6/CVtQsVdH/2qb/U5lj1Nr+Oa0NY0RV7cfVwfnnnx8FBQVx4okn5qat7m375JNP4uCDD47mzZtHgwYNYpNNNomXXnopN391bd/ChQvjzDPPjC5dukT9+vWja9euce6558bixYtzZVaXttX28bwqztFWZfsyDZ9uu+22OPHEE2P48OExZcqU2GabbWLAgAHx4Ycfllt+2rRpsfvuu8c222wTU6ZMiT/84Q9x/PHHx1133ZVlNSv01FNPxTHHHBPPPfdcPP7447Fw4cLYZZdd4ocffljusm+//XZ89tlnuX/rrrvuKqhxxbp3755Xn9dee63CsjVtP5SaPHlyXhsef/zxiIjYb7/9lrlcde6LH374ITbeeOO44ooryp0/atSouPTSS+OKK66IyZMnR5s2bWLnnXeO7777rsJ1Tpo0KQ444IA45JBD4pVXXolDDjkk9t9//3j++eezasYy2zF79ux4+eWX46yzzoqXX3457r777njnnXdir732Wu56mzRpkrdvPvvssygpKcmiCRGx/P0REbHbbrvl1eehhx5a5jpX9f5YXhuW3p7XX399FBQUxC9/+ctlrndV74vlWdHxg3zL6vNXpt/5uamKvvvEE0+Me+65J2699dZ45pln4vvvv4+BAwfGokWLVlUzapSq6H9t0/+pzDFqbf6c1pYxoqr2Y003efLk+Nvf/hY9e/bMm746t23GjBnRr1+/KCwsjIcffjj+/e9/xyWXXBJrrLFGrszq2r4LL7wwRo8eHVdccUW8+eabMWrUqLjooovi8ssvz5VZXdpW28fzqjhHW6XtSxnq06dPOuqoo/Kmrb/++umMM84ot/xpp52W1l9//bxpRx55ZNpyyy0zq+OK+OKLL1JEpKeeeqrCMhMmTEgRkWbMmLHqKrYcI0aMSBtvvHGly9f0/VDqhBNOSGuvvXZavHhxufNr2r6IiHTPPffkXi9evDi1adMmXXDBBblpc+fOTU2bNk2jR4+ucD37779/2m233fKm7brrrunAAw+s8jqXZ+l2lOeFF15IEZE++OCDCsvccMMNqWnTplVbuRVQXjsOO+ywNGjQoBVaT3Xuj8rsi0GDBqUddthhmWWqe1+UZ0XHD/5nWX3+yvY7P2cr03d/++23qbCwMN166625Mp988kmqU6dOeuSRR1ZZ3Wuqlel/bdNlW/oYtbZ/TmvrGLEy+7Gm++6779K6666bHn/88dS/f/90wgknpJRW/7adfvrpaeutt65w/urcvj322CMdfvjhedP22WefdPDBB6eUVt+21fbxfGXO0VZ1+zK78mn+/Pnx0ksvxS677JI3fZdddolnn3223GUmTZpUpvyuu+4aL774YixYsCCrqlbazJkzIyKiWbNmyy276aabRtu2bWPHHXeMCRMmZF215Xr33XejXbt20aVLlzjwwAPjvffeq7BsTd8PET9+vsaMGROHH354FBQULLNsTdsXpaZNmxbTp0/P29bFxcXRv3//Cr8jERXvn2Uts6rNnDkzCgoK8v76U57vv/8+OnfuHB06dIiBAwfGlClTVk0Fl2HixInRqlWrWG+99eI3v/lNfPHFF8ssX5P3x+effx7jxo2LI444Yrlla9K+WJnxg3wV9fkr2+/wP5XZhi+99FIsWLAgr0y7du1io402sp2XYVn9r226bEsfo9bmz2ltHiNWZj/WdMccc0zssccesdNOO+VNX93bdv/990fv3r1jv/32i1atWsWmm24a1157bW7+6ty+rbfeOp544ol45513IiLilVdeiWeeeSZ23333iFi927ak2txPVmTpc7RV3b7MwqevvvoqFi1aFK1bt86b3rp165g+fXq5y0yfPr3c8gsXLoyvvvoqq6pWSkophg0bFltvvXVstNFGFZZr27Zt/O1vf4u77ror7r777ujWrVvsuOOO8fTTT6/C2ubbYost4uabb45HH300rr322pg+fXpstdVW8fXXX5dbvibvh1L33ntvfPvttzF06NAKy9TEfbGk0u/BinxHSpdb0WVWpblz58YZZ5wRBx10UDRp0qTCcuuvv37ceOONcf/998ctt9wSJSUl0a9fv3j33XdXYW3zDRgwIMaOHRtPPvlkXHLJJTF58uTYYYcdYt68eRUuU5P3x0033RSNGzeOffbZZ5nlatq+WJnxg/9ZVp+/sv0O/1OZbTh9+vQoKiqKNddcs8Iy5Fte/2ubVqy8Y9Ta/DmtrWPEyu7HmuzWW2+Nl19+Oc4///wy81b3tr333ntx9dVXx7rrrhuPPvpoHHXUUXH88cfHzTffHBGrd/tOP/30GDx4cKy//vpRWFgYm266aZx44okxePDgiFi927ak2txPlqe8c7RV3b56Vb7GpSx9VUpKaZlXqpRXvrzpq9qxxx4br776ajzzzDPLLNetW7fo1q1b7nXfvn3jo48+iosvvji23XbbrKtZrgEDBuT+v0ePHtG3b99Ye+2146abbophw4aVu0xN3Q+lrrvuuhgwYEC0a9euwjI1cV+UZ0W/Iyu7zKqwYMGCOPDAA2Px4sVx1VVXLbPslltumXcz2X79+sVmm20Wl19+efz1r3/NuqrlOuCAA3L/v9FGG0Xv3r2jc+fOMW7cuGUGODV1f1x//fUxZMiQ5d67qSbui4iau11rumX1+aX72bb96VZmG9rOFVvZ/tc2XfYxam3+nNa2fqyq92N1++ijj+KEE06Ixx57bJnHIatj2yIiFi9eHL17944//elPEfHjLy3eeOONuPrqq+PQQw/NlVsd23fbbbfFmDFj4h//+Ed07949pk6dGieeeGK0a9cuDjvssFy51bFt5anN/WSpFTlHi8iufZld+dSiRYuoW7dumcTsiy++KJMulmrTpk255evVqxfNmzfPqqrLddxxx8X9998fEyZMiA4dOqzw8ltuuWW1Xs2xtIYNG0aPHj0qrFNN3Q+lPvjggxg/fnz8+te/XuFla9K+KH361Ip8R0qXW9FlVoUFCxbE/vvvH9OmTYvHH398mVc9ladOnTqx+eab15j9E/Hj1XOdO3deZp1q6v745z//GW+//fZKfU+qe1+szPhBxZbs81e23+F/KrMN27RpE/Pnz48ZM2ZUWIZlW7r/tU3LV9Exam3+nNbGMeKn7Mea6qWXXoovvvgievXqFfXq1Yt69erFU089FX/961+jXr16ufqvjm2L+LGP2nDDDfOmbbDBBrmb3q/O++7UU0+NM844Iw488MDo0aNHHHLIIXHSSSflrmBbndu2pNrcTy5pWedoq7p9mYVPRUVF0atXr9wTyUo9/vjjsdVWW5W7TN++fcuUf+yxx6J3795RWFiYVVUrlFKKY489Nu6+++548skno0uXLiu1nilTpkTbtm2ruHYrb968efHmm29WWKeath+WdsMNN0SrVq1ijz32WOFla9K+6NKlS7Rp0yZvW8+fPz+eeuqpCr8jERXvn2Utk7XSTu3dd9+N8ePHr1RImVKKqVOn1pj9ExHx9ddfx0cffbTMOtXE/RHx49WBvXr1io033niFl63ufbEy4wcVW7LPX9l+h/+pzDbs1atXFBYW5pX57LPP4vXXX7edK2np/tc2zbe8Y9Ta/DmtTWNEVezHmmrHHXeM1157LaZOnZr717t37xgyZEhMnTo1unbtutq2LeLHq8TffvvtvGnvvPNOdO7cOSJW7303e/bsqFMnPyaoW7duLF68OCJW77YtqTb3k6WWd462yttX5bcwX8Ktt96aCgsL03XXXZf+/e9/pxNPPDE1bNgwvf/++ymllM4444x0yCGH5Mq/9957qUGDBumkk05K//73v9N1112XCgsL05133pllNSv0u9/9LjVt2jRNnDgxffbZZ7l/s2fPzpVZug1//vOf0z333JPeeeed9Prrr6czzjgjRUS66667qqMJKaWUTj755DRx4sT03nvvpeeeey4NHDgwNW7ceLXZD0tatGhR6tSpUzr99NPLzKuJ++K7775LU6ZMSVOmTEkRkS699NI0ZcqU3BMGLrjggtS0adN09913p9deey0NHjw4tW3bNs2aNSu3jkMOOSTv6S3/+te/Ut26ddMFF1yQ3nzzzXTBBRekevXqpeeee65a2rFgwYK01157pQ4dOqSpU6fmfVfmzZtXYTvOPvvs9Mgjj6T//ve/acqUKelXv/pVqlevXnr++eerpR3fffddOvnkk9Ozzz6bpk2bliZMmJD69u2b2rdvX6P2x/I+UymlNHPmzNSgQYN09dVXl7uOmrAvlmd54wcVW16fX5l+5+euKvruo446KnXo0CGNHz8+vfzyy2mHHXZIG2+8cVq4cGF1NataVUX/a5v+T2WOUWvz57S2jBFVtR9XF0s+7S6l1bttL7zwQqpXr14677zz0rvvvpvGjh2bGjRokMaMGZMrs7q277DDDkvt27dPDz74YJo2bVq6++67U4sWLdJpp52WK7O6tK22j+dVcY62KtuXafiUUkpXXnll6ty5cyoqKkqbbbZZ7tGhKf34we7fv39e+YkTJ6ZNN900FRUVpbXWWqvCk6dVISLK/XfDDTfkyizdhgsvvDCtvfbaqaSkJK255ppp6623TuPGjVv1lV/CAQcckNq2bZsKCwtTu3bt0j777JPeeOON3Pyavh+W9Oijj6aISG+//XaZeTVxX0yYMKHcz9Bhhx2WUvrxEZ8jRoxIbdq0ScXFxWnbbbdNr732Wt46+vfvnytf6o477kjdunVLhYWFaf311888UFtWO6ZNm1bhd2XChAkVtuPEE09MnTp1SkVFRally5Zpl112Sc8++2y1tWP27Nlpl112SS1btkyFhYWpU6dO6bDDDksffvhh3jqqe38s7zOVUkrXXHNNql+/fvr222/LXUdN2BeVsazxg4otr8+vTL/zc1cVffecOXPSsccem5o1a5bq16+fBg4cWKY/+Tmpiv7XNv2fyhyj1vbPaW0YI6pqP64ulg6fVve2PfDAA2mjjTZKxcXFaf31109/+9vf8uavru2bNWtWOuGEE1KnTp1SSUlJ6tq1axo+fHheYLG6tK22j+dVcY62KttXkNL/v5M0AAAAAFSxzO75BAAAAADCJwAAAAAyI3wCAAAAIDPCJwAAAAAyI3wCAAAAIDPCJwAAAAAyI3wCAAAAIDPCJwAAAAAyI3yCarTWWmvFX/7yl+quBsDPVkFBQdx7773VXQ0AVsL7778fBQUFMXXq1EzfZ+LEiVFQUBDffvttpu8DtZnwiWo1dOjQKCgoiIKCgigsLIyuXbvGKaecEj/88EN1V22VmDx5cvz2t7+t7moA1ErTp0+PE044IdZZZ50oKSmJ1q1bx9Zbbx2jR4+O2bNnV3f1AFiOJc8VCgoKonnz5rHbbrvFq6++Wq31Kg2jSv+1bNkyBgwYEK+88kq11gtqMuET1W633XaLzz77LN57770YOXJkXHXVVXHKKaeUKbdgwYJqqF22WrZsGQ0aNKjuagDUOu+9915suumm8dhjj8Wf/vSnmDJlSowfPz5OOumkeOCBB2L8+PHVXUUAKqH0XOGzzz6LJ554IurVqxcDBw6s7mpFRMTbb78dn332WYwbNy5mzJgRu+22W8ycObPcsjXxXKYm1onaS/hEtSsuLo42bdpEx44d46CDDoohQ4bEvffeG2effXZssskmcf3110fXrl2juLg4Ukoxc+bM+O1vfxutWrWKJk2axA477FDmrwwjR46MVq1aRePGjePXv/51nHHGGbHJJpvk5g8dOjT23nvvuPjii6Nt27bRvHnzOOaYY/I64DFjxkTv3r2jcePG0aZNmzjooIPiiy++yM0v/YvHE088Eb17944GDRrEVlttFW+//XZeXe6///7o3bt3lJSURIsWLWKfffbJzVv6Z3fLa9srr7wS22+/fTRu3DiaNGkSvXr1ihdffPGn7gKAWufoo4+OevXqxYsvvhj7779/bLDBBtGjR4/45S9/GePGjYs999yzzDLl/axi6tSpUVBQEO+//35u2r/+9a/o379/NGjQINZcc83YddddY8aMGRERMW/evDj++OOjVatWUVJSEltvvXVMnjw5t+yMGTNiyJAh0bJly6hfv36su+66ccMNN+Tmf/LJJ3HAAQfEmmuuGc2bN49BgwblvTfAz03puUKbNm1ik002idNPPz0++uij+PLLL8st/9RTT0WfPn2iuLg42rZtG2eccUYsXLgwN395/XRExEMPPRTrrbde1K9fP7bffvsK++FWrVpFmzZtok+fPnHJJZfE9OnT47nnnsv9HPD222+P7bbbLkpKSmLMmDEREXHDDTfEBhtsECUlJbH++uvHVVddlVvf/Pnz49hjj422bdtGSUlJrLXWWnH++efn5p999tnRqVOnKC4ujnbt2sXxxx+fm1fez8jXWGONuPHGGyMiVrpOUFWET9Q49evXz4VA//nPf+L222+Pu+66K/db7j322COmT58eDz30ULz00kux2WabxY477hjffPNNRESMHTs2zjvvvLjwwgvjpZdeik6dOsXVV19d5n0mTJgQ//3vf2PChAlx0003xY033pjrnCN+7Pz/+Mc/xiuvvBL33ntvTJs2LYYOHVpmPcOHD49LLrkkXnzxxahXr14cfvjhuXnjxo2LffbZJ/bYY4+YMmVKLqgqT0ppuW0bMmRIdOjQISZPnhwvvfRSnHHGGVFYWLgymxmg1vr666/jsccei2OOOSYaNmxYbpmCgoKVWvfUqVNjxx13jO7du8ekSZPimWeeiT333DMWLVoUERGnnXZa3HXXXXHTTTfFyy+/HOuss07suuuuuX78rLPOin//+9/x8MMPx5tvvhlXX311tGjRIiIiZs+eHdtvv300atQonn766XjmmWeiUaNGsdtuu8X8+fNXqr4Atcn3338fY8eOjXXWWSeaN29eZv4nn3wSu+++e2y++ebxyiuvxNVXXx3XXXddjBw5Mldmef30Rx99FPvss0/svvvuMXXq1Nwfspenfv36EZF/NdHpp58exx9/fLz55pux6667xrXXXhvDhw+P8847L958883405/+FGeddVbcdNNNERHx17/+Ne6///64/fbb4+23344xY8bEWmutFRERd955Z/z5z3+Oa665Jt5999249957o0ePHiu8DVe0TlBlElSjww47LA0aNCj3+vnnn0/NmzdP+++/fxoxYkQqLCxMX3zxRW7+E088kZo0aZLmzp2bt5611147XXPNNSmllLbYYot0zDHH5M3v169f2njjjfPet3PnzmnhwoW5afvtt1864IADKqzrCy+8kCIifffddymllCZMmJAiIo0fPz5XZty4cSki0pw5c1JKKfXt2zcNGTKkwnV27tw5/fnPf6502xo3bpxuvPHGCtcHQErPPfdcioh09913501v3rx5atiwYWrYsGE67bTTUkopRUS65557Ukr/69dnzJiRW2bKlCkpItK0adNSSikNHjw49evXr9z3/f7771NhYWEaO3Zsbtr8+fNTu3bt0qhRo1JKKe25557pV7/6VbnLX3fddalbt25p8eLFuWnz5s1L9evXT48++ugKbQOA2uCwww5LdevWzfXdEZHatm2bXnrppZRSStOmTUsRkaZMmZJSSukPf/hDmX70yiuvTI0aNUqLFi2qVD/9+9//Pm2wwQZ56zj99NPzxoelx4uvvvoq7bXXXqlx48bp888/z9XrL3/5S157OnbsmP7xj3/kTfvjH/+Y+vbtm1JK6bjjjks77LBD3nuXuuSSS9J6662X5s+fX+62WnI8K9W0adN0ww035G2rFa0TVBVXPlHtHnzwwWjUqFGUlJRE3759Y9ttt43LL788IiI6d+4cLVu2zJV96aWX4vvvv4/mzZtHo0aNcv+mTZsW//3vfyPix99e9+nTJ+89ln4dEdG9e/eoW7du7nXbtm3zflY3ZcqUGDRoUHTu3DkaN24c2223XUREfPjhh3nr6dmzZ946IiK3ntK/kFdGZdo2bNiw+PWvfx077bRTXHDBBbnpAJS19NVNL7zwQkydOjW6d+8e8+bNW6l1Lqtf/+9//xsLFiyIfv365aYVFhZGnz594s0334yIiN/97ndx6623xiabbBKnnXZaPPvss7myL730UvznP/+Jxo0b58aAZs2axdy5c/X3wM/W9ttvH1OnTo2pU6fG888/H7vssksMGDAgPvjggzJl33zzzejbt29e/9+vX7/4/vvv4+OPP65UP/3mm2/GlltumbeOvn37llu3Dh06RKNGjaJFixbx5ptvxh133BGtWrXKzV/yFw9ffvllfPTRR3HEEUfkHeuPHDky18cPHTo0pk6dGt26dYvjjz8+Hnvssdzy++23X8yZMye6du0av/nNb+Kee+7J+zlhZa1onaCq1KvuCsD2228fV199dRQWFka7du3yfka29M8lFi9eHG3bto2JEyeWWc8aa6yR+/+lTzhSSmXKL/1ztYKCgli8eHFERPzwww+xyy67xC677BJjxoyJli1bxocffhi77rprmZ8+LLme0vctXU/p5beVUZm2nX322XHQQQfFuHHj4uGHH44RI0bErbfeGr/4xS8q/T4Atd0666wTBQUF8dZbb+VN79q1a0RU3DfXqfPj3+SWHDOWvhnrsvr10uXKG4NKp5WeMI0bNy7Gjx8fO+64YxxzzDFx8cUXx+LFi6NXr14xduzYMute8g8xAD8nDRs2jHXWWSf3ulevXtG0adO49tpr49e//nVe2SX72yWnRfzYN1emny7vvKEi//znP6NJkybRsmXLaNKkSbl1L1V6fnDttdfGFltskVeu9A/im222WUybNi0efvjhGD9+fOy///6x0047xZ133hkdO3aMt99+Ox5//PEYP358HH300XHRRRfFU089FYWFhXntK1XeDcVXtE5QVVz5RLUrHVA6d+683PsXbbbZZjF9+vSoV69erLPOOnn/Su+Z0a1bt3jhhRfyllvRm3K/9dZb8dVXX8UFF1wQ22yzTay//vp5V0VVVs+ePeOJJ56oVNnKtC0iYr311ouTTjopHnvssdhnn33yblQLQETz5s1j5513jiuuuCJ++OGHSi9XGvB89tlnuWml9xsstax+fZ111omioqJ45plnctMWLFgQL774YmywwQZ57zN06NAYM2ZM/OUvf4m//e1vEfHjOPDuu+9Gq1atyowDTZs2rXQ7AGqzgoKCqFOnTsyZM6fMvA033DCeffbZvBDm2WefjcaNG0f79u0r1U9vuOGG8dxzz+Wtd+nXpbp06RJrr712ucHT0lq3bh3t27eP9957r0wf36VLl1y5Jk2axAEHHBDXXntt3HbbbXHXXXfl7kdVv3792GuvveKvf/1rTJw4MSZNmhSvvfZaRPw4tiw5fr377rsxe/bsKqkTVAVXPrFa2WmnnaJv376x9957x4UXXhjdunWLTz/9NB566KHYe++9o3fv3nHcccfFb37zm+jdu3dstdVWcdttt8Wrr76a+4t3ZXTq1CmKiori8ssvj6OOOipef/31+OMf/7jC9R0xYkTsuOOOsfbaa8eBBx4YCxcujIcffjhOO+20FW5b9+7d49RTT4199903unTpEh9//HFMnjw5fvnLX65wvQBqu6uuuir69esXvXv3jrPPPjt69uwZderUicmTJ8dbb70VvXr1KrPMOuusEx07doyzzz47Ro4cGe+++25ccskleWV+//vfR48ePeLoo4+Oo446KoqKimLChAmx3377RYsWLeJ3v/tdnHrqqdGsWbPo1KlTjBo1KmbPnh1HHHFERET83//9X/Tq1Sv3078HH3wwd8IzZMiQuOiii2LQoEFx7rnnRocOHeLDDz+Mu+++O0499dTo0KFD9hsOoIaZN29eTJ8+PSJ+fGLoFVdcEd9//325Ty09+uij4y9/+Uscd9xxceyxx8bbb78dI0aMiGHDhkWdOnWiYcOGy+2njzrqqLjkkkti2LBhceSRR8ZLL72U91Cin+Lss8+O448/Ppo0aRIDBgyIefPmxYsvvhgzZsyIYcOGxZ///Odo27ZtbLLJJlGnTp244447ok2bNrmn1i1atCi22GKLaNCgQfz973+P+vXrR+fOnSMiYocddogrrrgittxyy1i8eHGcfvrplXow0fLqBFWmmu41BSmlsjccX9KIESPybhJeatasWem4445L7dq1S4WFhaljx45pyJAh6cMPP8yVOffcc1OLFi1So0aN0uGHH56OP/74tOWWWy7zfU844YTUv3//3Ot//OMfaa211krFxcWpb9++6f7778+7oWFlbkybUkp33XVX2mSTTVJRUVFq0aJF2meffXLzlrzh+PLaNm/evHTggQemjh07pqKiotSuXbt07LHH5m5uDkC+Tz/9NB177LGpS5cuqbCwMDVq1Cj16dMnXXTRRemHH35IKZW9QeszzzyTevTokUpKStI222yT7rjjjjL9+sSJE9NWW22ViouL0xprrJF23XXX3FgwZ86cdNxxx6UWLVqk4uLi1K9fv/TCCy/klv3jH/+YNthgg1S/fv3UrFmzNGjQoPTee+/l5n/22Wfp0EMPzS3ftWvX9Jvf/CbNnDkz020FUBMddthhKSJy/xo3bpw233zzdOedd6aUyt5wPKUf++jNN988FRUVpTZt2qTTTz89LViwIDd/ef10Sik98MADaZ111knFxcVpm222Sddff/0ybzi+tPLqVWrs2LG5c4M111wzbbvttrkHZPztb39Lm2yySWrYsGFq0qRJ2nHHHdPLL7+cUkrpnnvuSVtssUVq0qRJatiwYdpyyy3zHnz0ySefpF122SU1bNgwrbvuuumhhx4q94bjK1onqCoFKa3Aj1phNbXzzjtHmzZt4u9//3t1VwUAAAB+Vvzsjlpn9uzZMXr06Nh1112jbt26ccstt8T48ePj8ccfr+6qAQAAwM+OK5+odebMmRN77rlnvPzyyzFv3rzo1q1bnHnmmbHPPvtUd9UAAADgZ0f4BAAAAEBm6lR3BQAAAACovYRPAAAAAGRG+AQAAABAZoRPAAAAAGRG+AQAAABAZoRPAAAAAGRG+AQAAABAZoRPAAAAAGRG+AQAAABAZv4fdfPLikNXuHMAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x600 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#visulization \n",
    "\n",
    "\n",
    "plt.figure(figsize=(12,6))\n",
    "\n",
    "for i,col in enumerate(df.columns[:3]): #only first 3 features\n",
    "    plt.subplot(1,3,i+1)\n",
    "    sns.boxplot(x = df[col])\n",
    "    plt.title(f'blot box for {col}') \n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "bfeafeea-e3b7-4d60-ac2e-98a6d5bef6fe",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# Function to detect and replace outliers using IQR\n",
    "def detect_outliers_iqr(column):\n",
    "    q1 = column.quantile(0.1)\n",
    "    q3 = column.quantile(0.9)\n",
    "    iqr = q3 - q1\n",
    "\n",
    "\n",
    "    lower_b = q1 - (1.5 * iqr)\n",
    "    upper_b = q3 + (1.5 * iqr)\n",
    "\n",
    "    if iqr == 0:  # Skip low variance columns\n",
    "        return column\n",
    "         \n",
    "    # Replace outliers with NaN  \n",
    "    return column.where((column >= lower_b) & (column <= upper_b), np.nan)\n",
    "\n",
    "# Apply only to numerical columns\n",
    "for col in df.columns:\n",
    "    df[col] = detect_outliers_iqr(df[col])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "231192ef-c38b-4718-b35c-505a3b7fe9d3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pregnancies                  0\n",
      "Glucose                      0\n",
      "BloodPressure               35\n",
      "SkinThickness                0\n",
      "Insulin                      8\n",
      "BMI                          0\n",
      "DiabetesPedigreeFunction     4\n",
      "Age                          0\n",
      "Outcome                      0\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# check if any Null value is present from outlaiers\n",
    "null_count = df.isnull().sum()\n",
    "print(null_count)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "256f17e6-6ae3-4114-b471-e7396c1d594b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# handeling missing values for numarical data using mean\n",
    "for column in df.select_dtypes(include = ['float64']).columns:\n",
    "    fillValue = df[column].mean() \n",
    "    df[column] = df[column].fillna(fillValue)\n",
    "for column in df.select_dtypes(include = ['int64']).columns:\n",
    "    fillValue = df[column].mean() \n",
    "    df[column] = df[column].fillna(fillValue)\n",
    "\n",
    "# handeling missing values for catagorical data using mode\n",
    "for column in df.select_dtypes(include = ['object']).columns:\n",
    "    fillValue = df[column].mode()[0]\n",
    "    df[column] = df[column].fillna(fillValue)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "624386f3-0079-426b-82ba-8d131d529304",
   "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": [
    "# check if any Null value is present from outlaiers\n",
    "null_count = df.isnull().sum()\n",
    "print(null_count)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "78b45712-ec77-4647-90f3-e9cab7593acb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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fyAAAADnU6H7zps2barvv/9ey5cv144dO2RZltq3b68hQ4ZUdn2A2803Sw88IO3bJ61YIQ0dandFAADA01zWyO3KlSvVvn17HT9+XJJ0zTXX6P7779cDDzygnj17qkOHDlqzZk2VFAoEBkq33Waev/GGvbUAAADPdFnh9uWXX9Zvf/tb1a1b95xzoaGhuuuuu/Tiiy9WWnHA2e6+2zx++KF04IC9tQAAAM9zWeF2y5Ytuvbaay94fujQodq0adMVFwVcSPv20oABZs4ty4IBAICzXVa4PXz48HmXACvl4+OjI0eOXHFRwMXcc495fOst6dQpe2sBAACe5bLCbePGjZWYmHjB81u3blVUVNQVFwVczI03ShERUlqamZ4AAABQ6rLC7YgRI/THP/5RBQUF55zLz8/XtGnTNGrUqEorDjgfPz/pzjvN89des7cWAADgWS4r3D7xxBM6duyYWrdureeff14ffvihli5dqueee05t2rTRsWPHNHXq1KqqFXD7f/9P8vKSVq2SduywuxoAAOApLmud24iICK1bt0733HOPpkyZIsuyJEkul0vDhg3Ta6+9poiIiCopFDhTTIw0apS0dKlZFuzll+2uCAAAeILL3sQhNjZWn3zyibKysrR7925ZlqW4uDjVr1+/KuoDLuiee0y4fftt6ZlnpOBguysCAAB2q9D2u5JUv3599ezZU7/4xS8ItrDF0KFSixZSTo60cKHd1QAAAE9Q4XAL2M3Lq2xTh9dek36aJQMAAGoxwi1qtN/8RvL3l77/Xtqwwe5qAACA3Qi3qNHCwqRbbjHPWRYMAADYGm6/+uorXXfddYqOjpbL5dIHH3xQ7rxlWZo+fbqio6MVGBiogQMHKikpqVyfwsJC3X///QoLC1NwcLCuv/56HThwoBq/BexWumPZokVSZqa9tQAAAHvZGm5PnDihzp07a9asWec9//zzz+vFF1/UrFmztGHDBkVGRuqaa65Rbm6uu8/kyZO1ZMkSLVy4UGvXrlVeXp5GjRql4uLi6voasFnv3lLXrlJBgdmSFwAA1F62htvhw4fr6aef1ujRo885Z1mWXn75ZU2dOlWjR49WfHy85s2bp5MnT2rBggWSpJycHM2ePVsvvPCChgwZoq5du2r+/PlKTEzUihUrqvvrwCYul/Tgg+b5q69Kp07ZWw8AALCPx8653bt3r9LT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poYNG17wPZfq+PHjatq0qVJTU1W3bt0r+ixcOq67Pbju9uC6Vz+uuT247vbw1OtuWZZyc3MVHR190X41PtyGhYXJ29tb6enp5Y5nZGQoIuL8c1P8/f3l7+9f7lhlD6fXrVvXo34haguuuz247vbgulc/rrk9uO728MTrHhoa+rN9avwqbX5+furevbuWL19e7vjy5cvVt29fm6oCAACAHWr8yK0kPfTQQ7rtttvUo0cP9enTR3/729+UkpKiu+++2+7SAAAAUI0cEW7HjBmjo0eP6qmnnlJaWpri4+P1ySefKDY2ttpr8ff317Rp086Z9oCqxXW3B9fdHlz36sc1twfX3R41/bq7LOvn1lMAAAAAaoYaP+cWAAAAKEW4BQAAgGMQbgEAAOAYhFsAAAA4BuG2AmbOnKmePXsqJCRE4eHhuuGGG7Rz585yfSzL0vTp0xUdHa3AwEANHDhQSUlJNlXsDK+//ro6derkXlS6T58++vTTT93nueZVb+bMmXK5XJo8ebL7GNe9akyfPl0ul6tci4yMdJ/nuledgwcPavz48WrYsKGCgoLUpUsXbdq0yX2ea1/5mjVrds7vu8vl0u9+9ztJXPOqcPr0aT3xxBNq3ry5AgMD1aJFCz311FMqKSlx96mx1/2im/PivIYNG2bNnTvX2rZtm7V582Zr5MiRVkxMjJWXl+fu8+yzz1ohISHWv//9bysxMdEaM2aMFRUVZR0/ftzGymu2pUuXWh9//LG1c+dOa+fOndbjjz9u+fr6Wtu2bbMsi2te1davX281a9bM6tSpk/Xggw+6j3Pdq8a0adOsDh06WGlpae6WkZHhPs91rxrHjh2zYmNjrYkTJ1rfffedtXfvXmvFihXW7t273X249pUvIyOj3O/68uXLLUnWqlWrLMvimleFp59+2mrYsKH10UcfWXv37rX++c9/WnXq1LFefvlld5+aet0Jt5UgIyPDkmStXr3asizLKikpsSIjI61nn33W3aegoMAKDQ213njjDbvKdKT69etbf//737nmVSw3N9eKi4uzli9fbg0YMMAdbrnuVWfatGlW586dz3uO6151HnvsMevqq6++4HmuffV48MEHrZYtW1olJSVc8yoycuRI64477ih3bPTo0db48eMty6rZv+tMS6gEOTk5kqQGDRpIkvbu3av09HQNHTrU3cff318DBgzQunXrbKnRaYqLi7Vw4UKdOHFCffr04ZpXsd/97ncaOXKkhgwZUu44171q7dq1S9HR0WrevLnGjh2rPXv2SOK6V6WlS5eqR48e+tWvfqXw8HB17dpVb731lvs8177qFRUVaf78+brjjjvkcrm45lXk6quv1hdffKEff/xRkrRlyxatXbtWI0aMkFSzf9cdsUOZnSzL0kMPPaSrr75a8fHxkqT09HRJUkRERLm+ERER2r9/f7XX6CSJiYnq06ePCgoKVKdOHS1ZskTt27d3/w+Na175Fi5cqO+//14bNmw45xy/61WnV69eeuedd9S6dWsdPnxYTz/9tPr27aukpCSuexXas2ePXn/9dT300EN6/PHHtX79ej3wwAPy9/fX7bffzrWvBh988IGys7M1ceJESfw5U1Uee+wx5eTkqG3btvL29lZxcbGeeeYZjRs3TlLNvu6E2yt03333aevWrVq7du0551wuV7nXlmWdcwyXp02bNtq8ebOys7P173//WxMmTNDq1avd57nmlSs1NVUPPvigli1bpoCAgAv247pXvuHDh7ufd+zYUX369FHLli01b9489e7dWxLXvSqUlJSoR48emjFjhiSpa9euSkpK0uuvv67bb7/d3Y9rX3Vmz56t4cOHKzo6utxxrnnlWrRokebPn68FCxaoQ4cO2rx5syZPnqzo6GhNmDDB3a8mXnemJVyB+++/X0uXLtWqVavUpEkT9/HSO5pL/9ZTKiMj45y/AeHy+Pn5qVWrVurRo4dmzpypzp076y9/+QvXvIps2rRJGRkZ6t69u3x8fOTj46PVq1frr3/9q3x8fNzXlute9YKDg9WxY0ft2rWL3/cqFBUVpfbt25c71q5dO6WkpEjiz/eqtn//fq1YsUJ33nmn+xjXvGr8z//8j/7whz9o7Nix6tixo2677Tb9/ve/18yZMyXV7OtOuK0Ay7J03333afHixVq5cqWaN29e7nzz5s0VGRmp5cuXu48VFRVp9erV6tu3b3WX62iWZamwsJBrXkUGDx6sxMREbd682d169OihX//619q8ebNatGjBda8mhYWFSk5OVlRUFL/vVeiqq646Z2nHH3/8UbGxsZL4872qzZ07V+Hh4Ro5cqT7GNe8apw8eVJeXuVjoLe3t3spsBp93e26k60mu+eee6zQ0FDryy+/LLd0ycmTJ919nn32WSs0NNRavHixlZiYaI0bN65GLJ/hyaZMmWJ99dVX1t69e62tW7dajz/+uOXl5WUtW7bMsiyueXU5c7UEy+K6V5WHH37Y+vLLL609e/ZY3377rTVq1CgrJCTE2rdvn2VZXPeqsn79esvHx8d65plnrF27dlnvvvuuFRQUZM2fP9/dh2tfNYqLi62YmBjrscceO+cc17zyTZgwwWrcuLF7KbDFixdbYWFh1qOPPuruU1OvO+G2AiSdt82dO9fdp6SkxJo2bZoVGRlp+fv7W/3797cSExPtK9oB7rjjDis2Ntby8/OzGjVqZA0ePNgdbC2La15dzg63XPeqUbqepK+vrxUdHW2NHj3aSkpKcp/nuled//znP1Z8fLzl7+9vtW3b1vrb3/5W7jzXvmp8/vnnliRr586d55zjmle+48ePWw8++KAVExNjBQQEWC1atLCmTp1qFRYWuvvU1OvusizLsnHgGAAAAKg0zLkFAACAYxBuAQAA4BiEWwAAADgG4RYAAACOQbgFAACAYxBuAQAA4BiEWwAAADgG4RYAAACOQbgFAACAYxBuAaCGWbdunby9vXXttdfaXQoAeBy23wWAGubOO+9UnTp19Pe//13bt29XTEyM3SUBgMdg5BYAapATJ07o/fff1z333KNRo0bp7bffLnd+6dKliouLU2BgoBISEjRv3jy5XC5lZ2e7+6xbt079+/dXYGCgmjZtqgceeEAnTpyo3i8CAFWEcAsANciiRYvUpk0btWnTRuPHj9fcuXNV+g9w+/bt080336wbbrhBmzdv1l133aWpU6eWe39iYqKGDRum0aNHa+vWrVq0aJHWrl2r++67z46vAwCVjmkJAFCDXHXVVbrlllv04IMP6vTp04qKitJ7772nIUOG6A9/+IM+/vhjJSYmuvs/8cQTeuaZZ5SVlaV69erp9ttvV2BgoN588013n7Vr12rAgAE6ceKEAgIC7PhaAFBpGLkFgBpi586dWr9+vcaOHStJ8vHx0ZgxYzRnzhz3+Z49e5Z7zy9+8Ytyrzdt2qS3335bderUcbdhw4appKREe/furZ4vAgBVyMfuAgAAl2b27Nk6ffq0Gjdu7D5mWZZ8fX2VlZUly7LkcrnKvefsf5wrKSnRXXfdpQceeOCcz+fGNABOQLgFgBrg9OnTeuedd/TCCy9o6NCh5c7ddNNNevfdd9W2bVt98skn5c5t3Lix3Otu3bopKSlJrVq1qvKaAcAOzLkFgBrggw8+0JgxY5SRkaHQ0NBy56ZOnapPPvlEixcvVps2bfT73/9ekyZN0ubNm/Xwww/rwIEDys7OVmhoqLZu3arevXvrN7/5jX77298qODhYycnJWr58uV555RWbvh0AVB7m3AJADTB79mwNGTLknGArmZHbzZs3KysrS//617+0ePFiderUSa+//rp7tQR/f39JUqdOnbR69Wrt2rVL/fr1U9euXfXkk08qKiqqWr8PAFQVRm4BwMGeeeYZvfHGG0pNTbW7FACoFsy5BQAHee2119SzZ081bNhQX3/9tf785z+zhi2AWoVwCwAOsmvXLj399NM6duyYYmJi9PDDD2vKlCl2lwUA1YZpCQAAAHAMbigDAACAYxBuAQAA4BiEWwAAADgG4RYAAACOQbgFAACAYxBuAQAA4BiEWwAAADgG4RYAAACO8f8BfPftmFm8jaUAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Data visulization \n",
    "\n",
    "plt.figure(figsize=(8,6))\n",
    "sns.histplot(df['Age'], bins=15, kde = True, color = 'blue')\n",
    "plt.title('Age class count')\n",
    "plt.xlabel('Age')\n",
    "plt.ylabel('Count')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "de17624a-d687-48de-915f-d4541b59be18",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_11668\\539581794.py:4: FutureWarning: \n",
      "\n",
      "Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n",
      "\n",
      "  sns.countplot(x = 'Outcome', data = df, palette ='Set1')\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArcAAAIhCAYAAABUopIpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAtP0lEQVR4nO3df5zWdZ3v/+cVAyMgTPywGacmwRO5EmgdMBIrIAWi1FordTWzzXY1lZqU48m0ROsGGx6BU6hte0os8+Dt7C3MPZmK+aNcNJFy80e7/VgSMJA0mgFDoPH6/rHH67sj+INh4MJ39/vt9rnduj6f93V9Xp/5Y3r06TMXlWq1Wg0AABTgVfUeAAAAeou4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4Behl9913Xz70oQ/lwAMPTL9+/dLS0pIPfvCDuffee3v8mXPmzMmNN97Ye0MCFErcAvSir3zlKznqqKOydu3azJs3L7fffnv+x//4H3n88cfz9re/PYsWLerR54pbgJenod4DAJTin//5n9Pe3p73vOc9Wbp0aRoa/v9fsSeffHL+8i//Mp/61Kfylre8JUcddVQdJwUolzu3AL1k7ty5qVQqufrqq7uFbZI0NDTkqquuSqVSyd/93d8lST760Y9mxIgRO3zO7NmzU6lUaq8rlUqefvrpXHvttalUKqlUKpk8eXLt+OOPP56//du/TVtbW/r165fW1tZ88IMfzBNPPFFbs3r16nz4wx/Oa17zmjQ2NubQQw/NFVdckWeffba25je/+U0qlUouv/zyfOlLX8qIESPSv3//TJ48Ob/4xS+yffv2fOYzn0lra2uampryl3/5l9mwYcMO899www058sgjM3DgwOy///6ZPn16fvrTn/b0xwqwS9y5BegFXV1dufPOOzN+/Pi87nWv2+matra2jBs3LnfccUe6urpe9mffe++9ede73pUpU6bkc5/7XJJk8ODBSf4jbI844ohs3749n/3sZ3PYYYflqaeeyq233pqNGzemubk5v/vd7zJx4sRs27YtX/jCFzJixIj83//7fzNr1qz8+te/zlVXXdXtfFdeeWUOO+ywXHnllfnDH/6Q888/P8cdd1wmTJiQvn375hvf+EYee+yxzJo1Kx//+Mdz00031d47Z86cXHzxxfnrv/7rXHzxxdm2bVsuv/zyvOMd78j999+f0aNH7+qPFmCXiFuAXvDkk0/mj3/8Y0aOHPmi60aOHJn7778/Tz311Mv+7Le97W151atelQMOOCBve9vbuh37/Oc/nyeffDL/8i//kkMPPbS2/8QTT6z95/nz5+fxxx/Pj3/847z1rW9NkkyfPj1dXV356le/mvb29rzxjW+srX/1q1+dG2+8Ma961atq19be3p6/+Iu/yHe/+93aun/913/NwoUL09nZmcGDB2fNmjW55JJLcu655+bLX/5ybd3UqVMzatSoXHrppbnhhhte9nUD9ITHEgD2omq1miTdHjvYHd///vczZcqUbmH7fHfccUdGjx5dC9vnfPSjH021Ws0dd9zRbf973vOeWtgmqX32e9/73m7rntu/evXqJMmtt96aP/3pT/nIRz6SP/3pT7Vtv/32y6RJk3LXXXf1+DoBXi53bgF6wfDhwzNgwICsWrXqRdf95je/yYABAzJ06NBeOe/vfve7F3wM4jlPPfXUTp/tbW1trR3/z54/W79+/V50/zPPPJMktWd8jzjiiJ3O8Z+DGWBPEbcAvaBPnz6ZMmVKbrnllqxdu3anwbl27dqsXLkyM2bMSJ8+fbLffvtl69atO6x78sknX/Z5DzjggKxdu/ZF1wwbNizr1q3bYf9vf/vbJP8R5r3huc/5x3/8xxx00EG98pkAu8r/jAboJRdeeGGq1WrOPvvsHf5grKurK5/4xCdSrVZz4YUXJklGjBiRDRs2dPtWg23btuXWW2/d4bMbGxuzZcuWHfbPmDEjd955Z/7t3/7tBec6+uij8+ijj+YnP/lJt/3f/OY3U6lUMmXKlF26zhcyffr0NDQ05Ne//nXGjx+/0w1gT3PnFqCXHHXUUVm4cGHa29vz9re/Peeee25e//rXZ/Xq1bnyyivz4x//OAsXLszEiROTJCeddFI+//nP5+STT85/+2//Lc8880y+/OUv7/SbFMaOHZu77ror//RP/5QDDzwwgwYNyiGHHJLLLrss3//+9/POd74zn/3sZzN27Nj84Q9/yC233JLzzjsvf/EXf5FPf/rT+eY3v5n3vve9ueyyy3LQQQfle9/7Xq666qp84hOf6PbHZLtjxIgRueyyy3LRRRfl3//93/Pud787Q4YMyRNPPJH7778/AwcOzKWXXtor5wJ4QVUAetW9995b/eAHP1htbm6uNjQ0VF/zmtdUTzjhhOry5ct3WHvzzTdX3/zmN1f79+9fPfjgg6uLFi2qXnLJJdXn/3p+8MEHq0cddVR1wIAB1STVSZMm1Y6tWbOm+rGPfaza0tJS7du3b7W1tbV64oknVp944onamscee6x6yimnVIcNG1bt27dv9ZBDDqlefvnl1a6urtqaVatWVZNUL7/88m7nvvPOO6tJqv/n//yfbvuvueaaapLqihUruu2/8cYbq1OmTKkOHjy42tjYWD3ooIOqH/zgB6u33377Lv8sAXZVpVr9f3+6CwAAr3CeuQUAoBjiFgCAYohbAACKIW4BACiGuAUAoBjiFgCAYvhHHJI8++yz+e1vf5tBgwalUqnUexwAAJ6nWq1m06ZNaW1tzate9cL3Z8Vt/uPfV29ra6v3GAAAvIQ1a9bkda973QseF7dJBg0alOQ/fliDBw+u8zQAADxfZ2dn2traat32QsRtUnsUYfDgweIWAGAf9lKPkPqDMgAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAYdY3b2bNnp1KpdNtaWlpqx6vVambPnp3W1tb0798/kydPziOPPNLtM7Zu3ZqZM2dm+PDhGThwYI4//visXbt2b18KAAD7gLrfuX3Tm96UdevW1baHHnqodmzevHmZP39+Fi1alBUrVqSlpSVTp07Npk2bamva29uzdOnSLFmyJPfcc082b96cY489Nl1dXfW4HAAA6qih7gM0NHS7W/ucarWahQsX5qKLLsoJJ5yQJLn22mvT3Nyc66+/PmeeeWY6Ojry9a9/Pd/61rdyzDHHJEmuu+66tLW15fbbb8/06dP36rUAAFBfdb9z+8tf/jKtra0ZOXJkTj755Pz7v/97kmTVqlVZv359pk2bVlvb2NiYSZMmZfny5UmSlStXZvv27d3WtLa2ZsyYMbU1O7N169Z0dnZ22wAAeOWr653bCRMm5Jvf/Gbe+MY35oknnsgXv/jFTJw4MY888kjWr1+fJGlubu72nubm5jz22GNJkvXr16dfv34ZMmTIDmuee//OzJ07N5deemkvX03PPTD+rfUeAdhDxj9wf71HAPizUtc7tzNmzMgHPvCBjB07Nsccc0y+973vJfmPxw+eU6lUur2nWq3usO/5XmrNhRdemI6Ojtq2Zs2a3bgKAAD2FXV/LOE/GzhwYMaOHZtf/vKXtedwn38HdsOGDbW7uS0tLdm2bVs2btz4gmt2prGxMYMHD+62AQDwyrdPxe3WrVvz85//PAceeGBGjhyZlpaWLFu2rHZ827ZtufvuuzNx4sQkybhx49K3b99ua9atW5eHH364tgYAgD8fdX3mdtasWTnuuOPy+te/Phs2bMgXv/jFdHZ25vTTT0+lUkl7e3vmzJmTUaNGZdSoUZkzZ04GDBiQU045JUnS1NSUM844I+eff36GDRuWoUOHZtasWbXHHAAA+PNS17hdu3Zt/uqv/ipPPvlkDjjggLztbW/Lfffdl4MOOihJcsEFF2TLli05++yzs3HjxkyYMCG33XZbBg0aVPuMBQsWpKGhISeeeGK2bNmSo48+OosXL06fPn3qdVkAANRJpVqtVus9RL11dnamqakpHR0ddXn+1rclQLl8WwJA73i5vbZPPXMLAAC7Q9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUY5+J27lz56ZSqaS9vb22r1qtZvbs2WltbU3//v0zefLkPPLII93et3Xr1sycOTPDhw/PwIEDc/zxx2ft2rV7eXoAAPYF+0TcrlixIl/72tdy2GGHdds/b968zJ8/P4sWLcqKFSvS0tKSqVOnZtOmTbU17e3tWbp0aZYsWZJ77rknmzdvzrHHHpuurq69fRkAANRZ3eN28+bNOfXUU/MP//APGTJkSG1/tVrNwoULc9FFF+WEE07ImDFjcu211+aPf/xjrr/++iRJR0dHvv71r+eKK67IMccck7e85S257rrr8tBDD+X222+v1yUBAFAndY/bc845J+9973tzzDHHdNu/atWqrF+/PtOmTavta2xszKRJk7J8+fIkycqVK7N9+/Zua1pbWzNmzJjamp3ZunVrOjs7u20AALzyNdTz5EuWLMlPfvKTrFixYodj69evT5I0Nzd329/c3JzHHnustqZfv37d7vg+t+a59+/M3Llzc+mll+7u+AAA7GPqdud2zZo1+dSnPpXrrrsu++233wuuq1Qq3V5Xq9Ud9j3fS6258MIL09HRUdvWrFmza8MDALBPqlvcrly5Mhs2bMi4cePS0NCQhoaG3H333fnyl7+choaG2h3b59+B3bBhQ+1YS0tLtm3blo0bN77gmp1pbGzM4MGDu20AALzy1S1ujz766Dz00EN58MEHa9v48eNz6qmn5sEHH8zBBx+clpaWLFu2rPaebdu25e67787EiROTJOPGjUvfvn27rVm3bl0efvjh2hoAAP581O2Z20GDBmXMmDHd9g0cODDDhg2r7W9vb8+cOXMyatSojBo1KnPmzMmAAQNyyimnJEmamppyxhln5Pzzz8+wYcMydOjQzJo1K2PHjt3hD9QAAChfXf+g7KVccMEF2bJlS84+++xs3LgxEyZMyG233ZZBgwbV1ixYsCANDQ058cQTs2XLlhx99NFZvHhx+vTpU8fJAQCoh0q1Wq3We4h66+zsTFNTUzo6Oury/O0D49+6188J7B3jH7i/3iMAFOHl9lrdv+cWAAB6i7gFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAoRl3j9uqrr85hhx2WwYMHZ/DgwTnyyCPz/e9/v3a8Wq1m9uzZaW1tTf/+/TN58uQ88sgj3T5j69atmTlzZoYPH56BAwfm+OOPz9q1a/f2pQAAsA+oa9y+7nWvy9/93d/lgQceyAMPPJB3vetded/73lcL2Hnz5mX+/PlZtGhRVqxYkZaWlkydOjWbNm2qfUZ7e3uWLl2aJUuW5J577snmzZtz7LHHpqurq16XBQBAnVSq1Wq13kP8Z0OHDs3ll1+ej33sY2ltbU17e3v++3//70n+4y5tc3NzvvSlL+XMM89MR0dHDjjggHzrW9/KSSedlCT57W9/m7a2ttx8882ZPn36yzpnZ2dnmpqa0tHRkcGDB++xa3shD4x/614/J7B3jH/g/nqPAFCEl9tr+8wzt11dXVmyZEmefvrpHHnkkVm1alXWr1+fadOm1dY0NjZm0qRJWb58eZJk5cqV2b59e7c1ra2tGTNmTG3NzmzdujWdnZ3dNgAAXvnqHrcPPfRQ9t9//zQ2Nuass87K0qVLM3r06Kxfvz5J0tzc3G19c3Nz7dj69evTr1+/DBky5AXX7MzcuXPT1NRU29ra2nr5qgAAqIe6x+0hhxySBx98MPfdd18+8YlP5PTTT8+jjz5aO16pVLqtr1arO+x7vpdac+GFF6ajo6O2rVmzZvcuAgCAfULd47Zfv355wxvekPHjx2fu3Lk5/PDD8z//5/9MS0tLkuxwB3bDhg21u7ktLS3Ztm1bNm7c+IJrdqaxsbH2DQ3PbQAAvPLVPW6fr1qtZuvWrRk5cmRaWlqybNmy2rFt27bl7rvvzsSJE5Mk48aNS9++fbutWbduXR5++OHaGgAA/nw01PPkn/3sZzNjxoy0tbVl06ZNWbJkSe66667ccsstqVQqaW9vz5w5czJq1KiMGjUqc+bMyYABA3LKKackSZqamnLGGWfk/PPPz7BhwzJ06NDMmjUrY8eOzTHHHFPPSwMAoA7qGrdPPPFETjvttKxbty5NTU057LDDcsstt2Tq1KlJkgsuuCBbtmzJ2WefnY0bN2bChAm57bbbMmjQoNpnLFiwIA0NDTnxxBOzZcuWHH300Vm8eHH69OlTr8sCAKBO9rnvua0H33ML7Cm+5xagd7zivucWAAB2l7gFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAitGjuD344IPz1FNP7bD/D3/4Qw4++ODdHgoAAHqiR3H7m9/8Jl1dXTvs37p1ax5//PHdHgoAAHqiYVcW33TTTbX/fOutt6apqan2uqurKz/4wQ8yYsSIXhsOAAB2xS7F7fvf//4kSaVSyemnn97tWN++fTNixIhcccUVvTYcAADsil2K22effTZJMnLkyKxYsSLDhw/fI0MBAEBP7FLcPmfVqlW9PQcAAOy2HsVtkvzgBz/ID37wg2zYsKF2R/c53/jGN3Z7MAAA2FU9ittLL700l112WcaPH58DDzwwlUqlt+cCAIBd1qO4/epXv5rFixfntNNO6+15AACgx3r0Pbfbtm3LxIkTe3sWAADYLT2K249//OO5/vrre3sWAADYLT16LOGZZ57J1772tdx+++057LDD0rdv327H58+f3yvDAQDAruhR3P7sZz/Lm9/85iTJww8/3O2YPy4DAKBeehS3d955Z2/PAUBB3v25G+o9ArCH3PKFk+o9wovq0TO3AACwL+rRndspU6a86OMHd9xxR48HAgCAnupR3D73vO1ztm/fngcffDAPP/xwTj/99N6YCwAAdlmP4nbBggU73T979uxs3rx5twYCAICe6tVnbj/84Q/nG9/4Rm9+JAAAvGy9Grf33ntv9ttvv978SAAAeNl69FjCCSec0O11tVrNunXr8sADD+Rzn/tcrwwGAAC7qkdx29TU1O31q171qhxyyCG57LLLMm3atF4ZDAAAdlWP4vaaa67p7TkAAGC39Shun7Ny5cr8/Oc/T6VSyejRo/OWt7ylt+YCAIBd1qO43bBhQ04++eTcddddefWrX51qtZqOjo5MmTIlS5YsyQEHHNDbcwIAwEvq0bclzJw5M52dnXnkkUfy+9//Phs3bszDDz+czs7OfPKTn+ztGQEA4GXp0Z3bW265JbfffnsOPfTQ2r7Ro0fnyiuv9AdlAADUTY/u3D777LPp27fvDvv79u2bZ599dreHAgCAnuhR3L7rXe/Kpz71qfz2t7+t7Xv88cfz6U9/OkcffXSvDQcAALuiR3G7aNGibNq0KSNGjMh/+S//JW94wxsycuTIbNq0KV/5yld6e0YAAHhZevTMbVtbW37yk59k2bJl+dd//ddUq9WMHj06xxxzTG/PBwAAL9su3bm94447Mnr06HR2diZJpk6dmpkzZ+aTn/xkjjjiiLzpTW/Kj370oz0yKAAAvJRdituFCxfmb/7mbzJ48OAdjjU1NeXMM8/M/Pnze204AADYFbsUt//yL/+Sd7/73S94fNq0aVm5cuVuDwUAAD2xS3H7xBNP7PQrwJ7T0NCQ3/3ud7s9FAAA9MQuxe1rX/vaPPTQQy94/Gc/+1kOPPDA3R4KAAB6Ypfi9j3veU8+//nP55lnntnh2JYtW3LJJZfk2GOP7bXhAABgV+zSV4FdfPHF+c53vpM3vvGNOffcc3PIIYekUqnk5z//ea688sp0dXXloosu2lOzAgDAi9qluG1ubs7y5cvziU98IhdeeGGq1WqSpFKpZPr06bnqqqvS3Ny8RwYFAICXssv/iMNBBx2Um2++ORs3bsyvfvWrVKvVjBo1KkOGDNkT8wEAwMvWo3+hLEmGDBmSI444ojdnAQCA3bJLf1AGAAD7MnELAEAxxC0AAMUQtwAAFEPcAgBQDHELAEAxxC0AAMUQtwAAFEPcAgBQDHELAEAxxC0AAMUQtwAAFEPcAgBQDHELAEAxxC0AAMUQtwAAFEPcAgBQDHELAEAxxC0AAMUQtwAAFEPcAgBQDHELAEAxxC0AAMUQtwAAFEPcAgBQDHELAEAxxC0AAMUQtwAAFKOucTt37twcccQRGTRoUF7zmtfk/e9/f/7t3/6t25pqtZrZs2entbU1/fv3z+TJk/PII490W7N169bMnDkzw4cPz8CBA3P88cdn7dq1e/NSAADYB9Q1bu++++6cc845ue+++7Js2bL86U9/yrRp0/L000/X1sybNy/z58/PokWLsmLFirS0tGTq1KnZtGlTbU17e3uWLl2aJUuW5J577snmzZtz7LHHpqurqx6XBQBAnTTU8+S33HJLt9fXXHNNXvOa12TlypV55zvfmWq1moULF+aiiy7KCSeckCS59tpr09zcnOuvvz5nnnlmOjo68vWvfz3f+ta3cswxxyRJrrvuurS1teX222/P9OnT9/p1AQBQH/vUM7cdHR1JkqFDhyZJVq1alfXr12fatGm1NY2NjZk0aVKWL1+eJFm5cmW2b9/ebU1ra2vGjBlTW/N8W7duTWdnZ7cNAIBXvn0mbqvVas4777y8/e1vz5gxY5Ik69evT5I0Nzd3W9vc3Fw7tn79+vTr1y9Dhgx5wTXPN3fu3DQ1NdW2tra23r4cAADqYJ+J23PPPTc/+9nP8r//9//e4VilUun2ulqt7rDv+V5szYUXXpiOjo7atmbNmp4PDgDAPmOfiNuZM2fmpptuyp133pnXve51tf0tLS1JssMd2A0bNtTu5ra0tGTbtm3ZuHHjC655vsbGxgwePLjbBgDAK19d47Zarebcc8/Nd77zndxxxx0ZOXJkt+MjR45MS0tLli1bVtu3bdu23H333Zk4cWKSZNy4cenbt2+3NevWrcvDDz9cWwMAwJ+Hun5bwjnnnJPrr78+3/3udzNo0KDaHdqmpqb0798/lUol7e3tmTNnTkaNGpVRo0Zlzpw5GTBgQE455ZTa2jPOOCPnn39+hg0blqFDh2bWrFkZO3Zs7dsTAAD481DXuL366quTJJMnT+62/5prrslHP/rRJMkFF1yQLVu25Oyzz87GjRszYcKE3HbbbRk0aFBt/YIFC9LQ0JATTzwxW7ZsydFHH53FixenT58+e+tSAADYB1Sq1Wq13kPUW2dnZ5qamtLR0VGX528fGP/WvX5OYO8Y/8D99R6hLt79uRvqPQKwh9zyhZPqct6X22v7xB+UAQBAbxC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxRC3AAAUQ9wCAFAMcQsAQDHELQAAxahr3P7whz/Mcccdl9bW1lQqldx4443djler1cyePTutra3p379/Jk+enEceeaTbmq1bt2bmzJkZPnx4Bg4cmOOPPz5r167di1cBAMC+oq5x+/TTT+fwww/PokWLdnp83rx5mT9/fhYtWpQVK1akpaUlU6dOzaZNm2pr2tvbs3Tp0ixZsiT33HNPNm/enGOPPTZdXV176zIAANhHNNTz5DNmzMiMGTN2eqxarWbhwoW56KKLcsIJJyRJrr322jQ3N+f666/PmWeemY6Ojnz961/Pt771rRxzzDFJkuuuuy5tbW25/fbbM3369L12LQAA1N8++8ztqlWrsn79+kybNq22r7GxMZMmTcry5cuTJCtXrsz27du7rWltbc2YMWNqa3Zm69at6ezs7LYBAPDKt8/G7fr165Mkzc3N3fY3NzfXjq1fvz79+vXLkCFDXnDNzsydOzdNTU21ra2trZenBwCgHvbZuH1OpVLp9rpare6w7/leas2FF16Yjo6O2rZmzZpemRUAgPraZ+O2paUlSXa4A7thw4ba3dyWlpZs27YtGzdufME1O9PY2JjBgwd32wAAeOXbZ+N25MiRaWlpybJly2r7tm3blrvvvjsTJ05MkowbNy59+/bttmbdunV5+OGHa2sAAPjzUddvS9i8eXN+9atf1V6vWrUqDz74YIYOHZrXv/71aW9vz5w5czJq1KiMGjUqc+bMyYABA3LKKackSZqamnLGGWfk/PPPz7BhwzJ06NDMmjUrY8eOrX17AgAAfz7qGrcPPPBApkyZUnt93nnnJUlOP/30LF68OBdccEG2bNmSs88+Oxs3bsyECRNy2223ZdCgQbX3LFiwIA0NDTnxxBOzZcuWHH300Vm8eHH69Omz168HAID6qlSr1Wq9h6i3zs7ONDU1paOjoy7P3z4w/q17/ZzA3jH+gfvrPUJdvPtzN9R7BGAPueULJ9XlvC+31/bZZ24BAGBXiVsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiFBO3V111VUaOHJn99tsv48aNy49+9KN6jwQAwF5WRNzecMMNaW9vz0UXXZSf/vSnecc73pEZM2Zk9erV9R4NAIC9qIi4nT9/fs4444x8/OMfz6GHHpqFCxemra0tV199db1HAwBgL2qo9wC7a9u2bVm5cmU+85nPdNs/bdq0LF++fKfv2bp1a7Zu3Vp73dHRkSTp7Ozcc4O+iM1dXXU5L7Dn1ev3Sr39aesf6z0CsIfU6/fac+etVqsvuu4VH7dPPvlkurq60tzc3G1/c3Nz1q9fv9P3zJ07N5deeukO+9va2vbIjMCfsaamek8A0KuaLv9YXc+/adOmNL3I79ZXfNw+p1KpdHtdrVZ32PecCy+8MOedd17t9bPPPpvf//73GTZs2Au+B3pDZ2dn2trasmbNmgwePLje4wDsNr/X2Fuq1Wo2bdqU1tbWF133io/b4cOHp0+fPjvcpd2wYcMOd3Of09jYmMbGxm77Xv3qV++pEWEHgwcP9l8CQFH8XmNveLE7ts95xf9BWb9+/TJu3LgsW7as2/5ly5Zl4sSJdZoKAIB6eMXfuU2S8847L6eddlrGjx+fI488Ml/72teyevXqnHXWWfUeDQCAvaiIuD3ppJPy1FNP5bLLLsu6desyZsyY3HzzzTnooIPqPRp009jYmEsuuWSHx2IAXqn8XmNfU6m+1PcpAADAK8Qr/plbAAB4jrgFAKAY4hYAgGKIWwAAiiFuYS+56qqrMnLkyOy3334ZN25cfvSjH9V7JIAe++EPf5jjjjsura2tqVQqufHGG+s9EiQRt7BX3HDDDWlvb89FF12Un/70p3nHO96RGTNmZPXq1fUeDaBHnn766Rx++OFZtGhRvUeBbnwVGOwFEyZMyH/9r/81V199dW3foYcemve///2ZO3duHScD2H2VSiVLly7N+9///nqPAu7cwp62bdu2rFy5MtOmTeu2f9q0aVm+fHmdpgKAMolb2MOefPLJdHV1pbm5udv+5ubmrF+/vk5TAUCZxC3sJZVKpdvrarW6wz4AYPeIW9jDhg8fnj59+uxwl3bDhg073M0FAHaPuIU9rF+/fhk3blyWLVvWbf+yZcsyceLEOk0FAGVqqPcA8OfgvPPOy2mnnZbx48fnyCOPzNe+9rWsXr06Z511Vr1HA+iRzZs351e/+lXt9apVq/Lggw9m6NChef3rX1/Hyfhz56vAYC+56qqrMm/evKxbty5jxozJggUL8s53vrPeYwH0yF133ZUpU6bssP/000/P4sWL9/5A8P+IWwAAiuGZWwAAiiFuAQAohrgFAKAY4hYAgGKIWwAAiiFuAQAohrgFAKAY4hYAgGKIW4CC3HXXXalUKvnDH/7woutGjBiRhQsX7pWZAPYm/0IZQEG2bduW3//+92lubk6lUsnixYvT3t6+Q+z+7ne/y8CBAzNgwID6DAqwhzTUewAAek+/fv3S0tLykusOOOCAvTANwN7nsQSAvWzy5Mk599xzc+655+bVr351hg0blosvvjjP/R9pGzduzEc+8pEMGTIkAwYMyIwZM/LLX/6y9v7HHnssxx13XIYMGZKBAwfmTW96U26++eYk3R9LuOuuu/LXf/3X6ejoSKVSSaVSyezZs5N0fyzhr/7qr3LyySd3m3H79u0ZPnx4rrnmmiRJtVrNvHnzcvDBB6d///45/PDD84//+I97+CcFsOvELUAdXHvttWloaMiPf/zjfPnLX86CBQvyv/7X/0qSfPSjH80DDzyQm266Kffee2+q1Wre8573ZPv27UmSc845J1u3bs0Pf/jDPPTQQ/nSl76U/ffff4dzTJw4MQsXLszgwYOzbt26rFu3LrNmzdph3amnnpqbbropmzdvru279dZb8/TTT+cDH/hAkuTiiy/ONddck6uvvjqPPPJIPv3pT+fDH/5w7r777j3x4wHoMY8lANRBW1tbFixYkEqlkkMOOSQPPfRQFixYkMmTJ+emm27KP//zP2fixIlJkm9/+9tpa2vLjTfemA996ENZvXp1PvCBD2Ts2LFJkoMPPnin5+jXr1+amppSqVRe9FGF6dOnZ+DAgVm6dGlOO+20JMn111+f4447LoMHD87TTz+d+fPn54477siRRx5ZO+c999yTv//7v8+kSZN680cDsFvcuQWog7e97W2pVCq110ceeWR++ctf5tFHH01DQ0MmTJhQOzZs2LAccsgh+fnPf54k+eQnP5kvfvGLOeqoo3LJJZfkZz/72W7N0rdv33zoQx/Kt7/97STJ008/ne9+97s59dRTkySPPvponnnmmUydOjX7779/bfvmN7+ZX//617t1boDe5s4twCtAtVqtxfDHP/7xTJ8+Pd/73vdy2223Ze7cubniiisyc+bMHn/+qaeemkmTJmXDhg1ZtmxZ9ttvv8yYMSNJ8uyzzyZJvve97+W1r31tt/c1Njb2+JwAe4I7twB1cN999+3wetSoURk9enT+9Kc/5cc//nHt2FNPPZVf/OIXOfTQQ2v72tractZZZ+U73/lOzj///PzDP/zDTs/Tr1+/dHV1veQ8EydOTFtbW2644YZ8+9vfzoc+9KH069cvSTJ69Og0NjZm9erVecMb3tBta2tr68nlA+wx7twC1MGaNWty3nnn5cwzz8xPfvKTfOUrX8kVV1yRUaNG5X3ve1/+5m/+Jn//93+fQYMG5TOf+Uxe+9rX5n3ve1+SpL29PTNmzMgb3/jGbNy4MXfccUe38P3PRowYkc2bN+cHP/hBDj/88AwYMGCn321bqVRyyimn5Ktf/Wp+8Ytf5M4776wdGzRoUGbNmpVPf/rTefbZZ/P2t789nZ2dWb58efbff/+cfvrpe+aHBNAD7twC1MFHPvKRbNmyJW9961tzzjnnZObMmfnbv/3bJMk111yTcePG5dhjj82RRx6ZarWam2++OX379k2SdHV15Zxzzsmhhx6ad7/73TnkkENy1VVX7fQ8EydOzFlnnZWTTjopBxxwQObNm/eCM5166ql59NFH89rXvjZHHXVUt2Nf+MIX8vnPfz5z587NoYcemunTp+ef/umfMnLkyF76iQD0Dv9CGcBeNnny5Lz5zW/2z98C7AHu3AIAUAxxCwBAMTyWAABAMdy5BQCgGOIWAIBiiFsAAIohbgEAKIa4BQCgGOIWAIBiiFsAAIohbgEAKMb/B1g6szpq6UixAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Data visulization 2\n",
    "\n",
    "plt.figure(figsize=(8,6))\n",
    "sns.countplot(x = 'Outcome', data = df, palette ='Set1')\n",
    "plt.title('Outcome')\n",
    "plt.xlabel('positive')\n",
    "plt.ylabel('Count')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "084dc17b-f53a-4a98-898d-46b823256953",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Outcome\n",
       "0    500\n",
       "1    268\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# outcome count\n",
    "df['Outcome'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "9a208995-3b72-4122-bd28-61ad357042d6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define the x and y data \n",
    "x = df.drop('Outcome', axis=1).values \n",
    "y = df['Outcome'].values\n",
    "\n",
    "#splet data  train&test\n",
    "x_train, x_test, y_train, y_test = train_test_split(x,y, test_size = 0.20, random_state=24, stratify=y)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "4fb07002-9653-4dd4-8f96-ed86f8e16f9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Evaluation method \n",
    "def evaluate_model(model_name, y_true, y_pred):\n",
    "\n",
    "    #calculate matrix \n",
    "    accuracy = accuracy_score(y_true,y_pred)\n",
    "    precision = precision_score(y_true,y_pred, average='weighted')\n",
    "    recall = recall_score(y_true,y_pred, average='weighted')\n",
    "    f1 = f1_score(y_true,y_pred, average='weighted')\n",
    "    cm = confusion_matrix(y_true, y_pred)\n",
    "    \n",
    "    # create report \n",
    "    report = classification_report(y_true, y_pred)\n",
    "\n",
    "    #outcome results\n",
    "    matrics  ={\n",
    "        'Model name': model_name, \n",
    "        'Accuracy': accuracy, \n",
    "        'Precision': precision, \n",
    "        'Recall': recall,\n",
    "        'F1 Score': f1, \n",
    "        \n",
    "        'Classification Report': report\n",
    "    }\n",
    "\n",
    "    #Plot confusion matrics\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 Matrics for {model_name} ')\n",
    "    plt.xlabel('Predected Label')\n",
    "    plt.ylabel('True label')\n",
    "    plt.show()\n",
    "\n",
    "    return matrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "72a24dd4-5fac-4e6a-a50d-ddcce49cc092",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    }
   ],
   "source": [
    "# Random Forest \n",
    "rf_classifier = RandomForestClassifier(random_state = 42)\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "param_grid = {\n",
    "    'n_estimators': [100,200,300],\n",
    "    'max_depth': [None, 10,20,30], \n",
    "    'min_samples_split': [2,5,10],\n",
    "    'min_samples_leaf': [1,2,3]\n",
    "}\n",
    "\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= rf_classifier, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train, y_train)\n",
    "print(\"Grid Search Completed!\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "ad3be3f9-a898-433f-866d-650328463319",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZoAAAGHCAYAAACJTpQmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAyxklEQVR4nO3deXhMZ/8G8HuyTSa7iERCRCQVYo09lFTtS0jLi1K72rWWRu3BW1KqbTSE1hZaKq2iyovaX0uCSNDW0l8lxJLYYmuQZfL8/nBlXmMmMcM8GYn7c125rsxznjnnO2eWe845zzmjEEIIEBERSWJh7gKIiKh0Y9AQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikMmnQnD59GgMHDoSvry9sbW3h4OCAevXqYf78+cjMzDTlonQkJycjJCQEzs7OUCgUiIqKMvkyFAoFZs6cafL5Pk9sbCwUCgUUCgX279+vM10IAX9/fygUCrz11lsvtIyYmBjExsYadZ/9+/cXWpMscXFxqFGjBlQqFRQKBU6ePCltWQWPr+DP0tIS5cqVQ2hoKBITE6Ut93kKXg8XL14027L1/X388cfFXo8h5s6di82bNxc6PSUlBaNHj0bVqlWhUqlgZ2eHGjVqYNq0abh69aqm34ABA1C5cmX5BRfi4sWLUCgUOu9Tfe+JmTNnQqFQmKdQPaxMNaNly5Zh5MiRCAgIQHh4OAIDA5Gbm4vExEQsXboU8fHx2LRpk6kWp2PQoEHIysrC+vXrUaZMGSkviPj4eFSsWNHk8zWUo6MjVqxYoRMmBw4cwIULF+Do6PjC846JiYGbmxsGDBhg8H3q1auH+Ph4BAYGvvByjXHz5k307dsX7du3R0xMDJRKJapWrSp9uXPnzkXLli2Rm5uL5ORkzJo1CyEhITh58iTeeOMN6ct/Fa1atQrVqlXTavPy8jJTNUWbO3cuunfvjrCwMJ1pW7duRa9eveDm5obRo0cjKCgICoUCv//+O1auXIlt27YhOTm5+IvWw9PTE/Hx8fDz89O0FfaeGDJkCNq3b2/Gap8hTODIkSPC0tJStG/fXjx+/FhnenZ2tvjll19MsahCWVlZiREjRkhdhrmsWrVKABBDhgwRKpVK3Lt3T2v6+++/L4KDg0WNGjVESEjICy3DmPvm5OSI3NzcF1rOyzh06JAAIOLi4kw2z6ysrEKn7du3TwAQP/30k1b76tWrBQAxY8YMk9VhjILXQ2pqqtmWffz4cSnzL+r5eFH29vaif//+Ou0pKSnC3t5eBAUFibt37+pMz8/PFz///LPmdv/+/YWPj4/J63sZMt4T+rzs82KSoOncubOwsrISaWlpBvVXq9Vi3rx5IiAgQNjY2Ihy5cqJvn37isuXL2v1CwkJETVq1BDHjh0Tb775plCpVMLX11dERkYKtVothPjfC//ZPyGEiIiIEPqyVN8bdc+ePSIkJES4uroKW1tb4e3tLd59912tFQxAREREaM3r999/F126dBEuLi5CqVSKOnXqiNjYWK0+BR9Y69atE1OmTBGenp7C0dFRtGrVSpw7d+6566ug3j179giVSiWWLl2qmXb37l2hUqnEsmXL9IbFzJkzRaNGjUSZMmWEo6OjCAoKEsuXLxf5+fmaPj4+Pjrrr+ANVVD7mjVrxPjx44WXl5dQKBTi7Nmzmmn79u3TWmZCQoLo3LmzcHV1FUqlUlSpUkV89NFHmuk3btwQH3zwgahYsaKwsbERbm5uomnTpmLXrl2FroP+/fvr1Pj0Y/3ll19EkyZNhEqlEg4ODqJ169biyJEjWvMoeD2cOHFCdOvWTbi4uIjy5csXuszCgubPP/8UAMSwYcOMXtcF67tTp05i+/btIigoSNja2oqAgACxYsUKnRri4+NF06ZNhVKpFJ6enmLSpEni22+/1Xn9GvueOnLkiAgODha2trbCx8dHrFy5UgghxNatW0VQUJBQqVSiZs2aYvv27Vr3NzRoXvb5yM/PF4sXLxZ16tQRtra2wsXFRXTr1k1cuHBBax5JSUmiU6dOoly5csLGxkZ4enqKjh07ah63vs+GgtfN6NGjBQARHx9f5GMpoC9oFi1aJJo3by7KlSsn7OzsRM2aNcW8efNETk6OUXUKIcSPP/4oGjVqJJycnDSfdQMHDtRMT01NFQDEqlWrNPUU9tgK++xbv369aNKkibCzsxP29vaibdu2IikpSedx2tvbi9OnT4s2bdoIBwcH0aRJE4PWUWFeeteZWq3G3r17Ub9+fXh7ext0nxEjRuDbb7/F6NGj0blzZ1y8eBHTp0/H/v37kZSUBDc3N03fjIwM9OnTBxMmTEBERAQ2bdqEyZMnw8vLC/369UOnTp0QHx+P4OBgdO/eHRMmTDD6MVy8eBGdOnVC8+bNsXLlSri4uODq1avYsWMHcnJyYGdnp/d+58+fR9OmTeHu7o6vv/4aZcuWxffff48BAwbg+vXrmDhxolb/KVOmoFmzZli+fDnu37+PTz75BKGhoTh79iwsLS2fW6eTkxO6d++OlStXYtiwYQCAH374ARYWFujZs6fe41IXL17EsGHDUKlSJQBAQkICxowZg6tXr2LGjBkAgE2bNqF79+5wdnZGTEwMAECpVGrNZ/LkyQgODsbSpUthYWEBd3d3ZGRk6Cxv586dCA0NRfXq1fHll1+iUqVKuHjxIn777TdNn759+yIpKQlz5sxB1apVcffuXSQlJeH27duFPvbp06ejUaNGGDVqlGZXlpOTEwBg3bp16NOnD9q2bYsffvgB2dnZmD9/Pt566y3s2bMHb775pta83n33XfTq1QvDhw9HVlbW81a7jtTUVADQ2W1nyLoucOrUKUyYMAGTJk2Ch4cHli9fjsGDB8Pf3x8tWrQAAJw5cwatWrVC5cqVERsbCzs7O8TExGDdunU6NRn7nho4cCAmTpyIihUrIjo6GoMGDcLly5exYcMGTJkyBc7Ozpg9ezbCwsKQkpKis1tMrVYjLy9Pq83K6snHiSmej2HDhiE2NhYffvgh5s2bh8zMTMyePRtNmzbFqVOn4OHhgaysLLRp0wa+vr5YvHgxPDw8kJGRgX379uHBgwcAnuzufvvtt9GyZUtMnz4dADSvm99++w0eHh5o0qRJkc93US5cuIDevXvD19cXNjY2OHXqFObMmYNz585h5cqVAGBwnT179kTPnj0xc+ZM2Nra4tKlS9i7d2+hyy7qPaHP3LlzMW3aNAwcOBDTpk1DTk4OPv/8czRv3hzHjh3T2gWek5ODLl26YNiwYZg0aZLOc220l4opIURGRoYAIHr16mVQ/7NnzwoAYuTIkVrtR48eFQDElClTNG0hISECgDh69KhW38DAQNGuXTutNgBi1KhRWm2GbtFs2LBBABAnT54ssnY8s0XTq1cvoVQqdbbkOnToIOzs7DSb4wXfjDt27KjV78cffzToG9XT3yIL5vXHH38IIYRo2LChGDBggBDi+bu/1Gq1yM3NFbNnzxZly5bV+qZd2H0LlteiRYtCpz29RePn5yf8/PzEo0ePCq3DwcFBjB07tsjHrI++LQy1Wi28vLxErVq1NFu5Qgjx4MED4e7uLpo2bappK3g9GLrLq2B5cXFxIjc3Vzx8+FAcPnxYBAQEiMDAQHHnzp1C71vUuvbx8RG2trbi0qVLmrZHjx4JV1dXra2knj17CpVKJTIyMjRteXl5olq1alqv3xd5TyUmJmrabt++LSwtLYVKpRJXr17VtJ88eVIAEF9//bWmrbA9CABEbm6uSZ6P+Ph4AUB88cUXWu2XL18WKpVKTJw4UQghRGJiogAgNm/erO8p0Chs15mtra1R39Sft+us4Dlfs2aNsLS0FJmZmQbXuWDBAgFA7y68As9u0QhR+Fb3s599aWlpwsrKSowZM0ar34MHD0T58uVFjx49tB4nAM1WrikU+/Dmffv2AYDOQedGjRqhevXq2LNnj1Z7+fLl0ahRI6222rVr49KlSyarqW7durCxscHQoUOxevVqpKSkGHS/vXv3olWrVjpbcgMGDMDDhw8RHx+v1d6lSxet27Vr1wYAox5LSEgI/Pz8sHLlSvz+++84fvw4Bg0aVGSNrVu3hrOzMywtLWFtbY0ZM2bg9u3buHHjhsHL7dat23P7/PXXX7hw4QIGDx4MW1vbQvs1atQIsbGx+PTTT5GQkIDc3FyD63jW+fPnce3aNfTt2xcWFv97OTs4OKBbt25ISEjAw4cPjX4sT+vZsyesra1hZ2eHZs2a4f79+9i2bRtcXFy0+hmzruvWravZ8gEAW1tbVK1aVeu1sG/fPrRq1QoeHh6aNktLS/Ts2VNrXsa+pzw9PVG/fn3NbVdXV7i7u6Nu3bpaWy7Vq1cHoP/1uWbNGhw/flzrz8rKyiTPx9atW6FQKPD+++8jLy9P81e+fHnUqVNHM8rR398fZcqUwSeffIKlS5fizJkzOnXKlpycjC5duqBs2bKa57xfv35Qq9X466+/DK6zYcOGAIAePXrgxx9/1BrtZgo7d+5EXl4e+vXrp7VObW1tERISonfkqLHvk6K8dNC4ubnBzs5OszvheQp2j3h6eupM8/Ly0tl9UrZsWZ1+SqUSjx49eoFq9fPz88Pu3bvh7u6OUaNGwc/PD35+fli4cGGR97t9+3ahj6Ng+tOefSwFu6eMeSwKhQIDBw7E999/j6VLl6Jq1apo3ry53r7Hjh1D27ZtATwZFXj48GEcP34cU6dONXq5+h7ns27evAkAzx2ZFxcXh/79+2P58uUIDg6Gq6sr+vXrp3dX3PM87/WUn5+PO3fuaLUb8lieNm/ePBw/fhwHDhzA1KlTcf36dYSFhSE7O1vTx9h1bcjr+vbt2yhfvrxOv2fbjH1Pubq66vSzsbHRabexsQEAPH78WKd/9erV0aBBA60/Q2ox5Pm4fv06hBDw8PCAtbW11l9CQgJu3boFAHB2dsaBAwdQt25dTJkyBTVq1ICXlxciIiIM+vJSqVIlgz+39ElLS0Pz5s1x9epVLFy4EAcPHsTx48exePFiAP97zg2ps0WLFti8ebMmDCpWrIiaNWvihx9+eOH6nnb9+nUATwLt2XUaFxenWacF7OzsitwNZ6yXPkZjaWmJVq1aYfv27bhy5cpzP2QK3mDp6ek6fa9du6a1L/llFXyrzs7O1jrm8OxKBYDmzZujefPmUKvVSExMRHR0NMaOHQsPDw/06tVL7/zLli2L9PR0nfZr164BgEkfy9MGDBiAGTNmYOnSpZgzZ06h/davXw9ra2ts3bpVawujqHMKCmPImPxy5coBAK5cuVJkPzc3N0RFRSEqKgppaWnYsmULJk2ahBs3bmDHjh1G1fX06+lZ165dg4WFBcqUKaPVbuz5BVWqVNF8kLZo0QIqlQrTpk1DdHS05twRU67rAmXLltUbvs+2Fed76nlM8Xy4ublBoVDg4MGDOscKAe3jh7Vq1cL69eshhMDp06cRGxuL2bNnQ6VSYdKkSUXW2q5dO0RHRyMhIeGFjtNs3rwZWVlZ2LhxI3x8fDTt+s7tMqTOrl27omvXrsjOzkZCQgIiIyPRu3dvVK5cGcHBwUbX97SC18CGDRu0ai2Mqc/BMcmus8mTJ0MIgQ8++AA5OTk603Nzc/Hrr78CAN5++20AwPfff6/V5/jx4zh79ixatWplipIAQHMuzenTp7XaC2rRx9LSEo0bN9Z8K0lKSiq0b6tWrbB3715NsBRYs2YN7OzsXuogY1EqVKiA8PBwhIaGon///oX2UygUsLKy0hpo8OjRI3z33Xc6fU2xlVi1alXNbr2nv+0XpVKlShg9ejTatGlT5LouTEBAACpUqIB169ZBPPWr5FlZWfj5558RHBxc6GCOFzVx4kT4+/vjs88+0xzMNWZdG6ply5bYs2eP5tso8OQgfFxcnFa/4nxPPY8pno/OnTtDCIGrV6/qbDU1aNAAtWrV0rmPQqFAnTp18NVXX8HFxUXrtVTYa3vcuHGwt7fHyJEjce/ePZ3pQogiz/0r+DB+OviEEFi2bFmR9ymszqfrDQkJwbx58wDAJOfxtGvXDlZWVrhw4YLedVrwRUoWk5ywGRwcjCVLlmDkyJGoX78+RowYgRo1amhOcPv2229Rs2ZNhIaGIiAgAEOHDkV0dDQsLCzQoUMHzQgZb29vjBs3zhQlAQA6duwIV1dXDB48GLNnz4aVlRViY2Nx+fJlrX5Lly7F3r170alTJ1SqVAmPHz/WjBhp3bp1ofOPiIjA1q1b0bJlS8yYMQOurq5Yu3Yttm3bhvnz58PZ2dlkj+VZn3322XP7dOrUCV9++SV69+6NoUOH4vbt21iwYIHeb4kF37ji4uJQpUoV2Nra6n1DP8/ixYsRGhqKJk2aYNy4cahUqRLS0tKwc+dOrF27Fvfu3UPLli3Ru3dvVKtWDY6Ojjh+/Dh27NiBd9991+jlWVhYYP78+ejTpw86d+6MYcOGITs7G59//jnu3r1r0HoylrW1NebOnYsePXpg4cKFmDZtmlHr2lDTpk3Dli1b8Pbbb2PGjBmws7PD4sWLdUbKFed76nlM8Xw0a9YMQ4cOxcCBA5GYmIgWLVrA3t4e6enpOHToEGrVqoURI0Zg69atiImJQVhYGKpUqQIhBDZu3Ii7d++iTZs2mvnVqlUL+/fvx6+//gpPT084OjoiICAAvr6+WL9+PXr27Im6detqTtgEnoz4W7lyJYQQeOedd/TW2aZNG9jY2OC9997DxIkT8fjxYyxZskRn16Ahdc6YMQNXrlxBq1atULFiRdy9excLFy6EtbU1QkJCXvTp0KhcuTJmz56NqVOnIiUlBe3bt0eZMmVw/fp1HDt2DPb29pg1a9ZLL6dQJhtWIJ6MUunfv7+oVKmSsLGx0ZwMNWPGDHHjxg1Nv4Ix/1WrVhXW1tbCzc1NvP/++4WO+X+WvtEf0DPqTAghjh07Jpo2bSrs7e1FhQoVREREhFi+fLnWqJ34+HjxzjvvCB8fH6FUKkXZsmVFSEiI2LJli84y9J1HExoaKpydnYWNjY2oU6eO1qgQIQofGaJvFIk+hp67oG/k2MqVK0VAQIDmfJbIyEixYsUKnfMwLl68KNq2bSscHR31nkfzbO1PT3v2PJr4+HjRoUMH4ezsLJRKpfDz8xPjxo0TQgjx+PFjMXz4cFG7dm3N+QIBAQEiIiLiuSeFFVXL5s2bRePGjYWtra2wt7cXrVq1EocPH9bqUzAS5+bNm0Uux5DlCSFE48aNRZkyZTQjhQxd1wXn0TwrJCRE5/k7fPiwaNKkiVAqlaJ8+fIiPDy8yPNoXvQ9VVhNz76vDH0tmuL5WLlypWjcuLGwt7cXKpVK+Pn5iX79+mlGzJ07d0689957ws/PT6hUKuHs7CwaNWqkcx7byZMnRbNmzYSdnZ3O+VdCCHHhwgUxcuRI4e/vL5RKpVCpVCIwMFCMHz9eax3r+9z59ddfNef6VKhQQYSHh4vt27drvS8MqXPr1q2iQ4cOokKFCsLGxka4u7uLjh07ioMHD2r6vMyos6efl5YtWwonJyehVCqFj4+P6N69u9i9e7fW47S3t9f7nLwohRBPbd8SERGZGK/eTEREUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQm+ynnV4kqaLS5S6DXxJ3ji8xdAr0mbEvwpzW3aIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDJrXiKWlBSJGdsbZrTORGf8lzvw6E5OHtodCodDqF+DrgZ+ihiHjv5/jxqEFOLB6ArzLlzFT1VQSnUg8jjEjh6P1W2+iTo0A7N2zu9C+s2fOQJ0aAfh+TWzxFUjFysrcBVDxmTCgDYZ0fxMfzPgOZy6ko36NSvhm5vu4/+AxFv+wHwDgW9ENe1aOx+rNR/Dpkm24988jVPMtj8fZueYtnkqUR48eIiAgAF3feRcTxo4ptN/ePbvxx+lTKOfuXozVUXFj0LxGGtf2xdYDp7Hj0J8AgLT0TPRo3wD1Aitp+swaHYqdh/7E1IW/aNouXr1d7LVSyfZm8xC82TykyD7Xr19H5JzZWPLtCowZMayYKiNz4K6z10j8yQto2SgA/pWefHusVbUCgutWwc7DT4JHoVCg/Zs18H9pN7Bl8Shc2hOJ/675GKFv1TZn2VQK5efnY+qkcAwYOBj+/m+YuxySzKxbNFeuXMGSJUtw5MgRZGRkQKFQwMPDA02bNsXw4cPh7e1tzvJKnQWrdsHJQYVTm6ZBrRawtFQgYvFW/LjjBADA3dUBjva2+HhgG8xavBXTFm5G22aBWP/FELQb+jUOnfjbzI+ASotVK5bB0soKvd/vZ+5SqBiYLWgOHTqEDh06wNvbG23btkXbtm0hhMCNGzewefNmREdHY/v27WjWrFmR88nOzkZ2drZWm8hXQ2FhKbP8Eulf7erjvY4NMWDKapy5kI7aARXw+cfdkX7zHtb+ehQWFk82cLfu/x3Ra/cBAE7/dRWN61TBB93fZNCQSZz58w+s/W4N1m/YqDMQhUonswXNuHHjMGTIEHz11VeFTh87diyOHz9e5HwiIyMxa9YsrTZLj4aw9mxkslpLi7ljw7Bg1S78tPPJFsyff19DJU9XhA9sg7W/HsWtO/8gN1eNsynpWvc7n5KBpkFVzFEylUJJJxKRmXkb7Vu31LSp1Wp88fk8rP1uDbbv2mvG6kgGswXNH3/8ge+//77Q6cOGDcPSpUufO5/Jkydj/PjxWm3uzT956fpKI5WtDfJFvlabOl9otmRy89Q4ceYSqvp4aPV5w8cdael3iq1OKt06d+mKxsFNtdpGDB2MzqFdEfbOu2aqimQyW9B4enriyJEjCAgI0Ds9Pj4enp6ez52PUqmEUqnUauNuM/3+89/f8cngdricfgdnLqSjbrWK+PD9llizOUHT56vVu/HdvEE4lPQ3DiT+hbZNA9GxRU20+2ChGSunkuZhVhbS0tI0t69euYJzZ8/C2dkZnl5ecHHRPi/L2soabm5uqOzLLefSyGxB8/HHH2P48OE4ceIE2rRpAw8PDygUCmRkZGDXrl1Yvnw5oqKizFVeqTR+3k+IGNkZC6f0RLkyDki/eQ8rNhzG3G+3a/ps2XcaY+asR/igtvhiYnf8dekG3gtfjiMnU8xYOZU0f/75B4YM/N+B/gXzIwEAXbq+g3/P/cxcZZGZKIQQwlwLj4uLw1dffYUTJ05ArVYDACwtLVG/fn2MHz8ePXr0eKH5qoJGm7JMokLdOb7I3CXQa8K2BJ/1aNagKZCbm4tbt24BANzc3GBtbf1S82PQUHFh0FBxKclB80qUbm1tbdDxGCIiKnl4ZQAiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQklZUhnb7++muDZ/jhhx++cDFERFT6KIQQ4nmdfH19DZuZQoGUlJSXLuplqYJGm7sEek3cOb7I3CXQa8LWoM2CV5NBpaempsqug4iISqkXPkaTk5OD8+fPIy8vz5T1EBFRKWN00Dx8+BCDBw+GnZ0datSogbS0NABPjs189tlnJi+QiIhKNqODZvLkyTh16hT2798PW1tbTXvr1q0RFxdn0uKIiKjkM/rw0ubNmxEXF4cmTZpAoVBo2gMDA3HhwgWTFkdERCWf0Vs0N2/ehLu7u057VlaWVvAQEREBLxA0DRs2xLZt2zS3C8Jl2bJlCA4ONl1lRERUKhi96ywyMhLt27fHmTNnkJeXh4ULF+LPP/9EfHw8Dhw4IKNGIiIqwYzeomnatCkOHz6Mhw8fws/PD7/99hs8PDwQHx+P+vXry6iRiIhKMIOuDFDS8MoAVFx4ZQAqLqX+ygDPUqvV2LRpE86ePQuFQoHq1auja9eusLIqwWuCiIikMDoZ/vjjD3Tt2hUZGRkICAgAAPz1118oV64ctmzZglq1apm8SCIiKrmMPkYzZMgQ1KhRA1euXEFSUhKSkpJw+fJl1K5dG0OHDpVRIxERlWBGb9GcOnUKiYmJKFOmjKatTJkymDNnDho2bGjS4oiIqOQzeosmICAA169f12m/ceMG/P39TVIUERGVHgYFzf379zV/c+fOxYcffogNGzbgypUruHLlCjZs2ICxY8di3rx5suslIqISxqDhzRYWFlqXlym4S0Hb07fVarWMOo3C4c1UXDi8mYpLqR/evG/fPtl1EBFRKWVQ0ISEhMiug4iISqkX3hh7+PAh0tLSkJOTo9Veu3btly6KiIhKD6OD5ubNmxg4cCC2b9+ud/qrcIyGiIheHUYPbx47dizu3LmDhIQEqFQq7NixA6tXr8Ybb7yBLVu2yKiRiIhKMKO3aPbu3YtffvkFDRs2hIWFBXx8fNCmTRs4OTkhMjISnTp1klEnERGVUEZv0WRlZWl+YdPV1RU3b94EANSqVQtJSUmmrY6IiEq8F7oywPnz5wEAdevWxTfffIOrV69i6dKl8PT0NHmBRERUshm962zs2LFIT08HAERERKBdu3ZYu3YtbGxsEBsba+r6iIiohHvpHz57+PAhzp07h0qVKsHNzc1Udb0UXhmAiguvDEDFpdRfGaAodnZ2qFevnilqISKiUsigoBk/frzBM/zyyy9fuBgiIip9DAqa5ORkg2b29IU3iYiIABMco3kVpWVmm7sEek1czXxk7hLoNRHs72LuEl6Y0cObiYiIjMGgISIiqRg0REQkFYOGiIikYtAQEZFULxQ03333HZo1awYvLy9cunQJABAVFYVffvnFpMUREVHJZ3TQLFmyBOPHj0fHjh1x9+5dzQ+dubi4ICoqytT1ERFRCWd00ERHR2PZsmWYOnUqLC0tNe0NGjTA77//btLiiIio5DM6aFJTUxEUFKTTrlQqkZWVZZKiiIio9DA6aHx9fXHy5Emd9u3btyMwMNAUNRERUSli9NWbw8PDMWrUKDx+/BhCCBw7dgw//PADIiMjsXz5chk1EhFRCWZ00AwcOBB5eXmYOHEiHj58iN69e6NChQpYuHAhevXqJaNGIiIqwV7qopq3bt1Cfn4+3N3dTVnTS+NFNam48KKaVFxK8kU1X+qHz16VX9QkIqJXl9FB4+vrW+TvzqSkpLxUQUREVLoYHTRjx47Vup2bm4vk5GTs2LED4eHhpqqLiIhKCaOD5qOPPtLbvnjxYiQmJr50QUREVLqY7KKaHTp0wM8//2yq2RERUSlhsqDZsGEDXF1dTTU7IiIqJYzedRYUFKQ1GEAIgYyMDNy8eRMxMTEmLY6IiEo+o4MmLCxM67aFhQXKlSuHt956C9WqVTNVXUREVEoYFTR5eXmoXLky2rVrh/Lly8uqiYiIShGjjtFYWVlhxIgRyM7mmfdERGQYowcDNG7cGMnJyTJqISKiUsjoYzQjR47EhAkTcOXKFdSvXx/29vZa02vXrm2y4oiIqOQz+KKagwYNQlRUFFxcXHRnolBACAGFQqH5aWdz4kU1qbjwoppUXEryRTUNDhpLS0ukp6fj0aOi31g+Pj4mKexlMGiouDBoqLiU5KAxeNdZQR69CkFCREQlh1GDAYq6ajMREZE+Rg0GqFq16nPDJjMz86UKIiKi0sWooJk1axacnZ1l1UJERKWQUUHTq1evV+5nm4mI6NVm8DEaHp8hIqIXYXDQGDgKmoiISIvBu87y8/Nl1kFERKWUyX74jIiISB8GDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqazMXQAVnx9WL8ehA3tw+VIqlEolAmvVxZCRY+Ht4wsAyMvLxapvFuHYkYPIuHYFdg6OqNegMQaPHAu3cu5mrp5Kkr3bfsbe/2zErevXAAAVfKqg63uDUbtBU+Tl5WHjmqU4nXgENzKuws7eAYF1G+JfA0ahTNlyZq6cZFAIIYS5izC1tMxsc5fwSpo8djjeatMBAdVrQK1WY9XSaKSm/B+Wr9sElcoOWf88wOwpE9CxSzdUeaMqHjy4jyVR86FWqxGzar25y38lXc18ZO4SXknJRw/CwsICHl7eAIBDu7dh+8bvMfvr71DGzR2L505GSPuu8PZ9A1n/3Me6b79CvlqNmQtXm7nyV1ewv4u5S3hhDJrX2N07mfhXx7fwRcxK1A5qoLfP+TN/YPTg3li7aSfcy3sWc4WvPgaN4Ub1bIMeg8YgpF0XnWkpf53B7HED8cWqX1DWvbwZqnv1leSg4a6z11jWP/8AABydnIvso1AoYO/oWFxlUSmTr1bj2KE9yH78CP7Va+rt8yjryevMzsGhmKuj4sCgeU0JIbD0689Rs04QfP3e0NsnJzsby5dE4e22HWFvzw8AMs7li3/j0wlDkJuTA6VKhTHT5qFCpSo6/XJysvFT7GI0CWkHlR1fZ6XRKz3q7PLlyxg0aFCRfbKzs3H//n2tv+xs7jp7nugFc5H69/9hyux5eqfn5eVizoyJEPn5GBM+tZiro9LAs4IPZkd/h+lfrsDbHd/F8i9n42pailafvLw8LJk3DUII9BsVbqZKSbZXOmgyMzOxenXRBwcjIyPh7Oys9RcTNb+YKiyZFn0RiYRD+/H54uUop2d/eF5eLj6dGo6Ma1cx7+tvuTVDL8TK2hoeXt7wfaM6/jVgFLx938CuX+I00/Py8hDz2RTcun4N4Z9Gc2umFDPrrrMtW7YUOT0lJaXI6QAwefJkjB8/XqvtetZLlVVqCSGw6ItIHD6wFwtiVsDTq6JOn4KQuXrlEj5ftAJOzi7FXyiVSgICubm5AP4XMtevXcYnkTFwKOI4IZV8Zg2asLAwKBQKFDXwTaFQFDkPpVIJpVKp1XY3j7vO9IleMAd7f9uOWfMWws7OHpm3bwEA7O0doLS1hTovD7OnTMDf58/i3wsWIT8/X9PH0ckZ1tbW5iyfSpANq2NQq34wXMt54PGjhzh6YBfO/Z6ECbOjoFbnYfHcSbh04TzGRnyBfHU+7mbeBgA4ODrBiq+zUsesw5srVKiAxYsXIywsTO/0kydPon79+lCr1UbNl8Ob9WsTXFtv+8fT/o12nboiI/0q+r7bQW+fBYtXoE69hjLLK5E4vFm/FVGf4sypRNzLvAWVvQO8K/uj47/6omZQY9y8fg3hg97Re79PImNQvXb9Yq62ZCjJw5vNGjRdunRB3bp1MXv2bL3TT506haCgIOTn5xs1XwYNFRcGDRWXkhw0Zt11Fh4ejqyswg+o+Pv7Y9++fcVYERERmRqvDED0ErhFQ8WlJG/RvNLDm4mIqORj0BARkVQMGiIikopBQ0REUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQMGiIikopBQ0REUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQMGiIikopBQ0REUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQMGiIikopBQ0REUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQMGiIikopBQ0REUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQMGiIikopBQ0REUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQMGiIikopBQ0REUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQMGiIikopBQ0REUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQMGiIikopBQ0REUjFoiIhIKgYNERFJpRBCCHMXQeaXnZ2NyMhITJ48GUql0tzlUCnG19rrh0FDAID79+/D2dkZ9+7dg5OTk7nLoVKMr7XXD3edERGRVAwaIiKSikFDRERSMWgIAKBUKhEREcGDsyQdX2uvHw4GICIiqbhFQ0REUjFoiIhIKgYNERFJxaAhIiKpGDSEmJgY+Pr6wtbWFvXr18fBgwfNXRKVQv/9738RGhoKLy8vKBQKbN682dwlUTFh0Lzm4uLiMHbsWEydOhXJyclo3rw5OnTogLS0NHOXRqVMVlYW6tSpg0WLFpm7FCpmHN78mmvcuDHq1auHJUuWaNqqV6+OsLAwREZGmrEyKs0UCgU2bdqEsLAwc5dCxYBbNK+xnJwcnDhxAm3bttVqb9u2LY4cOWKmqoiotGHQvMZu3boFtVoNDw8PrXYPDw9kZGSYqSoiKm0YNASFQqF1Wwih00ZE9KIYNK8xNzc3WFpa6my93LhxQ2crh4joRTFoXmM2NjaoX78+du3apdW+a9cuNG3a1ExVEVFpY2XuAsi8xo8fj759+6JBgwYIDg7Gt99+i7S0NAwfPtzcpVEp888//+Dvv//W3E5NTcXJkyfh6uqKSpUqmbEyko3DmwkxMTGYP38+0tPTUbNmTXz11Vdo0aKFucuiUmb//v1o2bKlTnv//v0RGxtb/AVRsWHQEBGRVDxGQ0REUjFoiIhIKgYNERFJxaAhIiKpGDRERCQVg4aIiKRi0BARkVQMGiIikopBQ6XKzJkzUbduXXOXoVdx1Fa5cmVERUW91Dxe5XVIJRODhqQbMGAAFAoFFAoFrK2tUaVKFXz88cfIysoyd2nPVZwfuhcvXoRCocDJkyeLZXlExYUX1aRi0b59e6xatQq5ubk4ePAghgwZgqysLK2fkC6Qm5sLa2trM1RJRDJwi4aKhVKpRPny5eHt7Y3evXujT58+2Lx5M4D/bTWsXLkSVapUgVKphBAC9+7dw9ChQ+Hu7g4nJye8/fbbOHXqlNZ8P/vsM3h4eMDR0RGDBw/G48ePdZa9atUqVK9eHba2tqhWrRpiYmK0pl+5cgW9evWCq6sr7O3t0aBBAxw9ehSxsbGYNWsWTp06pdkiK7j4o6lqM8aFCxfQtWtXeHh4wMHBAQ0bNsTu3bt1+j148AC9e/eGg4MDvLy8EB0drTXdkNqJTIlBQ2ahUqmQm5uruf3333/jxx9/xM8//6zZddSpUydkZGTgP//5D06cOIF69eqhVatWyMzMBAD8+OOPiIiIwJw5c5CYmAhPT0+dEFm2bBmmTp2KOXPm4OzZs5g7dy6mT5+O1atXA3hy6fqQkBBcu3YNW7ZswalTpzBx4kTk5+ejZ8+emDBhAmrUqIH09HSkp6ejZ8+eEEKYpDZj/fPPP+jYsSN2796N5ORktGvXDqGhoUhLS9Pq9/nnn6N27dpISkrC5MmTMW7cOM1vDhlSO5HJCSLJ+vfvL7p27aq5ffToUVG2bFnRo0cPIYQQERERwtraWty4cUPTZ8+ePcLJyUk8fvxYa15+fn7im2++EUIIERwcLIYPH641vXHjxqJOnTqa297e3mLdunVaff7973+L4OBgIYQQ33zzjXB0dBS3b9/WW3tERITW/ExZ27NSU1MFAJGcnFxon2cFBgaK6OhozW0fHx/Rvn17rT49e/YUHTp0MLh2fY+Z6GVwi4aKxdatW+Hg4ABbW1sEBwejRYsWWrt0fHx8UK5cOc3tEydO4J9//kHZsmXh4OCg+UtNTcWFCxcAAGfPnkVwcLDWcp6+ffPmTVy+fBmDBw/Wmsenn36qmcfJkycRFBQEV1dXgx+LKWp7EVlZWZg4cSICAwPh4uICBwcHnDt3TmeLRt9yz549a3DtRKbGwQBULFq2bIklS5bA2toaXl5eOgf77e3ttW7n5+fD09MT+/fv15mXi4uLQcvMz88H8GT3WePGjbWmWVpaAniyC89YpqjtRYSHh2Pnzp1YsGAB/P39oVKp0L17d+Tk5Dz3vgqFAoD5aqfXG4OGioW9vT38/f0N7l+vXj1kZGTAysoKlStX1tunevXqSEhIQL9+/TRtCQkJmv89PDxQoUIFpKSkoE+fPnrnUbt2bSxfvhyZmZl6t2psbGygVqtNXtuLOHjwIAYMGIB33nkHwJNjNhcvXtTp9+xyEhISUK1aNYNrJzI1Bg29klq3bo3g4GCEhYVh3rx5CAgIwLVr1/Cf//wHYWFhaNCgAT766CP0798fDRo0wJtvvom1a9fizz//RJUqVTTzmTlzJj788EM4OTmhQ4cOyM7ORmJiIu7cuYPx48fjvffew9y5cxEWFobIyEh4enoiOTkZXl5eCA4ORuXKlTW/bV+xYkU4OjqarLbCnD9/XqctMDAQ/v7+2LhxI0JDQ6FQKDB9+nTNVtvTDh8+jPnz5yMsLAy7du3CTz/9hG3bthm8XolMztwHiaj0e3YwwLMKO/h8//59MWbMGOHl5SWsra2Ft7e36NOnj0hLS9P0mTNnjnBzcxMODg6if//+YuLEiTrzWrt2rahbt66wsbERZcqUES1atBAbN27UTL948aLo1q2bcHJyEnZ2dqJBgwbi6NGjQgghHj9+LLp16yZcXFwEALFq1SqT1va0gsEA+v5SU1NFamqqaNmypVCpVMLb21ssWrRIhISEiI8++kgzDx8fHzFr1izRo0cPYWdnJzw8PERUVJRR65WDAcjUFEIIYcacIyKiUo6jzoiISCoGDRERScWgISIiqRg0REQkFYOGiIikYtAQEZFUDBoiIpKKQUNERFIxaIiISCoGDRERScWgISIiqf4f0yIB6yDye+gAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model name: \n",
      " RandomForestClassifier\n",
      "Accuracy: 0.7662\n",
      "Precision: 0.7610\n",
      "Recall: 0.7662\n",
      "F1 Score: 0.7614\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.80      0.86      0.83       100\n",
      "           1       0.70      0.59      0.64        54\n",
      "\n",
      "    accuracy                           0.77       154\n",
      "   macro avg       0.75      0.73      0.73       154\n",
      "weighted avg       0.76      0.77      0.76       154\n",
      "\n",
      "\n",
      "Best hyperparamers found by GridSearchCV: \n",
      "{'max_depth': 10, 'min_samples_leaf': 2, 'min_samples_split': 10, 'n_estimators': 200}\n"
     ]
    }
   ],
   "source": [
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('RandomForestClassifier', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "71f2f20f-a51c-4850-af2b-8fa8634ff6dc",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    }
   ],
   "source": [
    "# Logistic Regression\n",
    "LR = LogisticRegression(random_state = 42)\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "param_grid = {\n",
    "    'C': [0.01,0.1,1,10],\n",
    "    'solver': ['liblinear', 'lbfgs'],\n",
    "    'max_iter': [500,1000,2000]\n",
    "}\n",
    "\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= LR, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train, y_train)\n",
    "print(\"Grid Search Completed!\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "7bc14fba-65f5-4a23-ac03-a655d3db4443",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model name: \n",
      " LogisticRegression\n",
      "Accuracy: 0.7727\n",
      "Precision: 0.7681\n",
      "Recall: 0.7727\n",
      "F1 Score: 0.7687\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.80      0.86      0.83       100\n",
      "           1       0.70      0.61      0.65        54\n",
      "\n",
      "    accuracy                           0.77       154\n",
      "   macro avg       0.75      0.74      0.74       154\n",
      "weighted avg       0.77      0.77      0.77       154\n",
      "\n",
      "\n",
      "Best hyperparamers found by GridSearchCV: \n",
      "{'C': 1, 'max_iter': 500, 'solver': 'lbfgs'}\n"
     ]
    }
   ],
   "source": [
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('LogisticRegression', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "9f9061a0-b6b7-4507-a155-22b11a48c43f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    }
   ],
   "source": [
    "#DecisionTreeClassifier\n",
    "DT = DecisionTreeClassifier(random_state = 42)\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "param_grid = {\n",
    "    'criterion': ['gini', 'entropy'],\n",
    "    'max_depth': [None, 10,20,30], \n",
    "    'min_samples_split': [2,5,10],\n",
    "    'min_samples_leaf': [1,2,3],\n",
    "    'max_features': [None, 'sqrt', 'log2']\n",
    "}\n",
    "\n",
    "\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= DT, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train, y_train)\n",
    "print(\"Grid Search Completed!\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "773c3609-9216-4edc-b07d-dd78fd9ef4c7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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4OjoqPMCiYhIc1pPv4SHhyM1NRUAEBERgR49emDz5s0wNjbG+vXrdV0fERFpodw/kpGdnY0///wTrq6usLe311Vd5cJPlFJl4SdKqbJU6I9kPM3MzAytWrUq72qIiEgHNAr1SZMmabzCTz/9tMzFEBFR+WgU6omJiRqt7Okv/SIioson5Q9PH798T98lUDXR1MVK3yVQNWFurNmgWetbGomI6MXFUCcikghDnYhIIgx1IiKJMNSJiCRSplDftGkT2rVrBycnJ1y7dg0AEBkZiW+++UanxRERkXa0DvXly5dj0qRJ6NWrF+7evav6UYyaNWsiMjJS1/UREZEWtA71qKgorF69GtOnT4eBgYGq3cfHB3/88YdOiyMiIu1oHepJSUlo2bJlkXalUomsrCydFEVERGWjdajXr18fp0+fLtK+b98+eHl56aImIiIqI62/pXHKlCkYP348cnJyIITAb7/9hi1btmDhwoVYs2ZNRdRIREQa0jrUhw0bhsePH2Pq1KnIzs7GwIED4ezsjKVLl2LAgAEVUSMREWmoXF/odfv2bRQUFKh+s/RFwS/0osrCL/SiyqLpF3qV60cyXpRfOiIioie0DvX69euX+r3pV65cKVdBRERUdmX64emn5eXlITExEfv378eUKVN0VRcREZWB1qH+zjvvFNu+bNkynDhxotwFERFR2ensC70CAwPx9ddf62p1RERUBjoL9e3bt8PW1lZXqyMiojLQevqlZcuWahdKhRBIS0tDeno6oqOjdVocERFpR+tQDwkJUXtco0YN1KpVC507d0ajRo10VRcREZWBVqH++PFj1KtXDz169ECdOnUqqiYiIiojrebUDQ0NMXbsWOTm5lZUPUREVA5aXyj19fVFYmJiRdRCRETlpPWc+rhx4zB58mSkpKSgdevWMDc3V1vu7e2ts+KIiEg7Gn+h1/DhwxEZGYmaNWsWXYlCASEEFAqF6uft9Ilf6EWVhV/oRZVF0y/00jjUDQwMkJqaiocPH5baz83NTaMNVySGOlUWhjpVFp1/S2Nh9r8IoU1ERMXT6kJpad/OSERE+qfVhdKGDRs+N9gzMzPLVRAREZWdVqE+e/ZsWFtbV1QtRERUTlqF+oABA164n64jIqL/0XhOnfPpREQvPo1DvRy/T01ERJVE4+mXgoKCiqyDiIh0QGc/kkFERPrHUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIob6LoAqz497t+PQ3h1Iv5kKAHB2q4+QN0eieRv/In3XRS3E4X07MXDURPQMebOyS6UqLmbNShw6eABXk65AaWKC5s1bYsLEyahXv4GqjxACK5d/jh3bt+LB/fto2swb70+fCXePl/RYedXHkXo1YmvvgDeGjcfspesxe+l6eDX3QeTcd5Fy7bJav5PHjuDyxbOwsaulp0qpqjt5IgFvDBiIDZtjsXxVDB7nP8a40SPxMDtb1WdDzBps3rge730wA5u2bIOdfS2MHTUcWVn/6rHyqo+hXo209O2A5m3awbGuGxzruuE/oeNgYmKGy3+eVfXJvH0LG5d/jDFT5sDAgCdyVDbLVqzBqyGvw93jJTT0bITZcxciLfUGzp8/B+DJKP3LLzZixFtj0KVrd3i81BBz5i9CTk4O9u3do+fqqzaGejVVkJ+P+KM/IDfnITwaN3vSVlCAlR9HoFffwajr5q7nCkkmD/59AACwtrYGAPyTkoLbt9Pxsn87VR9jY2O0bt0Gv59J1EuNsuBQrJq5nvQ35kwegbxHj2Biaop3ZiyGs+uTec692zbCwMAQ3fv013OVJBMhBD79aBFatGoNj5caAgAyMtIBAHZ2dmp9be3skJp6o9JrlMkLHerXr19HREQEYmJiSuyTm5uL3NxctbZHubkwViorurwqybGuG+Z9/gWy/n2AE78exqpPZuODxSvwKDcXP+z+CnM+2wSFQqHvMkkii+bPxaW/LiJmw5dFFxZzrPH4K58XevolMzMTGzZsKLXPwoULYW1trfa3YcWnlVRh1WNoZAQHJxc0aOiFN4aNh0uDl/DDN7G4eO407t+9g4mhryKstx/Cevvh9q1UbFmzFJPC+ui7bKqiPlwwFz8dOYRVazfCoU4dVbvd/78In3H7tlr/zIyMIqN30o5eR+q7d+8udfmVK1eeu45p06Zh0qRJam1nUnLKVVe1IgTy8h6h3SuBaNqirdqij2ZMgP8rgejYLVhPxVFVJYTAhwvm4vChg1gdsxHOdeuqLXeuWxf29rUQH3cMjRp7AQDy8h7h5MkETAifrI+SpaHXUA8JCYFCoYAQosQ+zzsVUyqVUD4z1WKsLHl91dm29dHw9vGDbS0H5GRnI/6nH3Dhj1OYMmcpLK1qwtKqplp/AwNDWNvYwbGum34Kpipr0fw52PfdHixZugxm5ua4ffvJHLqFhSVMTEygUCgwcPBQxKxZCVc3N7i6uiFm9UqYmJggMKi3nquv2vQa6o6Ojli2bBlCQkKKXX769Gm0bt26couS2L27GVj58SzczbwNU3MLuNT3wJQ5S9G0la++SyPJbIvdAgB4a/hQtfZZcxfg1ZDXAQChw0ciJzcHi+bNwf3799C0mTeiV66FublFpdcrE4UobZhcwV599VW0aNECc+bMKXb5mTNn0LJlSxQUFGi13uOX7+miPKLnaupipe8SqJowN9bsArJeR+pTpkxBVlZWics9PDxw+PDhSqyIiKhq0+tIvaJwpE6VhSN1qiyajtRf6FsaiYhIOwx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJMNSJiCTCUCcikghDnYhIIgx1IiKJKIQQQt9FkP7l5uZi4cKFmDZtGpRKpb7LIYnxWKtYDHUCANy/fx/W1ta4d+8erKys9F0OSYzHWsXi9AsRkUQY6kREEmGoExFJhKFOAAClUomIiAheuKIKx2OtYvFCKRGRRDhSJyKSCEOdiEgiDHUiIokw1ImIJMJQJ0RHR6N+/fowMTFB69at8fPPP+u7JJLQTz/9hODgYDg5OUGhUGDXrl36LklKDPVqLjY2FuHh4Zg+fToSExPRoUMHBAYGIjk5Wd+lkWSysrLQvHlzfP755/ouRWq8pbGa8/X1RatWrbB8+XJVW+PGjRESEoKFCxfqsTKSmUKhwM6dOxESEqLvUqTDkXo19ujRI5w8eRLdu3dXa+/evTuOHTump6qIqDwY6tXY7du3kZ+fDwcHB7V2BwcHpKWl6akqIioPhjpBoVCoPRZCFGkjoqqBoV6N2dvbw8DAoMio/NatW0VG70RUNTDUqzFjY2O0bt0aBw4cUGs/cOAA/P399VQVEZWHob4LIP2aNGkShgwZAh8fH/j5+WHVqlVITk7GmDFj9F0aSebff//F33//rXqclJSE06dPw9bWFq6urnqsTC68pZEQHR2NxYsXIzU1FU2bNsWSJUvQsWNHfZdFkjly5AgCAgKKtIeGhmL9+vWVX5CkGOpERBLhnDoRkUQY6kREEmGoExFJhKFORCQRhjoRkUQY6kREEmGoExFJhKFORCQRhjpJZdasWWjRooW+yyhWZdRWr149REZGlmsdL/I+pOdjqFOFCwsLg0KhgEKhgJGRERo0aIB3330XWVlZ+i7tuSoz4K5evQqFQoHTp09XyvZITvxCL6oUPXv2xLp165CXl4eff/4ZI0eORFZWltrP6BXKy8uDkZGRHqokqvo4UqdKoVQqUadOHbi4uGDgwIEYNGiQ6tfkC0fDMTExaNCgAZRKJYQQuHfvHkaNGoXatWvDysoKr7zyCs6cOaO23kWLFsHBwQGWlpYYMWIEcnJyimx73bp1aNy4MUxMTNCoUSNER0erLU9JScGAAQNga2sLc3Nz+Pj44Pjx41i/fj1mz56NM2fOqM40Cr94Sle1aePy5cvo06cPHBwcYGFhgTZt2uDgwYNF+j148AADBw6EhYUFnJycEBUVpbZck9qp6mKok16YmpoiLy9P9fjvv//G1q1b8fXXX6umH4KCgpCWlobvvvsOJ0+eRKtWrdClSxdkZmYCALZu3YqIiAjMnz8fJ06cgKOjY5HAXr16NaZPn4758+fjwoULWLBgAWbMmIENGzYAePJ1sJ06dcKNGzewe/dunDlzBlOnTkVBQQH69++PyZMno0mTJkhNTUVqair69+8PIYROatPWv//+i169euHgwYNITExEjx49EBwcjOTkZLV+H330Eby9vXHq1ClMmzYNEydOVH1nvia1UxUniCpYaGio6NOnj+rx8ePHhZ2dnXjjjTeEEEJEREQIIyMjcevWLVWfH3/8UVhZWYmcnBy1dbm7u4uVK1cKIYTw8/MTY8aMUVvu6+srmjdvrnrs4uIivvzyS7U+c+fOFX5+fkIIIVauXCksLS1FRkZGsbVHRESorU+XtT0rKSlJABCJiYkl9nmWl5eXiIqKUj12c3MTPXv2VOvTv39/ERgYqHHtxb1mqjo4UqdKsWfPHlhYWMDExAR+fn7o2LGj2rSAm5sbatWqpXp88uRJ/Pvvv7Czs4OFhYXqLykpCZcvXwYAXLhwAX5+fmrbefpxeno6rl+/jhEjRqitY968eap1nD59Gi1btoStra3Gr0UXtZVFVlYWpk6dCi8vL9SsWRMWFhb4888/i4zUi9vuhQsXNK6dqjZeKKVKERAQgOXLl8PIyAhOTk5FLoSam5urPS4oKICjoyOOHDlSZF01a9bUaJsFBQUAnkzB+Pr6qi0zMDAA8GQaSFu6qK0spkyZgu+//x4ff/wxPDw8YGpqin79+uHRo0fPfW7hD4nrq3aqPAx1qhTm5ubw8PDQuH+rVq2QlpYGQ0ND1KtXr9g+jRs3Rnx8PIYOHapqi4+PV/23g4MDnJ2dceXKFQwaNKjYdXh7e2PNmjXIzMwsdrRubGyM/Px8nddWFj///DPCwsLw2muvAXgyx3716tUi/Z7dTnx8PBo1aqRx7VS1MdTphdS1a1f4+fkhJCQEH374ITw9PXHjxg189913CAkJgY+PD9555x2EhobCx8cH7du3x+bNm3Hu3Dk0aNBAtZ5Zs2ZhwoQJsLKyQmBgIHJzc3HixAncuXMHkyZNwptvvokFCxYgJCQECxcuhKOjIxITE+Hk5AQ/Pz/Uq1dP9VuadevWhaWlpc5qK8nFixeLtHl5ecHDwwM7duxAcHAwFAoFZsyYoTobedqvv/6KxYsXIyQkBAcOHMC2bduwd+9ejfcrVXH6ntQn+T17ofRZJV2Yu3//vvjvf/8rnJychJGRkXBxcRGDBg0SycnJqj7z588X9vb2wsLCQoSGhoqpU6cWWdfmzZtFixYthLGxsbCxsREdO3YUO3bsUC2/evWq6Nu3r7CyshJmZmbCx8dHHD9+XAghRE5Ojujbt6+oWbOmACDWrVun09qeVnihtLi/pKQkkZSUJAICAoSpqalwcXERn3/+uejUqZN45513VOtwc3MTs2fPFm+88YYwMzMTDg4OIjIyUqv9ygulVRt/o5SISCK8+4WISCIMdSIiiTDUiYgkwlAnIpIIQ52ISCIMdSIiiTDUiYgkwlAnIpIIQ52ISCIMdSIiiTDUiYgk8v8ABKBY8Sm9xSMAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model name: \n",
      " DecisionTree\n",
      "Accuracy: 0.6558\n",
      "Precision: 0.6372\n",
      "Recall: 0.6558\n",
      "F1 Score: 0.6401\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.70      0.81      0.75       100\n",
      "           1       0.51      0.37      0.43        54\n",
      "\n",
      "    accuracy                           0.66       154\n",
      "   macro avg       0.61      0.59      0.59       154\n",
      "weighted avg       0.64      0.66      0.64       154\n",
      "\n",
      "\n",
      "Best hyperparamers found by GridSearchCV: \n",
      "{'criterion': 'gini', 'max_depth': 10, 'max_features': None, 'min_samples_leaf': 2, 'min_samples_split': 2}\n"
     ]
    }
   ],
   "source": [
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('DecisionTree', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "55bb2fb4-0019-4671-a627-5483d27bb573",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    }
   ],
   "source": [
    "#SVM // Taking too much time, changed parameters \n",
    "\n",
    "SVM = SVC(random_state = 42)\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "\"\"\"\n",
    "param_grid = {\n",
    "    'C': [0.01,0.1,1,10],\n",
    "    'kernel': ['linear', 'rbf','poly'],\n",
    "    'gamma': ['scale', 'auto'],\n",
    "    'degree': [3,4,5],\n",
    "    'class_weight': [None, 'balanced']\n",
    "}\n",
    "\"\"\"\n",
    "param_grid = {\n",
    "    'C': [0.1, 1, 10],\n",
    "    'kernel': ['linear', 'rbf'],  \n",
    "    'gamma': ['scale']\n",
    "}\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= SVM, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train, y_train)\n",
    "print(\"Grid Search Completed!\")\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "id": "f5ca617e-a9a3-476c-aae0-89a693373802",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model name: \n",
      " Support Vector Machine\n",
      "Accuracy: 0.7727\n",
      "Precision: 0.7676\n",
      "Recall: 0.7727\n",
      "F1 Score: 0.7673\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.80      0.87      0.83       100\n",
      "           1       0.71      0.59      0.65        54\n",
      "\n",
      "    accuracy                           0.77       154\n",
      "   macro avg       0.75      0.73      0.74       154\n",
      "weighted avg       0.77      0.77      0.77       154\n",
      "\n",
      "\n",
      "Best hyperparamers found by GridSearchCV: \n",
      "{'C': 1, 'gamma': 'scale', 'kernel': 'linear'}\n"
     ]
    }
   ],
   "source": [
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('Support Vector Machine', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "id": "5e21db0f-ccda-42c4-bc31-52ebc2560721",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    }
   ],
   "source": [
    "#GassianNB\n",
    "gnb = GaussianNB()\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "param_grid = {\n",
    "    'var_smoothing': [1e-9, 1e-8,1e-7,1e-6]\n",
    "    \n",
    "}\n",
    "\n",
    "\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= gnb, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train, y_train)\n",
    "print(\"Grid Search Completed!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "50449926-96e4-4106-9cd3-34569e1a80b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('Gaussian Naive Bayes', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "id": "38ebc7bf-b6b3-4795-8ad5-ff2d2b747a3d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    }
   ],
   "source": [
    "#KNeighborsClassifier\n",
    "\n",
    "knn = KNeighborsClassifier()\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "param_grid = {\n",
    "    'n_neighbors':[1,3,5,7,9],\n",
    "    'weights': ['uniform', 'distance'],\n",
    "    'metric': ['euclidean', 'manhattan'],\n",
    "    'algorithm': ['auto', 'ball_tree', 'brute']\n",
    "    \n",
    "}\n",
    "\n",
    "\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= knn, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train, y_train)\n",
    "print(\"Grid Search Completed!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "id": "3fdb5d65-be7a-49c6-a4ac-dc8912cdfb70",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model name: \n",
      " KNeighborsClassifier\n",
      "Accuracy: 0.6623\n",
      "Precision: 0.6569\n",
      "Recall: 0.6623\n",
      "F1 Score: 0.6592\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.73      0.76      0.75       100\n",
      "           1       0.52      0.48      0.50        54\n",
      "\n",
      "    accuracy                           0.66       154\n",
      "   macro avg       0.63      0.62      0.62       154\n",
      "weighted avg       0.66      0.66      0.66       154\n",
      "\n",
      "\n",
      "Best hyperparamers found by GridSearchCV: \n",
      "{'algorithm': 'auto', 'metric': 'manhattan', 'n_neighbors': 9, 'weights': 'uniform'}\n"
     ]
    }
   ],
   "source": [
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('KNeighborsClassifier', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "id": "c1d15e42-f815-4d9b-be33-432925de4e56",
   "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>Feature</th>\n",
       "      <th>Score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Pregnancies</td>\n",
       "      <td>117.036850</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Glucose</td>\n",
       "      <td>1085.664342</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>BloodPressure</td>\n",
       "      <td>32.392266</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>SkinThickness</td>\n",
       "      <td>91.831993</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Insulin</td>\n",
       "      <td>1849.072537</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>BMI</td>\n",
       "      <td>109.732744</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>DiabetesPedigreeFunction</td>\n",
       "      <td>3.249805</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Age</td>\n",
       "      <td>153.022813</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    Feature        Score\n",
       "0               Pregnancies   117.036850\n",
       "1                   Glucose  1085.664342\n",
       "2             BloodPressure    32.392266\n",
       "3             SkinThickness    91.831993\n",
       "4                   Insulin  1849.072537\n",
       "5                       BMI   109.732744\n",
       "6  DiabetesPedigreeFunction     3.249805\n",
       "7                       Age   153.022813"
      ]
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Selecting best 2 features using (Filter Method Chi-Square Test\n",
    "select_feature = SelectKBest(chi2, k=2).fit(x_train, y_train)\n",
    "data = pd.DataFrame([])\n",
    "feature_names = df.drop('Outcome', axis=1).columns\n",
    "\n",
    "data._append(pd.DataFrame({'Feature': feature_names, 'Score': select_feature.scores_}))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "id": "4eeafd2d-5d11-45ba-86dc-dd55c0913636",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Selected Features: ['Glucose', 'Insulin']\n"
     ]
    }
   ],
   "source": [
    "# Get selected feature indices\n",
    "selected_indices = select_feature.get_support(indices=True)\n",
    "\n",
    "# Print the selected features\n",
    "selected_features = feature_names[selected_indices]\n",
    "print(\"Selected Features:\", selected_features.tolist())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "id": "cb4a2c68-1ff2-4145-a7bb-0eccbf9c4b67",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train_selected = select_feature.transform(x_train)\n",
    "x_test_selected = select_feature.transform(x_test)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "id": "5e1b19b0-b674-463e-8153-1682771d26e1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model name: \n",
      " RandomForestClassifier\n",
      "Accuracy: 0.7013\n",
      "Precision: 0.6946\n",
      "Recall: 0.7013\n",
      "F1 Score: 0.6969\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.75      0.80      0.78       100\n",
      "           1       0.58      0.52      0.55        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",
      "\n",
      "Best hyperparamers found by GridSearchCV: \n",
      "{'max_depth': None, 'min_samples_leaf': 3, 'min_samples_split': 10, 'n_estimators': 200}\n"
     ]
    }
   ],
   "source": [
    "# Random Forest \n",
    "rf_classifier = RandomForestClassifier(random_state = 42)\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "param_grid = {\n",
    "    'n_estimators': [100,200,300],\n",
    "    'max_depth': [None, 10,20,30], \n",
    "    'min_samples_split': [2,5,10],\n",
    "    'min_samples_leaf': [1,2,3]\n",
    "}\n",
    "\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= rf_classifier, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train_selected, y_train)\n",
    "print(\"Grid Search Completed!\")\n",
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test_selected)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('RandomForestClassifier', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "id": "6163031e-0e62-4a08-9a91-efee904c0f55",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model name: \n",
      " LogisticRegression\n",
      "Accuracy: 0.7468\n",
      "Precision: 0.7401\n",
      "Recall: 0.7468\n",
      "F1 Score: 0.7407\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.78      0.85      0.81       100\n",
      "           1       0.67      0.56      0.61        54\n",
      "\n",
      "    accuracy                           0.75       154\n",
      "   macro avg       0.72      0.70      0.71       154\n",
      "weighted avg       0.74      0.75      0.74       154\n",
      "\n",
      "\n",
      "Best hyperparamers found by GridSearchCV: \n",
      "{'C': 10, 'max_iter': 500, 'solver': 'liblinear'}\n"
     ]
    }
   ],
   "source": [
    "# Logistic Regression\n",
    "LR = LogisticRegression(random_state = 42)\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "param_grid = {\n",
    "    'C': [0.01,0.1,1,10],\n",
    "    'solver': ['liblinear', 'lbfgs'],\n",
    "    'max_iter': [500,1000,2000]\n",
    "}\n",
    "\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= LR, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train_selected, y_train)\n",
    "print(\"Grid Search Completed!\")\n",
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test_selected)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('LogisticRegression', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "id": "8668bcc2-8a21-4867-9081-c6624eac6bf5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "selected features (RFE): [1 5]\n"
     ]
    }
   ],
   "source": [
    "#Selecting best 2 features using wrapper Method Recursive feature Elemination RFE\n",
    "clf_rf_2 = RandomForestClassifier(random_state=43)\n",
    "rfe_selector = RFE(estimator=clf_rf_2, n_features_to_select=2)\n",
    "\n",
    "x_train_selected_rfe = rfe_selector.fit_transform(x_train,y_train)\n",
    "x_test_selected_rfe = rfe_selector.transform(x_test)\n",
    "\n",
    "#get slected features \n",
    "selected_features = rfe_selector.get_support(indices = True)\n",
    "\n",
    "print(\"selected features (RFE):\", selected_features )\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "id": "fe3f3623-4e23-48cc-a553-eab94841f979",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model name: \n",
      " RandomForestClassifier\n",
      "Accuracy: 0.7727\n",
      "Precision: 0.7718\n",
      "Recall: 0.7727\n",
      "F1 Score: 0.7722\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.82      0.83      0.83       100\n",
      "           1       0.68      0.67      0.67        54\n",
      "\n",
      "    accuracy                           0.77       154\n",
      "   macro avg       0.75      0.75      0.75       154\n",
      "weighted avg       0.77      0.77      0.77       154\n",
      "\n",
      "\n",
      "Best hyperparamers found by GridSearchCV: \n",
      "{'max_depth': 10, 'min_samples_leaf': 2, 'min_samples_split': 2, 'n_estimators': 300}\n"
     ]
    }
   ],
   "source": [
    "# Random Forest \n",
    "rf_classifier = RandomForestClassifier(random_state = 42)\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "param_grid = {\n",
    "    'n_estimators': [100,200,300],\n",
    "    'max_depth': [None, 10,20,30], \n",
    "    'min_samples_split': [2,5,10],\n",
    "    'min_samples_leaf': [1,2,3]\n",
    "}\n",
    "\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= rf_classifier, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train_selected_rfe, y_train)\n",
    "print(\"Grid Search Completed!\")\n",
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test_selected_rfe)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('RandomForestClassifier', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "id": "74fc005e-ff56-49f9-a3a0-9159e9d6f8e7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Grid Search...\n",
      "Grid Search Completed!\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model name: \n",
      " LogisticRegression\n",
      "Accuracy: 0.7597\n",
      "Precision: 0.7539\n",
      "Recall: 0.7597\n",
      "F1 Score: 0.7540\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.79      0.86      0.82       100\n",
      "           1       0.69      0.57      0.63        54\n",
      "\n",
      "    accuracy                           0.76       154\n",
      "   macro avg       0.74      0.72      0.72       154\n",
      "weighted avg       0.75      0.76      0.75       154\n",
      "\n",
      "\n",
      "Best hyperparamers found by GridSearchCV: \n",
      "{'C': 0.01, 'max_iter': 500, 'solver': 'lbfgs'}\n"
     ]
    }
   ],
   "source": [
    "# Logistic Regression\n",
    "LR = LogisticRegression(random_state = 42)\n",
    "\n",
    "#Define the hyperparameters for grid search \n",
    "param_grid = {\n",
    "    'C': [0.01,0.1,1,10],\n",
    "    'solver': ['liblinear', 'lbfgs'],\n",
    "    'max_iter': [500,1000,2000]\n",
    "}\n",
    "\n",
    "#initilize GridSearchCV \n",
    "grid_search = GridSearchCV(estimator= LR, param_grid=param_grid, cv =5, scoring = 'accuracy', n_jobs=-1)\n",
    "\n",
    "# Fit the Grid shearch to the data \n",
    "print(\"Starting Grid Search...\")\n",
    "grid_search.fit(x_train_selected_rfe, y_train)\n",
    "print(\"Grid Search Completed!\")\n",
    "\n",
    "#Get best estimator from Grid search \n",
    "best_rf_classifier = grid_search.best_estimator_\n",
    "\n",
    "#Make prediction using the best model\n",
    "y_pred = best_rf_classifier.predict(x_test_selected_rfe)\n",
    "\n",
    "#Model evaluation \n",
    "evaluation_results = evaluate_model('LogisticRegression', y_test, y_pred)\n",
    "\n",
    "#print the evauation results \n",
    "for key, value in evaluation_results.items():\n",
    "    if key == 'Classification Report':\n",
    "        print(value)\n",
    "    else:\n",
    "        print(f\"{key}: {value:.4f}\" if isinstance(value, float) else f\"{key}: \\n {value}\")\n",
    "\n",
    "#Print the best parameters found by the grid search\n",
    "print(\"\\nBest hyperparamers found by GridSearchCV: \")\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "64377cdf-ce32-4cd2-97b5-21444a0e124f",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
