f 是什麼、誤差從哪來

ISLP 第 2 章 — 對應講義 02
Y = f(X) + ε|可縮減 vs 不可縮減|訓練 MSE vs 測試 MSE|偏差² + 變異 + Var(ε)|Bayes 分類器|KNN
向下捲動開始互動
📌 本頁使用方式(ISLP Ch.2|講義 02)

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

CONTENTS · 內容目錄
PROLOGUE · 開場

把「學習」寫成一條式子:Y = f(X) + ε ISLP §2.1講義 02 · p.2–9

第 1 章告訴你統計學習是幹什麼的。這一章要把它寫成一條式子, 之後九章的所有方法都只是在這條式子的不同位置上動手腳。式子長這樣:

$$Y = f(X) + \varepsilon$$

$Y$ 是你想預測的那個東西(銷售量、油耗、會不會違約), $X = (X_1, \dots, X_p)$ 是你手上量得到的那些變數。 $f$ 是「$X$ 對 $Y$ 提供的系統性資訊」——固定不變、真實存在,但你永遠看不到它。 $\varepsilon$ 是隨機誤差項,跟 $X$ 無關,平均值是 0。

整章只做兩件事:(一)怎麼估 f(二)怎麼判斷估得好不好。 聽起來很抽象,但第二件事其實是整本書最實用的部分——因為「看起來配得很漂亮」 跟「在新資料上真的準」是兩件常常相反的事。

為什麼一定要有 ε 這一項 把它拿掉,式子就變成 Y = f(X),等於宣稱 「只要知道 X 就能完全算出 Y」。這在真實世界幾乎不成立:
1. 沒量到的變數:病人對藥物的反應還跟基因、當天狀況有關,而你沒有那些欄位。
2. 無法量的變異:同一批藥的製造差異、同一個人不同天的身體狀況。
3. 量測誤差:儀器本身就有雜訊。
ε 就是這些東西的集合。它的變異數 Var(ε) 會變成你努力的天花板——這是下一節的主題。

先把兩個常見的目的分清楚,因為它們會導向完全不同的方法選擇:

預測(prediction)推論(inference)
你要什麼Ŷ 愈接近 Y 愈好搞懂 X 怎麼影響 Y
f̂ 可以是黑盒子嗎可以,沒人在意它長什麼樣不行,必須看得懂
典型問題這封信是垃圾郵件嗎?這支股票明天多少?哪個媒體的廣告有效?漲價會少賣多少?
偏好的模型彈性高的(提升法、神經網路)可解釋的(線性模型、lasso)
本章對應§2.2 怎麼量準不準§2.1.3 彈性換掉了解釋力

兩者也可以同時要。房價模型既想知道「靠河的房子貴多少」(推論), 也想知道「這間房子被高估了嗎」(預測)。只是通常得在中間選一個折衷點。

講義完整實作:把 (X, Y) 讀進 Python

第 2 章的 lab 是 Python 入門,所以下面每一張卡的定位是 「這一節的計算需要哪一個工具」。先從最基本的開始:把資料讀成一張表, 才有 X 和 Y 可以談。

講義 02 · 讀 Auto 並處理遺漏值
Auto = pd.read_csv(os.path.join(DATA_PATH,'Auto.data'), na_values=['?'], sep=r"\s+") Auto['horsepower'].sum()
預期輸出
np.float64(40952.0)

Auto.data 裡的遺漏值是用 ? 編碼的,不告訴 pd.read_csv() 這件事,整個 horsepower 欄位就會被讀成字串(lab 儲存格 190、192 示範了那個災難)。na_values=['?'] 之後才加得起來,總和是 40952.0

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 195
講義 02 · n 與 p 到底是多少
Auto.shape Auto_new = Auto.dropna() Auto_new.shape
預期輸出
(392, 9)

原始資料 397 列、9 欄;丟掉含遺漏值的 5 列之後是 392 × 9。如果要用 mpg 當 Y、其他數值欄當 X,那就是 n = 392、p = 7(扣掉 mpg 與文字欄 name)。本章的符號約定就是這樣對上真實資料的。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 197、199
QUIZ · Y = f(X) + ε

下列哪一句話正確描述了式子 Y = f(X) + ε 裡的 f

(A) f 是固定但未知的函數,代表 X 對 Y 提供的系統性資訊
(B) f 是我們配出來的模型,會隨著訓練資料改變
(C) f 包含了所有影響 Y 的因素,所以 ε 只是量測誤差
PART 01 · 兩種誤差

可縮減與不可縮減誤差:努力的上限在哪 ISLP §2.1.1講義 02 · p.10–15

先問一個看似哲學、其實非常實用的問題:如果你猜對了 f,誤差會是 0 嗎? 不會。假設 $\hat f$ 與 $X$ 都固定,只有 $\varepsilon$ 在變動,那麼

$$E\left(Y - \hat Y\right)^2 = \underbrace{\left[f(X) - \hat f(X)\right]^2}_{\text{可縮減}} + \underbrace{\mathrm{Var}(\varepsilon)}_{\text{不可縮減}}$$

這是 ISLP 式 2.3。左邊是你會量到的平均平方誤差,右邊拆成兩塊:

順帶把「最好的 f」講清楚。在平方誤差的意義下,最好的預測函數就是條件期望值, 也就是迴歸函數(regression function):

$$f(x) = E\left[Y \mid X = x\right], \qquad \varepsilon = Y - f(x)$$

講義第 11 頁畫的就是這個:在 $x$ 這條垂直線上,$Y$ 有一整個分佈, $f(x)$ 是那個分佈的平均。剩下的上下散開就是 $\varepsilon$,誰也拿不走。

