腫瘤分類模型資料不平衡,交叉驗證怎麼做才不偏差?
若評估一個新開發的腫瘤分類模型,其資料集中有 80% 的樣本來自良性病例。若直接使用 5-fold 交叉驗證(Cross-Validation)進行模型評估,可能導致模型效能評估出現偏差,為避免此問題,下列哪一種作法最合適?
腫瘤分類資料集中有 80% 良性病例、20% 惡性病例。直接做 5-fold 交叉驗證,可能因為每折的類別比例不均而造成評估偏差。
問你:資料類別比例不均時,怎麼做交叉驗證才能避免評估偏差?
一句話總結
不平衡資料集做交叉驗證,要用分層交叉驗證(Stratified K-Fold Cross-Validation),它確保每一折的類別比例都和整體資料集一致(80% 良性、20% 惡性),避免某折全部是良性、評估偏差。
先感受問題:普通 K-Fold 切出不均勻的折
「慈濟醫療 AI」研究員明珊開發了一個腫瘤分類模型,資料集共 1,000 筆,其中良性 800 筆(80%)、惡性 200 筆(20%)。
她用普通的 5-fold 交叉驗證,隨機把資料分成 5 折。問題來了:隨機切分可能導致某一折的 200 筆裡,惡性樣本只有 30 筆(15%),另一折卻有 50 筆(25%)。
這樣的不均勻分配,讓每折訓練時的「惡性樣本比例」不一樣,評估結果不穩定,有些折評估出來的準確率虛高(那折惡性太少,模型全預測良性就很準)。
普通 K-Fold 的問題
- 隨機切分無法保證比例:普通 K-Fold 隨機打亂再切,小資料集或不平衡資料集,每折的類別比例可能差異很大。
- 某折惡性樣本為 0 時訓練失敗:極端情況下,某折測試集可能完全沒有惡性樣本,模型在這折的 Recall(惡性偵測率)無意義,平均評估指標失準。
- K 值小不解決比例問題:把 K 從 5 降到 3,每折更大,但隨機比例失衡的問題依然存在,只是折數少、每次評估的標準差更大。
- 只調整測試集比例,訓練集不對:若只讓測試集有更高的良性比例,但訓練集比例沒對應調整,模型訓練的信號錯誤,且人工改變測試集比例讓評估不代表真實情境。
- Bootstrap 計算量大,且不直接解決折內比例問題:Bootstrap 有放回抽樣,每次 out-of-bag 樣本的比例仍可能不均,且計算量比 Stratified K-Fold 大。
分層交叉驗證:每折都保持 80:20 的比例
明珊改用分層交叉驗證(Stratified K-Fold):
做法:先把良性 800 筆和惡性 200 筆分開,各自均勻分成 5 折:
- 良性每折:160 筆
- 惡性每折:40 筆
再把對應折合併:每折 = 160 良性 + 40 惡性 = 200 筆(80% 良性,20% 惡性)。
結果:每次訓練都在 80:20 的資料上進行,測試也在 80:20 的資料上評估,5 折結果可靠比較,平均指標有意義。
這就是選項 D 講的:使用分層交叉驗證(Stratified K-Fold Cross-Validation),以確保每折類別比例一致。
技術版:分層交叉驗證的概念位置
Stratified K-Fold Cross-Validation 是 sklearn 中的標準評估方法,在分類任務(尤其是不平衡資料集)時應設為預設選項。使用方式:
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
for train_idx, val_idx in skf.split(X, y):
X_train, X_val = X[train_idx], X[val_idx]
y_train, y_val = y[train_idx], y[val_idx]
關鍵:split(X, y) 需要傳入 y(標籤),才能按類別比例切分。若只傳 X,就退化為普通 K-Fold。
分層 vs 普通 K-Fold 的差異在小資料集或高度不平衡資料集(如 99:1)時最明顯。對比較平衡的資料集(如 50:50),兩者差異可忽略。
延伸:StratifiedShuffleSplit 和 RepeatedStratifiedKFold 提供更多控制(重複多輪、固定隨機性),適合更嚴格的評估場景。
為什麼其他選項是錯的
A降低 K 值以減少交叉驗證次數
把 K 從 5 降到 2 或 3,讓每折的資料量更大。
K 值決定的是「折數」,不是「每折的類別比例」。降低 K 值讓每折資料量增加,但隨機切分依然可能讓某折惡性樣本比例偏高或偏低。問題的根源是「不保證比例」,降低 K 根本沒有解決這個問題。
以為「折數少 = 每折樣本更均勻」的人,混淆了「每折樣本量大」和「每折類別比例均勻」。
B改為使用拔靴法(Bootstrap)
用有放回抽樣的 Bootstrap 方法代替 K-Fold 評估模型。
Bootstrap 是可行的評估方法,但它的 out-of-bag 樣本的類別比例仍是隨機的,不保證每次評估的惡性樣本比例穩定。而且 Bootstrap 計算成本更高(通常跑 100-1,000 次),而分層交叉驗證更直接、更常用。
知道 Bootstrap 是替代評估方法,但不清楚它並沒有解決「每次評估樣本比例不均」的問題。
C調整測試集使良性樣本比例更高,以模擬真實分佈
人工調整測試集的類別比例,讓測試集更接近真實臨床分佈。
測試集應當保持原始資料分佈,人工調整會讓評估結果不代表真實情境。更大的問題是:「調整測試集比例」和「確保交叉驗證每折比例一致」是完全不同的操作,這個做法根本沒有解決 K-Fold 折間比例不一致的問題。
把「測試集要反映真實分佈」和「解決 K-Fold 比例問題」混在一起的人。兩件事的確都重要,但這個選項的做法不是解決折間比例問題的方法。
同個考點下次怎麼變形
分層交叉驗證和 SMOTE 有什麼關係?可以同時用嗎?
兩個都是處理不平衡資料的方法,衝突嗎?
不衝突,且應該搭配使用。SMOTE 在訓練集做資料增強(只在訓練折內做,不碰驗證折);分層交叉驗證確保每折比例均勻。正確流程:先分層切折,每折訓練時在訓練集做 SMOTE,驗證集保持原始比例,最後評估。
K-Fold 的 K 應該設多少?有沒有通用建議?
K=5 還是 K=10,哪個比較好?
業界常用 K=5 或 K=10。K=5 計算量較小,K=10 估計偏差較低但方差較高。對小資料集(<1,000 筆),可用 LOOCV(Leave-One-Out);對大資料集,K=5 已足夠。沒有唯一最佳值,視計算資源和資料量決定。
為什麼評估不平衡資料模型時,不能只看準確率?
準確率不是最直觀的指標嗎?
80% 良性的資料集,「全預測良性」準確率就有 80%,但對惡性的召回率為 0。評估不平衡資料應用 F1-Score(惡性類別)、AUC-ROC 或 PR-AUC,這些指標對少數類別的預測能力更敏感。
分層交叉驗證和分層抽樣(Stratified Sampling)有什麼不同?
都有「分層」兩個字,是同一件事嗎?
分層抽樣是「從母體中按比例抽取樣本」的抽樣方法,確保樣本代表性;分層交叉驗證是「在已有樣本中按比例切分折」的評估方法,確保每折評估的類別比例和整體一致。一個是資料收集時的工具,一個是模型評估時的工具。
若資料集更極端不平衡(99% 良性、1% 惡性),分層 K-Fold 的某些折可能幾乎沒有惡性樣本,怎麼辦?
1% 的惡性,分成 5 折後每折只有幾個,夠嗎?
若資料集有 1,000 筆,1% = 10 筆惡性,分 5 折後每折只有 2 筆,評估太不穩定。解法:改用更小的 K(如 K=3);或搭配 SMOTE 先在訓練集增加惡性樣本;或換成 Bootstrap 或 LOOCV,讓每次訓練看到更多惡性樣本。
想再往下看,這 5 個
- 交叉驗證(Cross-Validation)分層交叉驗證是交叉驗證在不平衡資料集上的改進版,保留了 K-Fold 的高效評估優點。
- 資料不平衡(Data Imbalance)80:20 的腫瘤資料集是典型的不平衡問題,需要分層採樣和適當評估指標。
- 過擬合(Overfitting)不均勻的 K-Fold 切分,可能讓某折訓練集過度偏向多數類,導致在少數類上過擬合或欠擬合。
- F1 Score(F1 分數)評估不平衡分類模型的關鍵指標,特別是少數類別的 F1,衡量精確率與召回率的平衡。
- 召回率(Recall)醫療模型中最關鍵的指標,確保惡性腫瘤不被漏診比避免誤診更重要。