小樣本情況下使用SVM的思考
今日在驗證測試數據時,發現當採用cross_val_score進行交叉驗證時,對於隨機分配的測試集比例越大,正確率便越高,而測試集越小,平均正確率就越有可能低。
使用svm推導模型時,有兩個大坑,一個是train_test_split後,當數據量不夠時,學習到的樣本分佈差異很大,極不穩定,如何才是最優的train_test_split分法,很難確定,然後就是模型的泛化能力的評估是否可靠,這一塊又與train_test_split所劃分的數據集相捆綁,這直接導致了,偶爾在測試集上拿了高分,也只是一種假象。
這是因為SVM實際上擬合的是數據分佈,在樣本中學習到的也是分佈,而樣本數量在隨機抽樣時,分佈的所呈現的結構也是不同的。
當測試集小時,有時集中推斷錯誤的數據會集中在一起,因此便會導致在測試集上的平均表現欠佳。
因此在卷積裡在圖像識別時,對於圖像可以進行不同分辨率的採樣,其實目換就是為了得到指向一個概念的不同分佈,通過這樣的訓練能夠提升神經網絡的泛化能力。
SVM的過程是直接一次性fit的,因此很難進行調整與改善,因為它每一次fit的都是整個分佈的情況,難以實現漸進式學習那樣的調整。
隨機森林相對來說,因為有分裂子樹進行局部抽樣的學習機制,所以相對更容易不過擬合,但整體效果是否會更好,也看數據的實際情況。
因此對於SVM擬合的數據集,應當做出一假設,即是在已有的數據中,如果能抽樣出來的子分佈集中,恰好有一個泛化性能很好的分佈存在,那麼通過網格搜索參數的方法,是能很有可能將它搜索出來的。
而更好的泛化性,意味著,比如在實際的推斷任務中,假如存在有一個完整的數據分佈話,這個泛化性能好的子集分佈,整體上會與這個完整的數據空間分佈更為相近。
因此,如果整個數據集合是G,而近似的這個子集為g,而從G中抽出來的其它集合,如果比較小的話,例如a,b,c,那麼呈現出來的分佈,便不一定會與g相似。
顯然比如一個整體分佈是{0,1,0,0,1,0,1,0,0,0},按0.33的比例抽取出來的分佈可能是{0,0,0}與{1,1,1},這也就意味著如果數據集不大,並在例較小的測試集上,進行交叉驗證,得出來的分數會出現不客觀地偏低的情況。
因此交叉驗證取K折的話,需要進行測試所取的數據的量,應當與原有訓練集的量差不多才能更好地客觀反映accuracy,roc,f1之類的評分。
根據實驗來看,例如用0.8比例的數據作為訓練集,如用隨機森林達到90%正確率,而再用全集取隨機抽取0.8的比例數據集做K折驗證,結果會下降到78%左右,這與大多數時候,實驗時數據模型效果看起來不錯,但上線後會損失10%~20%的情況相近。