拖動 σ 滑桿,看不可縮減下限跟著抬高。
σ1.0
怎麼玩這個元件 ISLP 式 2.3
真實的 f(綠色虛線)固定不動,只有噪音的 σ 在變。綠色淡帶是 f ± σ 的範圍。拖滑桿把 σ 拉大,看點雲怎麼變胖——而 f 一動也沒動。
兩種誤差的即時對帳
σ(噪音的標準差)1.0
Var(ε) = σ² ← 下限1.00
用完美的 f̂ = f 算 MSE
用線性 f̂ 算 MSE
差額 = 可縮減部分
重點在哪一行
看「用完美的 f̂ = f 算 MSE」那一行:它永遠在 σ² 附近抖動,不會趨近 0。這就是不可縮減誤差。線性 f̂ 那一行比它高出來的部分,才是你努力可以拿回來的。

講義第 12–15 頁接著問:那要怎麼估 $E[Y \mid X = x]$?最直覺的辦法是 最近鄰平均(nearest neighbor averaging)——把 $x$ 附近一小塊區域裡的 $y$ 平均起來當作 $f(x)$。一維、二維時這招很好用,可是

維度詛咒:最近鄰平均在高維會壞掉 在 p 維空間裡,要圈到 10% 的資料, 每個座標軸上平均得覆蓋 0.101/p 的範圍:p = 1 要 10%, p = 10 要 80%,p = 20 要 89%。 也就是說「最近的那幾個鄰居」其實離得非常遠,鄰域裡的 f 早就不是近似常數了, 平均出來的東西沒有偏差保證。
這就是講義第 13–15 頁的維度詛咒(curse of dimensionality), 也是高維問題偏好參數式模型(下一節)的根本理由。

講義完整實作:親手做出一個 Y = f(X) + ε

講義 02 · 噪音讓相關係數到不了 1
y = x + np.random.normal(loc=50, scale=1, size=50) np.corrcoef(x, y)
預期輸出
array([[1.        , 0.78689588],
       [0.78689588, 1.        ]])

儲存格 74 先產生 50 個標準常態的 x。這裡的 y = x + N(50, 1) 意思是真實的 f(x) = x + 50,一點都沒錯,而 ε 是標準差 1 的常態。既然 f 完全正確,相關係數為什麼不是 1?因為 Var(x) = 1、Var(ε) = 1,理論相關是 1/√2 ≈ 0.707,實測 0.787(50 筆的抽樣波動)。那個缺口就是不可縮減誤差。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 74、76、78
講義 02 · 用樣本變異數估 Var(ε)
rng = np.random.default_rng(3) y = rng.standard_normal(10) np.mean(y), y.mean() np.var(y), y.var(), np.mean((y - y.mean())**2)
預期輸出
(np.float64(2.7243406406465125),
 np.float64(2.7243406406465125),
 np.float64(2.7243406406465125))

三個寫法給出同一個數字 2.7243406406465125,因為它們算的是同一件事:np.mean((y - y.mean())**2)。MSE 也是「平方的平均」,同一個動作。注意 np.var() 預設除以 n 而不是 n − 1(看 ddof 參數)——估 Var(ε) 時這個差別在小樣本上是會被抓出來的。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 84、85
觀念釐清
Q:「不可縮減誤差」到底不可縮減在哪?多蒐集資料有用嗎?多加變數呢?

先講結論:多蒐集資料沒用,多加變數有用——但加進來的那部分就不再算是 ε 了。

不可縮減誤差是 $\mathrm{Var}(\varepsilon)$,而 $\varepsilon$ 的定義是 $Y - E[Y \mid X]$,也就是「在給定這組 X 之後,Y 還剩下的變異」。資料量 n 變大只會讓你把 f 估得更準(打的是可縮減那一塊),$\mathrm{Var}(\varepsilon)$ 是母體的性質,跟你抽了幾筆完全無關。

加變數就不一樣了。假設病人的反應其實還跟基因型有關,而你原本沒量。那部分變異現在被塞在 $\varepsilon$ 裡。一旦把基因型加進 X,$E[Y \mid X]$ 這個條件期望值本身就換了一個(更小的變異、更複雜的 f),$\mathrm{Var}(\varepsilon)$ 於是變小。所以嚴格說法是:不可縮減誤差是「相對於你手上這組 X」的下限,不是宇宙常數。

實務上的意義:如果測試誤差已經逼近你估計的 $\mathrm{Var}(\varepsilon)$,再換模型、再調參數都是浪費時間,該去找新的變數了。

QUIZ · 兩種誤差

你把模型從線性迴歸換成一個非常彈性的方法,測試 MSE 從 5.2 降到 2.4。已知 Var(ε) = 2.0。下列哪個判斷最合理?

(A) 可縮減誤差從約 3.2 降到約 0.4,剩下的空間已經很小,該去找新變數而不是繼續換模型
(B) 還能再降到 0,因為彈性可以無限提高
(C) Var(ε) = 2.0 表示資料品質太差,應該重新蒐集同樣的資料
PART 02 · 參數式與非參數式

先假設形狀,還是讓資料自己長? ISLP §2.1.2講義 02 · p.16–21

知道要估 $f$ 了,接下來的分岔是:要不要先假設 f 的形狀? 兩條路各有代價。

參數式方法(parametric method)分兩步。第一步假設形狀, 最簡單的假設是線性:

$$f(X) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p$$

第二步用訓練資料估那 $p + 1$ 個係數(第 3 章的最小平方法)。 這一招的威力在於:原本要估「一個任意的 $p$ 維函數」,現在只要估 $p+1$ 個數字。 代價是——假設錯了就一路錯。ISLP 圖 2.4 的黃色平面明顯漏掉了 真實 $f$ 的彎曲(圖 2.3 的藍色曲面)。

非參數式方法(non-parametric method)不預設形狀, 只要求配出來的曲面「貼近資料又不要太粗糙」。ISLP 圖 2.5 用薄板樣條 (thin-plate spline)配同一份 Income 資料,還原得非常漂亮。 但天下沒有白吃的午餐:

