{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cbd67910-3425-45af-8cc5-0a122edff268",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Machine Learning Project: Breast Cancer Classification - Nouf Assignment 2\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.preprocessing import LabelEncoder, StandardScaler\n",
    "from sklearn.feature_selection import SelectKBest, chi2, RFE\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import classification_report\n",
    "\n",
    "# Step 1: Load dataset\n",
    "df = pd.read_csv(\"Breast_Cancer.csv\")\n",
    "\n",
    "# Step 2: Check for missing values\n",
    "missing = df.isnull().sum()\n",
    "print(\"Missing values:\\n\", missing)\n",
    "\n",
    "# Step 3: Prepare features and target\n",
    "target_column = 'Status'\n",
    "X = df.drop(columns=[target_column])\n",
    "y = df[target_column]\n",
    "\n",
    "# Encode categorical variables\n",
    "for col in X.select_dtypes(include='object').columns:\n",
    "    le = LabelEncoder()\n",
    "    X[col] = le.fit_transform(X[col].astype(str))\n",
    "\n",
    "# Encode target if needed\n",
    "if y.dtypes == 'object':\n",
    "    le_target = LabelEncoder()\n",
    "    y = le_target.fit_transform(y)\n",
    "\n",
    "# Step 4: Train-test split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n",
    "\n",
    "# Step 5: Apply Machine Learning Models with GridSearchCV\n",
    "# Random Forest\n",
    "rf_params = {'n_estimators': [100, 200], 'max_depth': [None, 10, 20]}\n",
    "rf = RandomForestClassifier(random_state=42)\n",
    "grid_rf = GridSearchCV(rf, rf_params, cv=3, scoring='accuracy')\n",
    "grid_rf.fit(X_train, y_train)\n",
    "rf_best = grid_rf.best_estimator_\n",
    "\n",
    "# SVM\n",
    "svm_params = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}\n",
    "svm = SVC(random_state=42)\n",
    "grid_svm = GridSearchCV(svm, svm_params, cv=3, scoring='accuracy')\n",
    "grid_svm.fit(X_train, y_train)\n",
    "svm_best = grid_svm.best_estimator_\n",
    "\n",
    "# Logistic Regression\n",
    "lr_params = {'C': [0.1, 1, 10]}\n",
    "lr = LogisticRegression(max_iter=1000, random_state=42)\n",
    "grid_lr = GridSearchCV(lr, lr_params, cv=3, scoring='accuracy')\n",
    "grid_lr.fit(X_train, y_train)\n",
    "lr_best = grid_lr.best_estimator_\n",
    "\n",
    "# Step 6: Evaluation\n",
    "print(\"\\nRandom Forest Report:\\n\", classification_report(y_test, rf_best.predict(X_test)))\n",
    "print(\"\\nSVM Report:\\n\", classification_report(y_test, svm_best.predict(X_test)))\n",
    "print(\"\\nLogistic Regression Report:\\n\", classification_report(y_test, lr_best.predict(X_test)))\n",
    "\n",
    "# Step 7: Feature Selection\n",
    "# Chi-Square\n",
    "selector_chi2 = SelectKBest(score_func=chi2, k=10)\n",
    "X_chi2 = selector_chi2.fit_transform(X, y)\n",
    "selected_features_chi2 = X.columns[selector_chi2.get_support()].tolist()\n",
    "print(\"\\nSelected Features using Chi-Square:\", selected_features_chi2)\n",
    "\n",
    "# RFE with Random Forest\n",
    "rfe_selector = RFE(estimator=RandomForestClassifier(random_state=42), n_features_to_select=10)\n",
    "rfe_selector.fit(X, y)\n",
    "selected_features_rfe = X.columns[rfe_selector.get_support()].tolist()\n",
    "print(\"\\nSelected Features using RFE:\", selected_features_rfe)\n",
    "\n",
    "# Step 8: Retrain Models with Selected Features\n",
    "# Chi-Square Features\n",
    "X_selected_chi2 = X[selected_features_chi2]\n",
    "X_train_chi2, X_test_chi2, y_train_chi2, y_test_chi2 = train_test_split(X_selected_chi2, y, test_size=0.2, random_state=42, stratify=y)\n",
    "rf_chi2 = RandomForestClassifier(random_state=42)\n",
    "rf_chi2.fit(X_train_chi2, y_train_chi2)\n",
    "print(\"\\nRandom Forest Report (Chi-Square Features):\\n\", classification_report(y_test_chi2, rf_chi2.predict(X_test_chi2)))\n",
    "\n",
    "# RFE Features\n",
    "X_selected_rfe = X[selected_features_rfe]\n",
    "X_train_rfe, X_test_rfe, y_train_rfe, y_test_rfe = train_test_split(X_selected_rfe, y, test_size=0.2, random_state=42, stratify=y)\n",
    "rf_rfe = RandomForestClassifier(random_state=42)\n",
    "rf_rfe.fit(X_train_rfe, y_train_rfe)\n",
    "print(\"\\nRandom Forest Report (RFE Features):\\n\", classification_report(y_test_rfe, rf_rfe.predict(X_test_rfe)))\n",
    "\n",
    "# Step 9: Save cleaned dataset\n",
    "final_df = X.copy()\n",
    "final_df['Status'] = y\n",
    "final_df.to_csv(\"Breast_Cancer_Cleaned.csv\", index=False)\n",
    "\n",
    "# Plotting feature importances for Random Forest (Optional)\n",
    "plt.figure(figsize=(10, 6))\n",
    "sns.barplot(x=rf_best.feature_importances_, y=X.columns)\n",
    "plt.title('Feature Importances from Random Forest')\n",
    "plt.xlabel('Importance')\n",
    "plt.ylabel('Features')\n",
    "plt.show()\n"
   ]
  }
 ],
 "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
}
