分類:從機率到決策邊界

ISLP 第 4 章 — 對應講義 04
logit(p) = β₀ + βᵀx|勝算比|Bayes 定理|LDA|QDA|Naive Bayes|混淆矩陣|ROC 與 AUC
向下捲動開始互動
📌 本頁使用方式(ISLP Ch.4|講義 04)

照節次讀:每節先讀說明,動手玩互動元件——先預測結果,再按按鈕驗證。 ② 對照講義:每個 §徽章都標了 ISLP 節號與講義頁碼,細節與完整推導請回講義與課本。 ③ 每節做 quiz:答錯就回到該節重讀,不要往下跳;錯的選項也寫了「錯在哪」。 ④ 最後翻關鍵詞彙卡自測術語,並用 REF 總覽當速查表。標「ESL 進階」的節是課堂沒細講的延伸,第一輪可略過。

CONTENTS · 內容目錄
PROLOGUE · 開場

把類別編成 1、2、3 會出什麼事 ISLP §4.2講義 04 · p.2–6

第 3 章的 y 是連續的數字。現在換一種問題:y 是類別——這個人會不會違約、 今天股市漲還是跌、這封信是不是垃圾信。這叫做分類(classification)。 本章用 ISLP 的 Default 資料(n = 10000,違約率 3.33%)與課程 lab 的 Smarket 資料當主線。

直覺會說:把類別編成數字,然後照第 3 章配線性迴歸就好。這條路在兩個地方會撞牆, 而且兩個都不是技術細節,是真的錯。

線性迴歸用在類別上的兩個致命傷 1. 多於兩類時,編碼本身就帶進了假設。 把「中風 = 1、藥物過量 = 2、癲癇 = 3」丟進迴歸,等於宣告這三種病有順序, 而且「中風到藥物過量」的距離等於「藥物過量到癲癇」的距離。換一個編碼順序,模型就變了。
2. 只有兩類時編碼沒問題,但輸出會跑出 [0, 1]。直線沒有上下界, 一定會有某些 x 讓配出來的「機率」是負的或大於 1。

第二點值得寫成式子。把 y 編成 0/1,然後配 $p(X) = \beta_0 + \beta_1 X$:

$$\hat p(\texttt{balance}) = -0.0752 + 0.00013 \times \texttt{balance}$$

這是 Default 資料上真的配出來的直線。把 balance 代 300 進去 得到 −0.036——負的機率。ISLP 圖 4.2 左圖畫的就是這件事。 右圖換成邏輯斯迴歸,整條曲線就乖乖待在 0 與 1 之間。

拖滑桿選一個 balance,右邊會同時給出兩個模型的預測機率。
1000
怎麼看這張圖 圖 4.2
橫軸是 balance,上下兩排短刻度是真實資料:上排(y = 1)是違約的人,下排(y = 0)是沒違約的人。紅線是線性迴歸的配適,綠線是邏輯斯迴歸。紅色陰影是線性版給出負機率的區段。
在這個 balance 上
balance1000
線性迴歸 p̂
邏輯斯 p̂
線性版合法嗎
兩個係數的來歷
邏輯斯的 β̂₀ = −10.6513、β̂₁ = 0.0055 就是 ISLP 表 4.1 的數字;線性版的 −0.0752 與 0.00013 是同一份資料上的最小平方解。線性版在 balance < 579 給負值;要到 balance ≈ 8279 才會超過 1,那已經在資料範圍外了——但「原則上一定會超出」這件事不變。

三類的編碼實驗:換個順序,模型就換了

下面同一批急診病人,只是換了編碼順序。線性迴歸看到的是「數字」, 所以它會認真去配這些完全人造的順序與間距:

編碼方式中風藥物過量癲癇這個編碼隱含的假設
編碼 A123三種病有順序,而且「中風→藥物過量」與「藥物過量→癲癇」的差距一樣大
編碼 B132順序變成中風 < 癲癇 < 藥物過量——同一份資料,配出完全不同的模型
編碼 C213又是另一個模型。哪一個才對?都不對。

真正的問題是:類別沒有順序也沒有距離,硬編成數字就是在硬塞結構進去。 正解是邏輯斯迴歸(兩類)與多元邏輯斯迴歸(多類),或者本章後半的生成式模型。

QUIZ · 為什麼不用迴歸

把二元反應編成 0/1 之後配線性迴歸,跟邏輯斯迴歸比,最根本的問題是什麼?

(A) 配出來的「機率」沒有上下界,一定有某些 x 給出小於 0 或大於 1 的值
(B) 係數沒辦法用最小平方法估計,必須改用最大似然法
(C) 二元反應違反常態誤差假設,所以 p 值與信賴區間都不能用
PART 01 · 邏輯斯迴歸

勝算、log-odds 與那條 S 形曲線 ISLP §4.3講義 04 · p.7–13

要讓輸出永遠落在 (0, 1),最常用的做法是邏輯斯函數(logistic function):

$$p(X) = \frac{e^{\beta_0 + \beta_1 X}}{1 + e^{\beta_0 + \beta_1 X}}$$

把它整理一下,會冒出這一章最重要的兩個名詞。先移項:

$$\underbrace{\frac{p(X)}{1 - p(X)}}_{\text{勝算 odds}} = e^{\beta_0 + \beta_1 X} \qquad\Longleftrightarrow\qquad \underbrace{\log\!\left(\frac{p(X)}{1-p(X)}\right)}_{\text{log-odds / logit}} = \beta_0 + \beta_1 X$$

勝算(odds)是「發生機率 ÷ 不發生機率」,範圍 (0, ∞); 取 log 之後範圍變成整個實數線,這個量叫 log-oddslogit。 所以邏輯斯迴歸真正線性的東西不是機率,是 log-odds。這句話決定了係數怎麼解讀。

三個一句話的重點 1. β₁ 是 log-odds 的斜率。x 增加一單位,log-odds 增加 β₁, 勝算乘上 e^β₁。機率增加多少則要看你站在哪裡——同樣的 β₁,在 p ≈ 0.5 附近影響最大。
2. 係數用最大似然法(maximum likelihood)估。找一組 β 讓「觀察到的這批 0/1 出現的機率」最大,沒有封閉解,要迭代。最小平方法只是常態假設下的最大似然特例。
3. z 統計量就是第 3 章的 t 統計量。β̂ 除以它的標準誤,大到某個程度就拒絕 β = 0。
推兩個滑桿看 S 曲線怎麼動;下面那條 log-odds 永遠是直線。
-1
0.8
目前的模型
β₀−1.00
β₁0.80
p(0)
p(1)
p = 0.5 的 x
勝算比 e^β₁
兩張圖要一起看
上圖是機率 p(x),S 形、有上下界、斜率一直在變;下圖是同一個模型的 log-odds,一條直線,斜率永遠是 β₁。虛線是勝算(odds),它 ≥ 0 而且指數上升,很快就衝出圖外——這正是「不要用勝算的變化量講故事」的原因。
β₁ 的符號與大小
β₁ > 0 曲線往右上、β₁ < 0 往右下;|β₁| 愈大轉折愈陡,β₁ = 0 就是一條水平線(x 完全沒用)。β₀ 只負責左右平移:p = 0.5 的位置在 x = −β₀/β₁。
觀念釐清
Q:邏輯斯迴歸的係數到底怎麼解讀?「balance 每多一元,違約機率增加 0.0055」對嗎?