非參數式的代價是資料量 因為沒把問題化簡成少數幾個參數, 非參數式方法需要遠比參數式方法更多的觀測值才估得準。 這跟上一節的維度詛咒是同一件事的兩種說法。
而且它還多出一個要你決定的東西:平滑程度。 ISLP 圖 2.6 把平滑程度放鬆,配出來的曲面通過每一個訓練點、 訓練誤差是 0——看起來完美,但它跟真實的 f(圖 2.3)差得很遠。 這就是過度配適,也是下面兩節要量化的東西。
參數式(parametric)非參數式(non-parametric)
做法先假設 f 的形狀,再估參數不假設形狀,直接讓資料長出曲面
要估什麼有限個參數(β₀…βₚ)整個函數,沒有固定的參數個數
需要的資料量多,而且隨 p 增加得非常快
假設錯的後果系統性偏掉(高偏差)幾乎沒有這個風險
額外要選的東西形狀(線性?加二次項?)平滑程度
ISLP 例子圖 2.4 的線性平面圖 2.5/2.6 的薄板樣條
本書章節第 3、4、6 章第 7(樣條、GAM)、8(樹)、9 章

講義完整實作:先把「形狀」畫出來看看

講義 02 · 用等高線圖看一個指定的 f(x, y)
fig, ax = subplots(figsize=(8, 8)) x = np.linspace(-np.pi, np.pi, 50) y = x f = np.multiply.outer(np.cos(y), 1 / (1 + x**2)) ax.contour(x, y, f);

這一格自己指定了 f = cos(y) / (1 + x²),然後把它畫成等高線圖。這正是參數式的心態:先寫下一個形狀,剩下的只是把數字填進去。非參數式反過來——沒有這一行 f = ...,形狀要從資料裡長出來。順帶記住 np.multiply.outerax.contour:第 4、9 章畫決策邊界會一直用到。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 121
QUIZ · 參數式與非參數式

你有 n = 60 筆資料、p = 12 個預測變數,而且懷疑關係不是線性的。直接上一個很彈性的非參數式方法,主要的風險是什麼?

(A) p = 12 而 n = 60,非參數式方法在這種維度下沒有足夠的鄰居可以平均,會配出一個變異極大的 f̂
(B) 非參數式方法沒有參數,所以沒辦法做預測
(C) 非參數式方法一定比參數式方法偏差大,所以在小樣本上更不準
PART 03 · 彈性與可解釋性

彈性換來準度,也換掉了解釋力 ISLP §2.1.3講義 02 · p.22–26

把上一節的分岔攤開,其實是一條連續的光譜。一端是彈性低但看得懂, 另一端是彈性高但講不清楚。ISLP 圖 2.7 把本書的方法擺在這張圖上。

你可能會問:既然只要預測準,為什麼不永遠選最彈性的那個? ISLP 的回答很直接——令人意外的是,用比較不彈性的方法常常反而預測更準。 原因是過度配適,下一節就會用數字說清楚。

點圖上的方法,或按下方按鈕看兩種目的各該待在哪一區。
怎麼玩這個元件 ISLP 圖 2.7
點任何一個方法看它的定位與所在章節。兩個按鈕分別框出「做推論該待的區域」與「只求預測可以走的區域」。注意這張圖是示意,位置取自 ISLP 圖 2.7 的相對關係,不是量出來的座標。
目前選到的方法
方法最小平方線性迴歸
本書章節第 3 章
彈性
可解釋性
Lasso 為什麼比最小平方「更不彈性」
lasso(第 6 章)用的還是線性模型,但它的配適方式更受限,會把一部分係數壓成剛好 0。模型能生出的形狀變少(彈性更低),而最終模型只牽涉少數幾個變數(可解釋性更高)。
三個「選不彈性的」正當理由 1. 要做推論: 線性模型能直接回答「TV 廣告每多花一千元,銷售大約多幾單位」。 提升法給不出這種句子。
2. 樣本不夠:彈性高的方法要餵很多資料才穩,n 小的時候它的變異會吃掉一切。
3. 真實的 f 本來就簡單:如果 f 真的接近線性,線性迴歸的偏差幾乎是 0, 彈性方法只是白白多付變異。這是 P05 情境 B 的畫面。

講義完整實作:決定要多彈性之前,先看資料

講義 02 · 數值摘要
Auto[['mpg', 'weight']].describe()
預期輸出
              mpg       weight
count  392.000000   392.000000
mean    23.445918  2977.584184
std      7.805007   849.402560
min      9.000000  1613.000000
25%     17.000000  2225.250000
50%     22.750000  2803.500000
75%     29.000000  3614.750000
max     46.600000  5140.000000

describe() 一次給你 count/mean/std/五分位。mpg 的標準差 7.805 是「什麼都不做、直接猜平均」的誤差尺度——平方起來約 60.9。任何模型的測試 MSE 都要拿它當基準線比:比不過它,那個模型就沒有存在的必要。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 271
講義 02 · 散佈圖矩陣:一眼看出線性夠不夠
pd.plotting.scatter_matrix(Auto[['mpg', 'displacement', 'weight']]);

pd.plotting.scatter_matrix() 把所有兩兩關係一次畫出來。mpgweight 明顯是彎的——這就是「線性假設可能不夠」的第一手證據,也是決定要不要往彈性端走的依據。第 3 章會把這個觀察變成正式的殘差診斷。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 267、269
QUIZ · 彈性與可解釋性

下列哪一組方法在 ISLP 圖 2.7 上「彈性最低、可解釋性最高」?

(A) 子集選擇與 lasso
(B) 最小平方線性迴歸
(C) 廣義加法模型(GAM)與決策樹
PART 04 · 訓練與測試 MSE

訓練 MSE 一路往下,測試 MSE 是 U 型 ISLP §2.2.1講義 02 · p.27–29

要比較方法,得先有量尺。迴歸問題最常用的是均方誤差(MSE):

$$\mathrm{MSE} = \frac{1}{n} \sum_{i=1}^{n} \left(y_i - \hat f(x_i)\right)^2$$

