① 照節次讀:每節先讀說明,動手玩互動元件——先預測結果,再按按鈕驗證。 ② 對照講義:每個 §徽章都標了 ISLP 節號與講義頁碼,細節與完整推導請回講義與課本。 ③ 每節做 quiz:答錯就回到該節重讀,不要往下跳;錯的選項也寫了「錯在哪」。 ④ 最後翻關鍵詞彙卡自測術語,並用 REF 總覽當速查表。標「ESL 進階」的節是課堂沒細講的延伸,第一輪可略過。
第 3 章的 y 是連續的數字。現在換一種問題:y 是類別——這個人會不會違約、
今天股市漲還是跌、這封信是不是垃圾信。這叫做分類(classification)。
本章用 ISLP 的 Default 資料(n = 10000,違約率 3.33%)與課程 lab 的
Smarket 資料當主線。
直覺會說:把類別編成數字,然後照第 3 章配線性迴歸就好。這條路在兩個地方會撞牆, 而且兩個都不是技術細節,是真的錯。
第二點值得寫成式子。把 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,上下兩排短刻度是真實資料:上排(y = 1)是違約的人,下排(y = 0)是沒違約的人。紅線是線性迴歸的配適,綠線是邏輯斯迴歸。紅色陰影是線性版給出負機率的區段。
下面同一批急診病人,只是換了編碼順序。線性迴歸看到的是「數字」, 所以它會認真去配這些完全人造的順序與間距:
| 編碼方式 | 中風 | 藥物過量 | 癲癇 | 這個編碼隱含的假設 |
|---|---|---|---|---|
| 編碼 A | 1 | 2 | 3 | 三種病有順序,而且「中風→藥物過量」與「藥物過量→癲癇」的差距一樣大 |
| 編碼 B | 1 | 3 | 2 | 順序變成中風 < 癲癇 < 藥物過量——同一份資料,配出完全不同的模型 |
| 編碼 C | 2 | 1 | 3 | 又是另一個模型。哪一個才對?都不對。 |
真正的問題是:類別沒有順序也沒有距離,硬編成數字就是在硬塞結構進去。 正解是邏輯斯迴歸(兩類)與多元邏輯斯迴歸(多類),或者本章後半的生成式模型。
把二元反應編成 0/1 之後配線性迴歸,跟邏輯斯迴歸比,最根本的問題是什麼?
要讓輸出永遠落在 (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-odds 或 logit。 所以邏輯斯迴歸真正線性的東西不是機率,是 log-odds。這句話決定了係數怎麼解讀。
不對,這是最常見的誤讀。0.0055 是 log-odds 的變化,不是機率的變化。正確的說法有兩種:
balance 每增加一元,違約的 log-odds 增加 0.0055」;為什麼機率的變化講不出一個數字?因為它取決於你站在哪裡。用表 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 上配邏輯斯迴歸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
Truth Down Up Predicted Down 145 141 Up 457 507
predict() 回傳的是機率,不是標籤;要自己挑一個閾值把它切成 Up/Down。這裡用 0.5,正確率 (507 + 145) / 1250 = 52.2%——但這是訓練正確率,同一批資料又訓練又測試,一定太樂觀。
Ch04-classification-lab-zh.ipynb · 儲存格 31、33、35
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
某邏輯斯迴歸模型裡 balance 的係數是 0.0055。下面哪個說法對?
把一個預測變數換成 p 個,式子幾乎不用改——線性部分變成 $\beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p$ 就好。真正值得停下來的是加了變數以後係數會變號這件事。
ISLP 的 Default 例子最經典。只用 student 一個變數配(表 4.2),
student[Yes] 的係數是 +0.4049:學生比較容易違約。
可是把 balance 與 income 一起放進去(表 4.3),
同一個 student[Yes] 變成 −0.6468:學生比較不容易違約。
同一份資料,符號翻過來了。
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 章會再遇到) |
Lag1 與 Lag2Truth 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
只用 student 配時它的係數是正的,加入 balance 後變成負的。該怎麼理解?
邏輯斯迴歸是直接建模 $\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)}$$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$。
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 畫的就是這個。
差在係數是怎麼決定的。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 的分佈完全不做假設。
所以取捨很清楚:
實務上兩者的預測往往幾乎一樣——lab 儲存格 79 的 LDA 混淆矩陣(35/35/76/106)跟儲存格 53 的邏輯斯一個數字都沒差。這不是巧合,是式 4.32 保證的。
LinearDiscriminantAnalysisarray([[ 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
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
LDA(p > 1)到底假設了什麼?
| 要估的參數 | p = 2, K = 2 時 | p = 50, K = 2 時 | |
|---|---|---|---|
| 先驗 πk | K − 1 個 | 1 | 1 |
| 平均 μk | K × p 個 | 4 | 100 |
| 共用 Σ(LDA) | p(p+1)/2 個 | 3 | 1275 |
| 各自 Σk(QDA) | K·p(p+1)/2 個 | 6 | 2550 |
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 與 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 |
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
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
只有 n = 40 筆訓練資料、p = 2,而且你有理由相信真實的決策邊界是線性的。該選哪個?
前面所有方法的最後一步都是同一句話:「後驗機率大於 0.5 就判成正類」。 這個 0.5 不是天上掉下來的,它來自 Bayes 分類器——而 Bayes 分類器最小化的是「總」錯誤率, 它完全不管兩種錯誤誰比較痛。
ISLP 的 Default 例子把這件事講得很殘忍。LDA 在 10000 筆訓練資料上的錯誤率是
2.75%,聽起來很棒。但是:
閾值就是調節這兩種錯誤的旋鈕。把 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%。 對信用卡公司,這是划算的交易。自己動一下滑桿看看:
| 真實:不違約 | 真實:違約 | 合計 | |
|---|---|---|---|
| 預測:不違約 | 9644 | 252 | 9896 |
| 預測:違約 | 23 | 81 | 104 |
| 合計 | 9667 | 333 | 10000 |
綠底=猜對(TN/TP)· 淺紅=假陽 FP(誤報)· 深紅=假陰 FN(漏掉的違約戶)
因為準確率的分母被多數類綁死了。假設 1000 個人裡有 10 個得病,你寫一支 return '沒病' 的程式,準確率就是 99%——它一個病人都沒抓到。
這個「什麼都不做」的基準線有名字,叫 虛無率(null rate)。ISLP 用 Default 示範:虛無率 3.33%,LDA 的 2.75% 只是小勝。lab 的 Caravan 例子更誇張——只有 6% 的人買保險,KNN 的錯誤率 11.1% 比「全猜不買」的 6.7% 還差(儲存格 145)。
該看什麼?先問「哪一種錯誤比較貴」,再挑指標:
最後一句:永遠把虛無率一起報出來。沒有基準線的準確率是沒有資訊的數字。
先把四格與三個比率的分母釘死,這是最容易搞混的地方:
ISLP 表 4.7 還給了對照的別名:假陽率就是型一錯誤、真陽率就是檢定力(power)、精確率就是正預測值(PPV)。同一個表格,不同學科各叫一套名字。
方向相反是因為兩種錯誤的成本結構不同。
lab 的 Caravan 是第三種情況:業務員拜訪一個人有成本,所以在意的是「被我挑中的人裡有幾成真的會買」——那是精確率。把閾值從 0.5 降到 0.25,挑出 29 個人、9 個真的買,精確率 31%,是隨機猜(6%)的五倍(儲存格 158、159)。
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
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
把分類閾值從 0.5 降到 0.2,下面哪一組變化一定會發生?
| 名稱 | 定義 | 別名 | 分母是誰 |
|---|---|---|---|
| 假陽率 FPR | FP / N | 型一錯誤、1 − 特異度 | 真實的負類 |
| 真陽率 TPR | TP / P | 靈敏度、recall、檢定力、1 − 型二錯誤 | 真實的正類 |
| 正預測值 PPV | TP / P* | 精確率、1 − 錯誤發現比例 | 預測為正的 |
| 負預測值 NPV | TN / N* | — | 預測為負的 |
對照 ISLP 表 4.6/4.7。 N、P 是真實的負/正類總數;N*、P* 是被預測為負/正的總數。
五個方法看起來各說各話,其實把它們統一寫成「相對於第 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)$$三行擺在一起,四個結論就掉出來了:
邏輯斯迴歸呢?多元邏輯斯迴歸的形式跟 LDA 的第一行字面上完全一樣。 差別只在係數怎麼來:LDA 從常態假設推出來,邏輯斯迴歸直接最大化條件似然。 所以「X 近似常態 → LDA 較好,否則 → 邏輯斯較好」。
KNN 是唯一完全在框架外的:它不寫任何 log-odds 的式子,直接看鄰居投票。 代價是(a)需要 n ≫ p,(b)不告訴你哪個變數重要。
balance 對 default 的訊號非常強。訊號夠強時,模型假設的差別就淹沒在訊號裡。式 4.32 又保證 LDA 與邏輯斯的邊界形式相同,兩條當然重疊。
下面六個情境改寫自 ISLP §4.5.2 的模擬與 lab 的實際資料。 先自己想再點——每個選項都會告訴你它為什麼合理、又為什麼不是最好的答案。
—
按下面任一個方法看看拆解。
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.5 | LDA、邏輯斯 | 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 都撐不住 |
ISLP §4.5.1 說「LDA 是 Naive Bayes 的特例」。這句話怎麼可能成立?LDA 明明允許變數相關、Naive Bayes 明明假設獨立。
這一節是課堂沒細講的延伸(講義 04 · p.49–56 對應 ISLP §4.6)。 它把「線性迴歸/邏輯斯迴歸」收進 GLM 這個大框架裡,觀念很漂亮但不影響前面各節的理解, 第一輪可以先跳過,之後回來看。
前面兩種 y:連續的(第 3 章)與類別的(本章)。還有第三種常見的 y——計數。
ISLP 用 Bikeshare(華盛頓特區每小時的單車租借數,n = 8645)示範。
直接對計數配線性迴歸會踩三個坑:
Bikeshare 上有 9.6%
的配適值是負的——負的租借數沒有意義。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) = λ」自動把平均–變異關係包進模型。
weathersit[cloudy/misty] 的係數是 −0.08,
e−0.08 = 0.923——陰天的平均租借量只有晴天的 92.3%。線性迴歸、邏輯斯迴歸、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() |
| 邏輯斯迴歸 | Bernoulli | log(μ / (1 − μ))(logit) | (0, 1) | sm.families.Binomial() |
| Poisson 迴歸 | Poisson | log μ | (0, ∞) | sm.families.Poisson() |
| Gamma 迴歸 | Gamma | 通常是 −1/μ 或 log μ | (0, ∞) | sm.families.Gamma() |
常態、Bernoulli、Poisson、Gamma、負二項都屬於指數族(exponential family)。
任何「挑一個指數族成員 + 挑一個連結函數」的迴歸都叫 GLM。
所以 lab 裡從頭到尾只用了一支 sm.GLM()——換 family 就換模型。
sm.GLM() 打三種模型跟前面配邏輯斯迴歸的那一行比一比: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
Bikeshare 就有這個問題,
導致表 4.11 的 z 值被高估(看起來比實際更顯著)。Poisson 迴歸配的是 log λ 而不是 λ 本身。最主要的理由是什麼?
下面幾題取自 ISLP §4.8 的課後習題,題號都對得回課本。先自己想過再點選項; 每個選項——包含錯的——都寫了為什麼。想看完整解答再對照下面3個站。
某邏輯斯迴歸用 X₁ = 讀書時數、X₂ = 大學 GPA 預測「這科拿 A」,估到 β̂₀ = −6、β̂₁ = 0.05、β̂₂ = 1。一個讀 40 小時、GPA 3.5 的學生拿到 A 的機率是多少?
這一題只考勝算。(a)違約勝算是 0.37 的人,實際違約的比例是多少?(b)某人違約機率 16%,她的勝算是多少?
同一份資料切成一半訓練一半測試。邏輯斯迴歸的訓練錯誤率 20%、測試錯誤率 30%;1-NN 的「訓練與測試平均」錯誤率是 18%。該選哪一個?
(a)Bayes 決策邊界是線性時,LDA 與 QDA 誰在訓練集上比較好?測試集呢?(d)「就算邊界是線性的,QDA 彈性夠大也配得下,所以測試誤差還是會比較好」——對嗎?
考前把這一頁掃過去就好。
| 方法 | 在建模什麼 | 邊界形狀 | 關鍵假設 | 參數量 | 什麼時候選它 |
|---|---|---|---|---|---|
| 邏輯斯迴歸 | 後驗 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) | 加性(無交互項) | 類內各變數獨立 | 約 2Kp | p 大 n 小、變數近似獨立 |
| KNN | 什麼都不建模 | 任意 | 無(無母數) | 存全部資料 | 邊界極度彎曲且 n ≫ p |
| TN | FP | FN | TP | 錯誤率 | 靈敏度 | 出處 | |
|---|---|---|---|---|---|---|---|
| LDA,閾值 0.5 | 9644 | 23 | 252 | 81 | 2.75% | 24.3% | ISLP 表 4.4 |
| LDA,閾值 0.2 | 9432 | 235 | 138 | 195 | 3.73% | 58.6% | ISLP 表 4.5 |
| Naive Bayes,閾值 0.5 | 9621 | 46 | 244 | 89 | 2.90% | 26.7% | ISLP 表 4.8 |
| Naive Bayes,閾值 0.2 | 9339 | 328 | 130 | 203 | 4.58% | 61.0% | ISLP 表 4.9 |
| 一律預測「不違約」 | 9667 | 0 | 333 | 0 | 3.33% | 0.0% | 虛無率 |
本頁 w04thr 元件的 2×2 表在閾值
0.5 與 0.2 會逐格重現前兩列(我們用 scikit-learn 的
LinearDiscriminantAnalysis 在 balance + student 上重算,
數字與課本相同)。ISLP 表 4.8/4.9 的 Naive Bayes 實作與 GaussianNB
對 student 的處理略有不同,所以本頁烘焙的 NB 混淆矩陣是 9618/49/238/95。
| 方法 | 測試正確率 | 混淆矩陣(預測 × 真實) | lab 儲存格 |
|---|---|---|---|
| 邏輯斯(6 個變數) | 0.4801 | 77/97/34/44 | 49、51 |
| 邏輯斯(Lag1 + Lag2) | 0.5595 | 35/35/76/106 | 53、55 |
| LDA(Lag1 + Lag2) | 0.5595 | 35/35/76/106 | 79 |
| QDA(Lag1 + Lag2) | 0.5992 | 30/20/81/121 | 95、97 |
| Naive Bayes(Lag1 + Lag2) | 0.5952 | 29/20/82/121 | 116、117 |
| KNN,K = 1 | 0.5000 | 43/58/68/83 | 122、124 |
| KNN,K = 3 | 0.5317 | — | 127 |
| 一律猜 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 |
本頁「預期輸出」逐字取自課程 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 的儲存格編號,可以直接回去對。
這些題目取自課程題庫,只給對錯與說明,不計分。答錯就回到對應章節重讀。
詞彙卡取自本章講義與 ISLP 第 4 章,正面是中文術語(附英文原名)。 先看正面、心裡默想定義,再翻面對答案;洗牌後再過一輪,直到每張都能不看答案講出來。