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