不對,這是最常見的誤讀。0.0055 是 log-odds 的變化,不是機率的變化。正確的說法有兩種:

  • balance 每增加一元,違約的 log-odds 增加 0.0055」;
  • 「違約的 勝算乘上 $e^{0.0055} = 1.0055$,也就是多 0.55%」——注意是勝算多 0.55%,不是機率多 0.55 個百分點。

為什麼機率的變化講不出一個數字?因為它取決於你站在哪裡。用表 4.1 的係數算:balance = 1000 時 p̂ = 0.00576;balance = 2000 時 p̂ = 0.586。同樣是多 1000 元,在低 balance 區機率幾乎沒動,在 2000 附近卻是斷崖。S 曲線最陡的地方斜率是 β₁/4——這是唯一能快速估「機率變化」的地方,而且只在 p ≈ 0.5 附近成立。

順帶一提,這也是為什麼報告邏輯斯迴歸時大家愛講勝算比(odds ratio, $e^{\beta_1}$):它是一個不隨 x 改變的常數,講起來才不會錯。

講義完整實作:在 Smarket 上配邏輯斯迴歸

講義 04 · sm.GLM + Binomial(六個預測變數)
allvars = Smarket.columns.drop(['Today', 'Direction', 'Year']) design = MS(allvars) X = design.fit_transform(Smarket) y = Smarket.Direction == 'Up' glm = sm.GLM(y, X, family=sm.families.Binomial()) results = glm.fit() summarize(results)
預期輸出
             coef  std err      z  P>|z|
intercept -0.1260    0.241 -0.523  0.601
Lag1      -0.0731    0.050 -1.457  0.145
Lag2      -0.0423    0.050 -0.845  0.398
Lag3       0.0111    0.050  0.222  0.824
Lag4       0.0094    0.050  0.187  0.851
Lag5       0.0103    0.050  0.208  0.835
Volume     0.1354    0.158  0.855  0.392

family=sm.families.Binomial() 是關鍵——同一支 sm.GLM()換一個 family 就變成別的廣義線性模型(最後一節會回來講)。看那排 p 值:最小的是 Lag1 的 0.145,連 0.05 都沒到。用前幾天的報酬預測今天的漲跌,本來就不該有效。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 25
講義 04 · 從機率到標籤,再到混淆矩陣
probs = results.predict() probs[:10] labels = np.array(['Down']*1250) labels[probs>0.5] = "Up" confusion_table(labels, Smarket.Direction)
預期輸出
Truth      Down   Up
Predicted           
Down        145  141
Up          457  507

predict() 回傳的是機率,不是標籤;要自己挑一個閾值把它切成 UpDown。這裡用 0.5,正確率 (507 + 145) / 1250 = 52.2%——但這是訓練正確率,同一批資料又訓練又測試,一定太樂觀。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 31、33、35
講義 04 · 誠實一點:2005 年當測試集
X_train, X_test = X.loc[train], X.loc[~train] y_train, y_test = y.loc[train], y.loc[~train] glm_train = sm.GLM(y_train, X_train, family=sm.families.Binomial()) results = glm_train.fit() probs = results.predict(exog=X_test) labels = np.array(['Down']*252) labels[probs>0.5] = 'Up' confusion_table(labels, L_test)
預期輸出
Truth      Down  Up
Predicted          
Down         77  97
Up           34  44

用 2001–2004 訓練、2005 測試,正確率掉到 48.0%(錯誤率 52.0%,見儲存格 51)——比丟硬幣還差。訓練 52.2% 對測試 48.0%,這個落差就是第 5 章重抽樣要處理的主題。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 45、49、51
QUIZ · 係數的解讀

某邏輯斯迴歸模型裡 balance 的係數是 0.0055。下面哪個說法對?

(A) balance 每多一元,違約的勝算乘上 e^0.0055 ≈ 1.0055
(B) balance 每多一元,違約機率增加 0.0055
(C) balance 每多一元,違約機率乘上 1.0055
PART 02 · 多元與多類別

多個預測變數、多於兩類要怎麼做 ISLP §4.3.4–4.3.5講義 04 · p.11–13

把一個預測變數換成 p 個,式子幾乎不用改——線性部分變成 $\beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p$ 就好。真正值得停下來的是加了變數以後係數會變號這件事。

ISLP 的 Default 例子最經典。只用 student 一個變數配(表 4.2), student[Yes] 的係數是 +0.4049:學生比較容易違約。 可是把 balanceincome 一起放進去(表 4.3), 同一個 student[Yes] 變成 −0.6468:學生比較不容易違約。 同一份資料,符號翻過來了。

這叫混淆(confounding),不是矛盾 兩個係數都對,只是在回答不同的問題。
+0.4049 回答的是:「隨便抓一個學生跟一個非學生比,誰比較容易違約?」——學生。 因為學生的 balance 整體偏高。
−0.6468 回答的是:在 balance 相同 的前提下,學生跟非學生誰比較容易違約?」——非學生。
多元迴歸的每個係數都是「控制住其他變數之後」的效果。 ISLP 圖 4.3 左圖是前者、右圖(依 balance 分層的箱形圖)是後者。

用表 4.3 的係數算兩個具體的人(ISLP 式 4.8、4.9):balance = 1500、income = 40(千元)的 學生違約機率是 0.058,同樣條件的非學生是 0.105—— 差了將近一倍,而且方向跟「學生風險高」的直覺相反。

多於兩類:多元邏輯斯迴歸

兩類的邏輯斯迴歸沒辦法直接處理 K > 2。做法是挑一類當基準(baseline, 習慣挑第 K 類),然後對其餘每一類寫一條 log-odds:

$$\log\!\left(\frac{\Pr(Y = k \mid X = x)}{\Pr(Y = K \mid X = x)}\right) = \beta_{k0} + \beta_{k1} x_1 + \cdots + \beta_{kp} x_p, \qquad k = 1, \ldots, K-1$$

只要估 K − 1 組係數。另一種等價的寫法叫 softmax,它不挑基準、K 類完全對稱:

