{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1a0c7251-b961-4f5f-b239-20465cb60faf",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.model_selection import train_test_split,GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import classification_report, confusion_matrix\n",
    "import seaborn as sns\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.model_selection import StratifiedKFold,cross_val_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4fb048df-9c0a-44d2-9087-0dc2f4c6b5cd",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('Heart Disease.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "60c9b2f2-2a0e-4b4f-a25d-1e8d4c3835b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4321f33b-f37d-46ca-abbe-78f0c0a2cceb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>gender</th>\n",
       "      <th>impluse</th>\n",
       "      <th>pressurehight</th>\n",
       "      <th>pressurelow</th>\n",
       "      <th>glucose</th>\n",
       "      <th>kcm</th>\n",
       "      <th>troponin</th>\n",
       "      <th>class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>64</td>\n",
       "      <td>1</td>\n",
       "      <td>66</td>\n",
       "      <td>160</td>\n",
       "      <td>83</td>\n",
       "      <td>160.0</td>\n",
       "      <td>1.80</td>\n",
       "      <td>0.012</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>21</td>\n",
       "      <td>1</td>\n",
       "      <td>94</td>\n",
       "      <td>98</td>\n",
       "      <td>46</td>\n",
       "      <td>296.0</td>\n",
       "      <td>6.75</td>\n",
       "      <td>1.060</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>55</td>\n",
       "      <td>1</td>\n",
       "      <td>64</td>\n",
       "      <td>160</td>\n",
       "      <td>77</td>\n",
       "      <td>270.0</td>\n",
       "      <td>1.99</td>\n",
       "      <td>0.003</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>64</td>\n",
       "      <td>1</td>\n",
       "      <td>70</td>\n",
       "      <td>120</td>\n",
       "      <td>55</td>\n",
       "      <td>270.0</td>\n",
       "      <td>13.87</td>\n",
       "      <td>0.122</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>55</td>\n",
       "      <td>1</td>\n",
       "      <td>64</td>\n",
       "      <td>112</td>\n",
       "      <td>65</td>\n",
       "      <td>300.0</td>\n",
       "      <td>1.08</td>\n",
       "      <td>0.003</td>\n",
       "      <td>negative</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>1309</th>\n",
       "      <td>47</td>\n",
       "      <td>1</td>\n",
       "      <td>94</td>\n",
       "      <td>105</td>\n",
       "      <td>81</td>\n",
       "      <td>135.0</td>\n",
       "      <td>36.24</td>\n",
       "      <td>0.263</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1310</th>\n",
       "      <td>70</td>\n",
       "      <td>0</td>\n",
       "      <td>80</td>\n",
       "      <td>135</td>\n",
       "      <td>75</td>\n",
       "      <td>351.0</td>\n",
       "      <td>2.21</td>\n",
       "      <td>10.000</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1311</th>\n",
       "      <td>85</td>\n",
       "      <td>1</td>\n",
       "      <td>112</td>\n",
       "      <td>115</td>\n",
       "      <td>69</td>\n",
       "      <td>114.0</td>\n",
       "      <td>2.19</td>\n",
       "      <td>0.062</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1312</th>\n",
       "      <td>48</td>\n",
       "      <td>1</td>\n",
       "      <td>84</td>\n",
       "      <td>118</td>\n",
       "      <td>68</td>\n",
       "      <td>96.0</td>\n",
       "      <td>5.33</td>\n",
       "      <td>0.006</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1313</th>\n",
       "      <td>86</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>179</td>\n",
       "      <td>68</td>\n",
       "      <td>147.0</td>\n",
       "      <td>5.22</td>\n",
       "      <td>0.011</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1314 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      age  gender  impluse  pressurehight  pressurelow  glucose    kcm  \\\n",
       "0      64       1       66            160           83    160.0   1.80   \n",
       "1      21       1       94             98           46    296.0   6.75   \n",
       "2      55       1       64            160           77    270.0   1.99   \n",
       "3      64       1       70            120           55    270.0  13.87   \n",
       "4      55       1       64            112           65    300.0   1.08   \n",
       "...   ...     ...      ...            ...          ...      ...    ...   \n",
       "1309   47       1       94            105           81    135.0  36.24   \n",
       "1310   70       0       80            135           75    351.0   2.21   \n",
       "1311   85       1      112            115           69    114.0   2.19   \n",
       "1312   48       1       84            118           68     96.0   5.33   \n",
       "1313   86       0       40            179           68    147.0   5.22   \n",
       "\n",
       "      troponin     class  \n",
       "0        0.012  negative  \n",
       "1        1.060  positive  \n",
       "2        0.003  negative  \n",
       "3        0.122  positive  \n",
       "4        0.003  negative  \n",
       "...        ...       ...  \n",
       "1309     0.263  positive  \n",
       "1310    10.000  positive  \n",
       "1311     0.062  positive  \n",
       "1312     0.006  negative  \n",
       "1313     0.011  negative  \n",
       "\n",
       "[1314 rows x 9 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(-5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d7e26349-68bf-4e93-afc3-e43f9bf07ba5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age              0\n",
       "gender           0\n",
       "impluse          0\n",
       "pressurehight    0\n",
       "pressurelow      0\n",
       "glucose          0\n",
       "kcm              0\n",
       "troponin         0\n",
       "class            0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isna().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "ade1b7da-65c2-43cf-95c4-f31f72ecc0d3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age                int64\n",
       "gender             int64\n",
       "impluse            int64\n",
       "pressurehight      int64\n",
       "pressurelow        int64\n",
       "glucose          float64\n",
       "kcm              float64\n",
       "troponin         float64\n",
       "class             object\n",
       "dtype: object"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "1182db84-02b0-469a-ae35-c4f777a4fcec",
   "metadata": {},
   "outputs": [],
   "source": [
    "class_counts = df['class'].value_counts() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "00abbaff-4b50-4b45-9b61-0ce8881a512b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   age  gender  impluse  pressurehight  pressurelow  glucose    kcm  troponin  \\\n",
      "0   64       1       66            160           83    160.0   1.80     0.012   \n",
      "1   21       1       94             98           46    296.0   6.75     1.060   \n",
      "2   55       1       64            160           77    270.0   1.99     0.003   \n",
      "3   64       1       70            120           55    270.0  13.87     0.122   \n",
      "4   55       1       64            112           65    300.0   1.08     0.003   \n",
      "\n",
      "      class  \n",
      "0  negative  \n",
      "1  positive  \n",
      "2  negative  \n",
      "3  positive  \n",
      "4  negative  \n"
     ]
    }
   ],
   "source": [
    "print(df.head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "458542c6-873c-4566-b5e2-e36b66f00981",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "class\n",
       "positive    810\n",
       "negative    509\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['class'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "960bb3b0-3d71-4602-b2d9-c077ccec3055",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Feature Shape: (1319, 8)\n",
      "Target Shape: (1319,)\n"
     ]
    }
   ],
   "source": [
    "# Define features (X) and target (y)\n",
    "X = data.drop(\"class\", axis=1)  # All columns except \"class\"\n",
    "y = (data[\"class\"] == \"positive\").astype(int)  # Convert target to binary (0: negative, 1: positive)\n",
    "\n",
    "# Print shape of data\n",
    "print(\"Feature Shape:\", X.shape)\n",
    "print(\"Target Shape:\", y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "9a880740-2f9f-4447-846a-f2720ecaf76a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Data Shape: (1055, 8)\n",
      "Testing Data Shape: (264, 8)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# Define features (X) and target (y)\n",
    "X = data.drop(\"class\", axis=1)  # Features\n",
    "y = (data[\"class\"] == \"positive\").astype(int)  # Convert labels to binary\n",
    "\n",
    "# Split data (80% train, 20% test)\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# Print shapes\n",
    "print(\"Training Data Shape:\", X_train.shape)\n",
    "print(\"Testing Data Shape:\", X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "1ca33902-c1fe-472c-819d-43ed040bf552",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.80\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "    negative       0.75      0.69      0.72       101\n",
      "    positive       0.82      0.86      0.84       163\n",
      "\n",
      "    accuracy                           0.80       264\n",
      "   macro avg       0.79      0.78      0.78       264\n",
      "weighted avg       0.79      0.80      0.79       264\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "import pandas as pd\n",
    "\n",
    "# Load dataset\n",
    "df = pd.read_csv(\"Heart Disease.csv\")\n",
    "\n",
    "# Define features and target\n",
    "X = df.drop(columns=[\"class\"])  # Exclude target variable\n",
    "y = df[\"class\"]\n",
    "\n",
    "# Split data into training and testing sets\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# Initialize and train Logistic Regression model\n",
    "lr = LogisticRegression(max_iter=1000)\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "# Make predictions\n",
    "y_pred = lr.predict(X_test)\n",
    "\n",
    "# Evaluate model\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"Accuracy: {accuracy:.2f}\")\n",
    "print(\"Classification Report:\\n\", classification_report(y_test, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "5b0da180-3e10-4eb8-aff2-b98ff29f9b92",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.98\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "    negative       0.97      0.97      0.97       101\n",
      "    positive       0.98      0.98      0.98       163\n",
      "\n",
      "    accuracy                           0.98       264\n",
      "   macro avg       0.98      0.98      0.98       264\n",
      "weighted avg       0.98      0.98      0.98       264\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "import pandas as pd\n",
    "\n",
    "# Load dataset\n",
    "df = pd.read_csv(\"Heart Disease.csv\")\n",
    "\n",
    "# Define features and target\n",
    "X = df.drop(columns=[\"class\"])  # Exclude the target column\n",
    "y = df[\"class\"]\n",
    "\n",
    "# Split data into training and testing sets\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# Initialize and train Decision Tree model\n",
    "dt = DecisionTreeClassifier(max_depth=5, random_state=42)\n",
    "dt.fit(X_train, y_train)\n",
    "\n",
    "# Make predictions\n",
    "y_pred = dt.predict(X_test)\n",
    "\n",
    "# Evaluate model\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"Accuracy: {accuracy:.2f}\")\n",
    "print(\"Classification Report:\\n\", classification_report(y_test, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "1c56e6c6-5204-40d9-987c-46e3ed620306",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.64\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "    negative       0.53      0.55      0.54       101\n",
      "    positive       0.72      0.70      0.71       163\n",
      "\n",
      "    accuracy                           0.64       264\n",
      "   macro avg       0.63      0.63      0.63       264\n",
      "weighted avg       0.65      0.64      0.65       264\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "import pandas as pd\n",
    "\n",
    "# Load dataset\n",
    "df = pd.read_csv(\"Heart Disease.csv\")\n",
    "\n",
    "# Define features and target variable\n",
    "X = df.drop(columns=[\"class\"])  # Exclude target column\n",
    "y = df[\"class\"]\n",
    "\n",
    "# Split dataset into training and testing sets\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# Initialize and train KNN model\n",
    "knn = KNeighborsClassifier(n_neighbors=5)\n",
    "knn.fit(X_train, y_train)\n",
    "\n",
    "# Make predictions\n",
    "y_pred = knn.predict(X_test)\n",
    "\n",
    "# Evaluate accuracy\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"Accuracy: {accuracy:.2f}\")\n",
    "print(\"Classification Report:\\n\", classification_report(y_test, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "72268b6f-6d90-4d62-ba92-aec24a48be09",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.69\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "    negative       0.75      0.30      0.43       101\n",
      "    positive       0.68      0.94      0.79       163\n",
      "\n",
      "    accuracy                           0.69       264\n",
      "   macro avg       0.72      0.62      0.61       264\n",
      "weighted avg       0.71      0.69      0.65       264\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "import pandas as pd\n",
    "\n",
    "# Load dataset\n",
    "df = pd.read_csv(\"Heart Disease.csv\")\n",
    "\n",
    "# Define features and target variable\n",
    "X = df.drop(columns=[\"class\"])  # Exclude the target column\n",
    "y = df[\"class\"]\n",
    "\n",
    "# Split dataset into training and testing sets\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# Initialize and train SVM model\n",
    "svm = SVC(kernel='rbf', C=1.0, gamma='scale')  # RBF kernel for nonlinear classification\n",
    "svm.fit(X_train, y_train)\n",
    "\n",
    "# Make predictions\n",
    "y_pred = svm.predict(X_test)\n",
    "\n",
    "# Evaluate accuracy\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"Accuracy: {accuracy:.2f}\")\n",
    "print(\"Classification Report:\\n\", classification_report(y_test, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "4e6faa26-91a3-4afb-8ffa-0e698bdaf18b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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W98hEOncjvj7+g6BSOeCu3ro9Pg+K38r8b4HxlfMzm6xe/wDBgyAr68vateujUePHqkXJIiLi4Onp6fWAyQiItIVrtVfBIsXL0bNmjVx9+5dREREwNLSEsCLWwATJkzQeoBERES6IsO8X/zEb2xsjBkzZhQoDwwM1EY8REREpENFSvx79uwp8gHfeeedEgdDRERUliTIr8tfpMT/91cHvokkScV+SxAREZG+GMgv7xct8efn5+s6DiIiojLHyX3F9OzZM5iammorFiIiojIlw7xf/JX78vLyMG/ePFSvXh2Wlpa4efMmAGDWrFlYt26d1gMkIiLSldKs1V9RFTvxz58/H1FRUYiIiICJiYm6vHHjxli7dq1WgyMiIiLtKnbi37BhA1avXg0/Pz+NZQKbNGmC33//XavBERER6VJZrdVfnhT7Hv9ff/1V6Ap9+fn5yMnJ0UpQREREZUGOk/uK3eNv2LAhTpw4UaD8P//5D5o3b66VoIiIiMoCe/xFEBoaig8++AB//fUX8vPzsXPnTly7dg0bNmzAvn37dBEjERGRTlTkSXolVewef9++fbFt2zb88MMPkCQJn332GRISErB371707NlTFzESERHphFSKraIq0XP83t7e8Pb21nYsREREpGMlXsAnNjYWCQkJkCQJ9evXR8uWLbUZFxERkc7JcXJfsRP/vXv3MGTIEJw6dQpVqlQBADx+/BheXl7YsmULXFxctB0jERGRTshxrf5i3+MfOXIkcnJykJCQgNTUVKSmpiIhIQFCCAQEBOgiRiIiIp2QJKnEW0VV7B7/iRMncPr0adStW1ddVrduXSxduhTt27fXanBERES6VIHzd4kVO/G7uroWulBPbm4uqlevrpWgiIiIykJF7rmXVLGH+iMiIvDhhx8iNjYWQggALyb6TZkyBV988YXWAyQiIiLtKVKP39bWVuOvoszMTLRt2xZGRi92z83NhZGREUaOHIn+/fvrJFAiIiJtk+PkviIl/sjISB2HQUREVPbkONRfpMQ/fPhwXcdBRERU5uSX9kuxgA8AZGdnF5joZ21tXaqAiIiIygrX6i+CzMxMTJo0CY6OjrC0tIStra3GRkREROVXsRN/cHAwjhw5ghUrVkChUGDt2rWYM2cOlEolNmzYoIsYiYiIdIKv5S2CvXv3YsOGDejSpQtGjhyJjh07wtPTE25u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",
      "text/plain": [
       "<Figure size 600x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "# Compute confusion matrix\n",
    "cm = confusion_matrix(y_test, y_pred)\n",
    "\n",
    "# Plot confusion matrix\n",
    "plt.figure(figsize=(6, 4))\n",
    "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=[\"Negative\", \"Positive\"], yticklabels=[\"Negative\", \"Positive\"])\n",
    "plt.xlabel(\"Predicted Labels\")\n",
    "plt.ylabel(\"True Labels\")\n",
    "plt.title(\"Confusion Matrix\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "beed8ca5-a975-4396-828c-420bcd3acb93",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best Parameters: {'max_depth': None, 'min_samples_split': 2, 'n_estimators': 100}\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "import pandas as pd\n",
    "\n",
    "# Load dataset\n",
    "data = pd.read_csv(\"Heart Disease.csv\")\n",
    "\n",
    "# Prepare features and target\n",
    "X = data.drop(\"class\", axis=1)\n",
    "y = (data[\"class\"] == \"positive\").astype(int)\n",
    "\n",
    "# Define model and hyperparameter grid\n",
    "rf = RandomForestClassifier()\n",
    "param_grid = {\n",
    "    \"n_estimators\": [50, 100, 200],\n",
    "    \"max_depth\": [None, 10, 20],\n",
    "    \"min_samples_split\": [2, 5, 10]\n",
    "}\n",
    "\n",
    "# Apply Grid Search\n",
    "grid_search = GridSearchCV(rf, param_grid, cv=5, scoring=\"accuracy\")\n",
    "grid_search.fit(X, y)\n",
    "\n",
    "# Print best parameters\n",
    "print(\"Best Parameters:\", grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "5daf87ee-1cea-42a8-aa0a-56f96ca1d3d4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cross-Validation Accuracy Scores: [0.97727273 0.98484848 0.99242424 0.98106061 0.98859316]\n",
      "Mean Accuracy: 0.9848398432999194\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score, KFold\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "import pandas as pd\n",
    "\n",
    "# Load dataset\n",
    "data = pd.read_csv(\"Heart Disease.csv\")\n",
    "\n",
    "# Prepare features and target\n",
    "X = data.drop(\"class\", axis=1)\n",
    "y = (data[\"class\"] == \"positive\").astype(int)\n",
    "\n",
    "# Define model\n",
    "rf = RandomForestClassifier(n_estimators=100, random_state=42)\n",
    "\n",
    "# Apply K-Fold Cross-Validation\n",
    "kf = KFold(n_splits=5, shuffle=True, random_state=42)\n",
    "scores = cross_val_score(rf, X, y, cv=kf, scoring=\"accuracy\")\n",
    "\n",
    "# Print results\n",
    "print(\"Cross-Validation Accuracy Scores:\", scores)\n",
    "print(\"Mean Accuracy:\", scores.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "a581e4df-4cf6-4e46-9e36-0b0c69c0879e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Random Forest Accuracy: 0.9810606060606061\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score\n",
    "import pandas as pd\n",
    "\n",
    "# Load dataset\n",
    "data = pd.read_csv(\"Heart Disease.csv\")\n",
    "\n",
    "# Prepare features and target\n",
    "X = data.drop(\"class\", axis=1)\n",
    "y = (data[\"class\"] == \"positive\").astype(int)\n",
    "\n",
    "# Split data\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# Train Random Forest model\n",
    "rf = RandomForestClassifier(n_estimators=100, random_state=42)\n",
    "rf.fit(X_train, y_train)\n",
    "\n",
    "# Make predictions\n",
    "y_pred = rf.predict(X_test)\n",
    "\n",
    "# Evaluate model\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(\"Random Forest Accuracy:\", accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "21741133-6f75-48cf-b65a-73d8dc9abfa2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 27 candidates, totalling 135 fits\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=50; total time=   0.0s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=100; total time=   0.3s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=200; total time=   0.8s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=None, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END .max_depth=10, min_samples_split=2, n_estimators=50; total time=   0.2s\n",
      "[CV] END .max_depth=10, min_samples_split=2, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=10, min_samples_split=2, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=10, min_samples_split=2, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=10, min_samples_split=2, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END .max_depth=10, min_samples_split=5, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=10, min_samples_split=5, n_estimators=50; total time=   0.2s\n",
      "[CV] END .max_depth=10, min_samples_split=5, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=10, min_samples_split=5, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=10, min_samples_split=5, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=200; total time=   0.8s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=200; total time=   0.8s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=10, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END .max_depth=20, min_samples_split=2, n_estimators=50; total time=   0.2s\n",
      "[CV] END .max_depth=20, min_samples_split=2, n_estimators=50; total time=   0.2s\n",
      "[CV] END .max_depth=20, min_samples_split=2, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=20, min_samples_split=2, n_estimators=50; total time=   0.2s\n",
      "[CV] END .max_depth=20, min_samples_split=2, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=2, n_estimators=200; total time=   0.9s\n",
      "[CV] END .max_depth=20, min_samples_split=5, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=20, min_samples_split=5, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=20, min_samples_split=5, n_estimators=50; total time=   0.2s\n",
      "[CV] END .max_depth=20, min_samples_split=5, n_estimators=50; total time=   0.1s\n",
      "[CV] END .max_depth=20, min_samples_split=5, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=200; total time=   0.8s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=5, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=50; total time=   0.2s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=50; total time=   0.1s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=100; total time=   0.4s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=200; total time=   0.9s\n",
      "[CV] END max_depth=20, min_samples_split=10, n_estimators=200; total time=   0.8s\n",
      "Best Parameters: {'max_depth': None, 'min_samples_split': 2, 'n_estimators': 200}\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# Define hyperparameter grid for Random Forest\n",
    "param_grid = {\n",
    "    \"n_estimators\": [50, 100, 200],\n",
    "    \"max_depth\": [None, 10, 20],\n",
    "    \"min_samples_split\": [2, 5, 10]\n",
    "}\n",
    "\n",
    "# Initialize model\n",
    "rf = RandomForestClassifier()\n",
    "\n",
    "# Apply Grid Search with 5-fold Cross-Validation\n",
    "grid_search = GridSearchCV(rf, param_grid, cv=5, scoring=\"accuracy\", verbose=2)\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "# Print best parameters\n",
    "print(\"Best Parameters:\", grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "a701626b-ec57-4f28-8145-201b1059ff48",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cross-Validation Accuracy Scores: [0.98104265 0.98104265 0.98578199 0.99526066 0.99052133]\n",
      "Mean Accuracy: 0.9867298578199051\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "# Perform K-Fold Cross-Validation\n",
    "scores = cross_val_score(grid_search.best_estimator_, X_train, y_train, cv=5, scoring=\"accuracy\")\n",
    "\n",
    "# Print results\n",
    "print(\"Cross-Validation Accuracy Scores:\", scores)\n",
    "print(\"Mean Accuracy:\", scores.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "26681905-1375-4cfd-96b6-b68338186ccf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Final Model Accuracy: 0.9772727272727273\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "           0       0.97      0.97      0.97       101\n",
      "           1       0.98      0.98      0.98       163\n",
      "\n",
      "    accuracy                           0.98       264\n",
      "   macro avg       0.98      0.98      0.98       264\n",
      "weighted avg       0.98      0.98      0.98       264\n",
      "\n"
     ]
    }
   ],
   "source": [
    "best_rf = grid_search.best_estimator_\n",
    "best_rf.fit(X_train, y_train)\n",
    "y_pred = best_rf.predict(X_test)\n",
    "\n",
    "# Evaluate performance\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(\"Final Model Accuracy:\", accuracy)\n",
    "print(\"Classification Report:\\n\", classification_report(y_test, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e0752301-d13e-4ba9-82db-f1bf141efb2d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Selected Features: Index(['age', 'gender', 'glucose', 'kcm', 'troponin'], dtype='object')\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_selection import SelectKBest, chi2\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "import pandas as pd\n",
    "\n",
    "# Load dataset\n",
    "data = pd.read_csv(\"Heart Disease.csv\")\n",
    "\n",
    "# Separate features and target\n",
    "X = data.drop(\"class\", axis=1)\n",
    "y = (data[\"class\"] == \"positive\").astype(int)  # Convert labels\n",
    "\n",
    "# Scale features for Chi-Square test\n",
    "scaler = MinMaxScaler()\n",
    "X_scaled = scaler.fit_transform(X)\n",
    "\n",
    "# Apply Chi-Square test for feature selection\n",
    "selector = SelectKBest(score_func=chi2, k=5)  # Select top 5 features\n",
    "X_new = selector.fit_transform(X_scaled, y)\n",
    "\n",
    "# Show selected features\n",
    "selected_features = X.columns[selector.get_support()]\n",
    "print(\"Selected Features:\", selected_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d62abff5-6e97-4c77-9ff1-7fdad005f88c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# Load dataset\n",
    "df = pd.read_csv(\"Heart Disease.csv\")\n",
    "\n",
    "# Define features (X) and target (y)\n",
    "X = df.drop(columns=[\"class\"])  # Assuming 'class' is the target variable\n",
    "y = df[\"class\"]\n",
    "\n",
    "# Convert categorical target variable to numerical (if needed)\n",
    "y = y.map({\"negative\": 0, \"positive\": 1})\n",
    "\n",
    "# Split into training and test sets\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# Standardize the features (important for models like Logistic Regression & SVM)\n",
    "scaler = StandardScaler()\n",
    "X_train = scaler.fit_transform(X_train)\n",
    "X_test = scaler.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "3c24c325-deaa-4e33-a3bc-99949fce823d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Selected Features: Index(['age', 'gender', 'glucose', 'kcm', 'troponin'], dtype='object')\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.feature_selection import RFE\n",
    "\n",
    "# Initialize model\n",
    "model = LogisticRegression(max_iter=1000)\n",
    "\n",
    "# Apply Recursive Feature Elimination\n",
    "rfe = RFE(estimator=model, n_features_to_select=5)  # Choose the number of features to keep\n",
    "X_train_rfe = rfe.fit_transform(X_train, y_train)\n",
    "X_test_rfe = rfe.transform(X_test)\n",
    "\n",
    "# Get selected feature names\n",
    "selected_features = X.columns[rfe.support_]\n",
    "print(\"Selected Features:\", selected_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "aa6a9715-93c8-430f-aade-e12836fb67d4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model Accuracy after RFE: 0.80\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "# Train the model on selected features\n",
    "model.fit(X_train_rfe, y_train)\n",
    "\n",
    "# Make predictions\n",
    "    y_pred = model.predict(X_test_rfe)\n",
    "    \n",
    "    # Evaluate model performance\n",
    "    accuracy = accuracy_score(y_test, y_pred)\n",
    "    print(f\"Model Accuracy after RFE: {accuracy:.2f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "04a12b2c-5267-4cf7-a15e-63d657f345d0",
   "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
}
