{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "6ae1d6a7",
   "metadata": {},
   "source": [
    "# 第 01 章　機器學習簡介與環境安裝\n",
    "\n",
    "這是「醫學生的機器學習入門」第 01 章的配套 notebook。\n",
    "\n",
    "- **在 Colab 執行**：上方選單「執行階段 → 全部執行」即可，不需要安裝任何東西。本章只用 Colab 內建的套件與 scikit-learn 內建資料集，不需要網路下載資料。\n",
    "- **在自己電腦執行**：需要 Python 3.10 以上，以及 numpy、pandas、matplotlib、scikit-learn（安裝方式見網站第 01 章「環境安裝」一節）。\n",
    "- 由上往下一格一格執行（Shift + Enter）。每一格程式碼前都有一段說明。\n",
    "\n",
    "> 本章使用 Breast Cancer Wisconsin (Diagnostic) 資料集（CC BY 4.0），僅供學習，不構成臨床建議。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ee68acd",
   "metadata": {},
   "source": [
    "## 0. 確認環境\n",
    "\n",
    "先印出 Python 與主要套件的版本。之後遇到錯誤、上網查解法時，版本號是第一個要核對的資訊。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "06dc2b28",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:15:56.013803Z",
     "iopub.status.busy": "2026-09-29T20:15:56.013730Z",
     "iopub.status.idle": "2026-09-29T20:15:56.924656Z",
     "shell.execute_reply": "2026-09-29T20:15:56.924121Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python       3.12.2\n",
      "numpy        2.1.3\n",
      "pandas       2.2.3\n",
      "matplotlib   3.10.0\n",
      "scikit-learn 1.6.1\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib\n",
    "import sklearn\n",
    "\n",
    "print(\"Python      \", sys.version.split()[0])\n",
    "print(\"numpy       \", np.__version__)\n",
    "print(\"pandas      \", pd.__version__)\n",
    "print(\"matplotlib  \", matplotlib.__version__)\n",
    "print(\"scikit-learn\", sklearn.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e02ec476",
   "metadata": {},
   "source": [
    "## 1. 載入資料：WDBC 乳癌細針抽吸資料\n",
    "\n",
    "scikit-learn 內建這份資料，一行就能載入，不需要網路。每一列是一位病人的乳房腫塊細針抽吸（fine-needle aspiration）影像，30 個欄位是電腦從細胞核影像量出來的數值（半徑、紋理、周長、面積、凹點……），答案欄 `target` 是病理診斷。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "19bba062",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:15:56.925940Z",
     "iopub.status.busy": "2026-09-29T20:15:56.925826Z",
     "iopub.status.idle": "2026-09-29T20:15:56.997159Z",
     "shell.execute_reply": "2026-09-29T20:15:56.996765Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "資料大小（列, 欄）: (569, 31)\n",
      "target 的意義: {0: 'malignant', 1: 'benign'}\n",
      "target\n",
      "benign       357\n",
      "malignant    212\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_breast_cancer\n",
    "\n",
    "data = load_breast_cancer(as_frame=True)\n",
    "df = data.frame\n",
    "\n",
    "print(\"資料大小（列, 欄）:\", df.shape)\n",
    "print(\"target 的意義:\", dict(enumerate(data.target_names.tolist())))\n",
    "print(df[\"target\"].value_counts().rename(index=dict(enumerate(data.target_names.tolist()))))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b7b351a",
   "metadata": {},
   "source": [
    "注意：scikit-learn 版本的編碼是 **0 = malignant（惡性）、1 = benign（良性）**，跟直覺的「1 = 有病」相反。之後算敏感度時要特別小心。\n",
    "\n",
    "看看前五列長什麼樣子："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d70e4e7e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:15:56.998248Z",
     "iopub.status.busy": "2026-09-29T20:15:56.998166Z",
     "iopub.status.idle": "2026-09-29T20:15:57.003367Z",
     "shell.execute_reply": "2026-09-29T20:15:57.003016Z"
    }
   },
   "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>mean radius</th>\n",
       "      <th>mean texture</th>\n",
       "      <th>mean perimeter</th>\n",
       "      <th>mean area</th>\n",
       "      <th>mean concave points</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.14710</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.07017</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.12790</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.10520</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10430</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   mean radius  mean texture  mean perimeter  mean area  mean concave points  \\\n",
       "0        17.99         10.38          122.80     1001.0              0.14710   \n",
       "1        20.57         17.77          132.90     1326.0              0.07017   \n",
       "2        19.69         21.25          130.00     1203.0              0.12790   \n",
       "3        11.42         20.38           77.58      386.1              0.10520   \n",
       "4        20.29         14.34          135.10     1297.0              0.10430   \n",
       "\n",
       "   target  \n",
       "0       0  \n",
       "1       0  \n",
       "2       0  \n",
       "3       0  \n",
       "4       0  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[:5, [0, 1, 2, 3, 7, -1]]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "88eb439e",
   "metadata": {},
   "source": [
    "## 2. 五行程式跑出第一個模型\n",
    "\n",
    "切出 25% 當「期末考」（測試集），用剩下 75% 訓練一棵決策樹，最後在沒看過的測試集上打分數。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3d34ab1d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:15:57.004396Z",
     "iopub.status.busy": "2026-09-29T20:15:57.004340Z",
     "iopub.status.idle": "2026-09-29T20:15:57.209517Z",
     "shell.execute_reply": "2026-09-29T20:15:57.209164Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "測試集準確率: 0.944\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "X, y = load_breast_cancer(return_X_y=True)\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, stratify=y, random_state=42)\n",
    "model = DecisionTreeClassifier(max_depth=3, random_state=42)\n",
    "model.fit(X_train, y_train)\n",
    "print(\"測試集準確率:\", round(model.score(X_test, y_test), 3))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cdceb345",
   "metadata": {},
   "source": [
    "輸出的數字是「測試集中有幾成病人被判對」。`random_state=42` 固定了隨機切分，讓你每次跑的結果都一樣。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "726eb675",
   "metadata": {},
   "source": [
    "## 3. 訓練分數 vs 測試分數\n",
    "\n",
    "同一個模型分別在「看過的題目」和「沒看過的題目」上打分數，比較兩者差多少。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1ff18436",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:15:57.210692Z",
     "iopub.status.busy": "2026-09-29T20:15:57.210597Z",
     "iopub.status.idle": "2026-09-29T20:15:57.213179Z",
     "shell.execute_reply": "2026-09-29T20:15:57.212886Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "訓練集準確率: 0.977\n",
      "測試集準確率: 0.944\n",
      "訓練集人數: 426 ／ 測試集人數: 143\n"
     ]
    }
   ],
   "source": [
    "print(\"訓練集準確率:\", round(model.score(X_train, y_train), 3))\n",
    "print(\"測試集準確率:\", round(model.score(X_test, y_test), 3))\n",
    "print(\"訓練集人數:\", len(y_train), \"／ 測試集人數:\", len(y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bff162d8",
   "metadata": {},
   "source": [
    "訓練集分數比測試集高是常態；兩者差距愈大，代表模型愈可能只是「背答案」。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b552c99",
   "metadata": {},
   "source": [
    "## 4. 換成醫學語言：混淆矩陣、敏感度、特異度\n",
    "\n",
    "準確率把所有錯誤一視同仁，但臨床上「把惡性判成良性」（偽陰性）的代價遠比反過來嚴重。我們把惡性（0）當作陽性，算出熟悉的敏感度與特異度。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "cfc82d46",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:15:57.214426Z",
     "iopub.status.busy": "2026-09-29T20:15:57.214353Z",
     "iopub.status.idle": "2026-09-29T20:15:57.217676Z",
     "shell.execute_reply": "2026-09-29T20:15:57.217399Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       預測：惡性  預測：良性\n",
      "真實：惡性     48      5\n",
      "真實：良性      3     87\n",
      "\n",
      "敏感度 (sensitivity): 0.906\n",
      "特異度 (specificity): 0.967\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "y_pred = model.predict(X_test)\n",
    "cm = confusion_matrix(y_test, y_pred, labels=[0, 1])   # 列 = 真實，欄 = 預測；順序 [惡性, 良性]\n",
    "print(pd.DataFrame(cm,\n",
    "                   index=[\"真實：惡性\", \"真實：良性\"],\n",
    "                   columns=[\"預測：惡性\", \"預測：良性\"]))\n",
    "\n",
    "sensitivity = cm[0, 0] / cm[0].sum()   # 惡性中被抓到的比例\n",
    "specificity = cm[1, 1] / cm[1].sum()   # 良性中被正確排除的比例\n",
    "print(\"\\n敏感度 (sensitivity):\", round(sensitivity, 3))\n",
    "print(\"特異度 (specificity):\", round(specificity, 3))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "257a31b9",
   "metadata": {},
   "source": [
    "右上角那格就是偽陰性：真的惡性、模型卻說良性的人數。第 11 章會再談怎麼調整閾值來換取更高的敏感度。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67cda683",
   "metadata": {},
   "source": [
    "## 5. 過擬合：模型愈複雜一定愈好嗎？\n",
    "\n",
    "把決策樹的最大深度從 1 調到 15，分別記錄訓練集與測試集的準確率，畫成折線圖。（圖上標籤用英文，因為 Colab 預設沒有中文字型。）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "36ce0ef1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:15:57.218797Z",
     "iopub.status.busy": "2026-09-29T20:15:57.218737Z",
     "iopub.status.idle": "2026-09-29T20:15:57.443368Z",
     "shell.execute_reply": "2026-09-29T20:15:57.442983Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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2hSxNmvWTB2mR2KInjosHyxvlCYh6cXn/P3331XygGQuOa7Wc1emTZsm/fv3V8tgwIABantFgopl8cwzzyQ7j6NHj6q/w2fs3r27SqiwM4W2QoIFiBnbAT4rlgu282+//VYlJOmR0jae2uWF5Tx//ny1rKpUqaLaC9s/1r0HHnggVdulPXyfYQfgvvvuU/Hh86F97BNtbHOYZvXq1Wq5oL3xPYlEGR0C2PaQ1OK7aO3atapda9asqXb0kIChLfVYdPi8+N7E58AOKJLytK6LzrBdYqceyx/tinm0atXK5WdG+yMxReeAv7+/+g7CzgI6KPDdAqndTtEO2MaRNCMZBiwPtCHaKiXYSUN7Yh747GPGjFE7E8ePH1exAb7nsH5g5wzfyyjVwfc3fouws4P2w9/ge3/27NmqvdGugHYkN9GI7sGMGTOw+69t27YtyWly5cql3X///bbHTZs21apXr65FRUXZnrNarVqDBg208uXL254bOXKklj17du3w4cMO7zd48GDN19dXO336tHp84sQJFUNwcLB29uxZ23RbtmxRz7/xxhtpnrf+uR5++GEtLi4uxXbA58f0+DtnjRs3Vq998803Ds/PmjVLs1gs2l9//eXwPKbD9H///bd6fPLkSfV5P/74Y4fp9u7dq/n5+Tk8v3btWvW3w4YNSzHmVq1aaSVLlkz0vP4eZcqU0W7fvu3wGtotPj7e4Tm0f2BgoDZixAiH55zbo3v37uo5++kA60atWrWSjXXRokUprmdr1qxR0/Tv3z/Ra1jGsHv3bjXNiy++6PD6W2+9pZ7He+jQNnhu+fLlDtOmdr1MCt4XbQ8TJkzQfHx81Hvax4p1sUWLFra4AcuidOnS2mOPPWZ7rlevXlrhwoW1K1euOMyjS5cuarvTl5++TIsWLaqFh4fbpps7d656HnHArl271ON58+ZpaZXUeq6/hpuubdu2WtWqVZN9P30bxLrkvEw2bNhgey4sLEytf2+++abtuddee021Kz6P7urVq1revHkTvWdqJbWNp2V5YZn07ds3XdulK1988YWK6fLly0lOM336dDXNuHHjEr2mx7t48WI1zUcffeTweseOHVU7Hj161PYcpsP31v79+x2mTe266Iq+Xb766qsOzz/zzDOJvs/atWunBQQEaMeOHbM9d/78eS0kJERr1KhRmrfTAQMGaDlz5kzV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Bpo4Pp60RkRERERejT28REREROTVmPASERERkVdjwktEREREXo0JLxERERF5NSa8BtqwYYO0bt1aXSEEV3RbvHixmMno0aPlwQcfVFecCw0NlXbt2smhQ4fETL7++mu57777bINc169fX5YtWyZm9Mknn6jl/Prrr4tZfPjhhyom+1ulSpXETM6dOyfPPfec5MuXT4KDg6V69eqyfft2MYtSpUolakPc+vbtK2YQHx8vH3zwgZQuXVq1X9myZWXkyJGpuvZ8ZsGVkrBdlCxZUsXYoEED2bZtmym/l9FuQ4cOlcKFC6tYmzVrJkeOHDFVjAsXLpTmzZurbQav79692zTxxcbGyqBBg9R2nD17djVNt27d1NVNzRCf/r2I70HElydPHrWMt2zZYpr47L3yyitqmvHjx2dafKmJ8YUXXkj0nfj444+LkZjwGujWrVtSo0YN+fLLL8WM1q9fr360//nnH1m5cqX6osKXKOI2C1wRD4nkjh07VBL06KOPStu2bWX//v1iJvjxnjJlikrOzaZq1apy4cIF223jxo1iFtevX5eHHnpI/P391Y7MgQMHZOzYsepHyEzL1r79sK3A008/LWbw6aefqh3DyZMny3///acejxkzRiZNmiRm8eKLL6p2mzVrluzdu1d9zyDJwM6O2b6X0XYTJ06Ub775RiVBSIpatGghUVFRpokRrz/88MNqWRshufhu374tO3fuVDth+B/JOTpS2rRpY4r4oEKFCmp7wbqI70Ps1GKdvHz5sini0y1atEj9PiPpzGy3UhEjElz778bZs2eLoTQyBSyKRYsWaWYWFham4ly/fr1mZnny5NG+/fZbzSwiIiK08uXLaytXrtQaN26sDRgwQDOLYcOGaTVq1NDMatCgQdrDDz+seRIs37Jly2pWq1Uzg1atWmk9e/Z0eK5Dhw7as88+q5nB7du3NV9fX+333393eP6BBx7Q3nvvPc1M38tYpoUKFdI+++wz23M3btzQAgMDtdmzZ5siRnsnTpxQr+/atUsz82/b1q1b1XSnTp3SzBjfzZs31XSrVq3SzBLf2bNntaJFi2r79u3TSpYsqX3xxReaUcRFjN27d9fatm2rmQl7eCnVbt68qf7PmzevKVsNh25/+eUXteeJ0gazQC95q1atVI+VGeFwLHoIypQpI88++6ycPn1azGLJkiVSu3Zt1VuK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KKlataq89NJLtueOHTum3mv69OmpLmEoUaKEZMuWTdq3by9Xr15NNM2vv/4qDzzwgAQFBUmZMmVk+PDhEhcXZ3sdvbdff/21SkIQJ6aZP3++7XXED/fff7+aFm1h7/PPP5fChQurRKhv374SGxubZLyXL1+WNWvWSOvWrR2ex/tOmTJFnnzySfVZKleuLJs3b5ajR4+q+WXPnl0aNGig2sce4i5btqwEBASo9p01a5bD60eOHFHlE/jsVapUkZUrVyaK6cyZM9KpUydVCpI3b15p27at6tVOi7///lvFidixfrRo0UKuX7+uXouOjpb+/ftLaGioiuPhhx+Wbdu22f523bp16vOvWLFCtTGWwaOPPiphYWFqfUJb5MyZU5555hm5ffu27e8wv379+qlbrly5JH/+/PLBBx+IpmlJxnnjxg158cUXpUCBAuo9MZ89e/bYlk2hQoVk1KhRtuk3bdqk2lbv1bUvacD977//Xq1fiB83fBa8J2Kyh/e2fx9fX19p2bKl/PLLL2lqZyJKgUZEdA8aN26shYSEaCNHjtQOHz6s/vf19dWeeOIJberUqeq5Pn36aPny5dNu3bql/iYmJkYbOnSotm3bNu348ePajz/+qGXLlk2bM2eO7X137dqlBQQEaIsXL9bi4uK0evXqae3bt09VTP/8849msVi0Tz/9VDt06JA2YcIELXfu3FquXLls02zYsEHLmTOnNnPmTO3YsWPan3/+qZUqVUr78MMPbdPgKxJxT5s2Tb3P+++/rz7bgQMH1Otbt25V06xatUq7cOGCdvXqVfV89+7d1Xu/8sor2n///af99ttv6vOhPZKycOFCLXv27Fp8fLzD83j/okWLqrZBDO3atVNxPvroo9ry5ctVLGibxx9/3OG9/P39tS+//FL9zdixY1Xca9asUa9jHtWqVdOaNm2q7d69W1u/fr12//33q3ktWrTItowqV66s9ezZU/v333/VfJ555hmtYsWKWnR0tO1ztm3bNsnPhGUYGBiolj/ms2/fPm3SpEna5cuX1ev9+/fXihQpov3xxx/a/v371fvlyZPH1o5r165VMeHzbdy4Udu5c6dWrlw5tc41b95cPcZyxDL65JNPbPPF6zly5NAGDBigHTx40LZ+2bd/yZIltS+++ML2uFmzZlrr1q3VOol19s0331Tvq8eydOlS1aZ4PTw8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",
      "text/plain": [
       "<Figure size 800x450 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "depth= 1  train=0.923  test=0.923\n",
      "depth= 2  train=0.958  test=0.909\n",
      "depth= 3  train=0.977  test=0.944\n",
      "depth= 4  train=0.988  test=0.944\n",
      "depth= 5  train=0.995  test=0.937\n",
      "depth= 6  train=0.998  test=0.937\n",
      "depth= 7  train=1.000  test=0.923\n",
      "depth= 8  train=1.000  test=0.923\n",
      "depth= 9  train=1.000  test=0.923\n",
      "depth=10  train=1.000  test=0.923\n",
      "depth=11  train=1.000  test=0.923\n",
      "depth=12  train=1.000  test=0.923\n",
      "depth=13  train=1.000  test=0.923\n",
      "depth=14  train=1.000  test=0.923\n",
      "depth=15  train=1.000  test=0.923\n"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "depths = range(1, 16)\n",
    "train_acc, test_acc = [], []\n",
    "for d in depths:\n",
    "    m = DecisionTreeClassifier(max_depth=d, random_state=42).fit(X_train, y_train)\n",
    "    train_acc.append(m.score(X_train, y_train))\n",
    "    test_acc.append(m.score(X_test, y_test))\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(8, 4.5))\n",
    "ax.plot(depths, train_acc, \"o-\", color=\"#00897B\", label=\"Train accuracy\")\n",
    "ax.plot(depths, test_acc, \"s-\", color=\"#F4511E\", label=\"Test accuracy\")\n",
    "ax.set_xlabel(\"max_depth (model complexity)\")\n",
    "ax.set_ylabel(\"Accuracy\")\n",
    "ax.set_title(\"Deeper tree: train score keeps rising, test score does not\")\n",
    "ax.set_xticks(list(depths))\n",
    "ax.grid(alpha=0.3)\n",
    "ax.legend()\n",
    "plt.show()\n",
    "\n",
    "for d, a, b in zip(depths, train_acc, test_acc):\n",
    "    print(f\"depth={d:2d}  train={a:.3f}  test={b:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f91e57b",
   "metadata": {},
   "source": [
    "深度 7 以後訓練集已經滿分，測試集卻停在比深度 3、4 還低的位置——這就是過擬合的樣子：模型把訓練資料的雜訊也一起背了下來。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fcc2ebf7",
   "metadata": {},
   "source": [
    "## 6. 同一份資料，換成你熟悉的邏輯迴歸\n",
    "\n",
    "流行病學課上的 logistic regression，在機器學習裡也是一個分類模型。先把各欄位標準化（z 分數），再訓練邏輯迴歸。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d5addce4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:15:57.445456Z",
     "iopub.status.busy": "2026-09-29T20:15:57.445294Z",
     "iopub.status.idle": "2026-09-29T20:15:57.453527Z",
     "shell.execute_reply": "2026-09-29T20:15:57.453183Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "邏輯迴歸 訓練集準確率: 0.988\n",
      "邏輯迴歸 測試集準確率: 0.986\n"
     ]
    }
   ],
   "source": [
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "logit = make_pipeline(StandardScaler(), LogisticRegression(solver=\"liblinear\"))\n",
    "logit.fit(X_train, y_train)\n",
    "print(\"邏輯迴歸 訓練集準確率:\", round(logit.score(X_train, y_train), 3))\n",
    "print(\"邏輯迴歸 測試集準確率:\", round(logit.score(X_test, y_test), 3))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a672a791",
   "metadata": {},
   "source": [
    "在這一次切分下邏輯迴歸的測試分數比決策樹高，但只憑一次切分、一百多位測試病人，還不能下「邏輯迴歸比較好」的結論；第 11 章會用交叉驗證更公平地比較。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e224166b",
   "metadata": {},
   "source": [
    "## 動手試試\n",
    "\n",
    "1. 把第 2 節的 `random_state=42` 改成 `0` 或 `7` 再跑一次，測試集準確率會變多少？這告訴你「單一次切分的分數」有多不穩定。\n",
    "2. 把第 2 節的 `max_depth=3` 改成 `None`（不限制深度），比較訓練集與測試集準確率的差距。\n",
    "3. 把 `test_size=0.25` 改成 `0.5`（訓練資料變少），第 5 節的兩條線會怎麼變化？"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "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
}