$$\Pr(Y = k \mid X = x) = \frac{e^{\beta_{k0} + \beta_{k1} x_1 + \cdots + \beta_{kp} x_p}} {\sum_{l=1}^{K} e^{\beta_{l0} + \beta_{l1} x_1 + \cdots + \beta_{lp} x_p}}$$
基準類寫法(式 4.10–4.12)softmax 寫法(式 4.13)
要估幾組係數K − 1 組K 組(多估一組,但有一組是多餘的)
係數怎麼解讀相對於基準類的 log-odds只有兩類之間的差 βk − βk′ 有意義
換基準/平移係數係數全變,但預測值不變全部係數同加一個常數,預測值不變
常見於統計軟體(statsmodels機器學習與神經網路(第 10 章會再遇到)
兩種寫法給的預測值完全一樣 ISLP §4.3.5 講得很清楚:換基準類、或用 softmax, 配適值、任兩類之間的 log-odds、以及其他關鍵輸出都不變,變的只有係數本身的數值。 所以看到別人的多類別邏輯斯係數時,第一件事是問「基準是哪一類」—— 不問清楚就沒辦法解讀。

講義完整實作:只留 Lag1Lag2

講義 04 · 砍掉沒用的變數再測一次
model = MS(['Lag1', 'Lag2']).fit(Smarket) X = model.transform(Smarket) X_train, X_test = X.loc[train], X.loc[~train] glm_train = sm.GLM(y_train, X_train, family=sm.families.Binomial()) results = glm_train.fit() probs = results.predict(exog=X_test) labels = np.array(['Down']*252) labels[probs>0.5] = 'Up' confusion_table(labels, L_test)
預期輸出
Truth      Down   Up
Predicted           
Down         35   35
Up           76  106

六個變數的 p 值都很醜,那就只留看起來最有希望的兩個。測試正確率從 48.0% 升到 (35 + 106) / 252 = 56.0%;而且在「模型說會漲」的日子裡,它有 106 / (106 + 76) = 58.2% 準(儲存格 55)。不過先別開心:那 252 天裡本來就有 141 天在漲,每天都猜漲也有 56%。整體正確率在這裡根本沒有資訊量——這是下面「閾值與混淆矩陣」那一節的引子。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 53、55
QUIZ · 混淆

只用 student 配時它的係數是正的,加入 balance 後變成負的。該怎麼理解?

(A) 兩個係數在回答不同的問題:後者是「在 balance 相同的前提下」的效果
(B) 其中一個模型配錯了,應該相信變數比較多的那一個
(C) 這是共線性造成的,把 student 或 balance 移掉一個就好
PART 03 · LDA

換個方向想:先建各類的機率模型再用 Bayes 定理 ISLP §4.4.1–4.4.3講義 04 · p.14–29

邏輯斯迴歸是直接建模 $\Pr(Y = k \mid X = x)$。這一節換一條路: 先分別建模「每一類裡面 X 長什麼樣子」,再用 Bayes 定理翻回去。 這類方法叫生成式模型(generative model)。

設 $\pi_k$ 是第 k 類的先驗機率(prior,隨便抓一筆資料屬於第 k 類的機率), $f_k(x) = \Pr(X = x \mid Y = k)$ 是第 k 類裡 X 的密度。Bayes 定理說:

$$\Pr(Y = k \mid X = x) = \frac{\pi_k f_k(x)}{\sum_{l=1}^{K} \pi_l f_l(x)}$$
為什麼還要別的方法?ISLP §4.4 開頭給了三個理由 1. 兩類分得很開的時候, 邏輯斯迴歸的係數會爆掉。完美可分時最大似然沒有有限解,係數往無限大跑。生成式模型不會。
2. n 小而各類內的 X 近似常態時,生成式模型更準。它用上了「常態」這個額外資訊。
3. K > 2 時很自然。不用挑基準類,每一類算一個 δk(x) 比大小就好。

LDA(linear discriminant analysis,線性判別分析)的假設是: 每一類的 X 是常態,平均數各類不同,但變異數共用。p = 1 時

$$f_k(x) = \frac{1}{\sqrt{2\pi}\,\sigma} \exp\!\left(-\frac{(x - \mu_k)^2}{2\sigma^2}\right)$$

代進 Bayes 定理、取 log、把跟 k 無關的項全部丟掉,剩下的就是判別函數 (discriminant function):

$$\delta_k(x) = x \cdot \frac{\mu_k}{\sigma^2} - \frac{\mu_k^2}{2\sigma^2} + \log \pi_k$$

把 x 分到 $\delta_k(x)$ 最大的那一類。δ 是 x 的一次式——這就是名字裡「線性」的來源。 兩類且 $\pi_1 = \pi_2$ 時,邊界剛好落在兩個平均數的中點 $(\mu_1 + \mu_2)/2$。

推 μ 與 σ 的滑桿看兩個常態密度怎麼動,虛線是決策邊界。
-1.25
1.25
1
1
0.5
目前的設定
模型LDA(共用 σ)
π₁ · π₂0.50 · 0.50
使用的 σ₁ · σ₂
決策邊界
中點 (μ₁+μ₂)/2
為什麼畫的是 πₖ·fₖ(x) 而不是 fₖ(x) 圖 4.4
因為要讓「兩條曲線的交點」正好就是決策邊界。Bayes 分類器比的是 πkfk(x) 的大小,所以把先驗乘進去畫,交點在哪裡、邊界就在哪裡,不用另外算。把 π₁ 拉大你會看到邊界往右跑——先驗大的那一類搶到更多地盤。
勾了「允許不同 σ」就變成 QDA
共用 σ 時 x² 的係數在相減時剛好抵消,只剩一次項,所以邊界是一個點。一旦 σ₁ ≠ σ₂,x² 的係數不再抵消,邊界變成二次方程式的根——可能有兩個點。這就是 QDA 與 LDA 的全部差別。

p > 1 時把常態換成多變量常態 $N(\mu_k, \Sigma)$, $\mu_k$ 是各類自己的平均向量、$\Sigma$ 是所有類共用的共變異數矩陣。 判別函數變成矩陣版:

$$\delta_k(x) = x^{\mathsf{T}} \Sigma^{-1} \mu_k - \frac{1}{2} \mu_k^{\mathsf{T}} \Sigma^{-1} \mu_k + \log \pi_k$$

還是 x 的一次式,所以邊界是超平面。K = 3 類時會有 3 條邊界線 (每一對類別一條),把平面切成三塊——ISLP 圖 4.6 畫的就是這個。

觀念釐清
Q:LDA 與邏輯斯迴歸都給線性邊界,那差在哪?什麼時候該選哪個?

差在係數是怎麼決定的。ISLP §4.5.1 把兩者都寫成同一個形式:

$\log\!\left(\frac{\Pr(Y=k|X=x)}{\Pr(Y=K|X=x)}\right) = a_k + \sum_{j=1}^{p} b_{kj}x_j$

兩邊的函數形式一模一樣,都是 x 的線性函數。差別是:LDA 的 $a_k, b_{kj}$ 是「假設各類 X 服從共用共變異數的常態」之後,由 $\hat\pi_k, \hat\mu_k, \hat\Sigma$ 算出來的;邏輯斯迴歸的係數則是直接讓條件似然最大——它對 X 的分佈完全不做假設。

所以取捨很清楚:

  • 各類內的 X 真的近似常態、n 又小:選 LDA。它多用了分佈資訊,變異較小。ISLP 情境 1 裡 LDA 表現最好。
  • X 明顯不常態(重尾、類別型變數、極端值多):選邏輯斯迴歸。ISLP 情境 3 把資料換成 t 分佈,邏輯斯就贏了 LDA。
  • 兩類分得很開:LDA(邏輯斯的最大似然會發散)。
  • 要做推論、要 p 值、要處理類別型預測變數:邏輯斯迴歸的工具鏈成熟得多。

實務上兩者的預測往往幾乎一樣——lab 儲存格 79 的 LDA 混淆矩陣(35/35/76/106)跟儲存格 53 的邏輯斯一個數字都沒差。這不是巧合,是式 4.32 保證的。

講義完整實作:LinearDiscriminantAnalysis

講義 04 · 配 LDA 並讀出估計的參數
X_train, X_test = [M.drop(columns=['intercept']) for M in [X_train, X_test]] lda.fit(X_train, L_train) lda.means_ lda.priors_
預期輸出
array([[ 0.04279022,  0.03389409],
       [-0.03954635, -0.03132544]])

means_ 是 μ̂₁、μ̂₂(每一列一類、每一欄一個變數):市場下跌的日子前兩天報酬偏正,上漲的日子前兩天偏負。priors_(儲存格 72)給 π̂ = [0.49198397, 0.50801603],就是訓練資料裡 Down/Up 的比例——LDA 的先驗預設就是這樣估的。注意 drop(columns=['intercept'])LDA 自己會處理截距。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 66、68、72
講義 04 · 線性判別方向與預測結果
lda.scalings_ lda_pred = lda.predict(X_test) confusion_table(lda_pred, L_test)
預期輸出
Truth      Down   Up
Predicted           
Down         35   35
Up           76  106

scalings_ = [[-0.642], [-0.514]] 是那條線性組合的方向:−0.64 × Lag1 − 0.51 × Lag2 很大就猜 Up、很小就猜 Down。混淆矩陣跟邏輯斯(儲存格 53)完全相同——兩個方法在這份資料上的線性邊界幾乎重疊。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 74、77、79
QUIZ · LDA 的假設

LDA(p > 1)到底假設了什麼?

(A) 每一類的 X 服從多變量常態,平均向量各類不同,但共變異數矩陣所有類共用
(B) 每一類的 X 服從多變量常態,平均與共變異數矩陣都各類共用
(C) X 的各個分量在每一類內互相獨立,且服從常態
要估的參數p = 2, K = 2 時p = 50, K = 2 時
先驗 πkK − 1 個11
平均 μkK × p 個4100
共用 Σ(LDA)p(p+1)/2 個31275
各自 Σk(QDA)K·p(p+1)/2 個62550
PART 04 · QDA 與 Naive Bayes

共變異數要不要共用?獨立假設又幫了什麼 ISLP §4.4.4–4.4.5講義 04 · p.30–37

LDA 逼所有類共用同一個 $\Sigma$。QDA(quadratic discriminant analysis) 放掉這一條:讓每一類有自己的 $\Sigma_k$。判別函數立刻多出二次項:

$$\delta_k(x) = -\frac{1}{2}(x - \mu_k)^{\mathsf{T}} \Sigma_k^{-1} (x - \mu_k) - \frac{1}{2} \log |\Sigma_k| + \log \pi_k$$

展開之後會出現 $x^{\mathsf{T}} \Sigma_k^{-1} x$。因為 $\Sigma_k$ 隨 k 不同, 這一項在兩類相減時不會抵消,所以邊界是 x 的二次曲面——名字裡的「二次」就是這麼來的。

要不要共用 Σ,本質是偏差–變異取捨 參數量:LDA 只估一個 Σ, 要 p(p+1)/2 個數;QDA 每類一個,要 K·p(p+1)/2 個。p = 50、K = 2 時是 1275 對 2550
所以:訓練資料少 → LDA(降變異優先);訓練資料很多, 或「共用共變異數」明顯站不住腳 → QDA。
ISLP 圖 4.9 兩張圖說得最白:左圖真實邊界是線性的,LDA 贏(QDA 白付了變異的代價); 右圖兩類的相關係數一個 +0.7 一個 −0.7,真實邊界是彎的,QDA 贏。
切換共用/各自共變異數,看邊界從直線變成二次曲線。
0.7
0.7
1.4
目前的設定
模式LDA(共用 Σ)
ρ₁(藍類)0.70
ρ₂(紅類)0.70
邊界的形狀
訓練錯誤(60 點)
怎麼看這張圖 圖 4.9
兩個橢圓是各類含 95% 機率的等高線,點是各類 30 筆抽樣。紅線是目前模式的決策邊界,灰虛線永遠是 LDA 的線性邊界,留在那裡當對照。把 ρ₁ 與 ρ₂ 調成一樣,紅線會壓在灰線上——因為 Σ₁ = Σ₂ 時 QDA 退化成 LDA。
為什麼 QDA 的邊界會是圓錐曲線
$\delta_1(x) - \delta_2(x) = 0$ 是 x 的二次式,所以邊界是雙曲線、橢圓或拋物線之一(退化時是直線)。把 ρ₁ 與 ρ₂ 拉到正負兩端,你會看到邊界彎成兩支——那不是 bug,二次曲線本來就可以有兩支。

Naive Bayes:不猜分佈的形狀,改猜「互相獨立」

LDA 與 QDA 都在猜 $f_k(x)$ 的形狀(多變量常態)。 Naive Bayes 換一個方向:形狀隨便你,但假設在每一類裡面,p 個預測變數互相獨立

$$f_k(x) = f_{k1}(x_1) \times f_{k2}(x_2) \times \cdots \times f_{kp}(x_p)$$

這個假設幾乎一定是錯的——我們也知道它是錯的。但它把「估一個 p 維密度」這件難事 換成「估 p 個一維密度」,用一點偏差換掉一大堆變異。 p 大、n 小的時候這筆交易非常划算。

對 fk(x) 的假設邊界形狀參數量(p 大時)什麼時候最強
LDA多變量常態,Σ 共用線性真實邊界線性、各類近常態、n 小
QDA多變量常態,Σk 各自二次多(K·p(p+1)/2)邊界明顯彎曲、n 大
Naive Bayes類內獨立,一維密度任意加性(可彎,但沒有交互項)很少(K·2p)p 大 n 小、變數近似獨立
邏輯斯迴歸不假設(直接建模後驗)線性少((K−1)(p+1))X 不常態、要做推論
KNN完全不假設任意—(存全部資料)邊界極度彎曲、n ≫ p

講義完整實作:QDA 與 Naive Bayes

講義 04 · QuadraticDiscriminantAnalysis
qda = QDA(store_covariance=True) qda.fit(X_train, L_train) qda.covariance_[0] qda_pred = qda.predict(X_test) confusion_table(qda_pred, L_test)
預期輸出
Truth      Down   Up
Predicted           
Down         30   20
Up           81  121

covariance_[0](儲存格 93)是第一類自己的 Σ̂₁ = [[1.5066, -0.0392], [-0.0392, 1.5356]]——QDA 每類一個,這是它跟 LDA 的分水嶺。QDA 的測試正確率 0.5992(儲存格 97/98),比 LDA 的 0.560 高。lab 儲存格 99 提醒:股市資料上多出這幾個百分點,先在更大的測試集上驗證再說。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 89、93、95
講義 04 · GaussianNB
NB = GaussianNB() NB.fit(X_train, L_train) NB.var_ nb_labels = NB.predict(X_test) confusion_table(nb_labels, L_test) print('Accuracy using gnb is ',accuracy_score(L_test,nb_labels))
預期輸出
Truth      Down   Up
Predicted           
Down         29   20
Up           82  121

theta_(儲存格 108)跟 lda.means_ 一模一樣——平均數的估法沒差。差別在 var_:Naive Bayes 每類每變數各估一個變異數、而且沒有共變異數(等於把 Σk 限制成對角矩陣)。正確率 0.5952(儲存格 117),比 QDA 的 0.5992 差一點、比 LDA 的 0.560 好。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 102、110、116、117
QUIZ · 該用 LDA 還是 QDA

只有 n = 40 筆訓練資料、p = 2,而且你有理由相信真實的決策邊界是線性的。該選哪個?

(A) LDA。真實邊界既然是線性的,QDA 多出來的彈性只會帶來變異、換不到偏差的減少
(B) QDA。它比較有彈性,線性邊界是二次邊界的特例,所以不會更差
(C) 兩個一樣,因為 p = 2 時共變異數矩陣只有 3 個參數,差別可以忽略
PART 05 · 閾值、混淆矩陣與 ROC

0.5 不是天經地義:把閾值當旋鈕 ISLP §4.4.2講義 04 · p.20–23

前面所有方法的最後一步都是同一句話:「後驗機率大於 0.5 就判成正類」。 這個 0.5 不是天上掉下來的,它來自 Bayes 分類器——而 Bayes 分類器最小化的是「總」錯誤率, 它完全不管兩種錯誤誰比較痛。

ISLP 的 Default 例子把這件事講得很殘忍。LDA 在 10000 筆訓練資料上的錯誤率是 2.75%,聽起來很棒。但是:

兩種錯誤有名字,而且權重通常不一樣 把「違約 / 有病 / 是垃圾信」當成正類(+):
FP(假陽性)=其實沒事,被你判成有事。
FN(假陰性)=其實有事,被你放過。
靈敏度(sensitivity, recall)= TP/(TP+FN)=真的有事的人裡你抓到幾成。
特異度(specificity)= TN/(TN+FP)=真的沒事的人裡你放對幾成。
精確率(precision)= TP/(TP+FP)=你喊「有事」的人裡真的有事的比例。

閾值就是調節這兩種錯誤的旋鈕。把 0.5 降到 0.2:

$$\Pr(\texttt{default} = \text{Yes} \mid X = x) > 0.2 \;\Longrightarrow\; \text{判為違約}$$

ISLP 表 4.5 的結果是:漏掉的違約戶從 252 掉到 138(靈敏度從 24.3% 升到 58.6%), 代價是誤報從 23 升到 235,總錯誤率從 2.75% 微升到 3.73%。 對信用卡公司,這是划算的交易。自己動一下滑桿看看:

真實:不違約真實:違約合計
預測:不違約96442529896
預測:違約2381104
合計966733310000

綠底=猜對(TN/TP)· 淺紅=假陽 FP(誤報)· 深紅=假陰 FN(漏掉的違約戶)

圖表需要連網載入 Chart.js。此圖的重點:LDA 在 Default 上的 ROC 曲線緊貼左上角,AUC = 0.95;把閾值從 0.5 調到 0.2,工作點沿曲線往右上移動——靈敏度換來假陽率。
拖動閾值:混淆矩陣、四個指標與 ROC 上的紅點會同步重算。
0.5
目前的閾值下
閾值0.500
預測會違約的人數104
靈敏度(抓到幾成違約戶)24.3%
特異度99.8%
精確率77.9%
總錯誤率2.75%
三個一定要記住的數字 表 4.4/4.5
閾值 0.5:錯誤率 2.75%,但漏掉 252 / 333 = 75.7% 的違約戶。
閾值 0.2:錯誤率 3.73%,只漏掉 138 個(41.4%)。
一律猜不違約:錯誤率 3.33%,漏掉全部 333 個。
這三行完整說明了「準確率不是唯一指標」。
ROC 與 AUC
ROC 曲線把所有閾值的(假陽率, 真陽率)畫成一條線,所以它描述的是分類器本身,不是某一個閾值。AUC = 0.95(ISLP §4.4.2);隨機猜是 0.5,完美是 1。紅點是你現在選的閾值在曲線上的位置。
觀念釐清
Q:類別不平衡時,「準確率 99%」為什麼可能一文不值?該看什麼?

因為準確率的分母被多數類綁死了。假設 1000 個人裡有 10 個得病,你寫一支 return '沒病' 的程式,準確率就是 99%——它一個病人都沒抓到。

這個「什麼都不做」的基準線有名字,叫 虛無率(null rate)。ISLP 用 Default 示範:虛無率 3.33%,LDA 的 2.75% 只是小勝。lab 的 Caravan 例子更誇張——只有 6% 的人買保險,KNN 的錯誤率 11.1% 比「全猜不買」的 6.7% 還差(儲存格 145)。

該看什麼?先問「哪一種錯誤比較貴」,再挑指標:

  • 怕漏掉正類(癌症篩檢、詐欺偵測):看靈敏度/recall,並且把閾值往下調。
  • 怕誤報(垃圾信過濾、發送行銷成本):看精確率,閾值往上調。
  • 要一個不挑閾值的總結:看 AUC,或在極不平衡時看 PR 曲線下面積。
  • 兩邊都要顧:F1(精確率與 recall 的調和平均),或平衡準確率。

最後一句:永遠把虛無率一起報出來。沒有基準線的準確率是沒有資訊的數字。

Q:TP / FP / FN / TN 跟那三個比率的關係是什麼?為什麼醫學篩檢跟垃圾信過濾在意的方向剛好相反?

先把四格與三個比率的分母釘死,這是最容易搞混的地方:

  • 靈敏度 = TP/(TP+FN):分母是真實的正類總數(縱向看)。
  • 特異度 = TN/(TN+FP):分母是真實的負類總數(縱向看)。
  • 精確率 = TP/(TP+FP):分母是你預測為正的總數(橫向看)。

ISLP 表 4.7 還給了對照的別名:假陽率就是型一錯誤、真陽率就是檢定力(power)、精確率就是正預測值(PPV)。同一個表格,不同學科各叫一套名字。

方向相反是因為兩種錯誤的成本結構不同。

  • 癌症篩檢:漏掉一個病人(FN)可能致命;誤報(FP)的代價是再做一次檢查。所以把閾值調低、犧牲特異度換高靈敏度。篩檢工具本來就設計成「寧可多抓」。
  • 垃圾信過濾:把重要信件丟進垃圾桶(FP,如果正類=垃圾信)代價很高;漏掉一封垃圾信只是煩。所以閾值調高、追求高精確率

lab 的 Caravan 是第三種情況:業務員拜訪一個人有成本,所以在意的是「被我挑中的人裡有幾成真的會買」——那是精確率。把閾值從 0.5 降到 0.25,挑出 29 個人、9 個真的買,精確率 31%,是隨機猜(6%)的五倍(儲存格 158、159)。

講義完整實作:從混淆矩陣算出四個指標

講義 04 · 手動算 accuracy / sensitivity / precision / FPR
conf_mat = confusion_matrix(L_test, labels) # True, predicted print(conf_mat) TP = conf_mat[1,1] TN = conf_mat[0,0] FP = conf_mat[0,1] FN = conf_mat[1,0] # print("Accuracy: ", conf_mat.diagonal().sum()/conf_mat.sum() ) print("Accuracy: ", (TP+TN) / (TP+TN+FP+FN) ) print("Sensitivity: ", TP / (FN + TP) ) print("Precision: ", TP / (FP + TP) ) print("False Positive Rate: ", FP / (FP + TN) )
預期輸出
Accuracy:  0.5595238095238095
Sensitivity:  0.75177304964539
Precision:  0.5824175824175825
False Positive Rate:  0.6846846846846847

注意 confusion_matrix(真實, 預測) 與 ISLP 的 confusion_table(預測, 真實) 參數順序相反、矩陣也是轉置的。看到別人的混淆矩陣第一件事就是確認哪一軸是真實值,否則靈敏度與精確率會對調。這裡靈敏度 0.752 很高,但假陽率也高達 0.685——模型幾乎什麼都猜 Up。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 57、58
講義 04 · Caravan:把閾值從 0.5 降到 0.25
logit = LogisticRegression(C=1e10, solver='liblinear') logit.fit(X_train, y_train) logit_pred = logit.predict_proba(X_test) logit_labels = np.where(logit_pred[:,1] > .5, 'Yes', 'No') confusion_table(logit_labels, y_test) logit_labels = np.where(logit_pred[:,1]>0.25, 'Yes', 'No') confusion_table(logit_labels, y_test) 9/(20+9)
預期輸出
Truth       No  Yes
Predicted          
No         913   58
Yes         20    9

閾值 0.5 時只有 2 個人被預測會買保險,而且兩個都猜錯(儲存格 156 的輸出是 931/67/2/0)——模型等於沒有產出。降到 0.25 之後挑出 29 個人、其中 9 個真的買了,精確率 9/(20+9) = 31.0%(儲存格 159),是隨機猜 6% 的五倍。同一個模型、同一組係數,只換了一個閾值。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 156、158、159
QUIZ · 閾值

把分類閾值從 0.5 降到 0.2,下面哪一組變化一定會發生?

(A) 靈敏度上升(或持平)、特異度下降(或持平);總錯誤率不保證變好
(B) 靈敏度與精確率都上升,因為抓到的正類變多了
(C) 總錯誤率一定下降,因為模型抓到更多真正的正類
名稱定義別名分母是誰
假陽率 FPRFP / N型一錯誤、1 − 特異度真實的負類
真陽率 TPRTP / P靈敏度、recall、檢定力、1 − 型二錯誤真實的正類
正預測值 PPVTP / P*精確率、1 − 錯誤發現比例預測為正的
負預測值 NPVTN / N*預測為負的

對照 ISLP 表 4.6/4.7。 N、P 是真實的負/正類總數;N*、P* 是被預測為負/正的總數。

PART 06 · 方法的解析比較

五種方法在什麼假設下等價、什麼時候會分家 ISLP §4.5講義 04 · p.38–48

五個方法看起來各說各話,其實把它們統一寫成「相對於第 K 類的 log-odds」之後, 差別就一目了然了。ISLP §4.5.1 做的就是這件事:

$$\text{LDA:}\;\log\!\left(\frac{\Pr(Y = k \mid x)}{\Pr(Y = K \mid x)}\right) = a_k + \sum_{j=1}^{p} b_{kj} x_j$$ $$\text{QDA:}\;\log\!\left(\frac{\Pr(Y = k \mid x)}{\Pr(Y = K \mid x)}\right) = a_k + \sum_{j=1}^{p} b_{kj} x_j + \sum_{j=1}^{p}\sum_{l=1}^{p} c_{kjl} x_j x_l$$ $$\text{Naive Bayes:}\;\log\!\left(\frac{\Pr(Y = k \mid x)}{\Pr(Y = K \mid x)}\right) = a_k + \sum_{j=1}^{p} g_{kj}(x_j)$$

三行擺在一起,四個結論就掉出來了:

四個等價關係(ISLP §4.5.1) 1. LDA 是 QDA 的特例(所有 ckjl = 0)。 不意外,LDA 就是加了 Σ₁ = ⋯ = ΣK 的 QDA。
2. 任何線性邊界的分類器都是 Naive Bayes 的特例(取 gkj(xj) = bkjxj)。 所以 LDA 是 Naive Bayes 的特例——這件事從兩者的假設完全看不出來。
3. 用常態密度的 Naive Bayes 是「Σ 被限制成對角矩陣」的 LDA。
4. QDA 與 Naive Bayes 誰都不是誰的特例。Naive Bayes 的 gkj 可以是任意函數(更彈性), 但它是純加性的、永遠沒有 xjxl 交互項;QDA 有交互項但被鎖在二次式裡。

邏輯斯迴歸呢?多元邏輯斯迴歸的形式跟 LDA 的第一行字面上完全一樣。 差別只在係數怎麼來:LDA 從常態假設推出來,邏輯斯迴歸直接最大化條件似然。 所以「X 近似常態 → LDA 較好,否則 → 邏輯斯較好」。

KNN 是唯一完全在框架外的:它不寫任何 log-odds 的式子,直接看鄰居投票。 代價是(a)需要 n ≫ p,(b)不告訴你哪個變數重要。

圖表需要連網載入 Chart.js。此圖的重點:在 Default 上,邏輯斯/LDA/QDA 的 ROC 幾乎完全重疊(AUC 0.9495–0.9496),Naive Bayes 略低(0.9447)——理論上的等價關係在實測上真的看得到。
四個方法在同一份 Default 資料、同一組預測變數上的 ROC 疊圖。
AUC(Default,balance + student)
邏輯斯迴歸
LDA
QDA
Naive Bayes
隨機猜0.5000
為什麼四條幾乎疊在一起 圖 4.8
因為這份資料只有兩個預測變數、n = 10000,而 balancedefault 的訊號非常強。訊號夠強時,模型假設的差別就淹沒在訊號裡。式 4.32 又保證 LDA 與邏輯斯的邊界形式相同,兩條當然重疊。
不要因此結論「方法都差不多」
ISLP 圖 4.11/4.12 用六個模擬情境示範:換掉資料的產生方式,排名就會重排。「哪個方法好」是資料的性質,不是方法的性質。按「放大左上角」看四條線在高靈敏度區真正分開的地方。

選方法的六個情境

下面六個情境改寫自 ISLP §4.5.2 的模擬與 lab 的實際資料。 先自己想再點——每個選項都會告訴你它為什麼合理、又為什麼不是最好的答案。

情境 1 / 6

按下面任一個方法看看拆解。

讀完情境後點一個方法,右邊會記你答對幾題。
進度
目前情境1 / 6
答對0
已作答0 / 6
這一組要練的判斷
1. 邊界是直的還是彎的?直的 → LDA/邏輯斯;彎的 → QDA/Naive Bayes/KNN。
2. n 相對 p 夠不夠大?不夠 → 選參數少的。
3. 各類內的 X 像不像常態?不像 → 邏輯斯或 Naive Bayes。
4. 變數之間獨立嗎?近似獨立 → Naive Bayes 大賺;明顯相關 → 它會很慘。
沒有萬用解
ISLP §4.5.2 的結論:六個情境沒有任何一個方法全勝。這也是第 5 章交叉驗證存在的理由——與其猜哪個方法適合,不如量出來。

講義完整實作:KNN,唯一的無母數方法

講義 04 · KNeighborsClassifier(n_neighbors=1)
knn1 = KNeighborsClassifier(n_neighbors=1) X_train, X_test = [np.asarray(X) for X in [X_train, X_test]] knn1.fit(X_train, L_train) knn1_pred = knn1.predict(X_test) confusion_table(knn1_pred, L_test) (83+43)/252, np.mean(knn1_pred == L_test)
預期輸出
Truth      Down  Up
Predicted          
Down         43  58
Up           68  83

K = 1 的測試正確率剛好 0.500(儲存格 124)——完全等於丟硬幣。K = 3 升到 0.532(儲存格 127),再加大也沒再改善。lab 儲存格 129 的結論:在 Smarket 上 QDA 最好。K = 1 太彈性,在 n 只有約 1000、訊號又極弱的資料上是純粹的變異。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 122、124
ISLP 情境(§4.5.2)資料怎麼產生誰贏為什麼
情境 1各類內兩變數不相關的常態,每類 20 筆LDA、邏輯斯邊界真的是線性的,KNN 白付變異
情境 2同上,但類內相關 −0.5LDA、邏輯斯Naive Bayes 崩掉——獨立假設被違反
情境 3類內強負相關的 t 分佈,每類 50 筆邏輯斯邊界仍線性但不常態,LDA/QDA 吃虧
情境 4兩類相關係數 +0.5 與 −0.5 的常態QDA真實邊界二次,正好是 QDA 的假設
情境 5不相關常態,反應由複雜非線性函數生成KNN-CV邊界很彎;KNN-1 最差——平滑度沒選對
情境 6各類對角但不同的 Σ,每類只有 6 筆Naive Bayes假設正好成立,而 n 太小連 QDA 都撐不住
QUIZ · 解析比較

ISLP §4.5.1 說「LDA 是 Naive Bayes 的特例」。這句話怎麼可能成立?LDA 明明允許變數相關、Naive Bayes 明明假設獨立。

(A) 因為兩者的 log-odds 都能寫成 a_k + Σ_j g_kj(x_j);LDA 對應 g_kj 取線性函數的情況
(B) 因為當 Σ 是對角矩陣時,LDA 的變數就真的獨立了,兩者於是相同
(C) 這句話只在 p = 1 時成立,p ≥ 2 時兩者沒有包含關係
PART 07 · Poisson 迴歸與 GLM

計數資料:把線性模型推廣成 GLM ISLP §4.6講義 04 · p.49–56ESL 進階

這一節是課堂沒細講的延伸(講義 04 · p.49–56 對應 ISLP §4.6)。 它把「線性迴歸/邏輯斯迴歸」收進 GLM 這個大框架裡,觀念很漂亮但不影響前面各節的理解, 第一輪可以先跳過,之後回來看。

前面兩種 y:連續的(第 3 章)與類別的(本章)。還有第三種常見的 y——計數。 ISLP 用 Bikeshare(華盛頓特區每小時的單車租借數,n = 8645)示範。

直接對計數配線性迴歸會踩三個坑:

Poisson 分佈天生就長成計數的樣子:

$$\Pr(Y = k) = \frac{e^{-\lambda} \lambda^k}{k!}, \qquad k = 0, 1, 2, \ldots \qquad\text{而且}\quad \mathbb{E}(Y) = \mathrm{Var}(Y) = \lambda$$

Poisson 迴歸讓 λ 隨預測變數而變,而且是對 log λ 配線性式:

$$\log \lambda(X_1, \ldots, X_p) = \beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p \qquad\Longleftrightarrow\qquad \lambda = e^{\beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p}$$

取 log 有兩個好處:λ 永遠是正的(不會再預測出負的租借數), 而且「E(Y) = Var(Y) = λ」自動把平均–變異關係包進模型。

係數要用乘法解讀 因為線性的是 log λ,所以 Xj 增加一單位讓 λ 乘上 e^βⱼ,不是加上 βⱼ。
ISLP 表 4.11 的例子:weathersit[cloudy/misty] 的係數是 −0.08, e−0.08 = 0.923——陰天的平均租借量只有晴天的 92.3%
這跟邏輯斯迴歸的「勝算乘上 e^β」是同一個模式:連結函數取了 log,解讀就從加法變乘法。

GLM:把三個模型收進同一個框架

線性迴歸、邏輯斯迴歸、Poisson 迴歸做的事其實一樣: 假設 y 屬於某個分佈族,然後用連結函數(link function)η 把 y 的期望值 轉換成預測變數的線性組合:

$$\eta\big(\mathbb{E}(Y \mid X_1, \ldots, X_p)\big) = \beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p$$
假設 y 的分佈連結函數 η(μ)μ 的範圍statsmodels 的 family
線性迴歸常態(Gaussian)μ(恆等)整個實數線sm.families.Gaussian()
邏輯斯迴歸Bernoullilog(μ / (1 − μ))(logit)(0, 1)sm.families.Binomial()
Poisson 迴歸Poissonlog μ(0, ∞)sm.families.Poisson()
Gamma 迴歸Gamma通常是 −1/μ 或 log μ(0, ∞)sm.families.Gamma()

常態、Bernoulli、Poisson、Gamma、負二項都屬於指數族(exponential family)。 任何「挑一個指數族成員 + 挑一個連結函數」的迴歸都叫 GLM。 所以 lab 裡從頭到尾只用了一支 sm.GLM()——換 family 就換模型。

講義完整實作:一支 sm.GLM() 打三種模型

講義 04 · Poisson 迴歸(Bikeshare)
M_pois = sm.GLM(Y, X2, family=sm.families.Poisson()).fit() S_pois = summarize(M_pois) coef_month = S_pois[S_pois.index.str.contains('mnth')]['coef'] coef_month = pd.concat([coef_month, pd.Series([-coef_month.sum()], index=['mnth[Dec]'])]) coef_hr = S_pois[S_pois.index.str.contains('hr')]['coef'] coef_hr = pd.concat([coef_hr, pd.Series([-coef_hr.sum()], index=['hr[23]'])])

跟前面配邏輯斯迴歸的那一行比一比:family=sm.families.Binomial() 換成 family=sm.families.Poisson(),其他一個字都沒改。係數的補齊步驟(mnth[Dec] 取其餘月份的負和)是因為用了 contrast('mnth', 'sum') 這種和為零的編碼,係數要讀成「相對於年平均」。對照 ISLP 表 4.11 與圖 4.15。這一格 lab 沒有存下輸出,數字請看課本表 4.11:intercept 4.12、temp 0.79、weathersit[light rain/snow] −0.58。

來源:Ch04-classification-lab-zh.ipynb · 儲存格 188、190
Poisson 迴歸的一個坑:過度分散 Poisson 模型硬性要求 Var(Y) = E(Y)。 真實資料常常變異遠大於平均,這叫過度分散(overdispersion)。 ISLP 的腳註坦承 Bikeshare 就有這個問題, 導致表 4.11 的 z 值被高估(看起來比實際更顯著)。
補救方式是 quasi-Poisson 或負二項迴歸——超出本章範圍,但知道有這個坑很重要: 係數還可信,標準誤與 p 值不可信。
QUIZ · Poisson 迴歸

Poisson 迴歸配的是 log λ 而不是 λ 本身。最主要的理由是什麼?

(A) 取 log 之後 λ = e^(線性式) 永遠是正的,計數的平均值不會被預測成負數
(B) 因為 log 轉換會讓計數資料變成常態分佈,這樣才能用最小平方法
(C) 因為 log 是唯一能讓 Poisson 迴歸有封閉解的連結函數
EXERCISES · 練習

動手驗證:ISLP 第 4 章精選題 ISLP §4.8 習題

下面幾題取自 ISLP §4.8 的課後習題,題號都對得回課本。先自己想過再點選項; 每個選項——包含錯的——都寫了為什麼。想看完整解答再對照下面3個站。

EXERCISE 1 · ISLP 4.8 第 6 題(a)

某邏輯斯迴歸用 X₁ = 讀書時數、X₂ = 大學 GPA 預測「這科拿 A」,估到 β̂₀ = −6、β̂₁ = 0.05、β̂₂ = 1。一個讀 40 小時、GPA 3.5 的學生拿到 A 的機率是多少?

(A) 約 0.378
(B) 約 −0.5
(C) 約 0.622
EXERCISE 2 · ISLP 4.8 第 9 題

這一題只考勝算。(a)違約勝算是 0.37 的人,實際違約的比例是多少?(b)某人違約機率 16%,她的勝算是多少?

(A) (a) 約 0.27 (b) 約 0.19
(B) (a) 0.37 (b) 0.16
(C) (a) 約 0.63 (b) 約 5.25
EXERCISE 3 · ISLP 4.8 第 8 題

同一份資料切成一半訓練一半測試。邏輯斯迴歸的訓練錯誤率 20%、測試錯誤率 30%;1-NN 的「訓練與測試平均」錯誤率是 18%。該選哪一個?

(A) 邏輯斯迴歸。1-NN 的訓練錯誤率是 0,所以它的測試錯誤率約 36%,比 30% 差
(B) 1-NN。它的平均錯誤率 18% 比邏輯斯的兩個數字都低
(C) 資訊不足,因為題目沒有分別給 1-NN 的訓練與測試錯誤率
EXERCISE 4 · ISLP 4.8 第 5 題(a)(d)

(a)Bayes 決策邊界是線性時,LDA 與 QDA 誰在訓練集上比較好?測試集呢?(d)「就算邊界是線性的,QDA 彈性夠大也配得下,所以測試誤差還是會比較好」——對嗎?

(A) 訓練集 QDA 通常較好,測試集 LDA 較好;(d) 是錯的
(B) 兩個集合都是 LDA 較好,因為真實邊界是線性的
(C) 兩個集合都是 QDA 較好,因為線性邊界是二次邊界的特例
REFERENCE · 總覽

分類速查表 ISLP Ch.4

考前把這一頁掃過去就好。

五種方法對照

方法在建模什麼邊界形狀關鍵假設參數量什麼時候選它
邏輯斯迴歸後驗 Pr(Y|X)(判別式)線性log-odds 對 x 線性(K−1)(p+1)兩類的預設選擇、要推論、X 不常態
LDA類條件 fk(x)(生成式)線性常態 + Σ 共用Kp + p(p+1)/2各類近常態、n 小、兩類分得很開
QDA類條件 fk(x)二次常態 + Σk 各自Kp + K·p(p+1)/2邊界明顯彎曲、n 大
Naive Bayes類條件 fk(x)加性(無交互項)類內各變數獨立約 2Kpp 大 n 小、變數近似獨立
KNN什麼都不建模任意無(無母數)存全部資料邊界極度彎曲且 n ≫ p

Default 資料上的實測數字(可以直接對回課本)

TNFPFNTP錯誤率靈敏度出處
LDA,閾值 0.5964423252812.75%24.3%ISLP 表 4.4
LDA,閾值 0.294322351381953.73%58.6%ISLP 表 4.5
Naive Bayes,閾值 0.5962146244892.90%26.7%ISLP 表 4.8
Naive Bayes,閾值 0.293393281302034.58%61.0%ISLP 表 4.9
一律預測「不違約」9667033303.33%0.0%虛無率

本頁 w04thr 元件的 2×2 表在閾值 0.5 與 0.2 會逐格重現前兩列(我們用 scikit-learnLinearDiscriminantAnalysisbalance + student 上重算, 數字與課本相同)。ISLP 表 4.8/4.9 的 Naive Bayes 實作與 GaussianNBstudent 的處理略有不同,所以本頁烘焙的 NB 混淆矩陣是 9618/49/238/95。

Smarket 上五個方法的測試正確率(lab 的實跑結果)

方法測試正確率混淆矩陣(預測 × 真實)lab 儲存格
邏輯斯(6 個變數)0.480177/97/34/4449、51
邏輯斯(Lag1 + Lag2)0.559535/35/76/10653、55
LDA(Lag1 + Lag2)0.559535/35/76/10679
QDA(Lag1 + Lag2)0.599230/20/81/12195、97
Naive Bayes(Lag1 + Lag2)0.595229/20/82/121116、117
KNN,K = 10.500043/58/68/83122、124
KNN,K = 30.5317127
一律猜 Up(虛無率)0.5595

注意最後一列:「每天都猜漲」就有 55.95%。 邏輯斯與 LDA 剛好打成平手、沒有贏過它;只有 QDA 與 Naive Bayes 真的多了一點資訊。

公式速查

名稱式子備註
邏輯斯函數$p(X) = \dfrac{e^{\beta_0+\beta_1X}}{1+e^{\beta_0+\beta_1X}}$式 4.2
logit / log-odds$\log\dfrac{p(X)}{1-p(X)} = \beta_0+\beta_1X$式 4.4,線性的是這個
多元邏輯斯$\log\dfrac{\Pr(Y=k|x)}{\Pr(Y=K|x)} = \beta_{k0}+\sum_j\beta_{kj}x_j$式 4.12
softmax$\Pr(Y=k|x) = \dfrac{e^{\beta_{k0}+\sum_j\beta_{kj}x_j}}{\sum_l e^{\beta_{l0}+\sum_j\beta_{lj}x_j}}$式 4.13,等價寫法
Bayes 定理$\Pr(Y=k|X=x) = \dfrac{\pi_k f_k(x)}{\sum_l \pi_l f_l(x)}$式 4.15
LDA 判別函數(p = 1)$\delta_k(x) = x\dfrac{\mu_k}{\sigma^2} - \dfrac{\mu_k^2}{2\sigma^2} + \log\pi_k$式 4.18,x 的一次式
LDA 邊界(K = 2, 等先驗)$x = \dfrac{\mu_1+\mu_2}{2}$式 4.19,兩平均的中點
LDA 判別函數(p > 1)$\delta_k(x) = x^{\mathsf{T}}\Sigma^{-1}\mu_k - \tfrac12\mu_k^{\mathsf{T}}\Sigma^{-1}\mu_k + \log\pi_k$式 4.24
QDA 判別函數$\delta_k(x) = -\tfrac12(x-\mu_k)^{\mathsf{T}}\Sigma_k^{-1}(x-\mu_k) - \tfrac12\log|\Sigma_k| + \log\pi_k$式 4.28,x 的二次式
Naive Bayes$f_k(x) = \prod_{j=1}^{p} f_{kj}(x_j)$式 4.29,類內獨立
Poisson 迴歸$\log\lambda(X) = \beta_0+\beta_1X_1+\cdots+\beta_pX_p$式 4.36
GLM 連結函數$\eta\big(\mathbb{E}(Y|X)\big) = \beta_0+\beta_1X_1+\cdots+\beta_pX_p$式 4.42
三個一定要記住的觀念 1. 邏輯斯迴歸線性的是 log-odds,不是機率。 係數 β₁ 要讀成「勝算乘上 e^β₁」;同樣的 β₁ 對機率的影響隨位置而變。
2. 生成式(LDA/QDA/Naive Bayes)與判別式(邏輯斯)的差別只在係數怎麼來。 LDA 的邊界形式跟邏輯斯字面上相同(式 4.32);差別是前者從常態假設推、後者最大化條件似然。 共用 Σ 給線性邊界、各自 Σk 給二次邊界、類內獨立給加性邊界。
3. 0.5 這個閾值只是「總錯誤率最小」的產物。 類別不平衡或兩種錯誤成本不同時,先問「哪種錯誤比較貴」,再調閾值, 並且永遠把虛無率與混淆矩陣一起報出來。

本頁「預期輸出」逐字取自課程 lab notebook(老師在課程環境實跑);圖表用的烘焙資料由 tools/frames/ 在固定種子下產生,環境為 numpy 1.24.4 · pandas 2.3.2 · scikit-learn 1.6.1 · scipy 1.13.1 · statsmodels 0.14.2 · ISLP 0.4.0 · pygam 0.10.1。每張卡下方的「來源」標了 lab 的儲存格編號,可以直接回去對。

QUIZ · 自我檢測

本章自我檢測 課程題庫 ch4 · 6 題

這些題目取自課程題庫,只給對錯與說明,不計分。答錯就回到對應章節重讀。

CARDS · 關鍵詞彙卡

關鍵詞彙卡:點卡片翻面 課程題庫 · 28 張

詞彙卡取自本章講義與 ISLP 第 4 章,正面是中文術語(附英文原名)。 先看正面、心裡默想定義,再翻面對答案;洗牌後再過一輪,直到每張都能不看答案講出來。