{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "8a2f6552",
      "metadata": {
        "id": "8a2f6552"
      },
      "outputs": [],
      "source": [
        "\n",
        "# Import necessary libraries\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "from sklearn.model_selection import train_test_split, GridSearchCV\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.feature_selection import SelectKBest, chi2, RFE\n",
        "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "7d8a0652",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 258
        },
        "id": "7d8a0652",
        "outputId": "2b08a8fa-ec36-45f3-b8f9-3214d111bd0e"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "   PassengerId  Survived  Pclass  \\\n",
              "0            1         0       3   \n",
              "1            2         1       1   \n",
              "2            3         1       3   \n",
              "3            4         1       1   \n",
              "4            5         0       3   \n",
              "\n",
              "                                                Name     Sex   Age  SibSp  \\\n",
              "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
              "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
              "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
              "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
              "4                           Allen, Mr. William Henry    male  35.0      0   \n",
              "\n",
              "   Parch            Ticket     Fare Cabin Embarked  \n",
              "0      0         A/5 21171   7.2500   NaN        S  \n",
              "1      0          PC 17599  71.2833   C85        C  \n",
              "2      0  STON/O2. 3101282   7.9250   NaN        S  \n",
              "3      0            113803  53.1000  C123        S  \n",
              "4      0            373450   8.0500   NaN        S  "
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-9df0b603-8e84-4b5b-8d3f-b75797c53f50\" class=\"colab-df-container\">\n",
              "    <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>PassengerId</th>\n",
              "      <th>Survived</th>\n",
              "      <th>Pclass</th>\n",
              "      <th>Name</th>\n",
              "      <th>Sex</th>\n",
              "      <th>Age</th>\n",
              "      <th>SibSp</th>\n",
              "      <th>Parch</th>\n",
              "      <th>Ticket</th>\n",
              "      <th>Fare</th>\n",
              "      <th>Cabin</th>\n",
              "      <th>Embarked</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>3</td>\n",
              "      <td>Braund, Mr. Owen Harris</td>\n",
              "      <td>male</td>\n",
              "      <td>22.0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>A/5 21171</td>\n",
              "      <td>7.2500</td>\n",
              "      <td>NaN</td>\n",
              "      <td>S</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
              "      <td>female</td>\n",
              "      <td>38.0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>PC 17599</td>\n",
              "      <td>71.2833</td>\n",
              "      <td>C85</td>\n",
              "      <td>C</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>1</td>\n",
              "      <td>3</td>\n",
              "      <td>Heikkinen, Miss. Laina</td>\n",
              "      <td>female</td>\n",
              "      <td>26.0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>STON/O2. 3101282</td>\n",
              "      <td>7.9250</td>\n",
              "      <td>NaN</td>\n",
              "      <td>S</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>4</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
              "      <td>female</td>\n",
              "      <td>35.0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>113803</td>\n",
              "      <td>53.1000</td>\n",
              "      <td>C123</td>\n",
              "      <td>S</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>5</td>\n",
              "      <td>0</td>\n",
              "      <td>3</td>\n",
              "      <td>Allen, Mr. William Henry</td>\n",
              "      <td>male</td>\n",
              "      <td>35.0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>373450</td>\n",
              "      <td>8.0500</td>\n",
              "      <td>NaN</td>\n",
              "      <td>S</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-9df0b603-8e84-4b5b-8d3f-b75797c53f50')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-9df0b603-8e84-4b5b-8d3f-b75797c53f50 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-9df0b603-8e84-4b5b-8d3f-b75797c53f50');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "    <div id=\"df-f52fcc4d-4d54-4ad1-a6e4-41035f9fa8ed\">\n",
              "      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-f52fcc4d-4d54-4ad1-a6e4-41035f9fa8ed')\"\n",
              "                title=\"Suggest charts\"\n",
              "                style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "      </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "      <script>\n",
              "        async function quickchart(key) {\n",
              "          const quickchartButtonEl =\n",
              "            document.querySelector('#' + key + ' button');\n",
              "          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "          quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "          try {\n",
              "            const charts = await google.colab.kernel.invokeFunction(\n",
              "                'suggestCharts', [key], {});\n",
              "          } catch (error) {\n",
              "            console.error('Error during call to suggestCharts:', error);\n",
              "          }\n",
              "          quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "        }\n",
              "        (() => {\n",
              "          let quickchartButtonEl =\n",
              "            document.querySelector('#df-f52fcc4d-4d54-4ad1-a6e4-41035f9fa8ed button');\n",
              "          quickchartButtonEl.style.display =\n",
              "            google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "        })();\n",
              "      </script>\n",
              "    </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "data",
              "summary": "{\n  \"name\": \"data\",\n  \"rows\": 891,\n  \"fields\": [\n    {\n      \"column\": \"PassengerId\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 257,\n        \"min\": 1,\n        \"max\": 891,\n        \"num_unique_values\": 891,\n        \"samples\": [\n          710,\n          440,\n          841\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Survived\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 1,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1,\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Pclass\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 3,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          3,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Name\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 891,\n        \"samples\": [\n          \"Moubarek, Master. Halim Gonios (\\\"William George\\\")\",\n          \"Kvillner, Mr. Johan Henrik Johannesson\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Sex\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"female\",\n          \"male\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Age\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 14.526497332334044,\n        \"min\": 0.42,\n        \"max\": 80.0,\n        \"num_unique_values\": 88,\n        \"samples\": [\n          0.75,\n          22.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"SibSp\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 0,\n        \"max\": 8,\n        \"num_unique_values\": 7,\n        \"samples\": [\n          1,\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Parch\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 6,\n        \"num_unique_values\": 7,\n        \"samples\": [\n          0,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Ticket\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 681,\n        \"samples\": [\n          \"11774\",\n          \"248740\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Fare\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 49.693428597180905,\n        \"min\": 0.0,\n        \"max\": 512.3292,\n        \"num_unique_values\": 248,\n        \"samples\": [\n          11.2417,\n          51.8625\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Cabin\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 147,\n        \"samples\": [\n          \"D45\",\n          \"B49\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Embarked\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"S\",\n          \"C\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 4
        }
      ],
      "source": [
        "\n",
        "# Reading dataset\n",
        "data = pd.read_csv(\"Titanic-Dataset.csv\")\n",
        "data.head()\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "513fc326",
      "metadata": {
        "id": "513fc326"
      },
      "outputs": [],
      "source": [
        "\n",
        "# Drop unnecessary columns if they exist\n",
        "for col in ['Cabin', 'Name', 'Ticket']:\n",
        "    if col in data.columns:\n",
        "        data.drop(col, axis=1, inplace=True)\n",
        "\n",
        "# Handle missing values\n",
        "if 'Age' in data.columns:\n",
        "    data['Age'] = data['Age'].fillna(data['Age'].mean())\n",
        "\n",
        "if 'Embarked' in data.columns:\n",
        "    data['Embarked'] = data['Embarked'].fillna(data['Embarked'].mode()[0])\n",
        "\n",
        "data.dropna(inplace=True)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "70784452",
      "metadata": {
        "id": "70784452"
      },
      "outputs": [],
      "source": [
        "\n",
        "# Convert categorical variables to numeric\n",
        "data = pd.get_dummies(data, columns=['Sex', 'Embarked'], drop_first=True)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "ad7d3db6",
      "metadata": {
        "id": "ad7d3db6"
      },
      "outputs": [],
      "source": [
        "\n",
        "# Define features and target variable\n",
        "X = data.drop(['Survived', 'PassengerId'], axis=1)\n",
        "y = data['Survived']\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "8dfa7131",
      "metadata": {
        "id": "8dfa7131"
      },
      "outputs": [],
      "source": [
        "\n",
        "# Split and scale the data\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
        "\n",
        "scaler = StandardScaler()\n",
        "X_train_scaled = scaler.fit_transform(X_train)\n",
        "X_test_scaled = scaler.transform(X_test)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "1acc275b",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "1acc275b",
        "outputId": "a51cfab0-6a18-4725-a2e2-95ebc993dc1b"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Best parameters: {'C': 0.01}\n",
            "Accuracy: 0.7988826815642458\n",
            "Classification Report:\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.79      0.89      0.84       105\n",
            "           1       0.81      0.68      0.74        74\n",
            "\n",
            "    accuracy                           0.80       179\n",
            "   macro avg       0.80      0.78      0.79       179\n",
            "weighted avg       0.80      0.80      0.80       179\n",
            "\n"
          ]
        }
      ],
      "source": [
        "\n",
        "# Apply Logistic Regression with GridSearchCV\n",
        "param_grid = {'C': [0.01, 0.1, 1, 10]}\n",
        "grid = GridSearchCV(LogisticRegression(), param_grid, cv=5)\n",
        "grid.fit(X_train_scaled, y_train)\n",
        "\n",
        "y_pred = grid.predict(X_test_scaled)\n",
        "print(\"Best parameters:\", grid.best_params_)\n",
        "print(\"Accuracy:\", accuracy_score(y_test, y_pred))\n",
        "print(\"Classification Report:\")\n",
        "print(classification_report(y_test, y_pred))\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "685b7b58",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 410
        },
        "id": "685b7b58",
        "outputId": "f173d7b9-7e92-4e4f-fec6-1a6d3ec5fa15"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 400x400 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXUAAAGJCAYAAAB1raOqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJK5JREFUeJzt3XlcVXX+x/H3BeGC7CYumKJmomaDS2VlipZW5ppTZs2MoFlpOZpbxsyUSqM0Zu6pLaZm6VhaZtmU5hJZlmai5pb7kqLihqIgwff3Rw/5dQXtgsCVr6/n4+HjMZxz7jmfy9iL47nnXhzGGCMAgBW8PD0AAKDoEHUAsAhRBwCLEHUAsAhRBwCLEHUAsAhRBwCLEHUAsAhRBwCLEHWUKtu3b9e9996rkJAQORwOLViwoEj3v2fPHjkcDs2YMaNI91uatWjRQi1atPD0GHATUUeB7dy5U0899ZRq1qwpPz8/BQcHq2nTpho/frzOnTtXrMeOjY3Vxo0bNWLECM2aNUu33HJLsR6vJMXFxcnhcCg4ODjf7+P27dvlcDjkcDg0evToAu//4MGDGjZsmJKTk4tgWlytynh6AJQuixYt0sMPPyyn06lu3bqpfv36On/+vFauXKnBgwdr06ZNeuONN4rl2OfOndOqVav0z3/+U3369CmWY0RGRurcuXPy8fEplv3/kTJlyujs2bP65JNP1KVLF5d17733nvz8/JSRkVGofR88eFDDhw9X9erV1aBBA7cft3jx4kIdD55B1OG23bt3q2vXroqMjNSyZctUuXLl3HXPPPOMduzYoUWLFhXb8Y8ePSpJCg0NLbZjOBwO+fn5Fdv+/4jT6VTTpk01Z86cPFGfPXu22rZtq/nz55fILGfPnlXZsmXl6+tbIsdDETGAm3r16mUkmW+++cat7bOyskxCQoKpWbOm8fX1NZGRkSY+Pt5kZGS4bBcZGWnatm1rvv76a3Prrbcap9NpatSoYWbOnJm7zdChQ40klz+RkZHGGGNiY2Nz//fvXXjM7y1evNg0bdrUhISEmICAAFO7dm0THx+fu3737t1Gkpk+fbrL45YuXWruuusuU7ZsWRMSEmI6dOhgNm/enO/xtm/fbmJjY01ISIgJDg42cXFxJj09/Q+/X7GxsSYgIMDMmDHDOJ1Oc+LEidx1q1evNpLM/PnzjSTzyiuv5K47duyYGThwoKlfv74JCAgwQUFB5v777zfJycm52yxfvjzP9+/3zzMmJsbcdNNN5ocffjDNmjUz/v7+pl+/frnrYmJicvfVrVs343Q68zz/e++914SGhppffvnlD58rig/X1OG2Tz75RDVr1tSdd97p1vY9e/bUiy++qEaNGmns2LGKiYlRYmKiunbtmmfbHTt26KGHHlLr1q316quvKiwsTHFxcdq0aZMkqXPnzho7dqwk6dFHH9WsWbM0bty4As2/adMmtWvXTpmZmUpISNCrr76qDh066Jtvvrns47788kvdd999OnLkiIYNG6YBAwbo22+/VdOmTbVnz54823fp0kWnT59WYmKiunTpohkzZmj48OFuz9m5c2c5HA59+OGHuctmz56tOnXqqFGjRnm237VrlxYsWKB27dppzJgxGjx4sDZu3KiYmBgdPHhQklS3bl0lJCRIkp588knNmjVLs2bNUvPmzXP3c+zYMbVp00YNGjTQuHHj1LJly3znGz9+vMLDwxUbG6vs7GxJ0uuvv67Fixdr4sSJioiIcPu5ohh4+qcKSodTp04ZSaZjx45ubZ+cnGwkmZ49e7osHzRokJFkli1blrssMjLSSDJJSUm5y44cOWKcTqcZOHBg7rILZ9G/P0s1xv0z9bFjxxpJ5ujRo5ecO78z9QYNGpgKFSqYY8eO5S5bv3698fLyMt26dctzvB49erjs88EHHzTXXXfdJY/5++cREBBgjDHmoYceMvfcc48xxpjs7GxTqVIlM3z48Hy/BxkZGSY7OzvP83A6nSYhISF32Zo1a/L9V4gxv52NSzJTp07Nd93vz9SNMeaLL74wksy///1vs2vXLhMYGGg6der0h88RxY8zdbglLS1NkhQUFOTW9p999pkkacCAAS7LBw4cKEl5rr3Xq1dPzZo1y/06PDxcUVFR2rVrV6FnvtiFa/Eff/yxcnJy3HrMoUOHlJycrLi4OJUrVy53+Z/+9Ce1bt0693n+Xq9evVy+btasmY4dO5b7PXTHY489phUrViglJUXLli1TSkqKHnvssXy3dTqd8vL67T/l7OxsHTt2TIGBgYqKitKPP/7o9jGdTqe6d+/u1rb33nuvnnrqKSUkJKhz587y8/PT66+/7vaxUHyIOtwSHBwsSTp9+rRb2+/du1deXl6qVauWy/JKlSopNDRUe/fudVlerVq1PPsICwvTiRMnCjlxXo888oiaNm2qnj17qmLFiuratavef//9ywb+wpxRUVF51tWtW1epqalKT093WX7xcwkLC5OkAj2XBx54QEFBQZo7d67ee+893XrrrXm+lxfk5ORo7NixuvHGG+V0OlW+fHmFh4drw4YNOnXqlNvHrFKlSoFeFB09erTKlSun5ORkTZgwQRUqVHD7sSg+RB1uCQ4OVkREhH766acCPc7hcLi1nbe3d77LjRu/bfFSx7hwvfcCf39/JSUl6csvv9Tf/vY3bdiwQY888ohat26dZ9srcSXP5QKn06nOnTtr5syZ+uijjy55li5JI0eO1IABA9S8eXO9++67+uKLL7RkyRLddNNNbv+LRPrt+1MQ69at05EjRyRJGzduLNBjUXyIOtzWrl077dy5U6tWrfrDbSMjI5WTk6Pt27e7LD98+LBOnjypyMjIIpsrLCxMJ0+ezLP84n8NSJKXl5fuuecejRkzRps3b9aIESO0bNkyLV++PN99X5hz27ZtedZt3bpV5cuXV0BAwJU9gUt47LHHtG7dOp0+fTrfF5cvmDdvnlq2bKlp06apa9euuvfee9WqVas83xN3f8C6Iz09Xd27d1e9evX05JNPatSoUVqzZk2R7R+FR9Thtueee04BAQHq2bOnDh8+nGf9zp07NX78eEm/XT6QlOcOlTFjxkiS2rZtW2Rz3XDDDTp16pQ2bNiQu+zQoUP66KOPXLY7fvx4nsdeeBNOZmZmvvuuXLmyGjRooJkzZ7pE8qefftLixYtzn2dxaNmypV566SVNmjRJlSpVuuR23t7eef4V8MEHH+iXX35xWXbhh09+PwALasiQIdq3b59mzpypMWPGqHr16oqNjb3k9xElhzcfwW033HCDZs+erUceeUR169Z1eUfpt99+qw8++EBxcXGSpOjoaMXGxuqNN97QyZMnFRMTo9WrV2vmzJnq1KnTJW+XK4yuXbtqyJAhevDBB9W3b1+dPXtWU6ZMUe3atV1eKExISFBSUpLatm2ryMhIHTlyRJMnT9b111+vu+6665L7f+WVV9SmTRvdcccdevzxx3Xu3DlNnDhRISEhGjZsWJE9j4t5eXnpX//61x9u165dOyUkJKh79+668847tXHjRr333nuqWbOmy3Y33HCDQkNDNXXqVAUFBSkgIEBNmjRRjRo1CjTXsmXLNHnyZA0d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PDy8UMf39/cv8GPOnDkjSVq0aJGqVKniss7pdBZqDoCowwoBAQGqVauWW9s2atRIc+fOVYUKFRQcHJzvNpUrV9b333+v5s2bS5J+/fVXrV27Vo0aNcp3+5tvvlk5OTn66quv1KpVqzzrL/xLITs7O3dZvXr15HQ6tW/fvkue4detW1cLFy50Wfbdd9/98ZPENYsXSnHN+ctf/qLy5curY8eO+vrrr7V7926tWLFCffv21YEDByRJ/fr108svv6wFCxZo69atevrppy97j3n16tUVGxurHj16aMGCBbn7fP/99yVJkZGRcjgc+vTTT3X06FGdOXNGQUFBGjRokPr376+ZM2dq586d+vHHHzVx4kTNnDlTktSrVy9t375dgwcP1rZt2zR79mx+9Rsui6jjmlO2bFklJSWpWrVq6ty5s+rWravHH39cGRkZuWfuAwcO1N/+9jfFxsbqjjvuUFBQkB588MHL7nfKlCl66KGH9PTTT6tOnTp64oknlJ6eLkmqUqWKhg8frueff14VK1ZUnz59JEkvvfSSXnjhBSUmJqpu3bq6//77tWjRItWoUUOSVK1aNc2fP18LFixQdHS0pk6dqpEjRxbjdwelHb+jFAAswpk6AFiEqAOARYg6AFiEqAOARYg6AFiEqAOARYg6AFiEqAOARYg6AFiEqAOARYg6AFjk/wBRz0hspCcHrwAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "\n",
        "# Plot Confusion Matrix\n",
        "cm = confusion_matrix(y_test, y_pred)\n",
        "plt.figure(figsize=(4, 4))\n",
        "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False)\n",
        "plt.title(\"Confusion Matrix\")\n",
        "plt.xlabel(\"Predicted\")\n",
        "plt.ylabel(\"Actual\")\n",
        "plt.show()\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "01d792c0",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "01d792c0",
        "outputId": "3beeb579-b05c-4950-8d2b-1d119166b9ba"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy after SelectKBest: 0.7932960893854749\n",
            "Classification Report:\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.80      0.86      0.83       105\n",
            "           1       0.78      0.70      0.74        74\n",
            "\n",
            "    accuracy                           0.79       179\n",
            "   macro avg       0.79      0.78      0.78       179\n",
            "weighted avg       0.79      0.79      0.79       179\n",
            "\n"
          ]
        }
      ],
      "source": [
        "\n",
        "# Feature Selection using SelectKBest\n",
        "selector = SelectKBest(score_func=chi2, k=5)\n",
        "X_new = selector.fit_transform(X, y)\n",
        "\n",
        "X_train_kb, X_test_kb, y_train_kb, y_test_kb = train_test_split(X_new, y, test_size=0.2, random_state=42)\n",
        "\n",
        "grid.fit(X_train_kb, y_train_kb)\n",
        "y_pred_kb = grid.predict(X_test_kb)\n",
        "\n",
        "print(\"Accuracy after SelectKBest:\", accuracy_score(y_test_kb, y_pred_kb))\n",
        "print(\"Classification Report:\")\n",
        "print(classification_report(y_test_kb, y_pred_kb))\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "8dede2ed",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "8dede2ed",
        "outputId": "8f313f4b-fe89-434b-bef4-eb8580e285b8"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy after RFE: 0.770949720670391\n",
            "Classification Report:\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.81      0.79      0.80       105\n",
            "           1       0.71      0.74      0.73        74\n",
            "\n",
            "    accuracy                           0.77       179\n",
            "   macro avg       0.76      0.77      0.77       179\n",
            "weighted avg       0.77      0.77      0.77       179\n",
            "\n"
          ]
        }
      ],
      "source": [
        "\n",
        "# Feature Selection using RFE\n",
        "rfe_selector = RFE(estimator=LogisticRegression(max_iter=1000), n_features_to_select=5)\n",
        "X_rfe = rfe_selector.fit_transform(X, y)\n",
        "\n",
        "X_train_rfe, X_test_rfe, y_train_rfe, y_test_rfe = train_test_split(X_rfe, y, test_size=0.2, random_state=42)\n",
        "\n",
        "grid.fit(X_train_rfe, y_train_rfe)\n",
        "y_pred_rfe = grid.predict(X_test_rfe)\n",
        "\n",
        "print(\"Accuracy after RFE:\", accuracy_score(y_test_rfe, y_pred_rfe))\n",
        "print(\"Classification Report:\")\n",
        "print(classification_report(y_test_rfe, y_pred_rfe))\n"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "language_info": {
      "name": "python"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}