1. 程式人生 > >交叉驗證

交叉驗證

out 真的 trap for tex 估計 深入分析 neu 一份

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

那麽什麽時候才需要交叉驗證呢?交叉驗證用在數據不是很充足的時候。比如在我日常項目裏面,對於普通適中問題,如果數據樣本量小於一萬條,我們就會采用交叉驗證來訓練優化選擇模型。如果樣本大於一萬條的話,我們一般隨機的把數據分成三份,一份為訓練集(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個樣本中很有可能有重復的樣本數據。同時,用原始的m個樣本做測試集。這樣接著進行交叉驗證。由於我們的訓練集有重復數據,這會改變數據的分布,因而訓練結果會有估計偏差,因此,此種方法不是很常用,除非數據量真的很少,比如小於20個。

交叉驗證