{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c886cb8a-f2fc-4d82-babf-ea06b1409986",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset shape: (303, 14)\n"
     ]
    },
    {
     "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>sex</th>\n",
       "      <th>cp</th>\n",
       "      <th>trestbps</th>\n",
       "      <th>chol</th>\n",
       "      <th>fbs</th>\n",
       "      <th>restecg</th>\n",
       "      <th>thalach</th>\n",
       "      <th>exang</th>\n",
       "      <th>oldpeak</th>\n",
       "      <th>slope</th>\n",
       "      <th>ca</th>\n",
       "      <th>thal</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>63</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>145</td>\n",
       "      <td>233</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>150</td>\n",
       "      <td>0</td>\n",
       "      <td>2.3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>37</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>130</td>\n",
       "      <td>250</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>187</td>\n",
       "      <td>0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>41</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>130</td>\n",
       "      <td>204</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>172</td>\n",
       "      <td>0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>56</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>120</td>\n",
       "      <td>236</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>178</td>\n",
       "      <td>0</td>\n",
       "      <td>0.8</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>57</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>120</td>\n",
       "      <td>354</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>163</td>\n",
       "      <td>1</td>\n",
       "      <td>0.6</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  sex  cp  trestbps  chol  fbs  restecg  thalach  exang  oldpeak  slope  \\\n",
       "0   63    1   3       145   233    1        0      150      0      2.3      0   \n",
       "1   37    1   2       130   250    0        1      187      0      3.5      0   \n",
       "2   41    0   1       130   204    0        0      172      0      1.4      2   \n",
       "3   56    1   1       120   236    0        1      178      0      0.8      2   \n",
       "4   57    0   0       120   354    0        1      163      1      0.6      2   \n",
       "\n",
       "   ca  thal  target  \n",
       "0   0     1       1  \n",
       "1   0     2       1  \n",
       "2   0     2       1  \n",
       "3   0     2       1  \n",
       "4   0     2       1  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "df = pd.read_csv(\"heart.csv\")\n",
    "print(\"Dataset shape:\", df.shape)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f14009ff-84e5-4e45-b510-ee346408f463",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age         0\n",
       "sex         0\n",
       "cp          0\n",
       "trestbps    0\n",
       "chol        0\n",
       "fbs         0\n",
       "restecg     0\n",
       "thalach     0\n",
       "exang       0\n",
       "oldpeak     0\n",
       "slope       0\n",
       "ca          0\n",
       "thal        0\n",
       "target      0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5162ae0f-7a77-4abd-b44f-8f15fd1d9049",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train: (242, 13)\n",
      "Test: (61, 13)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "X = df.drop(\"target\", axis=1)\n",
    "y = df[\"target\"]\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "scaler = StandardScaler()\n",
    "X_train = scaler.fit_transform(X_train)\n",
    "X_test = scaler.transform(X_test)\n",
    "print(\"Train:\", X_train.shape)\n",
    "print(\"Test:\", X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f57b9a9f-2f8d-4d85-a5e0-f075865c1057",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== Model Performance (Before Feature Selection) ===\n",
      "\n",
      "LogReg Best Params: {'C': 1}\n",
      "Accuracy: 0.8524590163934426\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.83      0.86      0.85        29\n",
      "           1       0.87      0.84      0.86        32\n",
      "\n",
      "    accuracy                           0.85        61\n",
      "   macro avg       0.85      0.85      0.85        61\n",
      "weighted avg       0.85      0.85      0.85        61\n",
      "\n",
      "\n",
      "RandomForest Best Params: {'max_depth': None, 'n_estimators': 50}\n",
      "Accuracy: 0.8360655737704918\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.83      0.83      0.83        29\n",
      "           1       0.84      0.84      0.84        32\n",
      "\n",
      "    accuracy                           0.84        61\n",
      "   macro avg       0.84      0.84      0.84        61\n",
      "weighted avg       0.84      0.84      0.84        61\n",
      "\n",
      "\n",
      "SVM Best Params: {'C': 1, 'kernel': 'rbf'}\n",
      "Accuracy: 0.8688524590163934\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.84      0.90      0.87        29\n",
      "           1       0.90      0.84      0.87        32\n",
      "\n",
      "    accuracy                           0.87        61\n",
      "   macro avg       0.87      0.87      0.87        61\n",
      "weighted avg       0.87      0.87      0.87        61\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "models = {\n",
    "    \"LogReg\": (LogisticRegression(max_iter=500), {\"C\":[0.1, 1, 10]}),\n",
    "    \"RandomForest\": (RandomForestClassifier(), {\"n_estimators\":[50,100], \"max_depth\":[None,5,10]}),\n",
    "    \"SVM\": (SVC(), {\"C\":[0.1,1,10], \"kernel\":[\"linear\",\"rbf\"]})\n",
    "}\n",
    "print(\"=== Model Performance (Before Feature Selection) ===\")\n",
    "for name, (model, params) in models.items():\n",
    "    grid = GridSearchCV(model, params, cv=5, scoring=\"accuracy\")\n",
    "    grid.fit(X_train, y_train)\n",
    "    pred = grid.predict(X_test)\n",
    "    print(f\"\\n{name} Best Params: {grid.best_params_}\")\n",
    "    print(\"Accuracy:\", accuracy_score(y_test, pred))\n",
    "    print(classification_report(y_test, pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "0f8cc49a-d0e6-45e8-a607-c8522a643766",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Chi2 selected features shape: (242, 5)\n",
      "RFE selected features shape: (242, 5)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_selection import SelectKBest, chi2, RFE\n",
    "# Chi2 \n",
    "chi2_selector = SelectKBest(score_func=chi2, k=5)\n",
    "X_train_chi2 = chi2_selector.fit_transform(abs(X_train), y_train)\n",
    "X_test_chi2 = chi2_selector.transform(abs(X_test))\n",
    "print(\"Chi2 selected features shape:\", X_train_chi2.shape)\n",
    "# RFE ---\n",
    "rfe = RFE(LogisticRegression(max_iter=500), n_features_to_select=5)\n",
    "X_train_rfe = rfe.fit_transform(X_train, y_train)\n",
    "X_test_rfe = rfe.transform(X_test)\n",
    "print(\"RFE selected features shape:\", X_train_rfe.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "351f90d1-8693-440b-9285-a7c5f6d75c8e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " Performance After Feature Selection (Chi2) \n",
      "\n",
      "LogReg Accuracy: 0.7213114754098361\n",
      "\n",
      "RandomForest Accuracy: 0.7377049180327869\n",
      "\n",
      "SVM Accuracy: 0.7377049180327869\n",
      "\n",
      "Performance After Feature Selection (RFE)\n",
      "\n",
      "LogReg Accuracy: 0.8688524590163934\n",
      "\n",
      "RandomForest Accuracy: 0.8360655737704918\n",
      "\n",
      "SVM Accuracy: 0.8688524590163934\n"
     ]
    }
   ],
   "source": [
    "print(\"\\n Performance After Feature Selection (Chi2) \")\n",
    "for name, (model, params) in models.items():\n",
    "    grid = GridSearchCV(model, params, cv=5, scoring=\"accuracy\")\n",
    "    grid.fit(X_train_chi2, y_train)\n",
    "    pred = grid.predict(X_test_chi2)\n",
    "    print(f\"\\n{name} Accuracy:\", accuracy_score(y_test, pred))\n",
    "print(\"\\nPerformance After Feature Selection (RFE)\")\n",
    "for name, (model, params) in models.items():\n",
    "    grid = GridSearchCV(model, params, cv=5, scoring=\"accuracy\")\n",
    "    grid.fit(X_train_rfe, y_train)\n",
    "    pred = grid.predict(X_test_rfe)\n",
    "    print(f\"\\n{name} Accuracy:\", accuracy_score(y_test, pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "a63be46f-a4de-45cf-a7e2-7bcd9681c313",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data saved successfully as heart_cleaned.csv\n"
     ]
    }
   ],
   "source": [
    "# حفظ نسخة من البيانات (ما تغيرت كثير)\n",
    "df.to_csv(\"heart_cleaned.csv\", index=False)\n",
    "print(\"Data saved successfully as heart_cleaned.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0cce5f44-9ee8-4a08-bdd3-44987c92397c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
