深入研究k折交叉驗(yàn)證(K fold Cross Validation)
機(jī)器學(xué)習(xí)方法常常不能直接對(duì)數(shù)據(jù)進(jìn)行建模,因?yàn)樗鼈儗W(xué)習(xí)的是訓(xùn)練集的特定特征,而這些特征在測(cè)試集中是不存在的。所以這些特征并不具有代表性,我們處于Overfitting的情況。(有不同意見(jiàn)后臺(tái)來(lái)和學(xué)姐討論,別直接取關(guān),嚶嚶嚶~)
當(dāng)模型擬合過(guò)多的訓(xùn)練數(shù)據(jù)時(shí),就會(huì)出現(xiàn)這種情況,而且它不能在新的樣本中泛化。不過(guò)有很多方法可以解決這個(gè)問(wèn)題,比如:正則化、選擇最佳超參數(shù)和K折交叉驗(yàn)證。
上周學(xué)姐介紹了K折交叉驗(yàn)證基本知識(shí)點(diǎn)的講解,今天我們來(lái)深入研究一下。
因?yàn)槟P偷墓憩F(xiàn)與它具有相關(guān)作用,簡(jiǎn)單地將數(shù)據(jù)分成訓(xùn)練集和測(cè)試集并不能真正了解模型的性能。比如,當(dāng)看到訓(xùn)練集的準(zhǔn)確率是90%覺(jué)得很準(zhǔn)確,但在看到60%的測(cè)試準(zhǔn)確率之后,會(huì)覺(jué)得肯定是出了什么問(wèn)題。
所以一般的想法是將數(shù)據(jù)集分成k個(gè)部分,k-1個(gè)用于訓(xùn)練,一個(gè)用于驗(yàn)證/測(cè)試。這樣的話(huà),我們可以將數(shù)據(jù)集分成5折,因此4折將用于訓(xùn)練模型,而剩余的折用于評(píng)估模型的性能。如果這樣進(jìn)行分區(qū),需要每次更改用于評(píng)估模型的折疊位置并重復(fù)5次。
為了更好地了解所有要使用的工具,我將使用來(lái)自Kaggle的Titanic數(shù)據(jù)集展示最常用的交叉驗(yàn)證技術(shù)。
Kaggle數(shù)據(jù)集:
https://www.kaggle.com/c/titanic/data
代碼:
https://github.com/eugeniaring/sklearn-tutorial/blob/main/titanic-kcv.ipynb
由于測(cè)試集不包含目標(biāo)標(biāo)簽,本教程中僅使用訓(xùn)練集。這是避免過(guò)度擬合的一種方法,過(guò)程中會(huì)使用較少的訓(xùn)練數(shù)據(jù)來(lái)訓(xùn)練模型,并在驗(yàn)證集中進(jìn)行評(píng)估。
本教程大綱:
交叉驗(yàn)證
留一法交叉驗(yàn)證
K折交叉驗(yàn)證
分層K折交叉驗(yàn)證
時(shí)間序列交叉驗(yàn)證
01?交叉驗(yàn)證

經(jīng)典和老式的方法是將數(shù)據(jù)集分解為3個(gè)固定子集:
常見(jiàn)的選擇是使用 60% 進(jìn)行訓(xùn)練,20% 用于驗(yàn)證,20% 用于測(cè)試。我們可以根據(jù)數(shù)據(jù)集的大小決定這些比例。對(duì)于一個(gè)小數(shù)據(jù)集,這個(gè)比例是可以的;當(dāng)有更多數(shù)據(jù)時(shí),可以考慮較大的訓(xùn)練集百分比和較小的驗(yàn)證集和測(cè)試集百分比。
接下來(lái)我們使用具有已處理特征的Titanic數(shù)據(jù)集的方法。在訓(xùn)練模型之前,我們將訓(xùn)練數(shù)據(jù)分為訓(xùn)練集和驗(yàn)證集。

一旦數(shù)據(jù)被拆分,我們訓(xùn)練決策樹(shù)分類(lèi)器并在驗(yàn)證集中對(duì)其進(jìn)行評(píng)估。

02?留一法交叉驗(yàn)證

第二種方法將觀察結(jié)果分為兩部分:
n-1個(gè)觀測(cè)值來(lái)擬合模型,剩余的觀測(cè)值用于評(píng)估它。此操作將重復(fù)n次。接下來(lái)按照相同的推理說(shuō)明函數(shù)LeaveOneOut是如何工作的:

