交叉驗證(Cross Validation)原理小結

劉建平Pinard發表於2016-10-24

    交叉驗證是在機器學習建立模型和驗證模型引數時常用的辦法。交叉驗證,顧名思義,就是重複的使用資料,把得到的樣本資料進行切分,組合為不同的訓練集和測試集,用訓練集來訓練模型,用測試集來評估模型預測的好壞。在此基礎上可以得到多組不同的訓練集和測試集,某次訓練集中的某樣本在下次可能成為測試集中的樣本,即所謂“交叉”。 

    那麼什麼時候才需要交叉驗證呢?交叉驗證用在資料不是很充足的時候。比如在我日常專案裡面,對於普通適中問題,如果資料樣本量小於一萬條,我們就會採用交叉驗證來訓練優化選擇模型。如果樣本大於一萬條的話,我們一般隨機的把資料分成三份,一份為訓練集(Training Set),一份為驗證集(Validation Set),最後一份為測試集(Test Set)。用訓練集來訓練模型,用驗證集來評估模型預測的好壞和選擇模型及其對應的引數。把最終得到的模型再用於測試集,最終決定使用哪個模型以及對應引數。

    回到交叉驗證,根據切分的方法不同,交叉驗證分為下面三種:   

    第一種是簡單交叉驗證,所謂的簡單,是和其他交叉驗證方法相對而言的。首先,我們隨機的將樣本資料分為兩部分(比如: 70%的訓練集,30%的測試集),然後用訓練集來訓練模型,在測試集上驗證模型及引數。接著,我們再把樣本打亂,重新選擇訓練集和測試集,繼續訓練資料和檢驗模型。最後我們選擇損失函式評估最優的模型和引數。 

     第二種是S折交叉驗證(S-Folder Cross Validation)。和第一種方法不同,S折交叉驗證會把樣本資料隨機的分成S份,每次隨機的選擇S-1份作為訓練集,剩下的1份做測試集。當這一輪完成後,重新隨機選擇S-1份來訓練資料。若干輪(小於S)之後,選擇損失函式評估最優的模型和引數。

    第三種是留一交叉驗證(Leave-one-out Cross Validation),它是第二種情況的特例,此時S等於樣本數N,這樣對於N個樣本,每次選擇N-1個樣本來訓練資料,留一個樣本來驗證模型預測的好壞。此方法主要用於樣本量非常少的情況,比如對於普通適中問題,N小於50時,我一般採用留一交叉驗證。

    通過反覆的交叉驗證,用損失函式來度量得到的模型的好壞,最終我們可以得到一個較好的模型。那這三種情況,到底我們應該選擇哪一種方法呢?一句話總結,如果我們只是對資料做一個初步的模型建立,不是要做深入分析的話,簡單交叉驗證就可以了。否則就用S折交叉驗證。在樣本量少的時候,使用S折交叉驗證的特例留一交叉驗證。

    此外還有一種比較特殊的交叉驗證方式,也是用於樣本量少的時候。叫做自助法(bootstrapping)。比如我們有m個樣本(m較小),每次在這m個樣本中隨機採集一個樣本,放入訓練集,取樣完後把樣本放回。這樣重複採集m次,我們得到m個樣本組成的訓練集。當然,這m個樣本中很有可能有重複的樣本資料。同時,用沒有被取樣到的樣本做測試集。這樣接著進行交叉驗證。由於我們的訓練集有重複資料,這會改變資料的分佈,因而訓練結果會有估計偏差,因此,此種方法不是很常用,除非資料量真的很少,比如小於20個。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

相關文章