問題在於:這個平均是對哪一批資料算的? 如果用的是配適時那批資料,它叫訓練 MSE; 如果用的是模型完全沒見過的資料,它叫測試 MSE。 兩者的行為完全不同,而我們真正在意的是後者。

為什麼不能用訓練 MSE 當代理?因為大部分方法就是直接或間接在最小化它。 你拿一個「已經被最佳化過的目標值」當成公正的評分,當然會太樂觀。 極端一點:一條通過每一個訓練點的曲線,訓練 MSE 是 0,但它什麼都沒學到。

按三個按鈕切換彈性,看訓練 MSE 與測試 MSE 各自往哪裡走。
怎麼看這兩張圖 ISLP 圖 2.9
上圖是同一組 50 個點(σ = 1)配上三種彈性的結果,綠色虛線是真實的 f。下圖是訓練 MSE(灰)與測試 MSE(紅)對彈性度的曲線,圓點標出上圖那三個選擇,紫色垂線是目前選的那一個。
目前的選擇
樣條自由度 df6
訓練 MSE
測試 MSE
Var(ε)(下限)1.00
彈性度是什麼
df = 配適時估的參數個數。df = 2 就是線性迴歸(截距加斜率),df ≥ 5 是三次迴歸樣條,節點依固定順序一個一個加進去——所以模型空間是巢狀的,訓練 MSE 保證單調下降。
這張圖的三個一定要看懂的地方 1. 訓練 MSE 從 3.43 一路掉到 0.48, 單調下降,沒有轉折——它永遠獎勵更多彈性。
2. 測試 MSE 是 U 型:3.26 → 最低約 1.02(df = 7)→ 回升到 1.50。 df = 25 的配適在訓練資料上是最好的,在新資料上卻比 df = 6 差了快 50%。
3. 那條水平虛線是 Var(ε) = 1.00。 測試 MSE 貼近它,但永遠碰不到——這就是上一節的不可縮減誤差。

ISLP 強調這個形狀是統計學習的基本性質: 不管用什麼資料、什麼方法,訓練 MSE 會隨彈性下降,而測試 MSE 不一定。 當訓練 MSE 很小、測試 MSE 卻很大,我們就說發生了過度配適(overfitting)。

過度配適的嚴格定義 不是「訓練 MSE 比測試 MSE 小」—— 那幾乎永遠成立,因為方法本來就在最小化訓練 MSE。
過度配適指的是:存在一個比較不彈性的模型,它的測試 MSE 反而更小。 上圖裡 df = 25 是過度配適(df = 6 更好),而 df = 6 不是。

講義完整實作:期望值就是加權平均

講義 02 · 用 zip 算加權和
total = 0 for value, weight in zip([2,3,19], [0.2,0.3,0.5]): total += weight * value print('Weighted average is: {0}'.format(total))
預期輸出
Weighted average is: 10.8

這一格算的是一個隨機變數的期望值:值 2、3、19,機率 0.2、0.3、0.5,E[X] = 2(0.2) + 3(0.3) + 19(0.5) = 10.8。MSE 是「平方誤差的平均」、期望測試 MSE 是「對所有可能的訓練集與測試點取平均」——本章所有的 E[·] 拆到最底層都是這個加權和。zip() 之後會在每一次「對每筆資料算誤差再平均」時出現。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 240
觀念釐清
Q:為什麼測試 MSE 一定是 U 型?訓練 MSE 為什麼不是?

先講訓練 MSE。彈性愈高,模型能生出的函數集合愈大(本頁的樣條是巢狀的,df = 6 能配出的每一條曲線 df = 7 都能配出來)。既然在更大的集合裡找最小值,最小值只可能更小或一樣。所以訓練 MSE 單調不上升——這是純粹的最佳化事實,跟資料是什麼無關。

測試 MSE 就沒有這個保護,因為它衡量的是「在沒見過的點上」的表現。拆解式(下一節)說它等於偏差² + 變異 + $\mathrm{Var}(\varepsilon)$。彈性上升時偏差²下降、變異上升。一開始偏差²掉得比變異漲得快,所以總和往下;某個點之後偏差²已經幾乎為 0、沒東西可掉了,變異卻還在漲,總和於是往上。兩個反向的量相加,形狀就是 U。

要注意「U 型」講的是一般趨勢。真實 f 剛好接近線性時,偏差²從一開始就幾乎是 0,U 的左半邊等於不存在,圖看起來就是單調上升(下一節的情境 B)。所以嚴格的說法是:測試 MSE 的最低點可能落在任何位置,包含最左邊。

QUIZ · 訓練與測試 MSE

手上有兩個模型:A 的訓練 MSE = 0.20、測試 MSE = 1.90;B 的訓練 MSE = 0.95、測試 MSE = 1.05。應該選哪一個?為什麼?

(A) 選 B。我們要的是在新資料上的表現,A 的訓練與測試差距顯示它在配適噪音
(B) 選 A。訓練 MSE 小表示它真的學到了資料裡的結構
(C) 資訊不足,還要看兩個模型的訓練 MSE 差距是否顯著
PART 05 · 偏差–變異拆解

把測試 MSE 拆成三塊:偏差²、變異、不可縮減誤差 ISLP §2.2.2ESL §7.3 · 進階

上一節看到了 U 型,這一節解釋它是怎麼長出來的。可以證明: 在某個測試點 $x_0$ 上,期望測試 MSE 一定能拆成三塊 (ISLP 式 2.7、ESL 式 7.9):

$$E\left(y_0 - \hat f(x_0)\right)^2 = \mathrm{Var}\!\left(\hat f(x_0)\right) + \left[\mathrm{Bias}\!\left(\hat f(x_0)\right)\right]^2 + \mathrm{Var}(\varepsilon)$$

三項都非負,所以期望測試 MSE 永遠不可能低於 $\mathrm{Var}(\varepsilon)$—— 這條式子同時給了 U 型的機制與 P01 那條下限。三項各是什麼意思:

