① 照節次讀:每節先讀說明,動手玩互動元件——先預測結果,再按按鈕驗證。 ② 對照講義:每個 §徽章都標了 ISLP 節號與講義頁碼,細節與完整推導請回講義與課本。 ③ 每節做 quiz:答錯就回到該節重讀,不要往下跳;錯的選項也寫了「錯在哪」。 ④ 最後翻關鍵詞彙卡自測術語,並用 REF 總覽當速查表。
前面幾章的分類器都先繞一圈:邏輯斯迴歸去估 $\Pr(Y \mid X)$,LDA 去估 $\Pr(X \mid Y)$ 再用貝氏定理翻回來,樹去切區塊。這一章換一條路—— 直接在特徵空間裡找一片把兩類分開的平面。不估機率、不假設分佈, 就是幾何。
講義第 3 頁把整章的劇本寫得很乾淨:先試著找一片分得開的平面; 如果找不到,往兩個方向想辦法——把「分開」的定義放鬆(軟邊界), 以及把特徵空間變大(核)。這兩招合起來就是支持向量機。
起點是超平面(hyperplane)。p 維空間裡的超平面是一個 p − 1 維的 平坦仿射子空間;p = 2 就是一條線,p = 3 就是一個平面。它的方程式簡單到有點反高潮:
$$\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p = 0$$寫成 $f(X) = \beta_0 + \beta^{\top} X$。滿足 $f(X) = 0$ 的點在超平面上, $f(X) > 0$ 的點在一側、$f(X) < 0$ 的點在另一側。所以只要看 $f(X)$ 的正負號, 就知道一個點站在哪一邊——分類問題被壓成一次算術。
而且 $f(X)$ 的大小也有意思。向量 $\beta = (\beta_1,\dots,\beta_p)$ 是超平面的法向量(normal vector),指向與超平面垂直的方向; 點 $x$ 到超平面的垂直距離正好是
$$\text{距離} = \frac{|f(x)|}{\lVert \beta \rVert}, \qquad \lVert \beta \rVert = \sqrt{\beta_1^2 + \cdots + \beta_p^2}$$所以 $|f(x)|$ 大就是離邊界遠、這個判斷有把握;$|f(x)|$ 接近 0 就是貼在邊界上、 隨時可能翻盤。這個「離邊界多遠 = 多有把握」的直覺,是整章的地基。
有了超平面,分類規則就寫完了:把 $y_i$ 編碼成 $\pm 1$, 分離超平面(separating hyperplane)就是滿足
$$y_i\left(\beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip}\right) > 0 \qquad \text{對每一筆 } i = 1, \dots, n$$的那些超平面(ISLP 式 9.8)。這一個式子把「藍色的要 $f > 0$、紫色的要 $f < 0$」 兩條規則合成一條,因為 $y_i$ 自己會把符號翻過來。這個 $y_i f(x_i)$ 之後會一直出現, 它就是「這一筆分對了嗎、有多篤定」的度量。
array([[1.17303943, 0.77348227]])
這 50 筆資料是本章前半的主角,本頁所有烘焙圖都是重播同一組default_rng(1) 抽樣算出來的。coef_ 就是 (β₁, β₂) = (1.173, 0.773),intercept_ 是 β₀。配適那一格的輸出只是 SVC(C=10, kernel='linear')——sklearn 印的是估計器本身,不是結果。
Ch09-svm-lab-zh.ipynb · 儲存格 14、16、29
把某個超平面的係數 (β₀, β₁, β₂) 全部乘上 −2,會發生什麼事?
如果資料真的分得開,麻煩來了:分離超平面有無限多個。 隨便一條分得開的線,都可以稍微平移一點、旋轉一點,還是分得開(ISLP 圖 9.2 左畫了三條)。 無限多個候選,總得有個挑法。
挑法很自然:選離兩邊都最遠的那一條。先算每個訓練點到超平面的垂直距離, 其中最小的那個距離叫做邊界(margin,ISLP 記為 M); 邊界最大的那個分離超平面就是最大邊界超平面(maximal margin hyperplane, 也叫最佳分離超平面)。用它做分類就是最大邊界分類器。
寫成最佳化問題(ISLP 式 9.9–9.11):
$$\begin{aligned} &\underset{\beta_0,\beta_1,\dots,\beta_p,\,M}{\text{maximize}} \quad M \\ &\text{subject to} \quad \sum_{j=1}^{p} \beta_j^2 = 1, \\ &\qquad\qquad\quad\; y_i\left(\beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip}\right) \ge M \quad \forall\, i \end{aligned}$$兩個限制式各有分工。$\sum \beta_j^2 = 1$ 不是對超平面的限制(前一節說過, 縮放係數不改變超平面),它的作用是把 $y_i f(x_i)$ 校準成真正的距離; 有了這個校準,第二條 $y_i f(x_i) \ge M$ 才真的在說「每一筆都在正確一側,而且至少離 M 遠」。 於是 M 就是邊界,而目標函數就是把它推到最大。
那幾個剛好落在虛線上的點就是支持向量(support vector)。 名字的由來很直白:它們像柱子一樣「支撐」著那片超平面——移動它們,超平面跟著動; 移動別的點,超平面完全不理你(只要那個點沒有越過 margin)。ISLP 說得很重:
順便說一句:ISLP §9.7 第 3 題就是這個元件的手算版。它給你 7 個點, 答案是 $X_2 = X_1 - 0.5$,支持向量是第 2、3、5、6 筆,$M = 1/(2\sqrt{2}) \approx 0.354$; 第 (f) 小題問「第 7 筆稍微移動會不會影響超平面」——你在上面拖過就知道答案了。 本頁 EX 區的第 3 題會再問一次。
Truth -1 1 Predicted -1 25 0 1 0 25
X[y==1] += 1.9 把兩類再推開一點,剛好變成線性可分開。用 C=1e5(sklearn 的 C,見下一節)配出來的分類器沒有任何訓練誤差,而且只用了 3 個支持向量——這就是最大邊界超平面。lab 儲存格 47 換成 C=0.1,訓練誤差同樣是 0,但支持向量變成 12 個、margin 寬得多。ISLP §9.6.1 的評語是:後者「因為點更多所以更穩定」,在測試資料上可能更好。
Ch09-svm-lab-zh.ipynb · 儲存格 41、43
先說「向量」:在 p 維空間裡,一筆觀測值 $x_i$ 就是一個 p 維向量,所以這些點本來就是向量。「支持」則是力學的比喻——它們頂在 margin 的兩側,撐著那塊板子。抽掉一根柱子,板子就塌下來換位置。
從最佳化的角度看:最大邊界問題的限制式是 $y_i f(x_i) \ge M$。在最佳解上,只有取等號的那些限制式是「緊的」(active);取嚴格大於的限制式等於根本沒在限制什麼,把它整條刪掉,解一模一樣。KKT 條件把這件事寫成 $\hat\alpha_i \left(y_i f(x_i) - M\right) = 0$:限制式不緊時 $\hat\alpha_i = 0$,而解只由 $\hat\alpha_i > 0$ 的那些點組成(講義第 18 頁:$\hat\beta = \sum_i \hat\alpha_i y_i x_i$)。
從損失函數的角度看:本頁 PART 03 會證明支持向量分類器等價於最小化hinge loss 加上 ridge 懲罰,而 hinge loss 在 $y_i f(x_i) \ge 1$ 時剛好等於 0。一個對目標函數貢獻恰好為 0 的點,當然不可能影響最佳解。兩個角度說的是同一件事。
直覺上合理:margin 大表示兩類之間有一塊很寬的無人區,新資料落進來也大概不會踩線。ISLP 就是這樣說服讀者的——「我們希望訓練資料上 margin 大的分類器在測試資料上 margin 也大」。
但它明確加了一句警告:p 很大的時候最大邊界分類器會過度配適。維度愈高,愈容易找到一片「剛好」把訓練資料切開的超平面——那片超平面的位置可能完全由雜訊決定。lab 的 Khan 資料就是極端例子:n = 63 而 p = 2308,訓練誤差輕鬆變成 0,「這並不令人驚訝」。
所以實務上幾乎沒有人用純粹的最大邊界分類器。真正在用的是加了正則化的軟邊界版本,而且那個調整參數要靠交叉驗證選。
在最大邊界分類器裡,把一個非支持向量的點往遠離邊界的方向移動一小段,解會怎麼變?
上一節結尾的兩個問題要一起解決。第一個是資料常常根本分不開 (講義第 10 頁:除非 n < p,通常都分不開),這時 M > 0 的解不存在, 整個最佳化問題沒有答案。第二個是就算分得開,硬要分開也可能是壞主意 ——ISLP 圖 9.5 只加一個點就讓超平面大幅轉向,margin 縮到極窄。
解法是把「分開」的定義放鬆:允許少數點跑到 margin 錯的一側, 甚至跑到超平面錯的一側。換來的是兩件 ISLP 明列的好處—— 對單一觀測值更穩健,以及大多數點分得更好。 這個分類器叫支持向量分類器,也叫軟邊界分類器 (margin 之所以「軟」,就是因為它可以被違反)。
$$\begin{aligned} &\underset{\beta_0,\dots,\beta_p,\,\epsilon_1,\dots,\epsilon_n,\,M}{\text{maximize}} \quad M \\ &\text{subject to} \quad \sum_{j=1}^{p} \beta_j^2 = 1, \\ &\qquad\qquad\quad\; y_i\left(\beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip}\right) \ge M\left(1 - \epsilon_i\right), \\ &\qquad\qquad\quad\; \epsilon_i \ge 0, \quad \sum_{i=1}^{n} \epsilon_i \le C \end{aligned}$$新東西是鬆弛變數(slack variable)$\epsilon_i$:它記錄第 i 筆 相對於 margin 與超平面的位置。三種狀態要分清楚:
| εᵢ 的值 | 這一筆在哪裡 | 是支持向量嗎 | 分類正確嗎 |
|---|---|---|---|
| εᵢ = 0 | 在 margin 正確的一側(或剛好在 margin 上) | 只有「剛好在 margin 上」的算 | 是 |
| 0 < εᵢ ≤ 1 | 違反了 margin,但還在超平面正確的一側 | 是 | 是 |
| εᵢ > 1 | 跑到超平面錯的一側 | 是 | 否 |
然後是 $\sum_i \epsilon_i \le C$ 這一條。ISLP 把 C 說成 「margin 可以被違反多少的預算」:C = 0 時沒有預算, 所有 $\epsilon_i$ 必須是 0,整個問題退回最大邊界超平面; C 愈大,愈容忍違反,margin 就愈寬。這裡有一個大坑,先講清楚:
SVC(C=…) 是「懲罰」
——目標函數是 ½‖β‖² + C·Σεᵢ,C 是對違反的罰款。C 大 → 罰得重 → 容忍少 →
margin 窄 → 支持向量少 → 偏差小變異大。[18 18])——元件上的數字就是那些數字。偏差與變異在這張圖上看得很清楚。C 小(滑桿左端):margin 寬、支持向量多, 決定邊界的點多,所以變異小、偏差大,配得比較鬆。 C 大(滑桿右端):margin 窄、支持向量少,邊界由少數點決定, 所以偏差小、變異大,配得很緊。C 就是這一章的調整參數, 跟 ridge 的 $\lambda$、樹的 $\alpha$ 是同一種東西,一律靠交叉驗證選。
最重要的性質原封不動地繼承下來,而且更強:只有落在 margin 上、 或違反 margin 的觀測值會影響超平面。嚴格待在正確一側的點, 你把它拖到再遠的地方,分類器完全不變。這些會影響答案的點就是支持向量。
array([15, 14], dtype=int32)
support_ 是支持向量在原始資料裡的索引(儲存格 22 印出 29 個),n_support_ 是每一類各幾個:[15, 14],合起來 29。儲存格 21 用 support_vectors_ 把座標印成表格。50 筆資料裡有 29 筆是支持向量——這份資料重疊得很厲害。
Ch09-svm-lab-zh.ipynb · 儲存格 21、22、23
array([18, 18], dtype=int32)
C=0.1 的支持向量變成 [18, 18] = 36 個。lab 的說法是「使用較小的成本參數值,我們獲得更多的支援向量,因為邊界現在更寬」——sklearn 的 C 小 = 罰得輕 = margin 寬,跟 ISLP 的預算 C 剛好相反。
Ch09-svm-lab-zh.ipynb · 儲存格 25、27
array([0.46, 0.46, 0.72, 0.74, 0.74, 0.74, 0.74])
七個 C 的 5 折交叉驗證準確率是 [0.46, 0.46, 0.72, 0.74, 0.74, 0.74, 0.74]。最佳是 C = 1(儲存格 31 的輸出),但後面四個 C 的準確率完全一樣——這種平台很常見,就挑最簡單(最正則化)的那個,不要假裝 0.74 跟 0.74 有差別。注意 C = 0.001 與 0.01 的準確率只有 0.46,比亂猜還差:罰得太輕,β 被壓到幾乎是 0,分類器整組崩掉。
Ch09-svm-lab-zh.ipynb · 儲存格 31、33
Truth -1 1 Predicted -1 8 4 1 2 6
混淆矩陣的對角線是 8 + 6 = 14,20 筆裡對了 14 筆 → 70%。lab 儲存格 39 換成 C=0.001,正確率掉到 60%(幾乎把所有點都判成 +1)。這一頁的每一個混淆矩陣都是 confusion_table(預測, 真實):列是預測、欄是真實,順序跟 sklearn 的 confusion_matrix 相反,看的時候要注意。
Ch09-svm-lab-zh.ipynb · 儲存格 35、37
兩個都對,因為那是兩個不同的 C。記一個口訣:ISLP 的 C 在限制式裡,sklearn 的 C 在目標函數裡。
ISLP(式 9.15):$\sum_i \epsilon_i \le C$。C 站在不等式的右邊,是「你最多可以犯多少規」的預算。預算多 → 犯規多 → margin 寬。C = 0 就是一毛錢都不准犯規,退回最大邊界分類器。
sklearn(等價的 primal 式,講義第 18 頁):$\min \frac12\lVert\beta\rVert^2 + C\sum_i \epsilon_i$。C 站在目標函數裡乘著犯規總量,是罰款單價。單價高 → 沒人敢犯規 → margin 窄。$C \to \infty$ 就是硬邊界。
所以講義寫「C 與 const 成反比」。實務上你摸到的幾乎都是 sklearn 那個,記住「C 大 = 配得緊 = 容易過度配適」就好,跟 ridge 的 λ 剛好反向(λ 大 = 配得鬆)。順便一提,$\lambda$ 在式 9.25 裡的方向與 ISLP 的預算 C 同向。
需要,而且比大多數方法更需要。講義第 33 頁講得很直接:「SVM 的演算法不具尺度不變性,所以強烈建議先縮放你的資料」。
理由就在這一章的第一句話:SVM 從頭到尾都在算距離與內積。一個以「元」為單位的收入變數(範圍幾十萬)和一個以「年」為單位的年齡變數(範圍幾十),在 ‖β‖ 與 margin 裡的權重會差好幾個數量級——收入那一維會完全主導邊界的方向,年齡等於被忽略。RBF 核更嚴重,因為 $\exp(-\gamma \sum_j (x_{ij}-x_{i'j})^2)$ 裡的平方距離會被大尺度的那一維吃光。
做法跟第 5 章一樣:把 StandardScaler 包進 Pipeline,再交給 GridSearchCV,這樣每一折都會用該折的訓練部分重新算平均與標準差,不會洩漏。順帶一提,這也是為什麼 lab 的 Khan 例子用線性核就好——基因表現量本來就在同一個尺度上。
在 scikit-learn 裡把 SVC(kernel='linear') 的 C 從 0.1 加到 100,預期會看到什麼?
📑 這一節是延伸:它解釋「為什麼只有支持向量影響答案」背後的損失函數, 是 ISLP §9.5 與 ESL §12.3.2 的內容。第一輪讀可以先跳過,直接去 PART 04 的核技巧; 但如果你想真正弄懂 SVM 跟邏輯斯迴歸的關係,回頭一定要讀這一節。
前面把支持向量分類器寫成一個帶限制式的最佳化問題。ISLP §9.5 給了一個 完全等價、但看起來完全不同的寫法(式 9.25):
$$\underset{\beta_0,\beta_1,\dots,\beta_p}{\text{minimize}} \left\{ \sum_{i=1}^{n} \max\left[0,\; 1 - y_i f(x_i)\right] \; + \; \lambda \sum_{j=1}^{p} \beta_j^2 \right\}$$這就是全書一直在用的「損失 + 懲罰」格式(式 9.26)。 後面那一項你認得——它就是第 6 章的 ridge 懲罰。前面那一項叫 hinge loss(合頁損失,因為它的圖長得像門的合頁):
$$L\left(X, y, \beta\right) = \sum_{i=1}^{n} \max\left[0,\; 1 - y_i\left(\beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip}\right)\right]$$現在看那條曲線。橫軸是 $y_i f(x_i)$——分對了是正的,愈大愈篤定;分錯了是負的。
那個「剛好是 0」是本節的全部重點。一個損失恰好為 0 的點,對目標函數的貢獻是 0, 對它求梯度也是 0——把它從資料裡整筆刪掉,最佳解一模一樣。 所以最佳解只由 $y_i f(x_i) < 1$ 的那些點決定,而那些點正好就是 「落在 margin 上或違反 margin」的觀測值,也就是支持向量。 對照之下,邏輯斯迴歸的損失永遠大於 0,每一筆資料都在(微弱地)拉扯答案, 所以它沒有稀疏性、也沒有支持向量的概念。
按「顯示 0–1 損失」會疊上我們真正想最小化的東西:分錯是 1、分對是 0 的 階梯函數。它既不連續也不凸,沒辦法直接最佳化——所以大家改去最小化它的 凸上界。hinge 與邏輯斯都是這樣的上界,這種替身叫做 代理損失(surrogate loss)。你在圖上會看到兩條曲線都完整地蓋在階梯之上。
講義第 32 頁的重點:SGDClassifier(loss="hinge") 就是用隨機梯度下降去最小化式 9.25,alpha 就是 λ。它不解 QP,所以資料量很大時比 SVC 快得多,代價是解得比較粗。這一格畫的三條等高線 [-1, 0, 1] 就是 margin 的兩側與邊界本身——跟 plot_svm() 畫的是同一件事。順帶一提,講義也提醒 SGD 對特徵尺度很敏感,用它之前更要標準化。
Ch09-svm-lab-zh.ipynb · 儲存格 95
某一筆觀測值的 y·f(x) = 3。它對式 9.25 那個目標函數的貢獻是多少?把它從訓練資料裡刪掉會發生什麼事?
軟邊界解決了「分不開」,但沒有解決「邊界根本不是直的」。 講義第 19 頁那張圖就是這種情形:一團在中間、一圈在外面, 無論 C 調成多少,一條直線都沒救。
第 7 章遇過一模一樣的問題,答案是特徵擴張(feature expansion): 把 $X_1^2, X_2^2, X_1X_2, X_1^3, \dots$ 加進特徵裡,在放大的空間配線性分類器, 映射回原空間就變成彎的邊界。用二次項的話(ISLP 式 9.16):
$$\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_1^2 + \beta_4 X_2^2 + \beta_5 X_1 X_2 = 0$$這在放大的空間裡是線性的,在原空間裡是二次曲線(圓、橢圓、雙曲線)。 問題是維度爆炸得很快:講義第 21 頁做到三次多項式,兩個變數就變成九維; p 個變數做到 d 次是 $\binom{p+d}{d} - 1$ 維。p = 100、d = 3 就已經 17 萬多維, 算不動。
既然演算法只透過內積接觸資料,那就把每一處內積換成別的東西:
$$\langle x_i, x_{i'} \rangle \;\longrightarrow\; K(x_i, x_{i'})$$$K$ 叫做核(kernel),是一個衡量兩筆觀測值有多像的函數。 這就是核技巧(kernel trick):講義第 22 頁一句話說完—— 「我們不需要真的知道 Φ(x),只要在原空間用核函數計算就好」。
講義第 24 頁的例子把這件事說得最清楚。取二次映射 $\Phi(x) = (\sqrt{2}\,x_1 x_2,\; x_1^2,\; x_2^2)$,那麼
$$\Phi(a)^{\top} \Phi(b) = 2a_1a_2b_1b_2 + a_1^2b_1^2 + a_2^2b_2^2 = \left(a_1b_1 + a_2b_2\right)^2 = \left(a^{\top} b\right)^2$$左邊要先算兩個三維向量再做內積;右邊只要在原本的二維空間做一次內積再平方。 兩者完全相等。維度愈高這個省法愈划算;RBF 核對應的特徵空間是無限維的, 本來就不可能真的走進去算。
w= [-0.05481854 -2.53191791 -2.52028513] b= [1.14976292] <Figure size 1600x800 with 2 Axes><figure omitted>
feature_map_1 把二維點送到三維 (√2·x₁x₂, x₁², x₂²),my_kernel_1 則是那個映射的內積——也就是它的核。在三維空間配出來的線性超平面是 w = [-0.0548, -2.5319, -2.5203]、b = 1.1498:第一個係數幾乎是 0(交互項沒用),後兩個幾乎相等且為負——它學到的其實就是「x₁² + x₂² 小的是內圈」。
Ch09-svm-lab-zh.ipynb · 儲存格 51、52
Accuracy score using feature map 1.0 Accuracy score using feature map 1.0
SVC(kernel=my_kernel_1)(只用核、留在二維)與 SVC(kernel='linear').fit(Z, y)(真的升到三維)訓練準確率都是 1.0。這就是核技巧的全部意思:兩條路數學上等價,但右邊那條不需要把 Φ(x) 算出來。儲存格 54 把決策區域畫出來,在原空間看是一個圓。
Ch09-svm-lab-zh.ipynb · 儲存格 53、54
常用的核有三個(講義第 40 頁列了各自的優缺點)。線性核就是普通內積, 等於什麼都不做:
$$K(x_i, x_{i'}) = \sum_{j=1}^{p} x_{ij} x_{i'j}$$d 次多項式核(式 9.22)等於在 d 次多項式的空間裡配線性分類器:
$$K(x_i, x_{i'}) = \left(1 + \sum_{j=1}^{p} x_{ij} x_{i'j}\right)^{d}$$徑向基核(radial basis kernel,RBF;式 9.24)用距離而不是內積:
$$K(x_i, x_{i'}) = \exp\left(-\gamma \sum_{j=1}^{p} \left(x_{ij} - x_{i'j}\right)^2\right), \qquad \gamma > 0$$RBF 的行為非常局部:如果測試點 $x^*$ 離訓練點 $x_i$ 很遠, 那個平方距離很大、指數很小、$K(x^*, x_i)$ 幾乎是 0,於是 $x_i$ 在 $f(x^*) = \beta_0 + \sum_{i \in S} \alpha_i K(x^*, x_i)$ 裡幾乎沒有發言權。 只有附近的訓練點會影響一個測試點的預測。γ 就是「附近」有多近。
SVC(C=1, gamma=1)
200 筆資料分成三塊:前 100 筆整體 +2、第 101–150 筆整體 −2、剩下 50 筆留在原地,標籤是 [1]*150 + [2]*50——所以第 2 類被第 1 類從兩邊夾住,邊界必然是非線性的。上面那張圖用的就是這 100 筆訓練資料(test_size=0.5)。
Ch09-svm-lab-zh.ipynb · 儲存格 57、61
{'C': 1, 'gamma': 0.5}25 組組合裡最好的是 C = 1、γ = 0.5。lab 的補充很重要:「儘管其他幾個值也達到相同的值」——網格搜尋常常有一片平原,別把 best_params_ 當成唯一正確答案。接著儲存格 69 用它預測測試集,混淆矩陣是 69/6/6/19,錯誤率 12%。順帶一提,ISLP 書上印的 Out[24] 是 {'C': 100, 'gamma': 1},跟 lab 實跑不同——這正是「平原上任選一點」的具體證據。
Ch09-svm-lab-zh.ipynb · 儲存格 67、69
省掉的是把 Φ(x) 算出來、存起來、在高維空間裡做運算這三件事。
具體看講義第 24 頁那個例子。要做二次擴張,笨方法是:對每一筆資料算出三維向量 $\Phi(x) = (\sqrt2 x_1x_2, x_1^2, x_2^2)$,存成一個 n × 3 的矩陣,再在三維空間裡配 SVC。核方法是:完全不動原始的 n × 2 資料,需要內積的時候就算 $(x_i^\top x_{i'})^2$。兩者的答案數學上完全相同(lab 儲存格 53 實測都是 1.0),但後者永遠留在二維。
二維變三維省不了多少。但 p = 100 做到 d = 3 是 17 萬多維,而 RBF 核對應的特徵空間是無限維的(講義第 26 頁:由 Mercer 定理,確切的 Φ 無法明確寫出)。ISLP 說得很白:那個空間大到「我們本來也不可能在那裡做計算」。核方法讓你使用那個空間,卻永遠不必進去。
要付的代價是:你拿不到 β 了。線性核可以印 coef_ 看哪個變數重要,RBF 核只有 $\alpha_i$ 與支持向量——講義第 40 頁把這列成高斯核的缺點:「神祕(沒有 w)」。可解讀性換來了彈性。
用 RBF 核的 SVM 時,把 γ 從 0.5 調到 50,決策邊界會怎麼變?
到這裡整章都在講兩類。K > 2 怎麼辦?ISLP §9.4 的答案有點掃興: 分離超平面這個概念本身沒辦法自然地推廣到多類別。 很多人提過各種做法,但實務上活下來的只有兩個,而且都是「把多類別問題拆成一堆兩類問題」。
一對一(one-versus-one,OVO,也叫 all-pairs):配 $\binom{K}{2} = K(K-1)/2$ 個分類器,每個只比較兩個類別 (第 k 類編成 +1、第 k′ 類編成 −1,其餘資料完全不用)。 測試點交給每一個分類器投一票,得票最多的類別勝出。
一對其餘(one-versus-all,OVA,也叫 one-versus-rest):配 K 個分類器, 第 k 個把第 k 類編成 +1、其餘 K − 1 類全部編成 −1。 測試點指派給 $f_k(x^*) = \beta_{0k} + \beta_{1k}x_1^* + \cdots + \beta_{pk}x_p^*$ 最大的那一類——因為那代表最有信心。
| K | OVO | OVA |
| 3 | 3 | 3 |
| 4 | 6 | 4 |
| 10 | 45 | 10 |
| 100 | 4950 | 100 |
兩件事值得看清楚。第一,兩種規則真的會給出不同答案: 在這組資料上,格點裡大約 7% 的位置,一個測試點的預測類別會因為你選 OVO 還是 OVA 而改變。 差異來自 OVA 的每個分類器都被迫把「其餘兩類」當成一團來切,而 OVO 的每個分類器只處理兩類。
第二,OVO 的投票在理論上可能平手——三個分類器各投一票給不同的類別,
誰都沒過半,投票規則本身給不出答案。但你在這組資料上看到的平手格子是
0 格:三團分得很開時,三條成對邊界幾乎就是三個間隙的垂直平分線,
而三角形三邊的垂直平分線會交於同一點(外心),所以平手區幾乎退化成一個點。
平手要變成真問題,得等到類別重疊或 K 變大的時候。
實作上 libsvm 用 decision_function 的加總去打破平手,
但那是實作細節,不是投票規則給的答案。
SVC 的
decision_function_shape 只改變 decision_function()
輸出的形狀,不改變底層的訓練方式。libsvm 一律用 OVO 訓練
K(K−1)/2 個分類器;設成 'ovr' 時 sklearn 是把 OVO 的結果換算成 K 個分數。
真的想要「訓練 K 個一對其餘分類器」,要用 OneVsRestClassifier(SVC(...)) 包起來——
上面元件的 OVA 那三條線就是這樣配出來的。
元件裡的三條線都是真的 SVC(kernel='linear', C=1) 配適結果
(OVO 的三個只吃兩類的資料、OVA 的三個吃全部資料),係數烘焙進頁面;
投票與取最大則由前端在格點上即時算,所以切換是瞬間的。
資料是另外造的三團 blob,沒有沿用 lab 儲存格 82 那一組——那組是環狀的非線性結構,
線性的成對配適在上面沒有意義(lab 自己用的也是 RBF 核)。
| 一對一(OVO) | 一對其餘(OVA) | |
|---|---|---|
| 分類器個數 | K(K−1)/2 | K |
| 每個分類器的訓練資料 | 只用相關的兩類 | 全部 n 筆 |
| 類別平衡 | 好(兩類各自的量) | 差(1 對 K−1) |
| 決策規則 | 投票,最多票者勝 | 取 f_k(x*) 最大者 |
| 模糊情形 | 可能平手(票數相同) | 可能兩個 f 都很小 |
| sklearn 的設定 | decision_function_shape='ovo' | decision_function_shape='ovr' |
| ISLP 的建議 | K 不太大就用這個 | K 很大時考慮 |
Truth 1 2 3 4 Predicted 1 3 0 0 0 2 0 6 2 0 3 0 0 4 0 4 0 0 0 5
p = 2308 遠大於 n = 63,所以 lab 直接說「這表示我們應該使用線性核,因為多項式或徑向基核產生的額外靈活性是不必要的」——維度已經夠高了,隨便都找得到分得開的超平面。訓練混淆矩陣(儲存格 90)完全對角、零訓練誤差,「這並不令人驚訝」;測試集 20 筆只錯 2 筆。這一格用的是 SVC 的預設多類別機制,也就是 OVO。lab 儲存格 84 則用 decision_function_shape='ovo' 明確指定,在三類的二維資料上把決策區域畫出來。
Ch09-svm-lab-zh.ipynb · 儲存格 88、90、92
K = 10 個類別。OVO 與 OVA 各要訓練幾個二元分類器?
SVM 在 1990 年代中期出場時很轟動:找一片盡量分開資料的超平面、允許少數違反、 用核擴張特徵空間——這套說法看起來跟邏輯斯迴歸、LDA 完全是兩個世界的東西。 ISLP §9.5 的任務就是把這個神祕感拆掉。
拆解的關鍵就是 PART 03 那個式子。支持向量分類器等價於
$$\underset{\beta}{\text{minimize}} \left\{ \underbrace{\sum_{i=1}^{n} \max\left[0, 1 - y_i f(x_i)\right]}_{\text{hinge loss}} + \lambda \underbrace{\sum_{j=1}^{p} \beta_j^2}_{\text{ridge 懲罰}} \right\}$$而加了 ridge 懲罰的邏輯斯迴歸是
$$\underset{\beta}{\text{minimize}} \left\{ \sum_{i=1}^{n} \log\left(1 + e^{-y_i f(x_i)}\right) + \lambda \sum_{j=1}^{p} \beta_j^2 \right\}$$只有損失函數換了一項,其他一模一樣。而 PART 03 的圖顯示這兩個損失 除了「hinge 在右邊剛好是 0」之外幾乎平行。所以 ISLP 的結論不意外: 「邏輯斯迴歸與支持向量分類器常常給出非常相似的結果」。
| 支持向量分類器 / SVM | 邏輯斯迴歸 | LDA | |
|---|---|---|---|
| 損失函數 | hinge:max(0, 1 − y·f) | log(1 + e^(−y·f)) | (不是損失,是概似) |
| 在 y·f ≥ 1 時的損失 | 恰好 0 | 很小但 > 0 | — |
| 解由誰決定 | 只有支持向量 | 全部資料(遠處權重極小) | 各類的平均與共變異 |
| 機率輸出 | 沒有(要另外校準) | 天生就有 | 有 |
| 類別分得很開時 | 表現較好 | 係數會發散、不穩定 | 表現較好 |
| 類別重疊很多時 | 還可以 | 通常較好 | 還可以 |
| 非線性邊界 | 核,很成熟 | 可以用核,但少見且較貴 | 同左 |
| p ≫ n | 線性核 + 正則化,很強 | 要正則化 | 會退化 |
SVC(probability=True)),
那是額外做一次交叉驗證去配一個 sigmoid,慢而且不見得校準得好。ISLP 這一節結尾還提了一個延伸:支持向量迴歸
(support vector regression)。最小平方法讓每一筆殘差都計入損失;
支持向量迴歸只讓絕對值超過某個正常數的殘差計入——
等於把 margin 的概念搬到迴歸,落在「管子」裡的點對解沒有貢獻,
稀疏性因此保留下來。sklearn.svm.SVR 就是它。
0.84
RBFSampler 用隨機傅立葉特徵近似 RBF 核:它真的把資料映射到一個有限維的空間,讓內積近似 K(x, x′),然後就可以用便宜的線性方法(這裡是 hinge loss 的 SGD)。訓練準確率 0.84 比不上真正的 SVC(kernel='rbf'),但它是 O(n) 的,資料上百萬筆時 SVC 根本跑不動。講義第 32 頁:「大規模問題就用 SGDClassifier 配 hinge loss」。
Ch09-svm-lab-zh.ipynb · 儲存格 96、97
先問一句話:你要不要機率?要就選邏輯斯迴歸,討論結束。風險分數、期望成本決策、要調閾值、要跟別的模型做集成——全部需要校準過的機率,SVM 給不了(probability=True 是事後貼上去的,還會慢好幾倍)。
不要機率的話,看類別分得多開。分得很開 → SVM:邏輯斯迴歸在完全可分的資料上係數會發散,而 SVM 的 margin 概念天生就處理這種情形。重疊很多 → 邏輯斯迴歸:這時 hinge 的稀疏性沒什麼好處,而邏輯斯迴歸的機率輸出與可解讀性是白拿的。重疊的中間地帶兩者結果會很像,因為損失函數很像。
另外兩個實務考量。n 很大:SVC 是 O(n²)~O(n³) 的,幾萬筆以上就開始痛,這時用 LinearSVC、SGDClassifier 或邏輯斯迴歸。要看變數重要度:線性核的 coef_ 可以看,RBF 核沒有 β 可看(講義第 40 頁列為高斯核的缺點:「神祕」)。
ISLP 明確回答了:「歷史原因」。任何只透過內積接觸資料的方法都能核化(核邏輯斯迴歸、核 PCA、核嶺迴歸都存在),但核在 SVM 的脈絡裡遠比在其他地方普及。
不過也有技術上的理由。SVM 的解是稀疏的——只有支持向量的 $\alpha_i$ 非零,所以預測時只要算 |S| 個核值。核邏輯斯迴歸沒有這個性質:每一筆訓練資料的權重都非零,預測一個點要算 n 個核值,訓練還要處理一個 n × n 的核矩陣。n 稍微大一點就吃不消。hinge loss 那段「剛好等於 0」,換來的正是核方法在計算上的可行性。
一份資料的兩個類別重疊得相當厲害,而且你需要輸出每一筆的違約機率。該選哪個?
下面幾題取自 ISLP §9.7 的課後習題,題號都對得回課本。先自己想過再點選項; 每個選項——包含錯的——都寫了為什麼。想看完整解答再對照下面3個站。
課本第 1 題要你畫出超平面 $1 + 3X_1 - X_2 = 0$,並標出兩側。點 $(0, 0)$ 落在哪一側?
課本第 2 題的分類器規則是:$(1+X_1)^2 + (2-X_2)^2 > 4$ 判成藍色,否則紅色。四個點 $(0,0)$、$(-1,1)$、$(2,2)$、$(3,8)$ 分別是什麼顏色?而 (d) 小題問這個邊界算不算線性——答案是什麼?
課本第 3 題的 7 個點:紅色是 (3,4)、(2,2)、(4,4)、(1,4),藍色是 (2,1)、(4,3)、(4,1)。最佳分離超平面是 $X_2 = X_1 - 0.5$。哪幾筆是支持向量?(f) 小題問「第 7 筆 (4,1) 稍微移動會不會影響超平面」——為什麼?
課本第 6 題要你造一組「剛好可以線性分開」的資料,然後比較大 C 與小 C。課本的主張是什麼,理由是什麼?(這裡的 C 是 sklearn 的 C)
考前把這一頁掃過去就好。
| 最大邊界分類器 | 支持向量分類器 | 支持向量機(SVM) | |
|---|---|---|---|
| ISLP 節次 | §9.1.3–9.1.4 | §9.2 | §9.3 |
| 資料要可分開嗎 | 要,不可分就沒有解 | 不用 | 不用 |
| 邊界形狀 | 直的 | 直的 | 可以彎 |
| 允許違反 margin | 不允許 | 允許(用 C 控制) | 允許 |
| 調整參數 | 沒有 | C | C + 核的參數(d 或 γ) |
| 解由誰決定 | 支持向量 | 支持向量 | 支持向量 |
| sklearn | SVC(kernel='linear', C=1e5) | SVC(kernel='linear', C=…) | SVC(kernel='rbf'/'poly', …) |
| 核 | 式子 | 調的參數 | 優點 | 缺點 |
|---|---|---|---|---|
| 線性 | Σⱼ xᵢⱼxᵢ′ⱼ | 只有 C | 快、可以看 coef_、不易過度配適;p ≫ n 的首選 | 邊界只能是直的 |
| d 次多項式 | (1 + Σⱼ xᵢⱼxᵢ′ⱼ)^d | C、d | 比線性有彈性,d 的意義很具體 | d 大時數值不穩;實務只用小 d |
| 徑向基(RBF) | exp(−γ Σⱼ (xᵢⱼ−xᵢ′ⱼ)²) | C、γ | 最有彈性、有界(數值穩)、只有一個核參數 | 沒有 β 可解讀、比線性慢、容易過度配適 |
Ch09-svm-lab-zh.ipynb)| 情境 | 設定 | 支持向量 | 結果 | 出處 |
|---|---|---|---|---|
| 50 筆·不可分開 | C = 10 | 29(15 + 14) | coef_ = [1.173, 0.773] | 儲存格 22、23、29 |
| 50 筆·不可分開 | C = 0.1 | 36(18 + 18) | margin 更寬 | 儲存格 27 |
| 50 筆·不可分開 | CV 選 C | — | best C = 1,準確率 0.74 | 儲存格 31、33 |
| 50 筆·不可分開 | C = 1(測試) | — | 70% 正確(8 + 6 / 20) | 儲存格 37 |
| 50 筆·不可分開 | C = 0.001(測試) | — | 60% 正確 | 儲存格 39 |
| 50 筆·可分開 | C = 10⁵ | 3 | 訓練誤差 0,margin 極窄 | 儲存格 43–46 |
| 50 筆·可分開 | C = 0.1 | 12 | 訓練誤差 0,margin 寬得多 | 儲存格 47、48 |
| 同心圓 100 筆 | 二次核 | — | 訓練準確率 1.0 | 儲存格 52、53 |
| 200 筆·非線性 | RBF, CV 選 C 與 γ | — | best C = 1、γ = 0.5,測試錯誤 12% | 儲存格 67、69 |
| Khan(4 類) | 線性核, C = 10 | — | 訓練誤差 0;測試 20 筆錯 2 筆 | 儲存格 88、90、92 |
| 200 筆·核近似 | RBFSampler + SGD | — | 訓練準確率 0.84 | 儲存格 97 |
| 名稱 | 式子 | 備註 |
|---|---|---|
| 超平面 | $\beta_0 + \beta^{\top}X = 0$ | 式 9.1–9.2 |
| 點到超平面的距離 | $|f(x)| / \lVert\beta\rVert$ | 講義第 6 頁 |
| 分離超平面的條件 | $y_i f(x_i) > 0 \;\forall i$ | 式 9.8 |
| 最大邊界 | max M s.t. $\sum\beta_j^2=1$, $y_i f(x_i) \ge M$ | 式 9.9–9.11 |
| 軟邊界 | 多了 $y_i f(x_i) \ge M(1-\epsilon_i)$, $\sum\epsilon_i \le C$ | 式 9.12–9.15 |
| 對偶問題 | max $\sum_i\alpha_i - \frac12\sum_i\sum_{i'}\alpha_i\alpha_{i'}y_iy_{i'}\langle x_i,x_{i'}\rangle$ | 講義第 17–18 頁;只出現內積 |
| 線性核的解 | $f(x) = \beta_0 + \sum_{i \in S}\alpha_i\langle x,x_i\rangle$ | 式 9.19;S 是支持向量的索引集 |
| 核化的解 | $f(x) = \beta_0 + \sum_{i \in S}\alpha_i K(x,x_i)$ | 式 9.23 |
| 多項式核 | $\left(1+\sum_j x_{ij}x_{i'j}\right)^{d}$ | 式 9.22 |
| 徑向基核 | $\exp\left(-\gamma\sum_j (x_{ij}-x_{i'j})^2\right)$ | 式 9.24 |
| 損失 + 懲罰 | min $\sum_i \max[0, 1-y_if(x_i)] + \lambda\sum_j\beta_j^2$ | 式 9.25–9.26;λ 大 ↔ 預算 C 大 |
Pipeline 才不會洩漏。C 與核參數要一起用網格搜尋調,
兩者都在控制彈性。SVM 不吐機率,需要機率就用邏輯斯迴歸,
或接受 probability=True 的額外成本。
本頁「預期輸出」逐字取自課程 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 第 9 章,正面是中文術語(附英文原名)。 先看正面、心裡默想定義,再翻面對答案;洗牌後再過一輪,直到每張都能不看答案講出來。