交叉驗證是在機器學習創建模型和驗證模型參數時經常使用的辦法。交叉驗證,顧名思義,就是重複的使用數據,把獲得的樣本數據進行切分,組合爲不一樣的訓練集和測試集,用訓練集來訓練模型,用測試集來評估模型預測的好壞。在此基礎上能夠獲得多組不一樣的訓練集和測試集,某次訓練集中的某樣本在下次可能成爲測試集中的樣本,即所謂「交叉」。 bootstrap
那麼何時才須要交叉驗證呢?交叉驗證用在數據不是很充足的時候。好比在我平常項目裏面,對於普通適中問題,若是數據樣本量小於一萬條,咱們就會採用交叉驗證來訓練優化選擇模型。若是樣本大於一萬條的話,咱們通常隨機的把數據分紅三份,一份爲訓練集(Training Set),一份爲驗證集(Validation Set),最後一份爲測試集(Test Set)。用訓練集來訓練模型,用驗證集來評估模型預測的好壞和選擇模型及其對應的參數。把最終獲得的模型再用於測試集,最終決定使用哪一個模型以及對應參數。app
回到交叉驗證,根據切分的方法不一樣,交叉驗證分爲下面三種: 機器學習
第一種是簡單交叉驗證,所謂的簡單,是和其餘交叉驗證方法相對而言的。首先,咱們隨機的將樣本數據分爲兩部分(好比: 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個。io
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 基礎