圖表需要連網載入 Chart.js。此圖的重點:偏差² 隨彈性下降、變異隨彈性上升,兩者相加再加上 Var(ε) 就是 U 型的測試 MSE;最低點的位置隨真實 f 的形狀而變(情境 B 在 df = 2,情境 C 在 df = 18)。
切換三個情境:真實 f 的形狀怎麼改變最佳彈性度。
這張圖怎麼算出來的 ISLP 圖 2.12
固定真實的 f 與 σ = 1,重抽 M = 300 組訓練集(每組 n = 50,訓練點的 x 固定、只有 ε 重抽),對每個彈性度算出 300 條 f̂,再在 201 個測試點上算偏差²與變異並平均。三個情境共用同一組 ε。
這個情境的最低點
情境中度非線性
最佳 df
該點的總測試 MSE
其中偏差²
其中變異
Var(ε)1.00
一個值得注意的巧合(其實不是巧合)
三個情境的變異曲線完全相同。因為對線性平滑器來說 Var(f̂) 只跟設計矩陣與 σ² 有關,跟真實的 f 一點關係都沒有。三張圖的差別百分之百來自偏差²。
三個情境的最佳 df 分別是 2、7、18 這就是 ISLP 圖 2.12 想講的唯一一件事: 沒有一個放諸四海皆準的彈性度。
情境 B(接近線性):偏差²從一開始就幾乎是 0,加彈性只是白付變異, df = 2 最好。
情境 A(中度非線性):偏差²一開始掉得快,總和先降後升,經典的 U。
情境 C(高度非線性):df = 2 的偏差²高達 20.06, 加彈性的報酬極大,要到 df = 18 才觸底。
真實的 f 你看不到,所以這個最佳點得靠第 5 章的交叉驗證去估。

順帶一個 ESL §7.3 給的漂亮特例。對 KNN 迴歸,三項有封閉形式(ESL 式 7.10):

$$\mathrm{Err}(x_0) = \sigma_\varepsilon^2 + \left[f(x_0) - \frac{1}{k} \sum_{\ell=1}^{k} f(x_{(\ell)})\right]^2 + \frac{\sigma_\varepsilon^2}{k}$$

看第三項:變異就是 $\sigma_\varepsilon^2 / k$,$k$ 愈大愈小。 第二項是「$f(x_0)$ 與 $k$ 個鄰居上 $f$ 的平均」之差,$k$ 愈大鄰居愈遠、這個差愈大。 一條式子把偏差–變異取捨寫得清清楚楚,也預告了本頁最後一節的 KNN。

講義完整實作:蒙地卡羅要能重現

講義 02 · 沒固定種子 vs 固定種子
print(np.random.normal(scale=5, size=2)) print(np.random.normal(scale=5, size=2)) rng = np.random.default_rng(1303) print(rng.normal(scale=5, size=2)) rng2 = np.random.default_rng(1303) print(rng2.normal(scale=5, size=2))
預期輸出
[ 4.09482632 -1.07485605]
[ 4.09482632 -1.07485605]

儲存格 80 連呼叫兩次 np.random.normal(),得到兩組不同的數字;儲存格 82 用 np.random.default_rng(1303) 各建一個產生器,兩次印出完全一樣[4.09482632 -1.07485605]。上面那張偏差–變異圖就是靠這件事才可信:default_rng(524)、M = 300 組訓練集,任何人重跑 tools/frames/gen_statlearn.py 都會得到同樣的曲線。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 80、82
蒙地卡羅拆解的虛擬碼 CODE
for d in 彈性度清單: for m in range(M): # M = 300 組訓練集 y = f(x_train) + rng.normal(0, sigma) fhat[m] = 用 d 配適(x_train, y).predict(x_test) bias2 = mean((fhat.mean(axis=0) - f(x_test))**2) var = mean(fhat.var(axis=0)) total = bias2 + var + sigma**2

注意 fhat.mean(axis=0):平均是跨 300 組訓練集取的, 不是跨測試點。這正是下面 Q&A 要釐清的地方。

觀念釐清
Q:偏差–變異拆解是在對「什麼」取期望值?

訓練集的重複抽樣取期望,不是對某一個已經配好的模型。這是整章最常被誤解的一句話。

拆解式裡的 $\hat f(x_0)$ 是一個隨機變數:它的隨機性來自「你剛好抽到哪一組訓練資料」。$E[\hat f(x_0)]$ 是「想像重複蒐集無數份訓練資料、每份都配一次模型、把這些 $\hat f(x_0)$ 平均起來」。偏差是這個平均與真值 $f(x_0)$ 的差;變異是這些 $\hat f(x_0)$ 自己的散開程度。

所以下面兩句話是不同的意思,不要搞混:

  • 「這個模型的變異很大」:換一份訓練資料,配出來的模型會很不一樣。這是拆解式講的變異。
  • 「這個模型的預測值散得很開」:在不同的 $x$ 上預測值差很多。這只是說 $\hat f$ 這條曲線起伏大,跟拆解式的變異不是同一件事

實務上的後果:你手上只有一份訓練資料,所以偏差與變異沒辦法分別算出來——上面那張圖能畫,是因為那是模擬,我們知道真實的 f,也能想抽幾組訓練集就抽幾組。真實資料上你只能估它們的總和(第 5 章的交叉驗證),然後靠這一節的直覺判斷該往哪邊調。

QUIZ · 偏差–變異拆解

把訓練資料從 100 筆加到 10000 筆,其他都不變。對一個很彈性的方法,拆解式的三項會怎麼變?

(A) 變異明顯下降,偏差幾乎不變,Var(ε) 完全不變
(B) 三項都下降,因為資料愈多估得愈準
(C) 偏差下降、變異上升,因為模型可以配得更複雜
PART 06 · Bayes 分類器與 KNN

