0
雷鋒網(wǎng) AI 科技評論按:文章的作者 Georgios Drakos 是一名數(shù)據(jù)科學(xué)家,通過本文作者向我們介紹了交叉驗證的基本概念、作用以及如何使用。雷鋒網(wǎng) AI 科技評論根據(jù)原文進(jìn)行了編譯。
驗證可能是數(shù)據(jù)科學(xué)家們所使用的最重要的技術(shù)之一,因為驗證操作有助于我們了解模型的穩(wěn)定性——用來探索模型對新數(shù)據(jù)的泛化能力。我們需要確保模型從數(shù)據(jù)中正確學(xué)習(xí)到了大部分的模式,并且沒有被數(shù)據(jù)中的噪聲過度干擾,也就是說,模型的偏差和方差都能保持在一個較低值。而本文的目的正是要介紹一下有關(guān)于交叉驗證(Cross-validation)的概念。
「交叉驗證」是一種模型驗證技術(shù),可用于評估統(tǒng)計分析(模型)結(jié)果在其它獨(dú)立數(shù)據(jù)集上的泛化能力。它主要用于預(yù)測,我們可以用它來評估預(yù)測模型在實踐中的準(zhǔn)確度。
交叉驗證的目標(biāo)是定義一個數(shù)據(jù)集,以便于在訓(xùn)練階段(例如,驗證數(shù)據(jù)集)中測試模型,從而限制模型過擬合、欠擬合等問題,并且?guī)椭覀兞私饽P驮谄渌?dú)立數(shù)據(jù)集上的泛化能力。值得一提的是,驗證集和訓(xùn)練集必須滿足獨(dú)立同分布條件,否則交叉驗證只會讓結(jié)果變得更加糟糕。
驗證有助于我們評估模型的質(zhì)量
驗證有助于我們挑選出那些能夠在預(yù)測數(shù)據(jù)集上取得最好性能的模型
驗證有助于我們避免過擬合與欠擬合
欠擬合指的是模型沒能夠從訓(xùn)練數(shù)據(jù)中學(xué)習(xí)到足夠的模式。此時,模型在訓(xùn)練集和測試集上的表現(xiàn)都非常差。
過擬合則有兩種情況:第一種,模型學(xué)習(xí)到過多的噪聲;第二種,模型學(xué)習(xí)到的模式泛化能力差。此時,模型在訓(xùn)練集上表現(xiàn)很好,但是在測試集上表現(xiàn)則非常差(對于分類任務(wù)而言,可以看作是模型學(xué)習(xí)到了同類別的不同實例之間的區(qū)別,并把它們作為分類依據(jù),所以面對新的實例時分類性能不佳)。
而最佳的模型應(yīng)該能夠在訓(xùn)練集和測試集上都表現(xiàn)得很好。
通常,依據(jù)數(shù)據(jù)集中分割方式的不同,會有不同的驗證策略。
訓(xùn)練測試集劃分/Holdout 驗證 —— 組數(shù)為 2
在該策略中,我們簡單地將數(shù)據(jù)集劃分成兩組:訓(xùn)練集和測試集,并且要求訓(xùn)練集和測試集之間的樣本不存在任何重疊,如果存在重疊,那么驗證手段將失效。在準(zhǔn)備發(fā)布最終模型之前,我們可以在整個數(shù)據(jù)集上重新訓(xùn)練模型,而不需要更改任何超參數(shù)。
但是這種劃分方式存在一個主要的缺陷:
如果我們的劃分方式并不是隨機(jī)的呢?比如,我們數(shù)據(jù)的某個子集只有來自于某個州的人,或者某個子集中只含有某一特定水平收入的員工,又或者子集中只含有女性或特定年齡的人,這時我們該怎么辦?盡管我們一直在極力避免,但是這些情況都將導(dǎo)致模型的過擬合,因為此時無法確定哪些數(shù)據(jù)點(diǎn)會出現(xiàn)在驗證集中,并且針對不同的數(shù)據(jù)集,模型的預(yù)測結(jié)果也可能完全不同。因此,只有當(dāng)我們擁有充足的數(shù)據(jù)時,這種做法才是合適的。
Python 的實現(xiàn)方式:sklearn.model_selection.train_test_split
k 分劃分 —— 組數(shù)為k
由于永遠(yuǎn)不會有充足的數(shù)據(jù)來訓(xùn)練模型,因此如果將數(shù)據(jù)集中的某一部分劃分出來用于驗證還會導(dǎo)致模型出現(xiàn)欠擬合的問題。由于訓(xùn)練數(shù)據(jù)樣本減少,我們的模型面臨著丟失掌握重要模式/趨勢機(jī)會的風(fēng)險,從而增加偏差引起的誤差。因此,我們需要一種方法,它既能夠為訓(xùn)練模型提供充足的數(shù)據(jù)樣本,又能夠為驗證步驟保留一定數(shù)量的數(shù)據(jù)。k 分(k-fold)交叉驗證正是我們所需要的。
k 分交叉驗證可以看做是執(zhí)行了多次的簡單二分劃分驗證,然后我們在執(zhí)行了 k 次不同的簡單劃分驗證之后繼續(xù)簡單地將得分進(jìn)行平均。數(shù)據(jù)集中的每個數(shù)據(jù)點(diǎn)只能在驗證集中出現(xiàn)一次,并且在訓(xùn)練集中出現(xiàn) k-1 次。這種做法將大大減輕欠擬合現(xiàn)象,因為我們使用了幾乎所有的數(shù)據(jù)來訓(xùn)練模型,同時還能顯著減少過擬合現(xiàn)象,因為大部分?jǐn)?shù)據(jù)也被用來做驗證。
當(dāng)我們的數(shù)據(jù)量較小時,或者在不同的劃分?jǐn)?shù)據(jù)集中,我們的模型性能或者最優(yōu)參數(shù)存在較大的區(qū)別時,k 分交叉驗證是一種很好的選擇。通常情況下,我們設(shè)置 k=5 或 k=10,這些值來自于經(jīng)驗總結(jié),大量實驗證明當(dāng) k 取這些值時,驗證結(jié)果不會存在過高的偏差或者方差。
Python 實現(xiàn)代碼:sklearn.model_selection.KFold
留一法 —— 組數(shù)訓(xùn)練數(shù)據(jù)集大小
當(dāng) k 等于數(shù)據(jù)集中的樣本數(shù)時,留一法(Leave one out)實際上可以看做 k 分交叉驗證的一個特例。這意味著每次使用 k-1 個樣本作為訓(xùn)練樣本而剩下 1 個樣本作為驗證樣本,然后照此遍歷數(shù)據(jù)集。
如果我們的數(shù)據(jù)量非常小并且模型的訓(xùn)練速度非常快,那么可以考慮該方法。
Python 實現(xiàn)代碼:sklearn.model_selection.LeaveOneOut
額外補(bǔ)充 —— 分層法(Stratification)
通常,在使用訓(xùn)練集/測試集劃分或者是 k 分交叉驗證的時候,我們會將數(shù)據(jù)集進(jìn)行隨機(jī)重排,以便于得到隨機(jī)的訓(xùn)練/驗證集劃分。在這種情況下,可以將不同的目標(biāo)分布應(yīng)用于不同的劃分區(qū)域中。通過分層法,當(dāng)我們在分割數(shù)據(jù)時,我們可以在不同的劃分區(qū)域中獲得相似的目標(biāo)分布。
該方法對以下情況有效:
小數(shù)據(jù)集
數(shù)據(jù)不平衡
多分類問題
通常而言,對于一個類別平衡的大型數(shù)據(jù)集,分層劃分法和簡單的隨機(jī)劃分基本一樣。
如果我們有充足的數(shù)據(jù),并且對于不同的劃分方式,我們都能獲得相近的成績以及最優(yōu)參數(shù)模型,那么訓(xùn)練集/測試集二分劃分是一種不錯的選擇。而如果恰恰相反,也就是對于不同的劃分方式,模型的測試成績和最優(yōu)參數(shù)都存在著較大的差異時,我們可以選擇 k 分交叉驗證。如果數(shù)據(jù)總量非常少,則可以考慮使用留一法。此外,分層法有助于使驗證結(jié)果更加穩(wěn)定,并且對于小型且類別不平衡的數(shù)據(jù)集尤其管用。
當(dāng) k 的取值越大時,由偏差導(dǎo)致的誤差將減少,而由方差導(dǎo)致的誤差將增加,此外計算的代價也將上升。顯然,你需要更多的時間來計算,并且也會消耗更多的內(nèi)存。
當(dāng) k 的取值越小時,由方差導(dǎo)致的誤差將減少,而由偏差導(dǎo)致的誤差將增加。此外,這時所需的計算資源也將減少。
針對大型數(shù)據(jù)集的時候,我們通常將 k 設(shè)置為 3 或者 5,但是對于小型數(shù)據(jù)集我們還是建議采用留一法。
交叉驗證是數(shù)據(jù)科學(xué)家評估模型有效性的一個非常有用的工具,特別是用于解決過擬合和欠擬合問題。此外,在確定模型最優(yōu)超參數(shù)問題上,它也是非常有幫助的。
Via 《Cross-Validation》,由雷鋒網(wǎng) AI 科技評論編譯。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。