現(xiàn)在使用cross_val_score函數(shù)來(lái)應(yīng)用留一法。cv是決定用不同方法分割數(shù)據(jù)集的策略的參數(shù)。在下面的例子中,使用了Leave One Out對(duì)象。

得到每次分裂的預(yù)測(cè)和準(zhǔn)確度,然后計(jì)算所有獲得值的平均值。結(jié)果表明,該方法的準(zhǔn)確度低于交叉驗(yàn)證方法,這可能是因?yàn)槊看尾鸱謹(jǐn)?shù)據(jù)集并使用不同的驗(yàn)證折疊不會(huì)高估驗(yàn)證準(zhǔn)確性。但通常它不是首選方法,因?yàn)榉指钪袥](méi)有隨機(jī)性,而且計(jì)算成本很高。我們可以嘗試用其他方法。
03?K折交叉驗(yàn)證

如前所述,在K折交叉驗(yàn)證中,我們將數(shù)據(jù)集分成k個(gè)折疊,k-1用于訓(xùn)練模型,剩余的一個(gè)用于評(píng)估模型,不斷重復(fù)這個(gè)操作k次。
用下面這個(gè)例子來(lái)了解這種方法如何拆分?jǐn)?shù)據(jù)集,為簡(jiǎn)單起見(jiàn),我們僅使用5折,并指定shuffle等于True以進(jìn)行隨機(jī)拆分:

以上我們觀察到,每個(gè)折疊中具有正類(lèi)和負(fù)類(lèi)(幸存/未幸存)的樣本數(shù)量不同,這是因?yàn)門(mén)itanic數(shù)據(jù)集具有不平衡的類(lèi)。
接下來(lái)看模型的性能如何,此次在函數(shù)cross_val_score中應(yīng)用了KFold對(duì)象:

性能比使用前一種方法要好得多。但是還有一個(gè)問(wèn)題,就是正類(lèi)和負(fù)類(lèi)的觀察數(shù)量是不同的:

結(jié)果:幸存的人數(shù)少于死亡人數(shù)。
還有一種更好的方法來(lái)管理不平衡的類(lèi),稱(chēng)為分層K折交叉驗(yàn)證。
04?分層K折交叉驗(yàn)證

分層K折交叉驗(yàn)證的工作方式與K折交叉驗(yàn)證相同,唯一的區(qū)別是它確保每個(gè)分類(lèi)值的觀察百分比相同。本案例中有兩個(gè)類(lèi),Survived 和 Not Survived。
下面的示例中,分層K交叉驗(yàn)證根據(jù)變量Survival劃分?jǐn)?shù)據(jù)集。

現(xiàn)在,可以看到從一層到另一層的不同類(lèi)的樣本數(shù)量沒(méi)有變化或略有變化,是因?yàn)槲覀冋诟鶕?jù)目標(biāo)變量對(duì)數(shù)據(jù)集進(jìn)行分層。

所有折疊的平均準(zhǔn)確率為79.79%。它比用前一種方法獲得的略小,但我仍然認(rèn)為這種方法對(duì)此類(lèi)數(shù)據(jù)更有效(歡迎討論)。
05?Time Series Cross Validation

最后一種方法是時(shí)間序列交叉驗(yàn)證。當(dāng)存在與時(shí)間相關(guān)的數(shù)據(jù)時(shí),它很有用,因此我們需要保留數(shù)據(jù)的順序。通過(guò)隨機(jī)化,我們將失去觀察之間的依賴(lài)關(guān)系。
在第一步中,我們不像其他方法那樣取所有樣本來(lái)訓(xùn)練和評(píng)估模型,而只是取一個(gè)子集。在第一步之后,每個(gè)訓(xùn)練集都是來(lái)自之前的訓(xùn)練和驗(yàn)證集的組合,我們每次都添加一個(gè)較小的數(shù)據(jù)來(lái)評(píng)估模型。只有在最后一次拆分中,我們才能使用所有數(shù)據(jù)。
在示例中,我們使用了5折,未指定,因?yàn)樗荰imeSeriesSplit中的默認(rèn)參數(shù)。

現(xiàn)在按照之前完成的相同程序進(jìn)行操作:

end?總結(jié)
本文說(shuō)明了將數(shù)據(jù)拆分為子集的最廣為人知的方法,但是還是需要使用相同的數(shù)據(jù)集嘗試更多方法,看看哪種方法更好。從本文實(shí)驗(yàn)來(lái)看最好的方法通常是K折交叉驗(yàn)證和分層K折交叉驗(yàn)證。希望學(xué)姐的這篇教程對(duì)大家有所幫助!

每天18:30分更新
關(guān)注+星標(biāo)+在看
不迷路看好文