分類設定:最好能做到多好,KNN 又靠 K 做什麼 ISLP §2.2.3講義 02 · p.31–41

前面全都在講迴歸。搬到分類問題,觀念一個都不用丟,只要換掉量尺: 把 MSE 換成錯誤率(error rate)。

$$\text{訓練錯誤率} = \frac{1}{n} \sum_{i=1}^{n} I(y_i \neq \hat y_i), \qquad \text{測試錯誤率} = \mathrm{Ave}\left(I(y_0 \neq \hat y_0)\right)$$

$I(\cdot)$ 是指示變數:分錯是 1、分對是 0,所以這個式子就是「分錯的比例」。 跟迴歸一樣,我們在意的是測試錯誤率,而訓練錯誤率會系統性偏低。

Bayes 分類器:能做到多好的天花板

可以證明(證明超出 ISLP 範圍),測試錯誤率會被一個非常簡單的分類器最小化: 把每一筆觀測指派給條件機率最大的那個類別

$$\text{把 } x_0 \text{ 指派給使 } \Pr(Y = j \mid X = x_0) \text{ 最大的 } j$$

這叫做 Bayes 分類器。兩類問題裡,它就是 「$\Pr(Y = 1 \mid X = x_0) > 0.5$ 就猜 1,否則猜 2」。 機率恰好等於 0.5 的那條線是 Bayes 決策邊界。 它達到的錯誤率是所有分類器的下限

$$\text{Bayes 錯誤率} = 1 - E\left[\max_j \Pr(Y = j \mid X)\right]$$

它大於 0,因為兩類在母體裡本來就重疊。 Bayes 錯誤率就是分類問題版本的不可縮減誤差。 下面這個元件把「重疊」直接畫出來:

拉開兩類的距離或縮小 σ,看 Bayes 錯誤率怎麼掉。
Δμ2.0
σ1.00
怎麼玩這個元件 ISLP 式 2.11
兩個等權重的常態分佈代表兩個類別。第一個滑桿拉開它們的平均值差距,第二個滑桿改變共同的 σ。橘色陰影就是重疊的部分,面積的一半就是 Bayes 錯誤率。兩個先驗相等時決策邊界固定在中線(紫色虛線)。
即時數字
平均值差距 Δμ2.0
共同標準差 σ1.00
標準化距離 Δμ ⁄ σ
Bayes 錯誤率
最高可能正確率
為什麼是 Φ(−Δμ ⁄ 2σ)
先驗相等、σ 相同時,邊界落在兩個平均值的中點。某一類被分錯的機率就是它落到中點另一邊的機率,也就是標準常態在 −Δμ ⁄ 2σ 以下的機率。Δμ = 0 時兩類完全重疊,錯誤率 0.500——此時任何分類器都只能瞎猜。

KNN:不知道真實機率時的替代方案

Bayes 分類器要求你知道 $\Pr(Y \mid X)$——真實資料上不可能。 K 最近鄰(K-nearest neighbors, KNN)用最土的辦法把它估出來: 找出離 $x_0$ 最近的 $K$ 個訓練點(記作 $\mathcal{N}_0$),數一數裡面各類佔幾成。

$$\widehat{\Pr}(Y = j \mid X = x_0) = \frac{1}{K} \sum_{i \in \mathcal{N}_0} I(y_i = j)$$

然後指派給比例最高的那一類。就這樣,沒有參數、沒有假設。 $K$ 是唯一的旋鈕,而它控制的正是彈性:$1/K$ 就是 KNN 的彈性度

切換 K,看決策區域與 Bayes 邊界(紫色虛線)差多少。
怎麼看這張圖 ISLP 圖 2.15–2.16
底色是 KNN 的決策區域(30 × 30 格點,各自問一次 KNN 要猜哪一類),紫色虛線是真實的 Bayes 決策邊界,圓點是 200 筆訓練資料。按鈕切換 K,看區域從破碎變成平滑。
這個 K 的表現
K10
彈性度 1 ⁄ K0.100
訓練錯誤率
測試錯誤率(5000 筆)
Bayes 錯誤率(下限)0.1382
三個 K 的故事
K = 1:訓練錯誤率 0.000,測試 0.1964。邊界破碎,抓到的是噪音——低偏差、極高變異。
K = 10:測試 0.1470,最接近 Bayes 下限 0.1382。
K = 100:測試 0.1758。邊界過度平滑、快變成直線——高偏差、低變異。
Bayes 錯誤率算不出來,那講它有什麼用 1. 它定義了「盡力了」的意思。 測試錯誤率已經逼近估計的 Bayes 錯誤率時,再換模型是浪費時間,該回頭找新變數—— 跟 P01 那個「測試 MSE 逼近 Var(ε)」的判斷完全平行。
2. 它是模擬研究的裁判。在已知真實分佈的模擬資料上它算得出來, 這時「離下限多遠」比「錯誤率多少」有意義得多,上面那個元件就是這樣用的。
3. 它告訴你目標是估機率,不是估標籤。 Bayes 分類器的形式是「比較條件機率的大小」,所以第 4 章的邏輯斯迴歸、LDA、Naive Bayes 全都在做同一件事:各用不同的假設去估那個條件機率,再套上同一個「取最大」的規則。

把所有的 $K$ 一次畫出來,就是 ISLP 圖 2.17 的形狀—— 跟迴歸那邊的訓練/測試 MSE 圖一模一樣的故事

