之前的blog討論過經驗風險與結構風險之間相互限制的關係,如下圖:
http://blog.csdn.net/ice110956/article/details/14002791
我們在相同VC維的模型中,選擇經驗風險最小的模型,能夠得到與真實風險誤差有一定上限的結果,即這種策略的結果可控,雖然不是最優的。
那麼,在不同的VC維模型中,比如遇到一個分類問題,是使用SVM,貝葉斯,還是決策樹?這時候如何選擇呢?一個常見的方法就是交叉驗證。
交叉驗證就是把訓練樣本的一部分獨立出來作爲測試樣本,用這時候的測試誤差來估計真實數據分佈的結構誤差。如下是幾種常見的交叉驗證方法。
簡單交叉驗證
1. 隨機選取一部分樣本爲訓練(通常爲70%),剩下(30%)做測試,然後選擇測試誤差最小的模型。
2. 取整體樣本,用第一步得到的模型做再訓練,得到最終模型。不過,當模型或數據非常不穩定的時候,再訓練的結果有時候也會不好。
上述簡單交叉驗證的缺點就是,浪費了部分數據(30%)。如果數據量較大,那沒有很大影響,但是在數據很小時影響較大。
k-fold交叉驗證
1.把樣本分爲k個相同大小的子集,用其中一個i測試,剩下k-1個訓練。
2.改變測試集i,重複上述過程
3.把k次測試得到的結果取平均,作爲這個模型的結構誤差估計,然後選取最小結構誤差的模型。
通常,k=10會取得較好的結果。
leave-one-out 交叉驗證
還有一種情況,數據量特別小,上述取90%訓練還是有很大影響。那麼極端的,我們取k=m,即每個樣本一個子集,做交叉驗證。
教研室常用的方法
教研室的大體方法就是10-fold交叉驗證,不過不是把集合劃分爲10份,而是每次隨機選擇90%的樣本做訓練,然後隨機10次,取平均結果。