首先說交叉驗證。
交叉驗證(Cross validation)是一種評估統計分析、機器學習算法對獨立於訓練數據的數據集的泛化能力(generalize), 可以避免過擬合問題。
交叉驗證通常要儘可能知足:
1)訓練集的比例要足夠多,通常大於一半
2)訓練集和測試集要均勻抽樣算法
交叉驗證主要分紅如下幾類:
1)Double cross-validation
Double cross-validation也稱2-fold cross-validation(2-CV),做法是將數據集分紅兩個相等大小的子集,進行兩回合的分類器訓練。在第一回閤中,一個子集做爲訓練集,另外一個做爲測試集;在第二回閤中,則將訓練集與測試集對換後,再次訓練分類器,而其中咱們比較關心的是兩次測試集的識別率。不過在實際中2-CV並不經常使用,主要緣由是訓練集樣本數太少,一般不足以表明母體樣本的分佈,致使測試階段識別率容易出現明顯落差。此外,2-CV中子集的變異度大,每每沒法達到「實驗過程必須能夠被複制」的要求。編程
2)k-folder cross-validation(k折交叉驗證)
K-fold cross-validation (k-CV)則是Double cross-validation的延伸,作法是將數據集分紅k個子集,每一個子集均作一次測試集,其他的做爲訓練集。k-CV交叉驗證重複k次,每次選擇一個子集做爲測試集,並將k次的平均交叉驗證識別率做爲結果。
優勢:全部的樣本都被做爲了訓練集和測試集,每一個樣本都被驗證一次。10-folder一般被使用。安全
3)leave-one-out cross-validation(LOOCV留一驗證法)
假設數據集中有n個樣本,那LOOCV也就是n-CV,意思是每一個樣本單獨做爲一次測試集,剩餘n-1個樣本則作爲訓練集。
優勢:
1)每一回閤中幾乎全部的樣本皆用於訓練model,所以最接近母體樣本的分佈,估測所得的generalization error比較可靠。 所以在實驗數據集樣本較少時,能夠考慮使用LOOCV。
2)實驗過程當中沒有隨機因素會影響實驗數據,確保實驗過程是能夠被複制的。
但LOOCV的缺點則是計算成本高,爲須要創建的models數量與總樣本數量相同,當總樣本數量至關多時,LOOCV在實做上便有困難,除非每次訓練model的速度很快,或是能夠用平行化計算減小計算所需的時間。機器學習
libsvm提供了 void svm_cross_validation(const struct svm_problem *prob, const struct svm_parameter *param, int nr_fold, double *target)方法,參數含義以下:ide
prob:待解決的分類問題,就是樣本數據。
param:svm訓練參數。
nr_fold:顧名思義就是k折交叉驗證中的k,若是k=n的話就是留一法了。
target:預測值,若是是分類問題的話就是類別標籤了。學習
而後咱們討論下參數選擇。
使用svm,不管是libsvm仍是svmlight,都須要對參數進行設置。以RBF核爲例,在《A Practical Guide to Support Vector Classi cation》一文中做者提到在RBF核中有2個參數:C和g。對於一個給定的問題,咱們事先不知道C和g取多少最優,所以咱們要進行模型選擇(參數搜索)。這樣作的目標是找到好的(C, g)參數對,使得分類器可以精確地預測未知的數據,好比測試集。須要注意的是在在訓練集上追求高精確度多是沒用的(意指泛化能力)。根據前一部分所說的,衡量泛化能力要用到交叉驗證。測試
在文章中做者推薦使用「網格搜索」來尋找最優的C和g。所謂的網格搜索就是嘗試各類可能的(C, g)對值,而後進行交叉驗證,找出使交叉驗證精確度最高的(C, g)對。「網格搜索」的方法很直觀可是看起來有些原始。事實上有許多高級的算法,好比可使用一些近似算法或啓發式的搜索來下降複雜度。可是咱們傾向於使用「網格搜索」這一簡單的方法:
1)從心理上講,不進行全面的參數搜索而是使用近似算法或啓發式算法讓人感受不安全。
2)若是參數比較少,「網格搜索」的複雜度比高級算法高不了多少。
3)「網格搜索」可並行性高,由於每一個(C, g)對是相互獨立的。ui
說了那麼大半天,其實「網格搜索」就是n層循環,n是參數個數,仍然以RBF核爲例,編程實現以下:spa
for(double c=c_begin;c<c_end;c+=c_step)
{
for(double g=g_begin;g<g_end;g+=g_step)
{
//這裏進行交叉驗證,計算精確度。
}
}設計
經過上述兩層循環找到最優的C和g就能夠了。
附錄:
使用Cross-Validation時常犯的錯誤
因爲實驗室許多研究都有用到evolutionary algorithms(EA)與classifiers,所使用的fitness function中一般都有用到classifier的辨識率,然而把cross-validation用錯的案例還很多。前面說過,只有training data才能夠用於model的建構,因此只有training data的辨識率才能夠用在fitness function中。而EA是訓練過程用來調整model最佳參數的方法,因此只有在EA結束演化後,model參數已經固定了,這時候纔可使用test data。(固然若是想造假的話就把測試集的數據參與進模型訓練,這樣獲得的模型效果多少會好些,由於模型自己已經包含了測試集的先驗知識,測試集對它來講再也不是未知數據。)
那EA跟cross-validation要如何搭配呢?Cross-validation的本質是用來估測(estimate)某個classification method對一組dataset的generalization error,不是用來設計classifier的方法,因此cross-validation不能用在EA的fitness function中,由於與fitness function有關的樣本都屬於training set,那試問哪些樣本纔是test set呢?若是某個fitness function中用了cross-validation的training或test辨識率,那麼這樣的實驗方法已經不能稱爲 cross-validation了。
EA與k-CV正確的搭配方法,是將dataset分紅k等份的subsets後,每次取1份 subset做爲test set,其他k-1份做爲training set,而且將該組training set套用到EA的fitness function計算中(至於該training set如何進一步利用則沒有限制)。所以,正確的k-CV 會進行共k次的EA演化,創建k個classifiers。而k-CV的test辨識率,則是k組test sets對應到EA訓練所得的k個classifiers辨識率之平均值。