圖表需要連網載入 Chart.js。此圖的重點:橫軸是 1/K(往右愈有彈性)。訓練錯誤率在 K = 1 時是 0 並隨彈性下降,測試錯誤率卻是 U 型,最低點在 K = 50 附近,而且永遠碰不到 Bayes 錯誤率 0.1382。
訓練錯誤率隨彈性單調下降,測試錯誤率是 U 型。
怎麼看這張圖 ISLP 圖 2.17
橫軸是 $1/K$(對數刻度),往右愈有彈性。藍線是訓練錯誤率、紅線是測試錯誤率、灰色虛線是 Bayes 錯誤率。注意最右端(K = 1):訓練錯誤率是 0,測試錯誤率卻最差。
讀出來的數字
最佳 K
最佳的測試錯誤率
K = 1 的測試錯誤率
K = 150 的測試錯誤率
Bayes 錯誤率0.1382
跟課本數字對一下
ISLP 圖 2.15–2.17 用的是它自己的模擬資料,報告的是 Bayes 0.1304、K = 10 為 0.1363、K = 1 為 0.1695、K = 100 為 0.1925。本頁是另一份模擬(種子與參數寫在 meta 裡),所以數字不同——但形狀與量級一致,那才是重點。

講義完整實作:錯誤率其實就是布林陣列取平均

講義 02 · 用布林陣列挑出「屬於這一類」的資料
keep_rows[[1,3]] = True keep_rows A[keep_rows]
預期輸出
array([[ 4,  5,  6,  7],
       [12, 13, 14, 15]])

keep_rows 是一個布林陣列,A[keep_rows] 只留下 True 的那幾列。KNN 在數「鄰居裡有幾個屬於類別 j」時做的就是這件事:先算出一個布林陣列,再數它。注意 lab 儲存格 169 的對照:np.array([0,1,0,1]) 雖然跟 keep_rows== 比是相等的,但當索引用時 numpy 會把整數當位置、把布林當遮罩,結果完全不同。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 162、164、171
講義 02 · 布林取平均就是比例
for col in D.columns: template = 'Column "{0}" has {1:.2%} missing values' print(template.format(col, np.isnan(D[col]).mean()))
預期輸出
Column "food" has 16.54% missing values
Column "bar" has 25.98% missing values
Column "pickle" has 29.13% missing values
Column "snack" has 21.26% missing values
Column "popcorn" has 22.83% missing values

np.isnan(D[col]).mean():對布林陣列取平均,True 當 1、False 當 0,算出來就是「成立的比例」。錯誤率 (1/n)ΣI(yᵢ ≠ ŷᵢ) 完全是同一個動作,程式上寫成 (y != y_hat).mean()。指示變數 I(·) 在 Python 裡就是一個布林陣列。

來源:Ch02-statlearn-lab-zh.ipynb · 儲存格 243、244
觀念釐清
Q:KNN 的 K = 1 為什麼訓練錯誤率是 0,這代表它很好嗎?

K = 1 時,要預測訓練點 $x_i$ 的類別,KNN 會去找「離 $x_i$ 最近的 1 個訓練點」——而那個點就是 $x_i$ 自己,距離 0。於是它回報 $x_i$ 自己的標籤,百分之百正確。訓練錯誤率必定是 0,跟資料好壞完全無關。

所以這個 0 沒有任何資訊。它是「用配適時那批資料評分」這個做法的極端失效案例,跟迴歸那邊「通過每一個點的曲線訓練 MSE = 0」是同一個病。本頁的模擬裡,K = 1 的測試錯誤率是 0.1964,是所有 K 之中最差的幾個之一,而 Bayes 下限只有 0.1382。

那 K = 1 有什麼用?它是彈性的極端:偏差極低(決策邊界可以任意扭曲)、變異極高(換一份訓練資料邊界就整個變樣)。資料量非常大、噪音非常小的時候,K = 1 是可以贏的——ISLP 第 4 章與第 9 章會再回到這個取捨。

QUIZ · Bayes 分類器與 KNN

在一份二維兩類資料上,你發現 K = 1 的測試錯誤率比 K = 25 高很多。最合理的解讀是什麼?

(A) K = 1 太有彈性,決策邊界抓到了訓練資料的噪音;K = 25 平滑掉噪音後更接近真實邊界
(B) K = 1 的訓練錯誤率是 0,所以它一定過度配適;K 愈大一定愈好
(C) 這表示資料的 Bayes 錯誤率很高,換任何 K 都沒有用
EXERCISES · 練習

動手驗證:ISLP 第 2 章精選題 ISLP §2.4 習題

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

EXERCISE 1 · ISLP 2.4 第 1 題(b)(d)

第 1 題問「彈性方法會比不彈性方法好還是差」。考慮 (b) p 極大而 n 很小,以及 (d) 誤差項的變異 σ² = Var(ε) 極大。這兩種情況呢?

(A) 兩種情況都比較差:(b) 資料不夠支撐彈性方法,(d) 彈性方法會去配噪音
(B) (b) 較差、(d) 較好,因為噪音大的時候更需要彈性去捕捉細節
(C) 兩種情況都比較好,因為彈性方法適用範圍更廣
EXERCISE 2 · ISLP 2.4 第 2 題(a)

第 2 題 (a):蒐集美國前 500 大公司的資料,每家記錄「利潤、員工數、產業、CEO 薪水」,想了解哪些因素影響 CEO 薪水。這是什麼問題、n 與 p 是多少?

(A) 迴歸問題、目的是推論,n = 500、p = 3
(B) 分類問題、目的是預測,n = 500、p = 4
(C) 迴歸問題、目的是預測,n = 500、p = 3
EXERCISE 3 · ISLP 2.4 第 3 題(a)(b)

第 3 題要你在同一張圖上畫五條曲線(偏差²、變異、訓練誤差、測試誤差、Bayes/不可縮減誤差),橫軸是彈性。哪一組形狀是對的?

(A) 偏差²單調下降、變異單調上升、訓練誤差單調下降、測試誤差 U 型、不可縮減誤差是一條水平線
(B) 偏差²與變異都單調下降,訓練誤差與測試誤差都是 U 型
(C) 訓練誤差與測試誤差最後會收斂到同一條線,因為彈性夠高就能學到真實的 f
EXERCISE 4 · ISLP 2.4 第 7 題(b)(c)

