1. 程式人生 > >機器學習--交叉驗證

機器學習--交叉驗證

轉自:

交叉驗證(Cross validation),有時亦稱迴圈估計, 是一種統計學上將資料樣本切割成較小子集的實用方法。於是可以先在一個子集上做分析, 而其它子集則用來做後續對此分析的確認及驗證。 一開始的子集被稱為訓練集。而其它的子集則被稱為驗證集或測試集。交叉驗證是一種評估統計分析、機器學習演算法對獨立於訓練資料的資料集的泛化能力(generalize),

交叉驗證一般要儘量滿足:

1)訓練集的比例要足夠多,一般大於一半
2)訓練集和測試集要均勻抽樣

交叉驗證主要分成以下幾類:
1)k-folder cross-validation:
k個子集,每個子集均做一次測試集,其餘的作為訓練集。交叉驗證重複k次,每次選擇一個子集作為測試集,並將k次的平均交叉驗證識別正確率作為結果。
優點:所有的樣本都被作為了訓練集和測試集,每個樣本都被驗證一次。10-folder通常被使用。
2)K * 2 folder cross-validation


是k-folder cross-validation的一個變體,對每一個folder,都平均分成兩個集合s0,s1,我們先在集合s0訓練用s1測試,然後用s1訓練s0測試。
優點是:測試和訓練集都足夠大,每一個個樣本都被作為訓練集和測試集。一般使用k=10
3)least-one-out cross-validation(loocv)
假設dataset中有n個樣本,那LOOCV也就是n-CV,意思是每個樣本單獨作為一次測試集,剩餘n-1個樣本則做為訓練集。
優點:
1)每一回閤中幾乎所有的樣本皆用於訓練model,因此最接近母體樣本的分佈,估測所得的generalization error比較可靠。
2)實驗過程中沒有隨機因素會影響實驗資料,確保實驗過程是可以被複制的。
但LOOCV的缺點則是計算成本高,為需要建立的models數量與總樣本數量相同,當總樣本數量相當多時,LOOCV在實作上便有困難,除非每次訓練model的速度很快,或是可以用平行化計算減少計算所需的時間。

http://www.amuhouse.com/blog/attachments/month_0712/j20071212201230.gif

——-十折交叉驗證:10-fold cross validation——-

英文名叫做10-fold cross-validation,用來測試演算法準確性。是常用的測試方法。將資料集分成十分,輪流將其中9份作為訓練資料,1份作為測試資料,進行試驗。每次試驗都會得出相應的正確率(或差錯率)。10次的結果的正確率(或差錯率)的平均值作為對演算法精度的估計,一般還需要進行多次10折交叉驗證(例如1010折交叉驗證),再求其均值,作為對演算法準確性的估計。

之所以選擇將資料集分為10份,是因為通過利用大量資料集、使用不同學習技術進行的大量試驗,表明10折是獲得最好誤差估計的恰當選擇,而且也有一些理論根據可以證明這一點。但這並非最終診斷,爭議仍然存在。而且似乎

5折或者20折與10折所得出的結果也相差無幾。

http://bioinfo.cipf.es/wikigepas/_media/cross_validation.jpg

交叉驗證是機器學習、資料探勘中經常要用到的技巧。很有必要很好的掌握它。所以試著寫點這方面的理解,希望對大家有幫助。

文章分為兩個部分: 一、交叉驗證的原理; 二、分享一個好用的實現了大多數交叉驗證的方法包(python scikit-learn)。

在用隨機化抽樣(random sampling)方法將資料集分為訓練集和測試集過程,劃分資料集常常會導致過度專門化(over-specialization)的問題,即資料的性質分佈不均勻,將會導致由訓練集訓練出來的學習模型,在測試集上表現的很差,類似於過擬合(over-fit)的現象。基於這個原因,我們希望能夠重複多次的進行訓練學習模型和測試模型步驟。通過隨機化抽樣的方法選定K個不同的訓練集和測試集,分別用來訓練出學習模型和測試模型。最後,通過取K個學習模型效能的均值,來解決過度專門化的問題。 而這個過程也稱之為交叉驗證(Cross-Validation)。

常用的交叉驗證有:K-Folds cross validation、Stratified K-Folds cross validation、Leave-one-out cross validation  等等。

#好東西要分享#