[a2d0eb]: / notebooks / exploration.ipynb

Download this file

948 lines (947 with data), 115.3 kB

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "23f2705f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Path to dataset files: /home/kesslermatics/.cache/kagglehub/datasets/raghadalharbi/breast-cancer-gene-expression-profiles-metabric/versions/1\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_24481/2461765115.py:9: DtypeWarning: Columns (678,688,690,692) have mixed types. Specify dtype option on import or set low_memory=False.\n",
      "  df = pd.read_csv(os.path.join(path, \"METABRIC_RNA_Mutation.csv\"))\n"
     ]
    }
   ],
   "source": [
    "import kagglehub\n",
    "import os\n",
    "import pandas as pd\n",
    "\n",
    "# Download latest version\n",
    "path = kagglehub.dataset_download(\"raghadalharbi/breast-cancer-gene-expression-profiles-metabric\")\n",
    "\n",
    "print(\"Path to dataset files:\", path)\n",
    "df = pd.read_csv(os.path.join(path, \"METABRIC_RNA_Mutation.csv\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "05cff3e5",
   "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>patient_id</th>\n",
       "      <th>age_at_diagnosis</th>\n",
       "      <th>chemotherapy</th>\n",
       "      <th>cohort</th>\n",
       "      <th>neoplasm_histologic_grade</th>\n",
       "      <th>hormone_therapy</th>\n",
       "      <th>lymph_nodes_examined_positive</th>\n",
       "      <th>mutation_count</th>\n",
       "      <th>nottingham_prognostic_index</th>\n",
       "      <th>overall_survival_months</th>\n",
       "      <th>...</th>\n",
       "      <th>srd5a1</th>\n",
       "      <th>srd5a2</th>\n",
       "      <th>srd5a3</th>\n",
       "      <th>st7</th>\n",
       "      <th>star</th>\n",
       "      <th>tnk2</th>\n",
       "      <th>tulp4</th>\n",
       "      <th>ugt2b15</th>\n",
       "      <th>ugt2b17</th>\n",
       "      <th>ugt2b7</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1904.000000</td>\n",
       "      <td>1904.000000</td>\n",
       "      <td>1904.000000</td>\n",
       "      <td>1904.000000</td>\n",
       "      <td>1832.000000</td>\n",
       "      <td>1904.000000</td>\n",
       "      <td>1904.000000</td>\n",
       "      <td>1859.000000</td>\n",
       "      <td>1904.000000</td>\n",
       "      <td>1904.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>1.904000e+03</td>\n",
       "      <td>1.904000e+03</td>\n",
       "      <td>1.904000e+03</td>\n",
       "      <td>1.904000e+03</td>\n",
       "      <td>1904.000000</td>\n",
       "      <td>1.904000e+03</td>\n",
       "      <td>1.904000e+03</td>\n",
       "      <td>1.904000e+03</td>\n",
       "      <td>1904.000000</td>\n",
       "      <td>1.904000e+03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3921.982143</td>\n",
       "      <td>61.087054</td>\n",
       "      <td>0.207983</td>\n",
       "      <td>2.643908</td>\n",
       "      <td>2.415939</td>\n",
       "      <td>0.616597</td>\n",
       "      <td>2.002101</td>\n",
       "      <td>5.697687</td>\n",
       "      <td>4.033019</td>\n",
       "      <td>125.121324</td>\n",
       "      <td>...</td>\n",
       "      <td>4.726891e-07</td>\n",
       "      <td>-3.676471e-07</td>\n",
       "      <td>-9.453782e-07</td>\n",
       "      <td>-1.050420e-07</td>\n",
       "      <td>-0.000002</td>\n",
       "      <td>3.676471e-07</td>\n",
       "      <td>4.726891e-07</td>\n",
       "      <td>7.878151e-07</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.731842e-18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2358.478332</td>\n",
       "      <td>12.978711</td>\n",
       "      <td>0.405971</td>\n",
       "      <td>1.228615</td>\n",
       "      <td>0.650612</td>\n",
       "      <td>0.486343</td>\n",
       "      <td>4.079993</td>\n",
       "      <td>4.058778</td>\n",
       "      <td>1.144492</td>\n",
       "      <td>76.334148</td>\n",
       "      <td>...</td>\n",
       "      <td>1.000263e+00</td>\n",
       "      <td>1.000262e+00</td>\n",
       "      <td>1.000262e+00</td>\n",
       "      <td>1.000263e+00</td>\n",
       "      <td>1.000262</td>\n",
       "      <td>1.000264e+00</td>\n",
       "      <td>1.000262e+00</td>\n",
       "      <td>1.000263e+00</td>\n",
       "      <td>1.000262</td>\n",
       "      <td>1.000262e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>21.930000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>-2.120800e+00</td>\n",
       "      <td>-3.364800e+00</td>\n",
       "      <td>-2.719400e+00</td>\n",
       "      <td>-4.982700e+00</td>\n",
       "      <td>-2.981700</td>\n",
       "      <td>-3.833300e+00</td>\n",
       "      <td>-3.609300e+00</td>\n",
       "      <td>-1.166900e+00</td>\n",
       "      <td>-2.112600</td>\n",
       "      <td>-1.051600e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>896.500000</td>\n",
       "      <td>51.375000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.046000</td>\n",
       "      <td>60.825000</td>\n",
       "      <td>...</td>\n",
       "      <td>-6.188500e-01</td>\n",
       "      <td>-6.104750e-01</td>\n",
       "      <td>-6.741750e-01</td>\n",
       "      <td>-6.136750e-01</td>\n",
       "      <td>-0.632900</td>\n",
       "      <td>-6.664750e-01</td>\n",
       "      <td>-7.102000e-01</td>\n",
       "      <td>-5.058250e-01</td>\n",
       "      <td>-0.476200</td>\n",
       "      <td>-7.260000e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>4730.500000</td>\n",
       "      <td>61.770000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>4.042000</td>\n",
       "      <td>115.616667</td>\n",
       "      <td>...</td>\n",
       "      <td>-2.456500e-01</td>\n",
       "      <td>-4.690000e-02</td>\n",
       "      <td>-1.422500e-01</td>\n",
       "      <td>-5.175000e-02</td>\n",
       "      <td>-0.026650</td>\n",
       "      <td>7.000000e-04</td>\n",
       "      <td>-2.980000e-02</td>\n",
       "      <td>-2.885500e-01</td>\n",
       "      <td>-0.133400</td>\n",
       "      <td>-4.248000e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>5536.250000</td>\n",
       "      <td>70.592500</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>5.040250</td>\n",
       "      <td>184.716667</td>\n",
       "      <td>...</td>\n",
       "      <td>3.306000e-01</td>\n",
       "      <td>5.144500e-01</td>\n",
       "      <td>5.146000e-01</td>\n",
       "      <td>5.787750e-01</td>\n",
       "      <td>0.590350</td>\n",
       "      <td>6.429000e-01</td>\n",
       "      <td>5.957250e-01</td>\n",
       "      <td>6.022500e-02</td>\n",
       "      <td>0.270375</td>\n",
       "      <td>4.284000e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>7299.000000</td>\n",
       "      <td>96.290000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>45.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>6.360000</td>\n",
       "      <td>355.200000</td>\n",
       "      <td>...</td>\n",
       "      <td>6.534900e+00</td>\n",
       "      <td>1.027030e+01</td>\n",
       "      <td>6.329000e+00</td>\n",
       "      <td>4.571300e+00</td>\n",
       "      <td>12.742300</td>\n",
       "      <td>3.938800e+00</td>\n",
       "      <td>3.833400e+00</td>\n",
       "      <td>1.088490e+01</td>\n",
       "      <td>12.643900</td>\n",
       "      <td>3.284400e+00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 503 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        patient_id  age_at_diagnosis  chemotherapy       cohort  \\\n",
       "count  1904.000000       1904.000000   1904.000000  1904.000000   \n",
       "mean   3921.982143         61.087054      0.207983     2.643908   \n",
       "std    2358.478332         12.978711      0.405971     1.228615   \n",
       "min       0.000000         21.930000      0.000000     1.000000   \n",
       "25%     896.500000         51.375000      0.000000     1.000000   \n",
       "50%    4730.500000         61.770000      0.000000     3.000000   \n",
       "75%    5536.250000         70.592500      0.000000     3.000000   \n",
       "max    7299.000000         96.290000      1.000000     5.000000   \n",
       "\n",
       "       neoplasm_histologic_grade  hormone_therapy  \\\n",
       "count                1832.000000      1904.000000   \n",
       "mean                    2.415939         0.616597   \n",
       "std                     0.650612         0.486343   \n",
       "min                     1.000000         0.000000   \n",
       "25%                     2.000000         0.000000   \n",
       "50%                     3.000000         1.000000   \n",
       "75%                     3.000000         1.000000   \n",
       "max                     3.000000         1.000000   \n",
       "\n",
       "       lymph_nodes_examined_positive  mutation_count  \\\n",
       "count                    1904.000000     1859.000000   \n",
       "mean                        2.002101        5.697687   \n",
       "std                         4.079993        4.058778   \n",
       "min                         0.000000        1.000000   \n",
       "25%                         0.000000        3.000000   \n",
       "50%                         0.000000        5.000000   \n",
       "75%                         2.000000        7.000000   \n",
       "max                        45.000000       80.000000   \n",
       "\n",
       "       nottingham_prognostic_index  overall_survival_months  ...  \\\n",
       "count                  1904.000000              1904.000000  ...   \n",
       "mean                      4.033019               125.121324  ...   \n",
       "std                       1.144492                76.334148  ...   \n",
       "min                       1.000000                 0.000000  ...   \n",
       "25%                       3.046000                60.825000  ...   \n",
       "50%                       4.042000               115.616667  ...   \n",
       "75%                       5.040250               184.716667  ...   \n",
       "max                       6.360000               355.200000  ...   \n",
       "\n",
       "             srd5a1        srd5a2        srd5a3           st7         star  \\\n",
       "count  1.904000e+03  1.904000e+03  1.904000e+03  1.904000e+03  1904.000000   \n",
       "mean   4.726891e-07 -3.676471e-07 -9.453782e-07 -1.050420e-07    -0.000002   \n",
       "std    1.000263e+00  1.000262e+00  1.000262e+00  1.000263e+00     1.000262   \n",
       "min   -2.120800e+00 -3.364800e+00 -2.719400e+00 -4.982700e+00    -2.981700   \n",
       "25%   -6.188500e-01 -6.104750e-01 -6.741750e-01 -6.136750e-01    -0.632900   \n",
       "50%   -2.456500e-01 -4.690000e-02 -1.422500e-01 -5.175000e-02    -0.026650   \n",
       "75%    3.306000e-01  5.144500e-01  5.146000e-01  5.787750e-01     0.590350   \n",
       "max    6.534900e+00  1.027030e+01  6.329000e+00  4.571300e+00    12.742300   \n",
       "\n",
       "               tnk2         tulp4       ugt2b15      ugt2b17        ugt2b7  \n",
       "count  1.904000e+03  1.904000e+03  1.904000e+03  1904.000000  1.904000e+03  \n",
       "mean   3.676471e-07  4.726891e-07  7.878151e-07     0.000000  3.731842e-18  \n",
       "std    1.000264e+00  1.000262e+00  1.000263e+00     1.000262  1.000262e+00  \n",
       "min   -3.833300e+00 -3.609300e+00 -1.166900e+00    -2.112600 -1.051600e+00  \n",
       "25%   -6.664750e-01 -7.102000e-01 -5.058250e-01    -0.476200 -7.260000e-01  \n",
       "50%    7.000000e-04 -2.980000e-02 -2.885500e-01    -0.133400 -4.248000e-01  \n",
       "75%    6.429000e-01  5.957250e-01  6.022500e-02     0.270375  4.284000e-01  \n",
       "max    3.938800e+00  3.833400e+00  1.088490e+01    12.643900  3.284400e+00  \n",
       "\n",
       "[8 rows x 503 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3630c8da",
   "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>patient_id</th>\n",
       "      <th>age_at_diagnosis</th>\n",
       "      <th>type_of_breast_surgery</th>\n",
       "      <th>cancer_type</th>\n",
       "      <th>cancer_type_detailed</th>\n",
       "      <th>cellularity</th>\n",
       "      <th>chemotherapy</th>\n",
       "      <th>pam50_+_claudin-low_subtype</th>\n",
       "      <th>cohort</th>\n",
       "      <th>er_status_measured_by_ihc</th>\n",
       "      <th>...</th>\n",
       "      <th>mtap_mut</th>\n",
       "      <th>ppp2cb_mut</th>\n",
       "      <th>smarcd1_mut</th>\n",
       "      <th>nras_mut</th>\n",
       "      <th>ndfip1_mut</th>\n",
       "      <th>hras_mut</th>\n",
       "      <th>prps2_mut</th>\n",
       "      <th>smarcb1_mut</th>\n",
       "      <th>stmn2_mut</th>\n",
       "      <th>siah1_mut</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>75.65</td>\n",
       "      <td>MASTECTOMY</td>\n",
       "      <td>Breast Cancer</td>\n",
       "      <td>Breast Invasive Ductal Carcinoma</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>claudin-low</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Positve</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>43.19</td>\n",
       "      <td>BREAST CONSERVING</td>\n",
       "      <td>Breast Cancer</td>\n",
       "      <td>Breast Invasive Ductal Carcinoma</td>\n",
       "      <td>High</td>\n",
       "      <td>0</td>\n",
       "      <td>LumA</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Positve</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5</td>\n",
       "      <td>48.87</td>\n",
       "      <td>MASTECTOMY</td>\n",
       "      <td>Breast Cancer</td>\n",
       "      <td>Breast Invasive Ductal Carcinoma</td>\n",
       "      <td>High</td>\n",
       "      <td>1</td>\n",
       "      <td>LumB</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Positve</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>6</td>\n",
       "      <td>47.68</td>\n",
       "      <td>MASTECTOMY</td>\n",
       "      <td>Breast Cancer</td>\n",
       "      <td>Breast Mixed Ductal and Lobular Carcinoma</td>\n",
       "      <td>Moderate</td>\n",
       "      <td>1</td>\n",
       "      <td>LumB</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Positve</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>76.97</td>\n",
       "      <td>MASTECTOMY</td>\n",
       "      <td>Breast Cancer</td>\n",
       "      <td>Breast Mixed Ductal and Lobular Carcinoma</td>\n",
       "      <td>High</td>\n",
       "      <td>1</td>\n",
       "      <td>LumB</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Positve</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 693 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   patient_id  age_at_diagnosis type_of_breast_surgery    cancer_type  \\\n",
       "0           0             75.65             MASTECTOMY  Breast Cancer   \n",
       "1           2             43.19      BREAST CONSERVING  Breast Cancer   \n",
       "2           5             48.87             MASTECTOMY  Breast Cancer   \n",
       "3           6             47.68             MASTECTOMY  Breast Cancer   \n",
       "4           8             76.97             MASTECTOMY  Breast Cancer   \n",
       "\n",
       "                        cancer_type_detailed cellularity  chemotherapy  \\\n",
       "0           Breast Invasive Ductal Carcinoma         NaN             0   \n",
       "1           Breast Invasive Ductal Carcinoma        High             0   \n",
       "2           Breast Invasive Ductal Carcinoma        High             1   \n",
       "3  Breast Mixed Ductal and Lobular Carcinoma    Moderate             1   \n",
       "4  Breast Mixed Ductal and Lobular Carcinoma        High             1   \n",
       "\n",
       "  pam50_+_claudin-low_subtype  cohort er_status_measured_by_ihc  ... mtap_mut  \\\n",
       "0                 claudin-low     1.0                   Positve  ...        0   \n",
       "1                        LumA     1.0                   Positve  ...        0   \n",
       "2                        LumB     1.0                   Positve  ...        0   \n",
       "3                        LumB     1.0                   Positve  ...        0   \n",
       "4                        LumB     1.0                   Positve  ...        0   \n",
       "\n",
       "   ppp2cb_mut smarcd1_mut nras_mut ndfip1_mut  hras_mut prps2_mut smarcb1_mut  \\\n",
       "0           0           0        0          0         0         0           0   \n",
       "1           0           0        0          0         0         0           0   \n",
       "2           0           0        0          0         0         0           0   \n",
       "3           0           0        0          0         0         0           0   \n",
       "4           0           0        0          0         0         0           0   \n",
       "\n",
       "  stmn2_mut  siah1_mut  \n",
       "0         0          0  \n",
       "1         0          0  \n",
       "2         0          0  \n",
       "3         0          0  \n",
       "4         0          0  \n",
       "\n",
       "[5 rows x 693 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "32de0ca9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1200x1000 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import os\n",
    "\n",
    "# Create output folder\n",
    "os.makedirs(\"outputs/figures\", exist_ok=True)\n",
    "\n",
    "# 1. Chemotherapy distribution\n",
    "sns.countplot(x=\"chemotherapy\", data=df)\n",
    "plt.title(\"Chemotherapy Decision Distribution\")\n",
    "plt.savefig(\"../outputs/figures/chemotherapy_distribution.png\")\n",
    "plt.clf()\n",
    "\n",
    "# 2. Age at diagnosis distribution\n",
    "sns.histplot(df[\"age_at_diagnosis\"], kde=True, bins=30)\n",
    "plt.title(\"Age at Diagnosis\")\n",
    "plt.xlabel(\"Age\")\n",
    "plt.ylabel(\"Count\")\n",
    "plt.savefig(\"../outputs/figures/age_distribution.png\")\n",
    "plt.clf()\n",
    "\n",
    "# 3. Tumor size distribution\n",
    "if \"tumor_size\" in df.columns:\n",
    "    sns.histplot(df[\"tumor_size\"].dropna(), kde=True, bins=30)\n",
    "    plt.title(\"Tumor Size\")\n",
    "    plt.xlabel(\"Size (mm)\")\n",
    "    plt.savefig(\"../outputs/figures/tumor_size_distribution.png\")\n",
    "    plt.clf()\n",
    "\n",
    "# 4. Chemotherapy by PAM50 subtype\n",
    "if \"pam50_+_claudin-low_subtype\" in df.columns:\n",
    "    sns.countplot(x=\"pam50_+_claudin-low_subtype\", hue=\"chemotherapy\", data=df)\n",
    "    plt.title(\"Chemotherapy by PAM50 Subtype\")\n",
    "    plt.xticks(rotation=45)\n",
    "    plt.tight_layout()\n",
    "    plt.savefig(\"../outputs/figures/chemotherapy_by_pam50_subtype.png\")\n",
    "    plt.clf()\n",
    "\n",
    "# 5. Chemotherapy vs. hormone therapy\n",
    "if \"hormone_therapy\" in df.columns:\n",
    "    sns.countplot(x=\"chemotherapy\", hue=\"hormone_therapy\", data=df)\n",
    "    plt.title(\"Chemotherapy vs. Hormone Therapy\")\n",
    "    plt.savefig(\"../outputs/figures/chemotherapy_vs_hormone_therapy.png\")\n",
    "    plt.clf()\n",
    "\n",
    "# 6. Correlation heatmap of numeric features\n",
    "numeric_df = df.select_dtypes(include=[\"int64\", \"float64\"]).drop(columns=[\"patient_id\"], errors=\"ignore\")\n",
    "plt.figure(figsize=(12, 10))\n",
    "sns.heatmap(numeric_df.corr(), cmap=\"coolwarm\", linewidths=0.5)\n",
    "plt.title(\"Correlation Heatmap of Numerical Features\")\n",
    "plt.savefig(\"../outputs/figures/numerical_correlation_heatmap.png\")\n",
    "plt.clf()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a71904ab",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/200 | Train Loss: 0.6784 | Val Loss: 0.6489\n",
      "Epoch 2/200 | Train Loss: 0.6003 | Val Loss: 0.5370\n",
      "Epoch 3/200 | Train Loss: 0.4942 | Val Loss: 0.4278\n",
      "Epoch 4/200 | Train Loss: 0.4268 | Val Loss: 0.3687\n",
      "Epoch 5/200 | Train Loss: 0.4064 | Val Loss: 0.3369\n",
      "Epoch 6/200 | Train Loss: 0.3759 | Val Loss: 0.3160\n",
      "Epoch 7/200 | Train Loss: 0.3660 | Val Loss: 0.2986\n",
      "Epoch 8/200 | Train Loss: 0.3521 | Val Loss: 0.2831\n",
      "Epoch 9/200 | Train Loss: 0.3457 | Val Loss: 0.2691\n",
      "Epoch 10/200 | Train Loss: 0.3315 | Val Loss: 0.2599\n",
      "Epoch 11/200 | Train Loss: 0.3281 | Val Loss: 0.2540\n",
      "Epoch 12/200 | Train Loss: 0.3422 | Val Loss: 0.2497\n",
      "Epoch 13/200 | Train Loss: 0.3301 | Val Loss: 0.2468\n",
      "Epoch 14/200 | Train Loss: 0.3064 | Val Loss: 0.2449\n",
      "Epoch 15/200 | Train Loss: 0.2887 | Val Loss: 0.2413\n",
      "Epoch 16/200 | Train Loss: 0.3206 | Val Loss: 0.2394\n",
      "Epoch 17/200 | Train Loss: 0.3045 | Val Loss: 0.2392\n",
      "Epoch 18/200 | Train Loss: 0.2961 | Val Loss: 0.2377\n",
      "Epoch 19/200 | Train Loss: 0.2955 | Val Loss: 0.2373\n",
      "Epoch 20/200 | Train Loss: 0.3007 | Val Loss: 0.2364\n",
      "Epoch 21/200 | Train Loss: 0.2977 | Val Loss: 0.2355\n",
      "Epoch 22/200 | Train Loss: 0.3060 | Val Loss: 0.2354\n",
      "Epoch 23/200 | Train Loss: 0.2944 | Val Loss: 0.2336\n",
      "Epoch 24/200 | Train Loss: 0.3073 | Val Loss: 0.2336\n",
      "Epoch 25/200 | Train Loss: 0.2963 | Val Loss: 0.2346\n",
      "Epoch 26/200 | Train Loss: 0.2977 | Val Loss: 0.2349\n",
      "Epoch 27/200 | Train Loss: 0.2821 | Val Loss: 0.2342\n",
      "Epoch 28/200 | Train Loss: 0.2795 | Val Loss: 0.2332\n",
      "Epoch 29/200 | Train Loss: 0.2866 | Val Loss: 0.2344\n",
      "Epoch 30/200 | Train Loss: 0.2887 | Val Loss: 0.2339\n",
      "Epoch 31/200 | Train Loss: 0.2858 | Val Loss: 0.2329\n",
      "Epoch 32/200 | Train Loss: 0.2819 | Val Loss: 0.2324\n",
      "Epoch 33/200 | Train Loss: 0.2700 | Val Loss: 0.2329\n",
      "Epoch 34/200 | Train Loss: 0.2979 | Val Loss: 0.2337\n",
      "Epoch 35/200 | Train Loss: 0.2724 | Val Loss: 0.2311\n",
      "Epoch 36/200 | Train Loss: 0.2624 | Val Loss: 0.2323\n",
      "Epoch 37/200 | Train Loss: 0.2906 | Val Loss: 0.2329\n",
      "Epoch 38/200 | Train Loss: 0.3033 | Val Loss: 0.2327\n",
      "Epoch 39/200 | Train Loss: 0.2641 | Val Loss: 0.2330\n",
      "Epoch 40/200 | Train Loss: 0.2754 | Val Loss: 0.2324\n",
      "Early stopping at epoch 40\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAlmRJREFUeJzs3Xd4VNXWx/HvzKRXIJUSCC1A6NIERFDAoBQpKvqqgL0gV8VyxYaIV+61YsHeRQVBVBRFBFGkCCrSeyihpZPeZ877xyQDIYUEkkwSfp/nmWfOnNnnnDXJBGbN3mtvk2EYBiIiIiIiIufA7OwARERERESk7lNiISIiIiIi50yJhYiIiIiInDMlFiIiIiIics6UWIiIiIiIyDlTYiEiIiIiIudMiYWIiIiIiJwzJRYiIiIiInLOlFiIiIiIiMg5U2IhIrVCeHg4kyZNcnYY9Y7NZqNTp0785z//OetzmEwm7rnnniqMyvk++ugjTCYTf/31l7NDOS8V/fwPHjzo2Ddo0CAGDRpUZdd46qmnMJlMVXa+0ixduhQfHx8SEhKq9ToidYUSC5F6RB+Wzl5OTg4vv/wyffr0wd/fHw8PDyIiIrjnnnvYs2ePs8M7a1988QWHDx8uNTGIjo7mjjvuoFWrVnh4eODn50f//v155ZVXyM7OdkK0Ve+NN97go48+cnYYtU54eDgmk8lxCw4OZsCAAXz99dfODq1SsrKyeOqpp/j111+dcv1hw4bRpk0bZs2a5ZTri9Q2Ls4OQEQEYPfu3ZjNzvmuIzExkWHDhvH3338zYsQI/u///g8fHx92797NvHnzeOedd8jLy3NKbOfq+eef59prr8Xf37/Y/iVLlnD11Vfj7u7OhAkT6NSpE3l5eaxevZqHHnqI7du388477zgp6qrzxhtvEBgYqN6wUnTr1o0HHngAgGPHjvH2228zduxY3nzzTe68884aj2fZsmWVPiYrK4sZM2YAlOjtePzxx3nkkUeqIrRy3XHHHTz44IPMmDEDX1/far+eSG2mxEJEqlxBQQE2mw03N7cKH+Pu7l6NEZVv0qRJ/PPPPyxcuJBx48YVe27mzJk89thjVXKds/m5nIt//vmHzZs38+KLLxbbf+DAAa699lpatGjBL7/8QuPGjR3PTZ48mX379rFkyZIaibG+y8zMxNvb29lhlKpp06bccMMNjscTJkygTZs2vPzyy2UmFtX5Hq7qc7q4uODiUv0fc8aNG8eUKVNYsGABN998c7VfT6Q201AokfPQ0aNHufnmmwkJCcHd3Z2OHTvywQcfFGuTl5fHk08+SY8ePfD398fb25sBAwawcuXKYu0OHjyIyWTihRdeYPbs2bRu3Rp3d3d27NjhGOO8b98+Jk2aRIMGDfD39+emm24iKyur2HlOr7EoGta1Zs0apk6dSlBQEN7e3owZM6bEeGabzcZTTz1FkyZN8PLy4pJLLmHHjh0VqttYv349S5Ys4ZZbbimRVIA94XnhhRccj8saBz5p0iTCw8PP+HP5559/cHFxcXzLeqrdu3djMpl4/fXXHftSUlK47777CAsLw93dnTZt2vC///0Pm81W7usC+Oabb3Bzc+Piiy8utv+5554jIyOD999/v1hSUaRNmzbce++9pZ6vU6dOjvfM0qVLS7SpyHvr119/xWQy8eWXXzJjxgyaNm2Kr68vV111FampqeTm5nLfffcRHByMj48PN910E7m5ucXOUVBQwMyZMx0/1/DwcB599NFi7cLDw9m+fTu//fabY8jP6b+73NzcM76/AH788UcGDBiAt7c3vr6+DB8+nO3btxdrM2nSJHx8fIiOjuaKK67A19eX66+/HoDff/+dq6++mubNm+Pu7k5YWBj3339/iSFnRefYv38/UVFReHt706RJE55++mkMwwDAMAzCw8O58sorS8SZk5ODv78/d9xxR4nnziQ0NJQOHTpw4MABoPy/bYBdu3Zx1VVX0ahRIzw8POjZsyeLFy8ucd7t27dz6aWX4unpSbNmzXjmmWdKff+W9reVk5PDU089RUREBB4eHjRu3JixY8cSHR3NwYMHCQoKAmDGjBmO3/FTTz0FlF5jUZH3DdjfOyNGjGD16tX07t0bDw8PWrVqxSeffFIi7uDgYLp06cK3335bsR+0SD2mHguR80xcXBwXXnihoyA3KCiIH3/8kVtuuYW0tDTuu+8+ANLS0njvvfe47rrruO2220hPT+f9998nKiqKDRs20K1bt2Ln/fDDD8nJyeH222/H3d2dRo0aOZ675ppraNmyJbNmzWLjxo289957BAcH87///e+M8U6ZMoWGDRsyffp0Dh48yOzZs7nnnnuYP3++o820adN47rnnGDlyJFFRUWzevJmoqChycnLOeP6iD0I33nhj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tQtfX19+/PFHevTogbu7O6tXryY6Oporr7ySkJAQfHx86NWrF8uXLy923tOHQplMJt577z3GjBmDl5cXbdu2ZfHixecU+1dffUXHjh1xd3cnPDycF198sdjzb7zxBm3btsXDw4OQkBCuuuoqx3MLFy6kc+fOeHp6EhAQwJAhQ8jMzDyneOoS9VjUsNwCKxsPpXA8NZuxFzRzdjgiIiJSxxiGQXa+1SnX9nS1VNkMQo888ggvvPACrVq1omHDhhw+fJgrrriC//znP7i7u/PJJ58wcuRIdu/eTfPmzcs8z4wZM3juued4/vnnee2117j++us5dOgQjRo1qnRMf//9N9dccw1PPfUU48ePZ+3atdx9990EBAQwadIk/vrrL/71r3/x6aef0q9fP5KTk/n9998Bey/Nddddx3PPPceYMWNIT0/n999/xzCMs/4Z1TVKLGrYvvgMrnv3D7zdLIzs2gRXizqNREREpOKy861EPvmTU6694+kovNyq5uPj008/zdChQx2PGzVqRNeuXR2PZ86cyddff83ixYu55557yjzPpEmTuO666wB49tlnefXVV9mwYQPDhg2rdEwvvfQSgwcP5oknngAgIiKCHTt28PzzzzNp0iRiYmLw9vZmxIgR+Pr60qJFC7p37w7YE4uCggLGjh1LixYtAOjcuXOlY6jL9Km2hnUI9aOhlyuZeVa2HElxdjgiIiIiTtGzZ89ijzMyMnjwwQfp0KEDDRo0wMfHh507dxITE1Puebp06eLY9vb2xs/Pj/j4+LOKaefOnfTv37/Yvv79+7N3716sVitDhw6lRYsWtGrVihtvvJHPPvuMrKwsALp27crgwYPp3LkzV199Ne+++y4nTpw4qzjqKvVY1DCz2UTf1gH8sDWWNfuS6NGi8t10IiIicv7ydLWw4+kop127qnh7exd7/OCDD/Lzzz/zwgsv0KZNGzw9PbnqqqvIy8sr9zyurq7FHptMJmw2W5XFeSpfX182btzIr7/+yrJly3jyySd56qmn+PPPP2nQoAE///wza9euZdmyZbz22ms89thjrF+/npYtW1ZLPLWNeiycoF/rQADW7Et0ciQiIiJS15hMJrzcXJxyq87Vv9esWcOkSZMYM2YMnTt3JjQ0lIMHD1bb9UrToUMH1qxZUyKuiIgILBZ7UuXi4sKQIUN47rnn2LJlCwcPHuSXX34B7L+b/v37M2PGDP755x/c3Nz4+uuva/Q1OJN6LJygfxt7YvFPTArZeVY83aou+xcRERGpi9q2bcuiRYsYOXIkJpOJJ554otp6HhISEti0aVOxfY0bN+aBBx6gV69ezJw5k/Hjx7Nu3Tpef/113njjDQC+//579u/fz8UXX0zDhg354YcfsNlstGvXjvXr17NixQouu+wygoODWb9+PQkJCXTo0KFaXkNtpB4LJwgP8KKJvwd5Vht/HUp2djgiIiIiTvfSSy/RsGFD+vXrx8iRI4mKiuKCCy6olmt9/vnndO/evdjt3Xff5YILLuDLL79k3rx5dOrUiSeffJKnn36aSZMmAdCgQQMWLVrEpZdeSocOHXjrrbf44osv6NixI35+fqxatYorrriCiIgIHn/8cV588UUuv/zyankNtZHJOJ/mwALS0tLw9/cnNTUVPz8/p8XxwJeb+WrjEe4c2JpHLm/vtDhERESkdsvJyeHAgQO0bNkSDw8PZ4cj9VB577HKfHZWj4WT9G8TAMDaaNVZiIiIiEjdp8TCSYrqLLYeTSU1K9/J0YiIiIiInBslFk4S4udB6yBvDAPW7U9ydjgiIiIiIudEiYUTFfVaaDiUiIiIiNR1SiycqF/rojoL9ViIiIiISN2mxMKJLmwVgMkE++IziEvLcXY4IiIiIiJnTYmFEzXwcqNTE39Aw6FEREREpG5TYuFk/QqnnV2zT8OhRERERKTuUmLhZP1bFxZw70vkPFurUERERETqESUWTtYzvCGuFhPHUnM4lJTl7HBEREREao1BgwZx3333OR6Hh4cze/bsco8xmUx8880353ztqjrP+USJhZN5ubnQvXlDANaozkJERETqgZEjRzJs2LBSn/v9998xmUxs2bKl0uf9888/uf322881vGKeeuopunXrVmL/8ePHufzyy6v0Wqf76KOPaNCgQbVeoyYpsagFTg6HUp2FiIiI1H233HILP//8M0eOHCnx3IcffkjPnj3p0qVLpc8bFBSEl5dXVYR4RqGhobi7u9fIteoLJRa1QP82RetZJGKzqc5CRERE6rYRI0YQFBTERx99VGx/RkYGCxYs4JZbbiEpKYnrrruOpk2b4uXlRefOnfniiy/KPe/pQ6H27t3LxRdfjIeHB5GRkfz8888ljvn3v/9NREQEXl5etGrViieeeIL8/HzA3mMw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BqcOhypFvzb2xGJttAq4RURERKR2UmJRG4R0tN+XMjMUQP/COot/Yk6QlVdQU1GJiIiIiFSYEovaIKSz/b6MmaFaBHjRtIEn+VaDPw+eqMHAREREREQqRolFbVDUY5G0D/KzSzxtMpnoW7gK91rVWYiIiIhILaTEojbwDQWvADBsEL+z1Cb9C+sstJ6FiIiIiNRGSixqA5PpjAvlFa1nsf1YGilZeTUVmYiIiIhIhSixqC0ciUXpBdwhfh60CfbBMOCP/ZodSkRERERqFyUWtYVjytnSeywA+rcuWs9CiYWIiIiI1C5KLGoLR4/FVjCMUpv0LRwOpToLEREREaltlFjUFkHtwOwCOamQdrTUJn1bBWA2wf6ETGJTc2o4QBERERGRsimxqC1c3CEwwr5dxnAofy9XOjX1B2CNpp0VERERkVpEiUVt4liBe2uZTYpmh1obrToLEREREak9nJ5YzJkzh/DwcDw8POjTpw8bNmwot31KSgqTJ0+mcePGuLu7ExERwQ8//FBD0VazM8wMBSfXs1gbnYhRRi2GiIiIiEhNc2piMX/+fKZOncr06dPZuHEjXbt2JSoqivj4+FLb5+XlMXToUA4ePMjChQvZvXs37777Lk2bNq3hyKtJBWaG6tmiEW4WM8dTcziQmFlDgYmIiIiIlM+picVLL73Ebbfdxk033URkZCRvvfUWXl5efPDBB6W2/+CDD0hOTuabb76hf//+hIeHM3DgQLp27VrDkVeToh6L5GjIyyq1iaebhe7NGwCwRsOhRERERKSWcFpikZeXx99//82QIUNOBmM2M2TIENatW1fqMYsXL6Zv375MnjyZkJAQOnXqxLPPPovVai3zOrm5uaSlpRW71Vo+IeAVCIYNEnaW2ax/G3udxTpNOysiIiIitYTTEovExESsVishISHF9oeEhBAbG1vqMfv372fhwoVYrVZ++OEHnnjiCV588UWeeeaZMq8za9Ys/P39HbewsLAqfR1VymSq0HCoXuGNANh8OLUmohIREREROSOnF29Xhs1mIzg4mHfeeYcePXowfvx4HnvsMd56660yj5k2bRqpqamO2+HDh2sw4rNQgQLuyCZ+ABxNySYlK68mohIRERERKZeLsy4cGBiIxWIhLi6u2P64uDhCQ0NLPaZx48a4urpisVgc+zp06EBsbCx5eXm4ubmVOMbd3R13d/eqDb46ORKLsnss/D1dCWvkyeHkbHYcS6Nf4dAoERERERFncVqPhZubGz169GDFihWOfTabjRUrVtC3b99Sj+nfvz/79u3DZrM59u3Zs4fGjRuXmlTUSacOhSpnOtmOje0L5W07puFQIiIiIuJ8Th0KNXXqVN59910+/vhjdu7cyV133UVmZiY33XQTABMmTGDatGmO9nfddRfJycnce++97NmzhyVLlvDss88yefJkZ72EqhcYAWYXyE2F1CNlNutYOBxq+7FaXIwuIiIiIucNpw2FAhg/fjwJCQk8+eSTxMbG0q1bN5YuXeoo6I6JicFsPpn7hIWF8dNPP3H//ffTpUsXmjZtyr333su///1vZ72EqufiDoHtIH67fThUg9KLzTs1tfdYKLEQERERkdrAZJxnyzenpaXh7+9Pamoqfn5+zg6ndF/dBlu/hEseh4EPldokPi2H3s+uwGyC7TOG4elmKbWdiIiIiMjZqsxn5zo1K9R5I/TMBdzBfh4E+rhjM2BnrHotRERERMS5lFjURhWYGQpOqbM4qgJuEREREXEuJRa1UVFikRQNeVllNlMBt4iIiIjUFkosaiPfEPAOAgyI31lmMxVwi4iIiEhtocSitnIMh9paZpOiHovdsenkW21lthMRERERqW5KLGqrkI72+7jtZTYJa+iFr7sLeVYb++IzaigwEREREZGSlFjUVqGd7fexZRdwm80mOqjOQkRERERqASUWtdWpPRblLDVSNBxqm2aGEhEREREnUmJRWwW2A7Mr5KZC6uEym3VsYi/g3qEeCxERERFxIiUWtZWLGwS1s2+XMxyqU1N7j8WO42nYbOfVIuoiIiIiUososajNKlDA3TrIBzcXMxm5BcQkl73mhYiIiIhIdVJiUZtVYMpZV4uZ9qG+gAq4RURERMR5lFjUZqGFiUU5Q6HglALuYyrgFhERERHnUGJRmxX1WCTvh7zMMptFNtEK3CIiIiLiXEosajOfYPAOBgyI31lms06FPRY7jqVilDM1rYiIiIhIdVFiUdsVFXDHll1n0T7UD7MJEjPyiE/PraHAREREREROUmJR2xXVWZQzM5Snm4XWQT4AbFedhYiIiIg4gRKL2i6ks/0+roIF3EdVZyEiIiIiNU+JRW136loW5dRPdHQUcKvHQkRERERqnhKL2i4wAsyukJsGKTFlNutYuAK3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O9SKnfFahVtEREREHCqcWHz22Wfcd999ZT5/33338cknn1RFTFKdzGYI6WjfPovhUP3bBOLhauZoSjY7j5fsvRIRERGR81OFE4u9e/fStWvXMp/v0qULe/dW/htwcYJzqLPwcLVwURt7bYUWyxMRERGRIhVOLAoKCkhISCjz+YSEBE05W1ecQ2IB9mlnAZZrPQsRERERKVThxKJjx44sX768zOeXLVtGx44dqyQoqWanJhZnUSdxaXt7YrH5cArxaTlVGZmIiIiI1FEVTixuvvlmZs6cyffff1/iue+++47//Oc/3HzzzVUanFST4EgwmSErEdJjK3+4nwddwxoA8It6LURERESESqxjcfvtt7Nq1SpGjRpF+/btadeuHQC7du1iz549XHPNNdx+++3VFqhUIVdPCGgLibshbhv4Na70KYa0D2bz4RSW74zj2t7NqyFIEREREalLKtxjATB37lzmzZtHREQEe/bsYffu3bRr144vvviCL774orpilOpQNBzqyF9ndfiQSPu0s6v3JZKdZ62qqERERESkjjIZ59liBGlpafj7+5Oamoqfn5+zw3Gef+bCt5MhqANM/qPShxuGwYDnVnLkRDbDOoby2v91x9VSqTxVRERERGq5ynx2rvQnwaSkJMf24cOHefLJJ3nooYdYtWpV5SMV52k/AixukLDTvgp3JZlMJv4zpjNuFjNLt8cy5fN/yLfaqiFQEREREakLKpxYbN26lfDwcIKDg2nfvj2bNm2iV69evPzyy7zzzjtceumlfPPNN9UYqlQpzwbQZqh9e9vCszrFwIgg3r6xh5ILEREREal4YvHwww/TuXNnVq1axaBBgxgxYgTDhw8nNTWVEydOcMcdd/Df//63OmOVqtZprP1+21dnNe0swCXtg5VciIiIiEjFaywCAwP55Zdf6NKlCxkZGfj5+fHnn3/So0cPwD471IUXXkhKSkp1xnvOVGNxirxMeL4N5GfBbb9A0x5nfaqVu+K549O/ybPaVHMhIiIiUk9US41FcnIyoaGhAPj4+ODt7U3Dhg0dzzds2JD09PSzDFmcws0b2l1u39761TmdSj0XIiIiIue3Sn2lbDKZyn0sdVCncfb77YvAdm6JgJILERERkfNXhRfIA5g0aRLu7u4A5OTkcOedd+Lt7Q1Abm5u1Ucn1a/NEHD3h/TjELMOwvuf0+mK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",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import os\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n",
    "from sklearn.compose import ColumnTransformer\n",
    "from sklearn.pipeline import Pipeline\n",
    "from torch.utils.data import DataLoader, TensorDataset\n",
    "\n",
    "selected_features = [\n",
    "    \"age_at_diagnosis\",\n",
    "    \"tumor_size\",\n",
    "    \"tumor_stage\",\n",
    "    \"lymph_nodes_examined_positive\",\n",
    "    \"nottingham_prognostic_index\",\n",
    "    \"cellularity\",\n",
    "    \"neoplasm_histologic_grade\",\n",
    "    \"inferred_menopausal_state\",\n",
    "    \"er_status_measured_by_ihc\",\n",
    "    \"pr_status\",\n",
    "    \"her2_status\"\n",
    "]\n",
    "\n",
    "df = df.dropna(subset=selected_features + [\"chemotherapy\"])\n",
    "X = df[selected_features].copy()\n",
    "y = df[\"chemotherapy\"].astype(int)\n",
    "\n",
    "# Typen korrigieren\n",
    "categorical_cols = X.select_dtypes(include=[\"object\", \"bool\", \"category\"]).columns.tolist()\n",
    "X[categorical_cols] = X[categorical_cols].astype(str)\n",
    "numeric_cols = X.select_dtypes(include=[\"int64\", \"float64\"]).columns.tolist()\n",
    "\n",
    "# Preprocessing Pipeline\n",
    "preprocessor = ColumnTransformer([\n",
    "    (\"num\", StandardScaler(), numeric_cols),\n",
    "    (\"cat\", OneHotEncoder(drop=\"first\", handle_unknown=\"ignore\"), categorical_cols)\n",
    "])\n",
    "X_processed = preprocessor.fit_transform(X)\n",
    "input_dim = X_processed.shape[1]\n",
    "\n",
    "X_tensor = torch.tensor(X_processed, dtype=torch.float32)\n",
    "y_tensor = torch.tensor(y.values, dtype=torch.float32).unsqueeze(1)\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_tensor, y_tensor, test_size=0.2, stratify=y, random_state=42)\n",
    "train_loader = DataLoader(TensorDataset(X_train, y_train), batch_size=32, shuffle=True)\n",
    "\n",
    "class ChemotherapyModel(nn.Module):\n",
    "    def __init__(self, in_dim):\n",
    "        super().__init__()\n",
    "        self.net = nn.Sequential(\n",
    "            nn.Linear(in_dim, 32),\n",
    "            nn.ReLU(),\n",
    "            nn.Dropout(0.5),\n",
    "            nn.Linear(32, 16),\n",
    "            nn.ReLU(),\n",
    "            nn.Dropout(0.5),\n",
    "            nn.Linear(16, 1),\n",
    "            nn.Sigmoid()\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        return self.net(x)\n",
    "\n",
    "model = ChemotherapyModel(input_dim)\n",
    "loss_fn = nn.BCELoss()\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "best_val_loss = float(\"inf\")\n",
    "patience = 5\n",
    "counter = 0\n",
    "best_model_state = None  # to store best model weights\n",
    "\n",
    "train_losses, val_losses = [], []\n",
    "for epoch in range(200):\n",
    "    model.train()\n",
    "    epoch_loss = 0\n",
    "    for xb, yb in train_loader:\n",
    "        preds = model(xb)\n",
    "        loss = loss_fn(preds, yb)\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        epoch_loss += loss.item()\n",
    "    train_losses.append(epoch_loss / len(train_loader))\n",
    "\n",
    "    # Validation loss\n",
    "    model.eval()\n",
    "    with torch.no_grad():\n",
    "        val_preds = model(X_test)\n",
    "        val_loss = loss_fn(val_preds, y_test)\n",
    "        val_losses.append(val_loss.item())\n",
    "\n",
    "    print(f\"Epoch {epoch+1}/200 | Train Loss: {train_losses[-1]:.4f} | Val Loss: {val_losses[-1]:.4f}\")\n",
    "\n",
    "    # Early stopping check\n",
    "    if val_loss.item() < best_val_loss:\n",
    "        best_val_loss = val_loss.item()\n",
    "        best_model_state = model.state_dict()\n",
    "        counter = 0\n",
    "    else:\n",
    "        counter += 1\n",
    "        if counter >= patience:\n",
    "            print(f\"Early stopping at epoch {epoch+1}\")\n",
    "            break\n",
    "\n",
    "os.makedirs(\"../outputs/figures\", exist_ok=True)\n",
    "plt.figure(figsize=(8,5))\n",
    "plt.plot(train_losses, label=\"Train Loss\")\n",
    "plt.plot(val_losses, label=\"Validation Loss\")\n",
    "plt.xlabel(\"Epoch\")\n",
    "plt.ylabel(\"BCE Loss\")\n",
    "plt.title(\"Learning Curve (Chemotherapy Prediction)\")\n",
    "plt.legend()\n",
    "plt.tight_layout()\n",
    "plt.savefig(\"../outputs/figures/nn_learning_curve_chemotherapy.png\")\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f358fffc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy : 0.9035\n",
      "Precision: 0.8000\n",
      "Recall   : 0.7586\n",
      "F1 Score : 0.7788\n",
      "ROC AUC  : 0.9550\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import (\n",
    "    accuracy_score, precision_score, recall_score,\n",
    "    f1_score, roc_auc_score, confusion_matrix, ConfusionMatrixDisplay\n",
    ")\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "# Model in eval mode\n",
    "model.eval()\n",
    "with torch.no_grad():\n",
    "    y_pred_prob = model(X_test).numpy()\n",
    "    y_pred = (y_pred_prob >= 0.5).astype(int)\n",
    "    y_true = y_test.numpy()\n",
    "\n",
    "# Evaluation metrics\n",
    "accuracy = accuracy_score(y_true, y_pred)\n",
    "precision = precision_score(y_true, y_pred, zero_division=0)\n",
    "recall = recall_score(y_true, y_pred, zero_division=0)\n",
    "f1 = f1_score(y_true, y_pred, zero_division=0)\n",
    "auc = roc_auc_score(y_true, y_pred_prob)\n",
    "\n",
    "# Confusion matrix\n",
    "cm = confusion_matrix(y_true, y_pred)\n",
    "disp = ConfusionMatrixDisplay(confusion_matrix=cm)\n",
    "disp.plot(cmap=\"Blues\")\n",
    "plt.title(\"Confusion Matrix - Chemotherapy Prediction\")\n",
    "plt.tight_layout()\n",
    "plt.savefig(\"../outputs/figures/confusion_matrix_chemotherapy.png\")\n",
    "plt.show()\n",
    "\n",
    "# Print results\n",
    "print(f\"Accuracy : {accuracy:.4f}\")\n",
    "print(f\"Precision: {precision:.4f}\")\n",
    "print(f\"Recall   : {recall:.4f}\")\n",
    "print(f\"F1 Score : {f1:.4f}\")\n",
    "print(f\"ROC AUC  : {auc:.4f}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6c2b952a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "venv",
   "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}