分層 K 折交叉驗證 是什麼?

Stratified K-Fold:分層 K 折交叉驗證 的完整解釋

確保每個折(Fold)中各類別樣本比例與原始資料集一致的 K 折交叉驗證變體。

分層 K 折交叉驗證(Stratified K-Fold Cross-Validation)是機器學習模型評估的重要工具,它在標準 K 折交叉驗證的基礎上增加了一個關鍵約束:確保每個折中各類別的樣本比例與原始資料集相同。

標準 K 折交叉驗證的做法是將資料集隨機分成 K 等份,輪流以其中一份作為驗證集,其餘 K-1 份作為訓練集,重複 K 次後取評估指標的平均值。這個方法能夠充分利用有限的資料進行模型評估,同時減少因單一訓練集-測試集分割帶來的偶然性。

然而,當面對類別不平衡的資料集時,純隨機分割可能導致某些折的類別分佈與整體資料差異很大,甚至在某個驗證折中完全沒有某個少數類別的樣本。例如,若一個二元分類資料集中正類佔 5%、負類佔 95%,在 10 折交叉驗證中,純隨機分割可能讓某些折的正類比例偏差至 2% 或 10%,甚至某個小資料集的折中正類樣本數為 0,這會讓評估結果失去可靠性。

分層 K 折交叉驗證透過按類別比例分配樣本到各折,確保每個折都能代表整體資料分佈。以同樣的例子,10 折分層 K 折後,每個折都會保持接近 5% 正類的比例,使得每次訓練和評估的資料分佈更加一致,得到更穩健可靠的評估結果。

在 Python scikit-learn 中,StratifiedKFold 類別提供了標準實作,使用方式與 KFold 幾乎相同,只需在建立 fold 分割物件時指定使用 StratifiedKFold,並在 split() 方法中傳入目標標籤 y,讓分割器能夠感知各類別的分佈。對於回歸問題,scikit-learn 也提供了 StratifiedGroupKFold,以及可以用於回歸的 KFold,但標準 StratifiedKFold 主要適用於分類任務。

分層 K 折在以下場景中特別重要:醫療診斷模型(陽性病例比例通常遠低於陰性)、詐欺偵測系統(詐欺樣本是少數)、罕見事件預測等所有類別不平衡場景。在這些場景中,若不使用分層,模型可能在某些折上因為訓練集缺乏少數類別而過度偏向多數類,或驗證集因缺乏少數類別而無法有效評估模型對關鍵類別的識別能力。

值得補充的是,分層 K 折解決的是評估過程中的類別分佈問題,但它本身並不解決類別不平衡的學習問題。若需要讓模型更好地學習少數類別,還需要配合過採樣(SMOTE)、欠採樣、調整類別權重(class_weight='balanced')等針對不平衡學習的技術。分層 K 折確保的是我們在公平條件下評估這些技術的效果。

在 iPAS AI 應用規劃師中級考試的模型評估與驗證主題中,分層 K 折是常見考點。考生應掌握它與標準 K 折的差異、適用場景(類別不平衡),以及為何在類別不平衡問題中標準隨機分割可能導致不可靠的評估結果。 分層 K 折交叉驗證(Stratified K-Fold Cross-Validation)是機器學習模型評估中的標準方法,特別適用於分類問題中類別不平衡的情境。它確保每個折疊(Fold)中各類別的比例與整體資料集相同,從而使每個折疊都是原始資料的代表性子集。

一般 K 折交叉驗證(K-Fold)隨機分割資料,可能導致某個折疊中某個類別樣本極少,使得訓練集缺乏該類別的代表樣本,或測試集評估結果方差過大。分層 K 折通過在分割時保持類別比例解決這個問題。

具體實現上,分層 K 折首先按類別分組,在每個類別內分別分割成 K 份,再合并各類別的對應份數組成每個折疊。以二元分類、正負類比例 1:9 為例,每個折疊中正負樣本比例都維持 1:9,避免某折疊幾乎全為負類而測試準確率虛高(預測全為負類即可達 90%)。

分層 K 折對計算模型的可靠性評估至關重要:它降低了評估指標的方差,提供更穩定可重複的 AUC、F1 等指標;確保了超參數調優(如 Grid Search CV)選出的參數在各折都有合理的測試集;在醫療、金融等少數類至關重要的應用中,確保評估結果不被採樣偏差影響。

在多分類問題中,分層 K 折對各個類別都執行同樣的比例保持,尤其當某些類別樣本量極少(例如罕見疾病多分類)時,防止稀有類在某些折疊中缺失導致訓練集缺乏代表性。

scikit-learn 的 StratifiedKFold 和 StratifiedGroupKFold(當資料還有分組約束時)提供了完整的實現,與 cross_val_score、GridSearchCV 等工具無縫整合。

常見問題