首頁  >  文章  >  科技週邊  >  交叉驗證的重要性不容忽視!

交叉驗證的重要性不容忽視!

王林
王林轉載
2023-11-06 20:17:191358瀏覽

為了不改變原始意思,需要重新表達的內容是:首先需要弄清楚為什麼需要進行交叉驗證?

交叉驗證是機器學習和統計學中常用的技術,用於評估預測模型的性能和泛化能力,特別是在數據有限或評估模型對新的未見數據的泛化能力時,交叉驗證非常有價值。

交叉驗證的重要性不容忽視!

在哪些情況下會使用交叉驗證呢?

  • 模型效能評估:交叉驗證有助於估計模型在未見資料上的表現。透過在多個資料子集上訓練和評估模型,交叉驗證提供了比單一訓練-測試分割更穩健的模型效能估計。
  • 資料效率:在資料有限的情況下,交叉驗證充分利用了所有可用樣本,透過同時使用所有資料進行訓練和評估,提供了對模型效能更可靠的評估。
  • 超參數調優:交叉驗證通常用於選擇模型的最佳超參數。透過在不同資料子集上使用不同的超參數設定來評估模型的效能,可以確定在整體效能上表現最好的超參數值。
  • 偵測過擬合:交叉驗證有助於偵測模型是否對訓練資料過擬合。如果模型在訓練集上的表現明顯優於驗證集,可能表示存在過擬合的情況,需要進行調整,如正規化或選擇更簡單的模型。
  • 泛化能力評估:交叉驗證提供了模型對未見資料的泛化能力的評估。透過在多個資料分割上評估模型,它有助於評估模型捕捉資料中的潛在模式的能力,而不依賴隨機性或特定的訓練-測試分割。

交叉驗證的大致想法可如圖5折交叉所示,在每次迭代中,新模型在四個子資料集上訓練,並在最後一個保留的子資料集上進行測試,確保所有數據都得到利用。透過平均分數及標準差等指標,提供了模型表現的真實量測

交叉驗證的重要性不容忽視!

#一切都得從K折交叉開始。

KFold

在Sklearn中已經整合了K折交叉驗證,這裡以7折為例:

from sklearn.datasets import make_regressionfrom sklearn.model_selection import KFoldx, y = make_regression(n_samples=100)# Init the splittercross_validation = KFold(n_splits=7)

交叉驗證的重要性不容忽視!

還有一個常用操作是在執行拆分前進行Shuffle,透過破壞樣本的原始順序進一步最小化了過度擬合的風險:

cross_validation = KFold(n_splits=7, shuffle=True)

交叉驗證的重要性不容忽視!

這樣,一個簡單的k折交叉驗證就能夠完成了,請務必查看原始程式碼!請務必查看原始程式碼!請務必查看原始程式碼!

StratifiedKFold

StratifiedKFold是專門為分類問題而設計。

在有的分類問題中,即使將資料分成多個集合,目標分佈也應該保持不變。例如大多數情況下,具有30到70類別比例的二元目標在訓練集和測試集中仍應保持相同的比例,在普通的KFold中,這個規則被打破了,因為在拆分之前對資料進行shuffle時,類別比例將無法維持。

為了解決這個問題,在Sklearn中使用了另一個專門用於分類的拆分器類別-StratifiedKFold:

from sklearn.datasets import make_classificationfrom sklearn.model_selection import StratifiedKFoldx, y = make_classification(n_samples=100, n_classes=2)cross_validation = StratifiedKFold(n_splits=7, shuffle=True, random_state=1121218)

交叉驗證的重要性不容忽視!

儘管與KFold看起來相似,但現在在所有的split和迭代中,類別比例保持一致

ShuffleSplit

有時只需多次重複進行訓練/測試集分割的過程,這種方式與交叉驗證非常相似

在邏輯上來說,透過使用不同的隨機種子來產生多個訓練/測試集,應該在足夠多的迭代中,類似於一個穩健的交叉驗證過程

#Scikit-learn函式庫中也提供了對應的介面:

from sklearn.model_selection import ShuffleSplitcross_validation = ShuffleSplit(n_splits=7, train_size=0.75, test_size=0.25)

交叉驗證的重要性不容忽視!

#TimeSeriesSplit

當資料集為時間序列時,不能使用傳統的交叉驗證,這將完全打亂順序,為了解決這個問題,參考Sklearn提供了另一個拆分器——TimeSeriesSplit,

from sklearn.model_selection import TimeSeriesSplitcross_validation = TimeSeriesSplit(n_splits=7)

交叉驗證的重要性不容忽視!

##在驗證集始終位於訓練集的索引之後的情況下,我們可以看到圖形。這是由於索引是日期,這意味著我們不會意外地在未來的日期上進行時間序列模型的訓練,並對先前的日期進行預測

非獨立同分佈(non-IID)資料的交叉驗證

以上方法是針對獨立同分佈資料集進行處理的,即產生資料的過程不會受到其他樣本的影響

然而,在某些情況下,資料並未滿足獨立同分佈(IID)的條件,即某些樣本之間存在依賴關係。這種情況在Kaggle競賽中也有出現,例如Google Brain Ventilator Pressure競賽。這些數據記錄了人工肺在數千個呼吸過程中(吸入和呼出)的氣壓值,並且對每次呼吸的每個時刻進行了記錄。每個呼吸過程大約有80行數據,這些行之間是相互關聯的。在這種情況下,傳統的交叉驗證方法無法使用,因為資料的劃分可能會“剛好發生在一個呼吸過程的中間”

這可以被理解為需要對這些資料進行“分組”,因為組內資料是有關聯的。舉個例子,當從多個患者收集醫療數據時,每個患者都有多個樣本。然而,這些數據很可能會受到患者個體差異的影響,因此也需要進行分組

往往我們希望在一個特定組別上訓練的模型是否能夠很好地泛化到其他未見過的組別,所以在進行交差驗證時給這些組別資料打上“tag”,告訴他們如何區分別瞎拆。

在Sklearn中提供了若干介面處理這些情況:

  • GroupKFold
  • StratifiedGroupKFold
  • LeaveOneGroupOut
  • LeavePGroupsOut
  • LeaveOneGroupOut

#GroupShuffleSplit

######強烈建議搞清楚交叉驗證的思想,以及如何實現,搭配看Sklearn源碼是一個肥腸不錯的方式。此外,需要對自己的資料集有著清晰的定義,而資料預處理真的很重要。 ###

以上是交叉驗證的重要性不容忽視!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除