{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2ec7b737",
   "metadata": {},
   "source": [
    "# 第 10 章　資料降維：反向淘汰法、卡方檢定法、主成分分析法（PCA）\n",
    "\n",
    "這是「醫學生的機器學習入門」第 10 章的配套 notebook。\n",
    "\n",
    "- 在 Google Colab 開啟：選單「執行階段 → 全部執行」即可，不需要額外安裝套件（本章用到的 scikit-learn、statsmodels 都是 Colab 內建）。\n",
    "- 章節講解請看網站第 10 章；這裡只放可以直接跑的程式碼與簡短說明。\n",
    "- 圖上的文字用英文，是因為 Colab 預設沒有中文字型。\n",
    "\n",
    "本章資料集：sklearn 內建 diabetes（反向淘汰）、UCI Cleveland Heart Disease（卡方檢定法，需網路）、sklearn 內建 WDBC 乳癌資料（PCA）。**所有醫學資料僅供學習，不構成臨床建議。**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5b099ba",
   "metadata": {},
   "source": [
    "## 0. 載入套件、確認版本\n",
    "\n",
    "先匯入本章會用到的套件，並印出版本。本 notebook 在 scikit-learn 1.6（Colab）與 1.9 都測試過。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "dab9b133",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:09.696160Z",
     "iopub.status.busy": "2026-09-29T20:21:09.696084Z",
     "iopub.status.idle": "2026-09-29T20:21:11.653024Z",
     "shell.execute_reply": "2026-09-29T20:21:11.652576Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "numpy 2.1.3\n",
      "pandas 2.2.3\n",
      "scikit-learn 1.6.1\n",
      "statsmodels 0.15.0\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import sklearn\n",
    "import statsmodels\n",
    "import statsmodels.api as sm\n",
    "\n",
    "print(\"numpy\", np.__version__)\n",
    "print(\"pandas\", pd.__version__)\n",
    "print(\"scikit-learn\", sklearn.__version__)\n",
    "print(\"statsmodels\", statsmodels.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15f2607b",
   "metadata": {},
   "source": [
    "## 1. 反向淘汰法（backward elimination）：用 p 值一步步刪變數\n",
    "\n",
    "資料：sklearn 內建的 diabetes 資料集，442 位糖尿病人、10 個基線特徵（年齡、性別、BMI、血壓、6 項血清指標 s1–s6），目標是一年後的疾病進展分數（連續值）。特徵已被 sklearn 事先置中與縮放，所以係數大小不好直接解讀，這裡只看 p 值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e43be91c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:11.654150Z",
     "iopub.status.busy": "2026-09-29T20:21:11.654052Z",
     "iopub.status.idle": "2026-09-29T20:21:11.749156Z",
     "shell.execute_reply": "2026-09-29T20:21:11.748681Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(442, 10)\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>bmi</th>\n",
       "      <th>bp</th>\n",
       "      <th>s1</th>\n",
       "      <th>s2</th>\n",
       "      <th>s3</th>\n",
       "      <th>s4</th>\n",
       "      <th>s5</th>\n",
       "      <th>s6</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.038076</td>\n",
       "      <td>0.050680</td>\n",
       "      <td>0.061696</td>\n",
       "      <td>0.021872</td>\n",
       "      <td>-0.044223</td>\n",
       "      <td>-0.034821</td>\n",
       "      <td>-0.043401</td>\n",
       "      <td>-0.002592</td>\n",
       "      <td>0.019907</td>\n",
       "      <td>-0.017646</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.001882</td>\n",
       "      <td>-0.044642</td>\n",
       "      <td>-0.051474</td>\n",
       "      <td>-0.026328</td>\n",
       "      <td>-0.008449</td>\n",
       "      <td>-0.019163</td>\n",
       "      <td>0.074412</td>\n",
       "      <td>-0.039493</td>\n",
       "      <td>-0.068332</td>\n",
       "      <td>-0.092204</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.085299</td>\n",
       "      <td>0.050680</td>\n",
       "      <td>0.044451</td>\n",
       "      <td>-0.005670</td>\n",
       "      <td>-0.045599</td>\n",
       "      <td>-0.034194</td>\n",
       "      <td>-0.032356</td>\n",
       "      <td>-0.002592</td>\n",
       "      <td>0.002861</td>\n",
       "      <td>-0.025930</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.089063</td>\n",
       "      <td>-0.044642</td>\n",
       "      <td>-0.011595</td>\n",
       "      <td>-0.036656</td>\n",
       "      <td>0.012191</td>\n",
       "      <td>0.024991</td>\n",
       "      <td>-0.036038</td>\n",
       "      <td>0.034309</td>\n",
       "      <td>0.022688</td>\n",
       "      <td>-0.009362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.005383</td>\n",
       "      <td>-0.044642</td>\n",
       "      <td>-0.036385</td>\n",
       "      <td>0.021872</td>\n",
       "      <td>0.003935</td>\n",
       "      <td>0.015596</td>\n",
       "      <td>0.008142</td>\n",
       "      <td>-0.002592</td>\n",
       "      <td>-0.031988</td>\n",
       "      <td>-0.046641</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        age       sex       bmi        bp        s1        s2        s3  \\\n",
       "0  0.038076  0.050680  0.061696  0.021872 -0.044223 -0.034821 -0.043401   \n",
       "1 -0.001882 -0.044642 -0.051474 -0.026328 -0.008449 -0.019163  0.074412   \n",
       "2  0.085299  0.050680  0.044451 -0.005670 -0.045599 -0.034194 -0.032356   \n",
       "3 -0.089063 -0.044642 -0.011595 -0.036656  0.012191  0.024991 -0.036038   \n",
       "4  0.005383 -0.044642 -0.036385  0.021872  0.003935  0.015596  0.008142   \n",
       "\n",
       "         s4        s5        s6  \n",
       "0 -0.002592  0.019907 -0.017646  \n",
       "1 -0.039493 -0.068332 -0.092204  \n",
       "2 -0.002592  0.002861 -0.025930  \n",
       "3  0.034309  0.022688 -0.009362  \n",
       "4 -0.002592 -0.031988 -0.046641  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import load_diabetes\n",
    "\n",
    "X, y = load_diabetes(return_X_y=True, as_frame=True)\n",
    "print(X.shape)\n",
    "X.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46dd7027",
   "metadata": {},
   "source": [
    "下面這個函式就是教科書版的反向淘汰：先放全部變數做普通最小平方（OLS）迴歸，找出 p 值最大的變數；若它大於 0.05 就刪掉、重新配適，直到剩下的變數 p 值都 ≤ 0.05。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e3ba0509",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:11.750109Z",
     "iopub.status.busy": "2026-09-29T20:21:11.750024Z",
     "iopub.status.idle": "2026-09-29T20:21:11.757983Z",
     "shell.execute_reply": "2026-09-29T20:21:11.757609Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "drop  age  p = 0.867\n",
      "drop   s3  p = 0.639\n",
      "drop   s6  p = 0.304\n",
      "drop   s4  p = 0.262\n",
      "kept: ['sex', 'bmi', 'bp', 's1', 's2', 's5']\n",
      "R2 = 0.515, adjusted R2 = 0.508\n"
     ]
    }
   ],
   "source": [
    "def backward_eliminate(X, y, alpha=0.05, verbose=True):\n",
    "    cols = list(X.columns)\n",
    "    while cols:\n",
    "        model = sm.OLS(y, sm.add_constant(X[cols])).fit()\n",
    "        pvals = model.pvalues.drop(\"const\")\n",
    "        worst = pvals.idxmax()\n",
    "        if pvals[worst] <= alpha:\n",
    "            break\n",
    "        if verbose:\n",
    "            print(f\"drop {worst:>4s}  p = {pvals[worst]:.3f}\")\n",
    "        cols.remove(worst)\n",
    "    return model, cols\n",
    "\n",
    "model, kept = backward_eliminate(X, y)\n",
    "print(\"kept:\", kept)\n",
    "print(f\"R2 = {model.rsquared:.3f}, adjusted R2 = {model.rsquared_adj:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e905ea4",
   "metadata": {},
   "source": [
    "依序刪掉 age、s3、s6、s4，剩下 6 個變數。接著看最終模型的 p 值與 95% 信賴區間——**要記得這些數字是在「挑過變數之後」才算的，會比實際情況樂觀**（見下一節）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "64b039cc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:11.759065Z",
     "iopub.status.busy": "2026-09-29T20:21:11.759002Z",
     "iopub.status.idle": "2026-09-29T20:21:11.762707Z",
     "shell.execute_reply": "2026-09-29T20:21:11.762264Z"
    }
   },
   "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>p</th>\n",
       "      <th>CI_low</th>\n",
       "      <th>CI_high</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>sex</th>\n",
       "      <td>0.0002</td>\n",
       "      <td>-344.2</td>\n",
       "      <td>-108.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bmi</th>\n",
       "      <td>0.0000</td>\n",
       "      <td>400.9</td>\n",
       "      <td>658.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bp</th>\n",
       "      <td>0.0000</td>\n",
       "      <td>204.0</td>\n",
       "      <td>450.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>s1</th>\n",
       "      <td>0.0000</td>\n",
       "      <td>-1073.3</td>\n",
       "      <td>-442.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>s2</th>\n",
       "      <td>0.0003</td>\n",
       "      <td>250.2</td>\n",
       "      <td>827.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>s5</th>\n",
       "      <td>0.0000</td>\n",
       "      <td>646.6</td>\n",
       "      <td>961.8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          p  CI_low  CI_high\n",
       "sex  0.0002  -344.2   -108.9\n",
       "bmi  0.0000   400.9    658.9\n",
       "bp   0.0000   204.0    450.4\n",
       "s1   0.0000 -1073.3   -442.6\n",
       "s2   0.0003   250.2    827.0\n",
       "s5   0.0000   646.6    961.8"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summary = pd.DataFrame({\n",
    "    \"p\": model.pvalues.drop(\"const\").round(4),\n",
    "    \"CI_low\": model.conf_int()[0].drop(\"const\").round(1),\n",
    "    \"CI_high\": model.conf_int()[1].drop(\"const\").round(1),\n",
    "})\n",
    "summary"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1b77605",
   "metadata": {},
   "source": [
    "## 2. 反向淘汰的問題①：純雜訊也能「挑出顯著變數」\n",
    "\n",
    "我們造一份**完全沒有關係**的資料：100 個人、20 個隨機特徵、結果也是隨機數。理論上沒有任何特徵真的有用。看看反向淘汰會留下什麼。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ef692efc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:11.763675Z",
     "iopub.status.busy": "2026-09-29T20:21:11.763618Z",
     "iopub.status.idle": "2026-09-29T20:21:11.780485Z",
     "shell.execute_reply": "2026-09-29T20:21:11.780062Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "kept: ['z2', 'z10', 'z17']\n",
      "z2     0.006\n",
      "z10    0.027\n",
      "z17    0.041\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "rng = np.random.default_rng(42)\n",
    "Z = pd.DataFrame(rng.normal(size=(100, 20)), columns=[f\"z{i}\" for i in range(20)])\n",
    "y_noise = pd.Series(rng.normal(size=100))\n",
    "\n",
    "noise_model, noise_kept = backward_eliminate(Z, y_noise, verbose=False)\n",
    "print(\"kept:\", noise_kept)\n",
    "print(noise_model.pvalues.drop(\"const\").round(3))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93d7ab18",
   "metadata": {},
   "source": [
    "明明全是雜訊，最後卻留下 3 個 p < 0.05 的變數。原因是：我們讓同一份資料「先挑變數、再算 p 值」，挑的過程已經偏向那些碰巧跟結果相關的變數，最後的 p 值就不再代表原本的意義。\n",
    "\n",
    "## 3. 反向淘汰的問題②：換一份資料，選出的變數就不一樣\n",
    "\n",
    "用自助重抽（bootstrap）模擬「如果重新收一批病人」：從 442 人中有放回抽 442 人，每次都重跑一次反向淘汰，統計每個變數被留下的比例。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "060fae3e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:11.781575Z",
     "iopub.status.busy": "2026-09-29T20:21:11.781512Z",
     "iopub.status.idle": "2026-09-29T20:21:12.452637Z",
     "shell.execute_reply": "2026-09-29T20:21:12.452267Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "bmi    1.00\n",
      "bp     1.00\n",
      "s5     1.00\n",
      "sex    0.98\n",
      "s1     0.88\n",
      "s2     0.55\n",
      "s4     0.32\n",
      "s6     0.20\n",
      "s3     0.18\n",
      "age    0.04\n",
      "dtype: float64\n",
      "number of different final models: 23\n",
      "most common model: [(('bmi', 'bp', 's1', 's2', 's5', 'sex'), 73)]\n"
     ]
    }
   ],
   "source": [
    "from collections import Counter\n",
    "\n",
    "rng = np.random.default_rng(42)\n",
    "n_boot = 200\n",
    "freq = Counter()\n",
    "selected_sets = Counter()\n",
    "for _ in range(n_boot):\n",
    "    idx = rng.integers(0, len(X), len(X))\n",
    "    Xb = X.iloc[idx].reset_index(drop=True)\n",
    "    yb = y.iloc[idx].reset_index(drop=True)\n",
    "    _, kept_b = backward_eliminate(Xb, yb, verbose=False)\n",
    "    freq.update(kept_b)\n",
    "    selected_sets[tuple(sorted(kept_b))] += 1\n",
    "\n",
    "inclusion = pd.Series({c: freq[c] / n_boot for c in X.columns}).sort_values(ascending=False)\n",
    "print(inclusion.round(2))\n",
    "print(\"number of different final models:\", len(selected_sets))\n",
    "print(\"most common model:\", selected_sets.most_common(1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5b88ae3f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:12.454356Z",
     "iopub.status.busy": "2026-09-29T20:21:12.454257Z",
     "iopub.status.idle": "2026-09-29T20:21:12.525835Z",
     "shell.execute_reply": "2026-09-29T20:21:12.525401Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmUAAAFPCAYAAAAMULnqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAP7RJREFUeJzt3Qm4VfP+x/Fv86iBNOoqoYEmJVKJK2Vq4EbSVaJcQ6gkokGaSKWkQZpMkSGZkpK6hrrcJoQUSYkmaR5Oddb/+fz+z9p37332OZ1znGHtc96v59l19m+vtfZvzd/9m1Yez/M8AwAAQLbKm71fDwAAACEoAwAACACCMgAAgAAgKAMAAAgAgjIAAIAAICgDAAAIAIIyAACAACAoAwAACACCMgAAgAAgKEOgVKlSxa655hqLN5dccol7ZZRbbrnFbYtwefLksUcffTTDvmPjxo1umTNnzrTsoO/V9ysfyBpLlixx2/yNN95gk+dy/rGg/xEcBGVI9mYZ/ipbtqxdeuml9sEHH7DFkCbDhw+3uXPn5rqt9scff9iTTz5pF198sZ166qlWqlQpu/DCC2327Nkxpz9y5Ig9+OCDVrFiRStSpIhdcMEFtnDhwpjTLl261Jo2bWpFixa18uXL27333mv79++3IFOe9aNi9+7daZ73t99+c/OuXr06U/IGBAVBGZL12GOP2YsvvmgvvPCC9e3b13bs2GFXXXWVvffee2y1bHDo0CHr379/hi3v9NNPd8u8+eabLTuCMn2vvl/5yImWLVtmjzzyiJ188sluvw0bNswFUTfeeKMNGjQoZunomDFjrFOnTjZu3DjLly+fO98+++yziOkUmFx22WV28OBBN323bt1sypQpdv3111vQg7LBgwenOyjTvARlyOnyZ3cGEFxXXnmlNWzYMPT+tttus3Llytkrr7wSl1WMf8WBAwesWLFi2ZqHwoULZ+jyVAKa0ctMCwUdeuVU55xzjq1fvz4i6LzrrrusRYsW9sQTT7gfOv4x9eWXX9qrr77qStb69Onj0jp37mznnnuum04Bje/hhx+20qVLu2qnEiVKuDRVdXfv3t0WLFhgLVu2tNxOAasCYCDeUFKGVFP1i6pV8uePjOVHjRplF110kZ1yyinu8wYNGiTbZuWll16yRo0auQumbiyq2tGNJCXPP/+8+84HHnjAvT/vvPPsuuuui5imdu3aLsj4+uuvQ2mqJlLa999/797/8ssv7qZYvXp1l0/lV6UL0W2a/Orbf//73256Vd2edtppoc9VKlGtWjW3DK3Lp59+mupt6G8DbSPNr1IUlZxs3rz5hPNFtynT30pbt26d/fOf/7SSJUu6arIBAwaY53lumW3btnU3blVxjR49+oRtylRaU7x4cduyZYu1a9fO/a1lKlA4fvx4mve7lq+AVvvQrwrXd4Rv5+jtP3HiRBfQFCpUyFXl3X333UlKV9R+TwHLd99956rVdTxVqlTJRo4cmap9cOzYMRsyZIjbj/oeBTUKdlSFGKuNo0qrtK8VxJ5xxhmu9PhEqlatmqQUUOur7arv2bBhQyhd200B6u233x5K03fph5BK3PzjY+/eva5KU/vbD8j8AE776rXXXkvV+mtfan11XCgwbNOmTcxj8PXXXw8dq2XKlHHfq2Mj2scff2zNmjVzy9J1Qsedf975x6p//mq7+MeCv++1TqqO1bxaD52jyp8o+Dz//PPd3127dg3N6x+3/rGwYsUKdz3RseDP+/bbb9vVV1/tjiPtZ+1v7ffoYzl8GTqmtb7K5+TJk1O1PVPKvyQkJNjAgQPdttR5qu2k7bV48eKY56TOrQkTJrhjTeujQFv7R+e18q/rkfKo7bxr166Yx6yuq/Xq1XPHUa1atWzOnDmpWpcvvvjCrrjiCpdPfXfz5s3t888/j5hm37591rNnT/dd2q66Rl5++eW2cuXKVH0HUuABUWbMmOHp0Pjoo4+8HTt2eNu3b/fWrFnj/etf//Ly5s3rLViwIGL60047zbvrrru8Z555xhszZozXqFEjN/97770XMd2jjz7q0i+66CLvySef9MaNG+fddNNN3oMPPhia5vTTT/euvvrq0Ptnn33Wy5Mnj/fII4+E0u69917v1FNPDb3/448/3DTKm/Lgu/vuuyOme/311726det6AwcO9KZMmeI9/PDDXunSpd13HjhwIMn616pVy2vevLk3fvx47/HHH3efTZ06NbQOTz/9tNezZ0+vVKlS3hlnnOGmPZGhQ4e6vHbo0MGbOHGiN3jwYK9MmTJelSpVvD///DM0XZcuXVy+wul7Bw0aFHqvv5VWr149r2PHjm552nZK036oXr26d+edd7r0Jk2auPR///vfofl//vlnl6b1Df/ewoULe+ecc4536623epMmTfL+8Y9/uOm0nLTu9xdffNErVKiQ16xZM/e3XkuXLo3YzspH9Dq1aNHCbfcePXp4+fLl884//3wvISEhNJ22dcWKFb3KlSt79913n8vb3//+dzfvvHnzTrgftJ6atn379t6ECRO8zp07u/ft2rWLmE77QNuxXLly7njRup533nluH+qcSA8tR9/122+/hdK0vjVr1kwyrc5BTfvOO++495999pl7P3v27CTTNm3a1OUtJYsXL3bz165d26tTp47bbw899JDb52effbZ38ODB0LT+/tG2f+qpp9x0RYoUSXKsLly40MufP7+bf+TIkaFjWueWv2+/+uord4xqeVqWfyzs37/fbceCBQt6DRs2dNeEyZMne3369PEuvvhiN+/WrVu9xx57zM17++23h+b96aefQsdC+fLl3bl+zz33uGvG3Llz3WfanzfccIO73uhYvv76691ytPxw/vFUtmxZd8zp3Nb21LTTpk1LcZueKP+i62iFChW83r17u3xoO+m4KlCggLdq1aok56TOaV1/tH/69+/vln/hhRe6Y8e/9ug6qOOwa9euSY5Z7Qtdl7TPtAzt7+hrt38s6H/fokWL3Hc1btzYGz16tNtXOk6U9sUXX4Sm03VbaVofXROfeOIJr3Xr1t5LL72U4rbCiRGUIQn/Yhz90s115syZSaYPv5CLbp7nnnuuu0n61q9f7y4K1157rXf8+PGI6RMTE2MGZbrA6aIzZMiQiOkVXCk/3333nXuvG5by1qZNGxfs+HQx0fcll09ZtmyZW9YLL7yQZP11UT527FjEeumirQvmkSNHQukK8DT9iYKyjRs3ugBj2LBhEenffPONu6mFp6clKNONyqf8KljSdvMDSdFNVDdULfdEQZnSdBMMV79+fa9BgwZp3u9SrFixiO/1RQdlCv51oW/ZsmXEMaJASNNNnz49lKZtHb3ftE90c1YQmZLVq1e7ebt16xaRrhup0j/++ONQmvaB0j755JNQmvKp4+3+++/30ko/IHQMKUgNpyA4ervJt99+675fN/rwYz88Pz4FHFr/lPg34kqVKnl79+4Npb/22msuXedc+LGu/Xno0KHQdAq4NZ1+2Ph0PmharZtPQZjOdwW7PgVG0UG46MavdAUuyfnvf/+b5FiNPhb8bRQu1jmvH5dFixb1Dh8+nGQZCkTCjyd/3cJ/EERLTf51XoZf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nnzySdu6davVrVvXxo8fb40aNUp2+t27d9sjjzzinrm5a9cuO/30023s2LF21VVXpTpfAAAAcR+U1atXL8XBY/12ZprmRAPJagiN3r172+TJk131p4KrVq1auQecly1bNsn0CQkJ7vma+uyNN95wHQt++eUXK1WqVFpXAwAAIL57X6qEqmrVqjZx4kQ3aKxe+rtatWr25ptv2oYNG+znn392/5/ImDFjrHv37ta1a1erVauWC87UYWD69Okxp1e6Ssfmzp1rTZo0sSpVqljz5s1dCRsAAECuKikbPny4G/4ivLpQ1ZSVK1e2AQMG2IoVK1K1HJV6adp+/fpFdBpo0aKFLVu2LOY877zzjjVu3Njuvvtue/vtt10Hg5tuuskefPBBy5cvX8x5jhw54l6+vXv3pmFtAQAAAlpS9s0337iSsmhK++6771K9nJ07d7rqzXLlykWk673al8Wi0jdVW2q+efPmuSBw9OjRNnTo0GS/Z8SIEVayZMnQS8EjAABA3AdlNWvWdIGOSrp8+ltp+iwzJSYmuvZkU6ZMsQYNGliHDh1co39VeyZHJXF79uwJvTZv3pypeQQAAMiS6ksFQK1bt7bTTjst1LtSPTLVsP/dd99N9XLKlCnjqhy3bdsWka735cuXjzlPhQoVrECBAhFVlQoEVbKmwLBgwYJJ5ilUqJB7AQAA5KiSMg1XoWpEVRkqKNNr2LBhLi2loSyiKYBSaVf48zJVEqb3ajcWixr3//jjj24637p161ywFisgAwAAyLElZVKsWDG7/fbb//KXaziMLl26WMOGDV1ApyExDhw44HpjSufOnd2wF6oalTvvvNOeeeYZu+++++yee+6x9evXu44H995771/OCwAAQNwFZS+++KI9++yzrnRMPSU1gKsev3TGGWdY27ZtU70ctQnbsWOHDRw40FVBagy0+fPnhxr/b9q0yfXI9KmR/ocffmi9evVyJXQK2BSgqfclAABArgrKJk2a5IKonj17uipMf4BYPfdSJV1pCcqkR48e7hXLkiVLkqSpavM///lPWrMNAACQs9qU6TFIzz33nOv1mD///2I6VUFquAwAAABkQVCm0frr16+fJF09HNUeDAAAAFkQlGmQ2NWrVydJV1uwzB6nDAAAIKfKn54ek3rM0eHDh92Dx7/88kt75ZVXXA/JqVOnZk4uAQAAcrg0B2XdunWzIkWKWP/+/e3gwYPu2ZMVK1a0cePG2Y033pg5uQQAAMjh0hSUHTt2zGbNmmWtWrWyTp06uaBs//797tFHAAAAyKI2Zepteccdd7iqSylatCgBGQAAQHZUX2rk/VWrVrkBYwEAZnlG9g/0ZvD6Ds3uLADIjKDsrrvusvvvv99+/fVX9+xKPXIpnP+QcgAAAGRiUOY35g9/3mSePHlcT0z974/wDwAAgEwMyjR4LAAAALIhKDvvvPNs0aJF7vmWzz//vPXp08c18gcAAEAW9r78/vvvQ49QGjx4sBsGAwAAAFlcUlavXj3r2rWrNW3a1LUdGzVqlBUvXjzmtAMHDszA7AEAAOQOqQrKZs6caYMGDbL33nvPNeb/4IMP3Jhl0fQZQRkAAEAmBWXVq1e3V1991f2dN29e176MUfwBAACysfdlYmJiBn49AAAA0vyYJQAAAGQOgjIAAIAAICgDAAAIAIIyAACAeGzo70tISLDt27cnafj/t7/9LSPyBQAAkKukOShbv3693XrrrbZ06dKIdB5IDgAAkIVB2S233OIGjtVAshUqVHADxgIAACCLg7LVq1fbihUrrEaNGn/xqwEAAJDuhv61atWynTt3pnU2AAAAZGRQ9sQTT1jfvn1tyZIl9scff9jevXsjXgAAAMiC6ssWLVq4/y+77LKIdBr6AwAAZGFQtnjx4r/wdQAAAMiQoKx58+ZpnQUAAACZMXjs7t27bdq0afb999+79+ecc44bu6xkyZLpWRwAAECul+aG/suXL7dq1arZU089Zbt27XKvMWPGuLSVK1fm+g0KAACQJSVlvXr1sjZt2thzzz3nBpGVY8eOWbdu3axnz572ySefpCsjAAAAuVn+9JSUhQdkbiH587thMho2bJjR+QMAAMgV0lx9WaJECdu0aVOS9M2bN9tJJ52UUfkCAADIVdIclHXo0MFuu+02mz17tgvE9Hr11Vdd9WXHjh0zJ5cAAAA5XJqrL0eNGuUeQt65c2fXlkwKFChgd955pz3++OOZkUcAAIAcL81BWcGCBW3cuHE2YsQI++mnn1yael4WLVo0M/IHAACQK6RrnDJREFa7du2MzQ0AAEAulaqg7LrrrrOZM2e6Rv76OyVz5szJqLwBAADkGqkKyjRSv9qR+X8DAAAgG4KyGTNmxPw7o0yYMMGefPJJ27p1q9WtW9fGjx9vjRo1OuF86vWpHp9t27a1uXPnZni+AAAAAjskxqFDh+zgwYOh97/88ouNHTvWFixYkK4MaGiN3r1726BBg9xjmhSUtWrVyrZv357ifBs3brQ+ffpYs2bN0vW9AAAAcR2UqVTqhRdeCD2YXCVao0ePdumTJk1Kcwb03Mzu3btb165drVatWjZ58mTXiWD69OnJznP8+HHr1KmTDR482M4444w0fycAAEDcB2UqzfJLp9544w0rX768Ky1ToPb000+naVkJCQm2YsUKa9Gixf8ylDeve79s2bJk53vsscesbNmybhDbEzly5Ijt3bs34gUAABD3QZmqLv3HKanKUr0xFUhdeOGFLjhLi507d7pSr3LlykWk673al8Xy2Wef2bRp09zzN1ND46mpc4L/qly5cpryCAAAEMig7Mwzz3SN6vV4pQ8//NBatmzp0tUGTENmZKZ9+/bZzTff7AKyMmXKpGqefv362Z49e0Iv5RsAACDuB48dOHCg3XTTTdarVy+77LLLrHHjxqFSs/r166dpWQqs8uXLZ9u2bYtI13tVi0bTEwTUwL9169ahtMTExP9fkfz57YcffnBPFwhXqFAh9wIAAMhRQVn79u2tadOm9vvvv7uekj4FaNdee22aH9nUoEEDW7RokbVr1y4UZOl9jx49kkxfo0YN++abbyLS+vfv70rQ9OgnqiYBAECuesySSrGiS7JSM65YLBoOo0uXLtawYUO3DA2vceDAAdcbU/Tg80qVKrm2YYULF7Zzzz03Yv5SpUq5/6PTAQAAcnRQdumll4ZG94/l448/TtPyOnToYDt27HDVomrcX69ePZs/f36o8f+mTZtcRwIAAICcLM1BmYKmcEePHrXVq1fbmjVrXIlXeqiqMlZ1pSxZsiTFefVMTgAAgFwXlD311FMx0x999FHbv39/RuQJAAAg18mwesF//vOfKY7CDwAAgCwIyjQCvxriAwAAIAuqLzWCfzjP89zwGMuXL7cBAwakIwsAAABIc1CmRxWFU8/I6tWru+dR+qP7AwAAIJODshkzZqR1FgAAAJwAA4ABAADES0lZ6dKlUxwwNtyuXbv+ap4AAABynVQFZXr0EQAAALI5KEvvSP0AAADIpDZl8+bNsw8//DBJ+oIFC+yDDz5I6+IAAACQnqDsoYcesuPHjydJT0xMdJ8BAAAgC4Ky9evXW61atZKk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1qNkyZLBbuhfsGBBa9CggS1atCiiJEvvGzduHHMepYdPLwsXLkx2egAAgHiQ7dWXqlrs0qWLNWzY0Bo1amRjx461AwcOuN6Y0rlzZ6tUqZKNGDHCvb/vvvusefPmNnr0aLv66qvt1VdfteXLl9uUKVOyeU0AAADiOCjr0KGD7dixwwYOHGhbt261evXq2fz5861cuXLu802bNrkemb6LLrrIZs2aZf3797eHH37YzjrrLNfz8txzz7WcStWvGsctuho23uSU9chJ68J6BA/7JFhyyv7ISetSKIesRyx51No/uzMBAACQ22X74LEAAAAgKAMAAAgESsoAAAACgKAMAAAgAAjKsskll1xiPXv2zNBlzpw5MxAD42bGugEAkNMRlOUgGl5k3bp12Z2NXEEBsB7TFf4qXLhwdmcrV/v222/tH//4h1WpUsXtD415GI+ee+45a9asmZUuXdq9WrRoYV9++aXFO40pqf3Srl07i0e7d++2u+++2ypUqOCGYjj77LNt3rx5Fk/mzJnjxgTVj/dixYq5IahefPHF7M4WgjROGTJOkSJF3AtZQ4/3+OGHH0Lv4+VZqjnVwYMH7YwzzrDrr7/eevXqZfFqyZIl1rFjRzcmowL9J554wlq2bOmCTg2kHY82btxoffr0ccFmPEpISLDLL7/cypYta2+88YbbD7/88ksgaibS4uSTT7ZHHnnEatSo4Z6o895777mB2rVerVq1yu7sgZKy7HXs2DHr0aOHex6WngM6YMAA99BS0a/9oUOHuicaFC9e3E4//XR755133EC7bdu2dWl16tRxTzMIWvVlatZtyJAh7sajX2u6wE2YMMGCSBfg2rVru2BXD7FXqYWeOOEHYXrmqv/yBzyOh7xPnTrVatas6W76ukBPnDgxNN+tt97qjq0jR46Ebkj169d3x2KQ1+v888+3J5980m688ca4GFQyufV4+eWX7a677nKlGNo32lf+4+eCKqVj7fjx49apUycbPHiwC5qDLLn1mD59uu3atcsNVN6kSRN3DdOTZerWrWvxtB5qWnLttde6c79atWruCTk61z/77DMLgvnz51vTpk3dfUz5vuaaa+ynn34Kfb506VJ3Xui6pRI/7Q9dh1evXh2aZs2aNXbllVe6e6SuyTfffLPt3LnT4oYGj0XWa968uVe8eHHvvvvu89auXeu99NJLXtGiRb0pU6a4z08//XTv5JNP9iZPnuytW7fOu/POO70SJUp4V1xxhffaa695P/zwg9euXTuvZs2aXmJioptnxowZXsmSJeNi3U466SRvxIgRbj2efvppL1++fN6CBQu8IPntt9+8/Pnze2PGjPF+/vln7+uvv/YmTJjg7du3z21r5flvf/ubd9ppp3lt2rTx1qxZ48VD3rU/KlSo4L355pvehg0b3P861mbOnOnm1TRnnHGG17NnT/e+T58+XpUqVbw9e/YEer3C6Rh76qmnvKBK7XrI3r17vcKFC3vvvvuuF4/rMnDgQHetki5dunht27b14m09rrzySq9Tp05e9+7dvbJly3rnnHOON2zYMO/YsWNevB5bum989NFH7toclGvvG2+84a5H69ev91atWuW1bt3aq127tnf8+HF3/dF16p///Kf37bffevPmzfPOPvts/dJ308qff/7pnXrqqV6/fv2877//3lu5cqV3+eWXe5deeqkXLwjKsjFwCQ+o5MEHH3Rp/k1FB5/v999/dwffgAEDQmnLli1zafosaEHZidZNwWW4Dh06uAtfkKxYscJt340bNyb5bOnSpd7zzz/vLgZLlizxrrnmGhc0b9682Qt63qtVq+bNmjUrIm3IkCFe48aNI9avQIEC7njTBf7TTz/1gr5e8RSUpXY9RD/IFCQfOnTIi7d10XFTqVIlb8eOHYEPylJaj+rVq3uFChXybr31Vm/58uXeq6++6gKERx991Iu3Y2v37t1esWLF3HmtdZo2bZoXVDt27HDr8s0333iTJk3yTjnllIjz4LnnnosIynQda9myZcQydE3WNCoAiAcEZdkYuHTt2jUibe7cue5E0a8v3VRGjhwZ+kwBjg4slZL5VMqhtK+++ipwQdmJ1m3w4MERn48dO9aVxgSJ8nrZZZe5Ur327du7kr5du3bFnDYhIcEFO/379/eCnPf9+/e7Y6ZIkSLuwuy/dHFWCUA4/drUtAqo422fBD0oS+16qDS5dOnSoXM8ntZFJXw6p1Wi4QtyUJbSPjnrrLO8ypUrR5SMjR492itfvrwXb8eWSp38kqhRo0a5e8bixYu9IFi3bp134403elWrVnX517VJ16D333/fldxHl3jpvAgPyrS++jEZfm3zlxF+HAYZvS8DrECBAkkakcdKU3sTZLx8+fLZwoUL7YMPPrBatWrZ+PHjrXr16vbzzz/H3Fdqd/Xjjz8GOu9qb+H38FM7DP+l9P/85z+h+XVMff755245QVmntO6TIEvNeowaNcoef/xxW7BggWv3E2/rouNGDfxbt25t+fPnd68XXnjBtY3V3+FthYK+T9TjUr0tNY1P7bK2bt3q2lzG07GVN29eO/PMM13brPvvv9/at29vI0aMsCBo3bq1a7un69MXX3zhXpLabbx//363jPBrm17r16+3iy++2OIBQVk28g84n26KZ511VsSJn1PXLTwA8N/rIhc0CnzVsFeNlFetWuV6LL311ltJplNj5m+++cZdvIOcdwVaFStWtA0bNrgLc/iratWqoXnVYH7t2rX273//2zW+nTFjhsXbPgm6lNZj5MiRrjOMtr0aNMfjuigo0DkRfnNs06aNXXrppe7vypUrW7zsE6UpyAz/Aazhh3S+a5qgScs5onXyO/Vkpz/++MP1Zu/fv79ddtll7n7w559/hj5XYKnjKTyv//3vfyOWcd5557leyuqIEX19U6eyeMCQGNlo06ZN1rt3b/vXv/5lK1eudL9oRo8ebblh3RQc6MajMYv0q+7111+3999/34IWWKrHm4YjUJdxvVfvV10sHnvsMbvwwgvdya7xixTEqIt8t27dLOh514X63nvvdT1jr7jiCneRUy9eXQC1z3QRHzhwoOvBpQv7mDFjXC8t9TbL7t5zKa2Xfk1/9913bjr9vWXLFnfzVy8s7acgSWk9NASGtv+sWbPczUWlMaL10CtoklsXlRyfe+65EdP6vcOj04O+T5TfZ555xp0H99xzjyt5GT58uDuP4mk9VCKmIF89L3Xea5w1jVM2adKk7M62G5PvlFNOsSlTprhgV/eQhx56KPT5TTfd5IbzuP322126PldpcnitkcaRUymbevb37dvXDQGiYFpj5KkXc1wUeGR3/WlupXZXd911l3fHHXe4BuJqN/Lwww+HGsfHahOj3fXWW2+F3qtnTXh9epDalJ1o3dSm7Prrr3c9f9QuY9y4cV7QfPfdd16rVq1cbx61uVJPn/Hjx7vP1L5BPS8LFizolStXzrvqqqtcT594yLu8/PLLXr169Vz+tX8uvvhib86cOa4Rba1atbzbb789YnnqXXrRRRdle2+zlNbLPx+iXzoegyal9dD5EWs9Bg0a5AXRiY61cEFuU3ai9VDnlwsuuMB9po4XQe19mdJ6PPLII96ZZ57pevPqvFfnHnVaCIqFCxe6DmHKd506dVwnqvD73ueff+7Sdd1q0KCB67Ckz9XLP7xd2rXXXuuVKlXKtZ2tUaOGu16HdzwLsjz6J7sDQ+Qu+vWvxzDxKCYAQHq9/PLLbvDbPXv25JiB06m+BAAAgffCCy+4JhQacPyrr76yBx980G644YYcE5AJQRkAAAi8rVu3uvaW+l/tzvRItWHDhllOQvUlAABAADAkBgAAQAAQlAEAAAQAQRkAAEAAEJQBAAAEAEEZAABAABCUAQAABABBGQAAQAAQlAEAAFj2+z96dzUATDSylQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 700x350 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(7, 3.5))\n",
    "ax.bar(inclusion.index, inclusion.values, color=\"#00897B\")\n",
    "ax.axhline(1.0, color=\"#607D8B\", lw=0.8, ls=\"--\")\n",
    "ax.set_ylabel(\"Inclusion frequency\")\n",
    "ax.set_title(\"Backward elimination on 200 bootstrap samples\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7c84f53b",
   "metadata": {},
   "source": [
    "bmi、bp、s5 幾乎每次都被選到，但 s2 大約一半、s4 約三成；200 次重抽出現了二十多種不同的「最終模型」。在原始資料上選出的那一組，只是其中一種可能。\n",
    "\n",
    "## 4. 以交叉驗證為準的向後選擇：`SequentialFeatureSelector`\n",
    "\n",
    "scikit-learn 沒有 p 值版的反向淘汰；它提供的 `SequentialFeatureSelector(direction=\"backward\")` 每一步刪掉「刪了之後交叉驗證分數掉最少」的變數。判準是**預測表現**，不是 p 值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f7f1847a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:12.526955Z",
     "iopub.status.busy": "2026-09-29T20:21:12.526896Z",
     "iopub.status.idle": "2026-09-29T20:21:12.928649Z",
     "shell.execute_reply": "2026-09-29T20:21:12.928311Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SFS kept: ['sex', 'bmi', 'bp', 's1', 's5']\n",
      "5-fold CV R2, all 10 features: 0.482\n",
      "5-fold CV R2, 6 kept features: 0.491\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_selection import SequentialFeatureSelector\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "sfs = SequentialFeatureSelector(\n",
    "    LinearRegression(), n_features_to_select=5, direction=\"backward\", cv=5\n",
    ")\n",
    "sfs.fit(X, y)\n",
    "print(\"SFS kept:\", list(X.columns[sfs.get_support()]))\n",
    "\n",
    "r2_all = cross_val_score(LinearRegression(), X, y, cv=5, scoring=\"r2\").mean()\n",
    "r2_kept = cross_val_score(LinearRegression(), X[kept], y, cv=5, scoring=\"r2\").mean()\n",
    "print(f\"5-fold CV R2, all 10 features: {r2_all:.3f}\")\n",
    "print(f\"5-fold CV R2, 6 kept features: {r2_kept:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e7cf061",
   "metadata": {},
   "source": [
    "刪掉 4 個變數後，交叉驗證 R² 幾乎沒變（約 0.48 vs 0.49）：少了變數、模型更精簡，預測力大致持平。**注意**：上面這個比較其實也有一點點「偷看」——`kept` 是用全部資料選出來的。嚴謹的做法要把選變數放進交叉驗證裡面（第 7 節）。\n",
    "\n",
    "## 5. 卡方檢定法（chi-square）：挑出與結果最相關的類別變數\n",
    "\n",
    "資料：UCI Cleveland Heart Disease（303 人，1980 年代單一醫學中心，CC BY 4.0）。我們只取 7 個類別型欄位，結果是有沒有冠狀動脈疾病（原始 `num` 0–4，>0 當作有病）。\n",
    "\n",
    "需要網路；直接讀 UCI 的 CSV。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "544d1772",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:12.929854Z",
     "iopub.status.busy": "2026-09-29T20:21:12.929754Z",
     "iopub.status.idle": "2026-09-29T20:21:13.510693Z",
     "shell.execute_reply": "2026-09-29T20:21:13.509855Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(301, 7) disease rate: 0.458\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>sex</th>\n",
       "      <th>cp</th>\n",
       "      <th>fbs</th>\n",
       "      <th>restecg</th>\n",
       "      <th>exang</th>\n",
       "      <th>slope</th>\n",
       "      <th>thal</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sex  cp  fbs  restecg  exang  slope  thal\n",
       "0    1   1    1        2      0      3     6\n",
       "1    1   4    0        2      1      2     3\n",
       "2    1   4    0        2      1      2     7\n",
       "3    1   3    0        0      0      3     3\n",
       "4    0   2    0        2      0      1     3"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "URL = (\"https://archive.ics.uci.edu/ml/machine-learning-databases/\"\n",
    "       \"heart-disease/processed.cleveland.data\")\n",
    "names = [\"age\", \"sex\", \"cp\", \"trestbps\", \"chol\", \"fbs\", \"restecg\", \"thalach\",\n",
    "         \"exang\", \"oldpeak\", \"slope\", \"ca\", \"thal\", \"num\"]\n",
    "try:\n",
    "    heart = pd.read_csv(URL, names=names, na_values=\"?\")\n",
    "except Exception as e:\n",
    "    raise RuntimeError(\n",
    "        \"Cannot download Cleveland data from UCI. Check the network, \"\n",
    "        \"or download processed.cleveland.data manually and change URL to the local path.\"\n",
    "    ) from e\n",
    "\n",
    "cat_cols = [\"sex\", \"cp\", \"fbs\", \"restecg\", \"exang\", \"slope\", \"thal\"]\n",
    "heart = heart.dropna(subset=cat_cols)\n",
    "Xc = heart[cat_cols].astype(int)\n",
    "yc = (heart[\"num\"] > 0).astype(int)\n",
    "print(Xc.shape, \"disease rate:\", round(yc.mean(), 3))\n",
    "Xc.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82cc4543",
   "metadata": {},
   "source": [
    "`SelectKBest(chi2)` 會替每個特徵算一個「卡方分數」，保留分數最高的 k 個。這個分數是**排序特徵用的篩選分數**，和統計課的列聯表卡方檢定不是同一件事（第 5 節最後會比較）。chi2 **只接受非負值**，這些欄位都是 0、1、2… 的編碼，符合條件。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "80fa8519",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.512866Z",
     "iopub.status.busy": "2026-09-29T20:21:13.512707Z",
     "iopub.status.idle": "2026-09-29T20:21:13.521370Z",
     "shell.execute_reply": "2026-09-29T20:21:13.520812Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          chi2             p\n",
      "thal     65.89  4.774151e-16\n",
      "exang    37.16  1.087056e-09\n",
      "cp       14.99  1.083368e-04\n",
      "restecg   9.40  2.166762e-03\n",
      "slope     8.04  4.577803e-03\n",
      "sex       7.10  7.696549e-03\n",
      "fbs       0.06  8.023648e-01\n",
      "selected: ['cp', 'restecg', 'exang', 'thal']\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_selection import SelectKBest, chi2\n",
    "\n",
    "selector = SelectKBest(chi2, k=4).fit(Xc, yc)\n",
    "chi_table = pd.DataFrame(\n",
    "    {\"chi2\": selector.scores_.round(2), \"p\": selector.pvalues_},\n",
    "    index=cat_cols,\n",
    ").sort_values(\"chi2\", ascending=False)\n",
    "print(chi_table)\n",
    "print(\"selected:\", list(Xc.columns[selector.get_support()]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b4bfec50",
   "metadata": {},
   "source": [
    "thal（鉈 201 心肌灌注掃描結果）、exang（運動誘發心絞痛）、cp（胸痛型態）、restecg 分數最高。\n",
    "\n",
    "**陷阱**：`cp` 是 1–4 的**類別代碼**，sklearn 的 `chi2` 會把它當成「次數」來加總，4 並不代表比 1「多三倍」。比較正確的做法是先 one-hot 編碼，每個類別各自一欄 0/1。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9c89404f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.523138Z",
     "iopub.status.busy": "2026-09-29T20:21:13.522984Z",
     "iopub.status.idle": "2026-09-29T20:21:13.530524Z",
     "shell.execute_reply": "2026-09-29T20:21:13.529989Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "thal_7     43.04\n",
      "cp_4       41.62\n",
      "exang_1    37.16\n",
      "thal_3     37.11\n",
      "slope_1    23.44\n",
      "cp_3       20.84\n",
      "slope_2    20.00\n",
      "exang_0    17.94\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import OneHotEncoder\n",
    "\n",
    "ohe = OneHotEncoder(sparse_output=False)\n",
    "X_onehot = pd.DataFrame(ohe.fit_transform(Xc), columns=ohe.get_feature_names_out())\n",
    "scores_onehot = pd.Series(chi2(X_onehot, yc)[0], index=X_onehot.columns)\n",
    "print(scores_onehot.sort_values(ascending=False).round(2).head(8))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b1771dc3",
   "metadata": {},
   "source": [
    "one-hot 之後排名前面的是 thal_7（可逆性灌注缺損）、cp_4（無症狀型胸痛）、exang_1、thal_3（正常），這樣的結果可以直接對回臨床意義。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f091aa2e",
   "metadata": {},
   "source": [
    "### sklearn 的 `chi2` 不是列聯表卡方檢定\n",
    "\n",
    "仔細看上面的輸出：`exang_1` 是 37.16、`exang_0` 是 17.94。同一個變數的兩個 0/1 欄只是互補，如果做的是「exang × 結果」的 2×2 列聯表檢定，兩者應該得到同一個數字。\n",
    "\n",
    "原因是 sklearn 的 `chi2` 把特徵值當成「次數」：把每一組（有病、沒病）的特徵值加總，和「依各組人數比例分配」的期望值比較。對 0/1 欄來說，它只看「值為 1 的那些人」在兩組怎麼分，完全沒用到值為 0 的人，所以不是完整的列聯表。它的分數適合拿來**排序、篩選特徵**；它附帶的 p 值不宜當成統計推論的依據。\n",
    "\n",
    "要回答「這個類別變數和結果有沒有關聯」，要用第 2 章的 `scipy.stats.chi2_contingency`，對每個變數建一張「類別 × 結果」列聯表。下面把兩者並排："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "06ade8e6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.532100Z",
     "iopub.status.busy": "2026-09-29T20:21:13.531985Z",
     "iopub.status.idle": "2026-09-29T20:21:13.551572Z",
     "shell.execute_reply": "2026-09-29T20:21:13.551235Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "         chi2  dof       p min_expected sklearn_chi2 sklearn_p\n",
      "feature                                                       \n",
      "thal    83.29    2 8.2e-19          8.3        65.89   4.8e-16\n",
      "cp      80.27    3 2.7e-17         10.5        14.99   0.00011\n",
      "exang   53.29    1 2.9e-13         44.9        37.16   1.1e-09\n",
      "slope   44.52    2 2.2e-10          9.6         8.04    0.0046\n",
      "sex     21.11    1 4.3e-06         44.0         7.10    0.0077\n",
      "restecg 10.81    2  0.0045          1.8         9.40    0.0022\n",
      "fbs      0.01    1    0.91         20.2         0.06       0.8\n",
      "\n",
      "disease rate by fbs: {0: 0.455, 1: 0.477}\n"
     ]
    }
   ],
   "source": [
    "from scipy.stats import chi2_contingency\n",
    "\n",
    "sk_scores, sk_p = chi2(Xc, yc)\n",
    "rows = []\n",
    "for i, col in enumerate(cat_cols):\n",
    "    table = pd.crosstab(Xc[col], yc)  # categories x outcome contingency table\n",
    "    stat, p, dof, expected = chi2_contingency(table)\n",
    "    rows.append({\"feature\": col, \"chi2\": stat, \"dof\": dof, \"p\": p,\n",
    "                 \"min_expected\": expected.min(),\n",
    "                 \"sklearn_chi2\": sk_scores[i], \"sklearn_p\": sk_p[i]})\n",
    "\n",
    "test_table = pd.DataFrame(rows).set_index(\"feature\").sort_values(\"chi2\", ascending=False)\n",
    "fmt = {\"chi2\": \"{:.2f}\".format, \"p\": \"{:.2g}\".format, \"min_expected\": \"{:.1f}\".format,\n",
    "       \"sklearn_chi2\": \"{:.2f}\".format, \"sklearn_p\": \"{:.2g}\".format}\n",
    "print(test_table.to_string(formatters=fmt))\n",
    "print()\n",
    "print(\"disease rate by fbs:\", yc.groupby(Xc[\"fbs\"]).mean().round(3).to_dict())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "846b46b9",
   "metadata": {},
   "source": [
    "兩種數字差很多：cp 的列聯表卡方是 80.27（自由度 3），sklearn 分數只有 14.99；排名也不同。以列聯表檢定來看，thal、cp、exang、slope、sex、restecg 與冠心病的關聯都達統計顯著（p < 0.05），但 restecg 有一格期望次數只有 1.8（低於常用的 5），這個 p 值要保守看待。fbs（空腹血糖 > 120 mg/dL）的 p = 0.91，兩組有病比例 45.5% 與 47.7%，**未達統計顯著**——這只代表「在這份約三百人的資料中沒有偵測到關聯」，不能反推空腹血糖與冠心病無關。\n",
    "\n",
    "小提醒：2×2 表（自由度 1）時 `chi2_contingency` 預設會做 Yates 連續性校正，所以數字會比未校正版略小。\n",
    "\n",
    "## 6. 主成分分析（PCA）：把 30 個相關特徵壓成幾個新軸\n",
    "\n",
    "資料：sklearn 內建 WDBC 乳癌細胞核影像資料，569 個腫瘤、30 個特徵。注意 sklearn 的編碼 **0 = malignant、1 = benign**。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "06fdbbb8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.553008Z",
     "iopub.status.busy": "2026-09-29T20:21:13.552910Z",
     "iopub.status.idle": "2026-09-29T20:21:13.559959Z",
     "shell.execute_reply": "2026-09-29T20:21:13.559661Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(569, 30) ['malignant' 'benign']\n",
      "PC1-PC5 explained variance ratio: [0.443 0.19  0.094 0.066 0.055]\n",
      "cumulative, first 5: [0.443 0.632 0.726 0.792 0.847]\n",
      "PCs needed for 95%: 10\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_breast_cancer\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "data = load_breast_cancer()\n",
    "Xw, yw = data.data, data.target\n",
    "print(Xw.shape, data.target_names)\n",
    "\n",
    "Xw_std = StandardScaler().fit_transform(Xw)\n",
    "pca = PCA().fit(Xw_std)\n",
    "ratio = pca.explained_variance_ratio_\n",
    "cum = np.cumsum(ratio)\n",
    "print(\"PC1-PC5 explained variance ratio:\", ratio[:5].round(3))\n",
    "print(\"cumulative, first 5:\", cum[:5].round(3))\n",
    "print(\"PCs needed for 95%:\", int(np.argmax(cum >= 0.95) + 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "428af45f",
   "metadata": {},
   "source": [
    "PC1 一個軸就解釋了 44% 的變異，前 2 個約 63%，要 10 個主成分才到 95%。把它畫成陡坡圖（scree plot）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "acc4daf0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.561120Z",
     "iopub.status.busy": "2026-09-29T20:21:13.561049Z",
     "iopub.status.idle": "2026-09-29T20:21:13.605762Z",
     "shell.execute_reply": "2026-09-29T20:21:13.605398Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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/76alZkuXbpENQBZLizKjrU/URttxowZ8uDBAzXbEzp27Ch58+ZV3ZaBgYFSpkwZm5/PlCmT+hp7OxEREZHXFbPVs2AIzp5W69at5fr16zJq1ChVzLZChQqyfv16y2SC8+fPqxmfRERERN7EoGma5swPIMv1ySefqC5JFJzVx4TpTp8+LZ4MY9IwgQB13TJkyJBkz2OYNEKSizZkfLI9FxERESVP7OF0Ju3dd9+Vbdu2qVmWuXPnVt2fRERERORaTgdp69atkzVr1qjitURERESUNJwe7JU5c2bJkiVL0rSGiIiIiBIXpI0bN04N8kf5DSIiIiLykO7OqVOnqqKymH1ZqFAhm/U7wdn1O4mIiIjIBUGaXnSWiIiIiDwoSBs9enTStISIiIiILFglloiIiCilZtIwm/PEiRNqQXTM7kyoNtqtW7dc2T4iIiIir+RQkDZ9+nRJnz69+h5raxIRERGRBwRpWADd3vdERERE5GELrEN4eLhERkbabEvK9TCJiIiIvIXTEwewwHqvXr0kR44ckjZtWjVGzfpGRERERG4I0oYMGSJbtmyRuXPnSkBAgCxcuFDGjBkjefLkkaVLl7qgSURERETkdHfnL7/8ooKxF198Ubp06SK1a9eWYsWKScGCBWXZsmXSrl07nlUiIiKi5M6kocRGkSJFLOPP9JIbtWrVkj/++ONp20NEREREiQnSEKCdOXNGfV+yZElZuXKlJcOWKVMmnlQiIiIidwRp6OI8dOiQ+n7YsGEyZ84cCQwMlP79+8vgwYNd0SYiIiIir+f0mDQEY7r69evL8ePHZd++fWpcWrly5bz+hBIRERG5vU4aYMIAbkRERESUzEHarFmzHD5gnz59nqY9REREROTM2p2OwMLrDNKIiIiIkilI02dzEhEREZGHzu60pmmauhERERGRBwRpixYtkjJlyqjSG7jheywPRURERERumt05atQomTZtmvTu3VuqV6+utu3cuVOV5jh//ryMHTvWRU0jIiIi8l5OB2lYWH3BggXSpk0by7amTZuqGmkI3BikEREREbmhuzMqKkoqV64cZ3ulSpUkOjraBU0iIiIiIqeDtA4dOqhsWmzz58+Xdu3a8YwSERERuWvFAUwc2Lhxozz//PPq/u7du9V4tI4dO8qAAQMs+2HsGhERERElQ5D2zz//SMWKFdX3p06dUl+zZcum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",
      "text/plain": [
       "<Figure size 700x350 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "k = np.arange(1, 16)\n",
    "fig, ax = plt.subplots(figsize=(7, 3.5))\n",
    "ax.bar(k, ratio[:15], color=\"#00897B\", label=\"each PC\")\n",
    "ax.plot(k, cum[:15], \"o-\", color=\"#F4511E\", label=\"cumulative\")\n",
    "ax.axhline(0.95, color=\"#607D8B\", ls=\"--\", lw=0.8)\n",
    "ax.set_xlabel(\"Principal component\")\n",
    "ax.set_ylabel(\"Explained variance ratio\")\n",
    "ax.set_title(\"Scree plot (WDBC, standardized)\")\n",
    "ax.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e296f26b",
   "metadata": {},
   "source": [
    "把每個腫瘤投影到前兩個主成分上，再用真正的診斷上色（PCA 本身沒看過診斷）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "81748118",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.606864Z",
     "iopub.status.busy": "2026-09-29T20:21:13.606804Z",
     "iopub.status.idle": "2026-09-29T20:21:13.641562Z",
     "shell.execute_reply": "2026-09-29T20:21:13.641118Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 550x450 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Z2 = PCA(n_components=2).fit_transform(Xw_std)\n",
    "fig, ax = plt.subplots(figsize=(5.5, 4.5))\n",
    "for label, color in [(0, \"#F4511E\"), (1, \"#00897B\")]:\n",
    "    m = yw == label\n",
    "    ax.scatter(Z2[m, 0], Z2[m, 1], s=12, alpha=0.6, color=color,\n",
    "               label=data.target_names[label])\n",
    "ax.set_xlabel(\"PC1\")\n",
    "ax.set_ylabel(\"PC2\")\n",
    "ax.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32e31d43",
   "metadata": {},
   "source": [
    "惡性與良性在 PC1 方向上大致分開。那 PC1 到底是什麼？看它的「載荷（loading）」——每個原始特徵在 PC1 裡的權重："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "8d8301a0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.642789Z",
     "iopub.status.busy": "2026-09-29T20:21:13.642708Z",
     "iopub.status.idle": "2026-09-29T20:21:13.645708Z",
     "shell.execute_reply": "2026-09-29T20:21:13.645322Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mean concave points     0.261\n",
      "mean concavity          0.258\n",
      "worst concave points    0.251\n",
      "mean compactness        0.239\n",
      "worst perimeter         0.237\n",
      "worst concavity         0.229\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "pca2 = PCA(n_components=2).fit(Xw_std)\n",
    "loadings = pd.Series(pca2.components_[0], index=data.feature_names)\n",
    "print(loadings.sort_values(key=abs, ascending=False).head(6).round(3))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9402d55",
   "metadata": {},
   "source": [
    "PC1 權重最大的是 concave points（凹點數）、concavity（凹陷程度）、compactness（緊密度）、perimeter（周長）這些描述「細胞核大小與形狀不規則程度」的特徵，而且正負號一致，可以把 PC1 粗略理解成「細胞核又大又不規則的程度」（正負號本身沒有意義，換個方向也是同一個軸）。\n",
    "\n",
    "**如果不標準化會怎樣？**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "696a2950",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.646909Z",
     "iopub.status.busy": "2026-09-29T20:21:13.646847Z",
     "iopub.status.idle": "2026-09-29T20:21:13.649660Z",
     "shell.execute_reply": "2026-09-29T20:21:13.649371Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "without scaling, PC1 explains: 0.982\n",
      "feature variances (top 3):\n",
      "worst area    323598.0\n",
      "mean area     123626.0\n",
      "area error      2066.0\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "raw_ratio = PCA().fit(Xw).explained_variance_ratio_\n",
    "print(\"without scaling, PC1 explains:\", raw_ratio[0].round(3))\n",
    "print(\"feature variances (top 3):\")\n",
    "print(pd.Series(Xw.var(axis=0), index=data.feature_names).sort_values(ascending=False).head(3).round(0))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78148720",
   "metadata": {},
   "source": [
    "不標準化時 PC1 看似解釋了 98% 的變異——但那只是因為 worst area、mean area 的數值（幾百到幾千）遠大於其他特徵，PC1 幾乎就等於「面積」。PCA 會置中但**不會縮放**，所以一定要先標準化。\n",
    "\n",
    "## 7. 把降維放進 Pipeline：選幾個主成分比較好？\n",
    "\n",
    "用 `Pipeline` 串起「標準化 → PCA → 邏輯迴歸」，每一折交叉驗證都只在訓練折上配適標準化與 PCA。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "df5ddbf1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.650657Z",
     "iopub.status.busy": "2026-09-29T20:21:13.650603Z",
     "iopub.status.idle": "2026-09-29T20:21:13.713475Z",
     "shell.execute_reply": "2026-09-29T20:21:13.712845Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 1 PCs: CV accuracy = 0.910\n",
      " 2 PCs: CV accuracy = 0.947\n",
      " 3 PCs: CV accuracy = 0.942\n",
      " 5 PCs: CV accuracy = 0.963\n",
      "10 PCs: CV accuracy = 0.977\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "30 PCs: CV accuracy = 0.974\n"
     ]
    }
   ],
   "source": [
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n",
    "for n in [1, 2, 3, 5, 10, 30]:\n",
    "    pipe = make_pipeline(StandardScaler(), PCA(n_components=n),\n",
    "                         LogisticRegression(max_iter=1000))\n",
    "    acc = cross_val_score(pipe, Xw, yw, cv=cv).mean()\n",
    "    print(f\"{n:2d} PCs: CV accuracy = {acc:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11e4e5de",
   "metadata": {},
   "source": [
    "2 個主成分就有約 0.95 的準確率，10 個主成分與全部 30 個特徵差不多（約 0.97–0.98）。要記得：WDBC 是單一來源、樣本數 569 的資料，準確率高不代表能直接用在別家醫院。\n",
    "\n",
    "## 8. 資料洩漏（data leakage）示範：先選特徵、再交叉驗證\n",
    "\n",
    "最後示範一個常見錯誤。造 100 位「病人」、5,000 個**純雜訊**特徵、隨機的 0/1 結果。正確的準確率應該接近 0.5（猜硬幣）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "1096088d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:21:13.715025Z",
     "iopub.status.busy": "2026-09-29T20:21:13.714950Z",
     "iopub.status.idle": "2026-09-29T20:21:13.748915Z",
     "shell.execute_reply": "2026-09-29T20:21:13.748605Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "selection outside CV: 0.88\n",
      "selection inside pipeline: 0.53\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_selection import f_classif\n",
    "\n",
    "rng = np.random.default_rng(42)\n",
    "X_noise = rng.normal(size=(100, 5000))\n",
    "y_coin = rng.integers(0, 2, size=100)\n",
    "\n",
    "# Wrong: select features on ALL data, then cross-validate\n",
    "X_selected = SelectKBest(f_classif, k=20).fit_transform(X_noise, y_coin)\n",
    "acc_wrong = cross_val_score(LogisticRegression(max_iter=1000), X_selected, y_coin, cv=cv).mean()\n",
    "\n",
    "# Right: feature selection inside the pipeline\n",
    "pipe_right = make_pipeline(SelectKBest(f_classif, k=20), LogisticRegression(max_iter=1000))\n",
    "acc_right = cross_val_score(pipe_right, X_noise, y_coin, cv=cv).mean()\n",
    "\n",
    "print(f\"selection outside CV: {acc_wrong:.2f}\")\n",
    "print(f\"selection inside pipeline: {acc_right:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d254e99d",
   "metadata": {},
   "source": [
    "在全部資料上先挑特徵，準確率被灌到約 0.88；放進 Pipeline 後回到約 0.5，這才是真相。\n",
    "\n",
    "## 動手試試\n",
    "\n",
    "1. 把第 1 節 `backward_eliminate` 的 `alpha` 改成 0.10 或 0.01，最後留下的變數有什麼不同？\n",
    "2. 把第 2 節的雜訊特徵從 20 個改成 50 個，看看反向淘汰會「找到」幾個顯著變數。\n",
    "3. 在第 7 節把 `LogisticRegression` 換成第 6 章的 `SVC()`，比較 2 個主成分與 30 個特徵的準確率。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
