模型選擇的標准是盡可能地貼近樣本真實的分布。但是在有限的樣本下,如果我們有多個可選模型,比如從簡單到復雜,從低階到高階,參數由少到多。那么我們怎么選擇模型呢,是對訓練樣本的擬合度越好就可以嗎?顯然不是,因為這樣做的話只會讓我們最終選擇出最復雜,最高階的模型。而這個模型的問題是過擬合的,即對樣本真實分布的預測誤差是很高的。那么該如何選擇模型,使得泛化誤差盡量小呢,有下面這些常用的方法:
保留交叉驗證
把樣本分成訓練樣本和測試樣本,一般可以7比3的比例。7成的樣本訓練出的模型,用3成的樣本做檢驗。取測試准確率最高的模型
K折交叉驗證
取K為10為例,把所有樣本平均分成10分,然后用9份訓練,剩下的1份做測試。這樣可以做十次測試,取十次測試的准確率的平均值最高的模型做為選取的模型。
留1交叉驗證
當樣本數目很少並且很難取得的時候,K折交叉驗證的極限就是讓K等於樣本數目N,這樣N-1個樣本作為訓練樣本,1個作為測試樣本。經過N次測試,取平局准確率最高的模型作為我們選擇的模型。
在交叉驗證做完選取理想模型之后,可以把所有樣本再放到模型中訓練一次,作為最后的輸出模型。
下面介紹特征選擇
對於特征選擇來說,我們可能面臨的問題是特征太多,有很多特征是屬於冗余信息或者無關信息,這些會增加我們訓練的時間,尤其是當特征特別多的時候,比如說朴素貝葉斯做垃圾郵件過濾,以單詞作為特征,這樣的特征集大小可能高達數十萬。如何做特征選擇呢,常用方法一般分成下面的類別:
包裹式特征選擇
包裹式的意思是把模型訓練封裝,我們對特征子集進行啟發式搜索,找到一個較好的子集。比如前向搜索,是從一個空集開始,選擇一個特征作為特征子集,找到測試結果最好的那個特征,此時特征子集的大小變為1,完成第一次迭代。下一次迭代,從剩余的特征中選取一個加入當前子集,找到能使得測試結果最好的那個子集最為這次迭代的特征子集。一次迭代直到達到我們預設的子集大小或者測試結果幾乎沒有改善為止。類似地,后向搜索的初始特征子集是所有特征,然后每次迭代從里面減少一個特征。很顯然,這兩種方法都是貪心算法,並不保證全局最優。
過濾式特征選擇
過濾式特征選擇不是通過模型訓練的方式來選擇特征子集。它是通過統計的方法找出對於樣本標記最重要的特征。
比如說計算相對熵的KL距離是其中一種方式。我們要計算的是每個特征對於標記來說MI(mutual information),即特征對於標記來說的信息相關度。對於第i個特征,有:
$$MI(x_{i},y) = \sum_{x_{i}\subseteq X_{i}}\sum_{y\subseteq Y_{i}}p(x_{i},y)log\frac{p(x_{i},y)}{p(x_{i})*p(y)}$$
其中$X_{i}$ $Y_{i}$分別為$x_{i}$和y所有可能的取值的集合。
上式就是KL距離,可表示為$KL(p(x_{i},y) || p(x_{i}) p(y))$,直觀地理解,當$x_{i}$和y是獨立不相關時,理論計算出的KL距離為0。