第 7 題給了六筆資料(X₁, X₂, X₃, Y):(0,3,0,紅)、(2,0,0,紅)、(0,1,3,紅)、(0,1,2,綠)、(−1,0,1,綠)、(1,1,1,紅)。要在測試點 X₁ = X₂ = X₃ = 0 上用 KNN 預測。K = 1 與 K = 3 分別預測什麼?

(A) K = 1 預測綠,K = 3 預測紅
(B) K = 1 預測紅,K = 3 預測紅
(C) K = 1 預測綠,K = 3 預測綠
REFERENCE · 總覽

統計學習的基本框架速查表 ISLP Ch.2

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

迴歸與分類:同一套邏輯的兩種語言

迴歸(regression)分類(classification)
Y 是什麼數值類別
量尺MSE $= \frac1n\sum (y_i - \hat f(x_i))^2$錯誤率 $= \frac1n\sum I(y_i \ne \hat y_i)$
最好的預測函數迴歸函數 $f(x) = E[Y \mid X = x]$Bayes 分類器(取條件機率最大者)
理論下限$\mathrm{Var}(\varepsilon)$(不可縮減誤差)Bayes 錯誤率
訓練版的問題訓練 MSE 系統性偏低訓練錯誤率系統性偏低(K = 1 時是 0)
彈性度的例子樣條自由度 df、多項式次數KNN 的 $1/K$
本頁元件w02irr/w02flexfit/w02bvw02bayeserr/w02knn/w02knnerr

參數式與非參數式

參數式非參數式
先假設形狀嗎不要
要估的東西有限個參數整個函數
主要風險形狀假設錯 → 高偏差資料不夠 → 高變異
額外要選形狀平滑程度
高維表現相對穩健受維度詛咒重創
ISLP 例子圖 2.4 線性平面(第 3 章)圖 2.5/2.6 薄板樣條(第 7 章)

本頁模擬跑出來的數字

樣條自由度 df2(線性)467121825
訓練 MSE(單一資料集)3.4331.1250.9610.9550.8900.7880.480
測試 MSE(單一資料集)3.2601.1801.0361.0211.0721.1701.495
情境 A 期望測試 MSE3.3731.2491.1371.1361.2191.3321.486
情境 B(接近線性)1.0461.0771.1161.1341.2191.3321.486
情境 C(高度非線性)21.09910.1464.7024.4702.4321.3361.486

σ = 1,所以 Var(ε) = 1.00 是所有數字的下限。 三個情境的最佳 df 分別是 2、7、18——這就是「沒有一個放諸四海皆準的彈性度」。 數字由 tools/frames/gen_statlearn.pydefault_rng(524)、 M = 300 下產生。

KNN(n = 200 訓練 / 5000 測試)K = 1K = 10K = 50K = 100K = 150
彈性度 1/K1.0000.1000.0200.0100.0067
訓練錯誤率0.0000.1350.1250.1650.240
測試錯誤率0.19640.14700.13840.17580.2270

Bayes 錯誤率 = 0.1382,是這一列的下限。 K = 1 的訓練錯誤率必定是 0(最近的鄰居就是自己)。 課本圖 2.15–2.17 用的是另一份模擬資料,報告 Bayes 0.1304、K = 10 為 0.1363、 K = 1 為 0.1695、K = 100 為 0.1925——數字不同,形狀一致。

公式速查

名稱式子備註
基本框架$Y = f(X) + \varepsilon$式 2.1,$E[\varepsilon] = 0$ 且與 $X$ 無關
迴歸函數$f(x) = E[Y \mid X = x]$平方誤差下最好的預測函數
兩種誤差$E(Y-\hat Y)^2 = [f(X)-\hat f(X)]^2 + \mathrm{Var}(\varepsilon)$式 2.3,$\hat f$ 與 $X$ 固定
線性模型$f(X) = \beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p$式 2.4,參數式的代表
MSE$\frac1n\sum_{i=1}^{n}(y_i - \hat f(x_i))^2$式 2.5
偏差–變異拆解$E(y_0-\hat f(x_0))^2 = \mathrm{Var}(\hat f(x_0)) + [\mathrm{Bias}(\hat f(x_0))]^2 + \mathrm{Var}(\varepsilon)$式 2.7;ESL 式 7.9 同
KNN 迴歸的拆解$\sigma_\varepsilon^2 + [f(x_0) - \frac1k\sum_\ell f(x_{(\ell)})]^2 + \frac{\sigma_\varepsilon^2}{k}$ESL 式 7.10,變異就是 $\sigma^2/k$
錯誤率$\frac1n\sum_{i=1}^{n} I(y_i \ne \hat y_i)$式 2.8/2.9
Bayes 分類器取使 $\Pr(Y=j \mid X=x_0)$ 最大的 $j$式 2.10
Bayes 錯誤率$1 - E[\max_j \Pr(Y=j \mid X)]$式 2.11,分類版的不可縮減誤差
KNN 機率估計$\frac1K\sum_{i \in \mathcal{N}_0} I(y_i = j)$式 2.12,$1/K$ 是彈性度
三個一定要記住的觀念 1. 測試 MSE 永遠不可能低於 Var(ε)。 拆解式的三項都非負,Var(ε) 是加在最後的常數。分類版的說法是「錯誤率不可能低於 Bayes 錯誤率」。 測試誤差逼近這條下限時,該去找新變數,不是繼續換模型。
2. 訓練誤差單調下降,測試誤差是 U 型。 訓練誤差是被最小化過的目標值,它永遠獎勵更多彈性;只有測試誤差誠實。 KNN 的 K = 1 訓練錯誤率必定是 0,這個 0 沒有任何資訊。
3. 偏差與變異的期望是對「重複抽訓練集」取的。 變異是「換一份訓練資料,f̂ 會變多少」,不是「f̂ 這條曲線起伏多大」。 真實資料上兩者無法分開估,只能估總和(第 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 的儲存格編號,可以直接回去對。

CARDS · 關鍵詞彙卡

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

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