這段虛擬程式碼在描述哪一種驗證法?
請參考附圖,下列虛擬程式碼(pseudocode)最可能是在描述何種驗證法? Input: - data_set: 包含 N 筆資料的資料集 - model_training_function: 用來訓練模型的函式 - model_evaluation_function: 用來評估模型的函式(如計算誤差或準確率) Output: - 平均評估指標(如平均準確率或平均誤差) Algorithm: 1. 初始化評估指標列表 metrics = [] 2. 對 i = 1 到 N: a. 將第 i 筆資料作為測試集 test_data b. 將其餘 N-1 筆資料作為訓練集 train_data c. 使用 model_training_function 在 train_data 上訓練模型 d. 使用訓練好的模型對 test_data 做預測,計算評估指標 metric_i e. 將 metric_i 加入 metrics 3. 計算 metrics 的平均值 mean_metric 4. 回傳 mean_metric
有一段虛擬程式碼,它的運作方式是:每次從 N 筆資料中拿出第 i 筆當測試集,用剩下 N-1 筆訓練模型,這樣重複 N 次(每筆資料輪流當一次測試),最後取 N 次評估指標的平均值。
問你:這段程式碼描述的是哪一種模型驗證方法?
一句話總結
每次只留一筆當測試、用剩下 N-1 筆訓練,重複 N 次取平均,這就是留一交叉驗證 LOOCV(Leave-One-Out Cross Validation),它是 K-fold 的極端特例:K=N。
先感受問題:小資料集要怎麼評估模型
「北城醫療研究」的研究員文哲,手上有一個珍貴的罕見疾病資料集,只有 50 筆病患記錄,每一筆都是花了大量人力標註的。
他要評估一個分類模型的效能,但 50 筆資料如果切成訓練集和測試集,測試集可能只有 10-15 筆,評估結果不穩定、方差太大。
文哲需要一個方法,讓每一筆資料都被拿去測試,同時訓練集盡量大(用 N-1 筆)。這樣評估結果最接近「用所有資料訓練的模型效能」,且偏差最小。
其他驗證方式在小資料集上的問題
- Hold-out 切一次就完,評估不穩定:隨機切 70/30,測試集只有 15 筆,碰到分佈偏斜就差很多,重跑一次結果可能差 5-10%。
- K-fold 每折測試集仍有多筆,評估不夠細緻:5-fold 時每折測試集有 10 筆,LOOCV 每次只有 1 筆,後者對每個樣本的「留出評估」更精確。
- Bootstrap 有放回抽樣,訓練集可能重複同一筆:Bootstrap 訓練集用有放回抽樣,可能同一筆出現多次,訓練集代表性不如 LOOCV 的 N-1 筆不重複。
- 隨機切分每次結果不同,難以重現:Hold-out 和普通 K-fold 依賴隨機種子,不同種子結果不一樣,LOOCV 切法固定,結果確定性最高。
- 資料少時,統計量估計誤差大:測試集越少,指標方差越大;LOOCV 每次只測 1 筆是極端情況,N 次結果的方差雖然大,但平均偏差最小(偏差-方差取捨)。
讀懂 pseudocode 的三個關鍵線索
文哲看到這段 pseudocode,抓住三個識別 LOOCV 的關鍵:
- 循環從 i=1 到 N:重複 N 次,每次循環對應資料集中的一筆
- 測試集 = 第 i 筆,訓練集 = 其餘 N-1 筆:每次只留「一筆」出來,這就是「Leave-One-Out」的含義
- 最終取 N 次評估的平均值:不是看某一次的結果,是全部 N 次取平均
對比 K-fold:K-fold 的外層循環是「i=1 到 K」(通常 5 或 10),測試集是「第 i 折」(多筆);LOOCV 的外層循環是「i=1 到 N」,測試集是「第 i 筆」(一筆)。
這就是選項 B 講的:留一交叉驗證 LOOCV(Leave-One-Out Cross Validation)。
技術版:LOOCV 的 pseudocode 完整解析
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
- 有 N 個學生的考試成績,想評估一個「分數預測模型」的準確度
- 第一輪:把第 1 個學生的成績藏起來,用其他 N-1 人訓練模型,再去預測第 1 人的成績,記錄誤差
- 第二輪:藏第 2 個人,用其他 N-1 人訓練,預測第 2 人,記錄誤差
- …重複 N 次,每個學生都輪流當「那個被藏起來的測試」
- 最後把 N 個誤差平均,得到模型的評估指標
| 故事 | pseudocode |
|---|---|
| 有 N 個學生的資料 | data_set(包含 N 筆) |
| 每輪輪流藏一個 | for i = 1 to N |
| 被藏起來的那個 | test_data = 第 i 筆 |
| 其他 N-1 人 | train_data = 其餘 N-1 筆 |
| 記錄每輪誤差 | metrics.append(metric_i) |
| 最後取平均 | mean_metric = avg(metrics) |
- N
- 資料集中的總筆數,也是 LOOCV 的迭代次數(每筆都要被測試一次)。
- i
- 當前輪次的索引,從 1 到 N,代表「這輪拿第 i 筆當測試集」。
- test_data
- 每次輪到的「第 i 筆」資料,只有 1 筆,這是 LOOCV 最核心的特徵。
- train_data
- 每次的訓練集,是「除了第 i 筆之外」的所有 N-1 筆資料。
- metrics
- 儲存每輪評估指標的列表,最後的平均值就是 LOOCV 的最終評估結果。
LOOCV 估計的誤差公式:
- CV_LOOCV = (1/N) × Σᵢ₌₁ᴺ L(yᵢ, ŷᵢ)
- 其中 L 是損失函數(如 MSE 或 0-1 Loss),yᵢ 是真實值,ŷᵢ 是用 N-1 筆訓練的模型對第 i 筆的預測值
這和 K-fold 的公式幾乎一樣,差別在 K=N(每折只有 1 筆)。
蓋住 pseudocode,用自己的話說出這 4 步:
- 循環 N 次(N = 資料集大小)
- 每次第 i 筆當測試集,其他 N-1 筆當訓練集
- 訓練模型後評估第 i 筆的指標
- N 次結果取平均
能講出來代表你看懂這類 pseudocode 了。
為什麼其他選項是錯的
AHold-out 驗證(Hold-out Validation)
把資料分成訓練集和測試集(如 70/30),只訓練和評估一次。
Hold-out 只分一次、評估一次,沒有循環;pseudocode 有 N 次循環,明顯不是 Hold-out。Hold-out 的特徵:「固定切分、一次訓練、一次評估」。
看到「訓練集 / 測試集」就聯想 Hold-out,沒有注意到 pseudocode 有明顯的 N 次迴圈結構。
CK-fold 交叉驗證(K-fold Cross Validation)
把資料分成 K 折,每次用 K-1 折訓練、1 折測試,重複 K 次取平均。
K-fold 的外層迴圈是「i=1 到 K」(K 通常是 5 或 10),測試集是「第 i 折」(多筆資料);pseudocode 的迴圈是「i=1 到 N」,測試集是「第 i 筆」(只有 1 筆)。LOOCV 可以理解為 K=N 的 K-fold,但當 K=N 時,每個測試集只有 1 筆,這是 LOOCV 的定義。
知道這是交叉驗證的一種,誤以為「K-fold 是所有交叉驗證的統稱」,沒有區分 K-fold(K 固定為小數字)和 LOOCV(K=N)的差別。
D拔靴法(Bootstrap)驗證
有放回地從原始資料抽取多個訓練集,用每次未被抽到的樣本(out-of-bag)做評估。
Bootstrap 的關鍵特徵是「有放回抽樣」,同一筆資料可能在訓練集裡出現多次;pseudocode 的 train_data 是「其餘 N-1 筆」(不放回,沒有重複),和 Bootstrap 的放回抽樣完全不同。
記得 Bootstrap 也是一種模型評估方法,但不記得 Bootstrap 的關鍵特徵是「有放回抽樣」,把所有「重複評估」的方法都歸成 Bootstrap。
同個考點下次怎麼變形
LOOCV 和 K-fold(K=N)在數學上等價嗎?
LOOCV 感覺就是 K=N 的 K-fold?
是的,LOOCV 等價於 K=N 的 K-fold。但實作上,LOOCV 有專門的優化(利用 hat matrix 直接計算,不需要真的跑 N 次線性迴歸);sklearn 也有獨立的 LeaveOneOut 類別,不是靠 KFold(n_splits=N) 實現。
LOOCV 的優缺點各是什麼?什麼時候該用?
LOOCV 聽起來很嚴格,有什麼缺點嗎?
優點:偏差最小(每次訓練集大小 N-1,接近全量);確定性高(不依賴隨機切分)。缺點:計算成本高(N 次訓練),N 很大時不實際;評估結果方差高(每次測試只有 1 筆,結果不穩定)。適用:小資料集(N < 1,000)、需要偏差極小的場景。
如果 pseudocode 的迴圈改成「for fold = 1 to K」,測試集是「第 fold 折」,這是什麼方法?
如果把 N 換成 K,每次測試集是「多筆」,會是什麼?
就是標準的 K-fold 交叉驗證。迴圈從 1 到 K(K 通常是 5 或 10),每次測試集是「第 fold 折」(包含 N/K 筆資料),訓練集是其餘 K-1 折。和 LOOCV 的差別只在測試集大小:K-fold 是「一折(多筆)」,LOOCV 是「一筆」。
Leave-P-Out(LPO)是什麼?和 LOOCV 有什麼關係?
LOOCV 是每次留一個,有沒有「每次留多個」的版本?
Leave-P-Out(LPO)每次從 N 筆中留出 P 筆當測試集,訓練集是 N-P 筆。LOOCV 是 LPO 的特例(P=1)。LPO 的迭代次數是 C(N,P)(組合數),N=50、P=2 就要跑 1,225 次,計算量急劇增加,實務上少用。
如果 N=10,000,LOOCV 要跑幾次?這是實際可行的嗎?
N 很大時,LOOCV 的計算量會怎樣?
需要跑 10,000 次訓練。若每次訓練耗時 1 秒,就需要 10,000 秒(約 2.8 小時)。若是複雜模型(如神經網路),完全不可行。大資料集應改用 K-fold(K=5 或 10),只需訓練 5-10 次。LOOCV 只適合 N 很小的場景。
想再往下看,這 5 個
- 交叉驗證(Cross-Validation)LOOCV 是交叉驗證的極端特例,K=N,偏差最小但計算成本最高。
- 過擬合(Overfitting)LOOCV 提供接近無偏的泛化誤差估計,是評估模型是否過擬合的可靠工具。
- 偏差方差權衡(Bias-Variance Tradeoff)LOOCV 偏差低但方差高;K-fold 偏差稍高但方差低,是偏差方差取捨的具體例子。
- 驗證資料集(Validation Set)LOOCV 每輪的測試集(1 筆)就是臨時的驗證集,通過輪替讓每筆都被驗證。
- 超參數調校(Hyperparameter Tuning)LOOCV 常被用於超參數選擇,在小資料集上尋找最佳模型配置。