1. 程式人生 > >機器學習筆記9——特徵選擇

機器學習筆記9——特徵選擇

無限假設類H的情況

上一章針對包含有限個假設類的情況,我們已經證明了一些有用的理論。但是針對包含無限假設的假設類,我們是否能得出類似的結論?

假設給定一個假設類H,存在d個實數引數。因為我們使用電腦代表真實值的話,用雙精度浮點數64bits(位)代表一個實數。這意味著在我們的學習演算法中,假設我們使用雙精度浮點數代表每個實數,那麼共有264dbits(位)。因此,假設類是由最多有k=264d個不同的假設構成。

從上一章最後一小節中的引理得知,為了保證ε(h^)ε(h)+2γ不等式成立,那麼在1σ的概率以下,有如下等式成立:


因此,訓練樣本的數量與模型中的引數的個數很有可能呈線性相關。

實際上我們依賴於64bits(位)的浮點數的出的這一結論並不完全令人滿意,但是結論大致上是正確的:如果我們繼續嘗試對訓練誤差最小化,那麼為了讓包含d個引數的假設類可以“更好的”學習,我們需要與d個引數個數成線性數量的訓練樣本。

因為上述的論證並不完全令人滿意,所以介紹下面的這個(更正式的)論證,證明過程省略。

Vapnik-Chervonenkis維

給定一個由d個點組成的集合S={x(i),...,x(d)},其中x(i)X,我們說一個假設類可以分散集合S,如果H可以實現集合的任意一種的標記形式(就是可以任意為d個點進行標記)。

如果H可以分散集合S,那麼對於S中任意一種的標記形式,都可以在假設類中找到一個假設h

對S中的d個樣本進行完美預測。

舉個例子來說明一下,假設H是一個包含了所有二維現行分類器的假設類,而S是一個包含了三個點的集合:


那麼對於集合S有八種不同的標記方式:

而對於每一種標記方式,都可以在假設類中找到一個假設對能對這些標記完美的分類。所以根據定義,假設類H可以分散集合S。

那麼對於更多點的集合S,假設類也能完美的分散嗎?答案是不能。篇幅原因不給出證明過程,但直接給出結果:在二維的情況下,任意的現行分類器都不能分離四個點構成的集合。

下面我們介紹一下VC維的定義。給定一個假設類H,其VC維表示為VC(H),表示能被H分散的最大集合的大小(如果H可以分散任意大小的集合,那麼它的V

C(H)無窮大)。

舉個例子,如果H是所有二維分類器構成的假設類,那麼它的VC維應為3。因為之前我們看到任意二維分類中的四個點的集合都不能被分離。

當然也不是所有的三個點的集合都能被分離,比如下面這中情況就無法分離:


但是這種情況是沒有問題的,只要存在大小為3的集合可以被分散,那麼VC維就等於3。但是絕對不可能等於4。

上述的理論可以推廣到一般情況,對於任意維度,由n維線性分類器構成的假設類,那麼它的VC維等於(n+1)。

那麼由上述結論可得出定理

給定假設類H,讓它的VC(H)=d,那麼至少在1σ的概率下,針對假設類中所有的假設,有下面的結論成立:


因此,在至少在1σ的概率下,同樣可得:


可將上述的公式寫作如下的引理。

引理:為了保證ε(h^)ε(h)+2γ這個結論在1σ概率下成立,應該滿足以下結論:m=Oγ,σ(d),m與Oγ,σ(d)呈線性關係。

這表明樣本複雜度的上界由VC維決定。實際上,在大多數合理的假設類中,VC維與模型的引數數量成正比。所以也可以得出訓練樣本的數量與模型的引數的數量成線性關係。

模型選擇

模型選擇提供了一類方法可以自動在偏差和方差之間權衡。

一些模型選擇的例子可能包括:1.θ0+θ1x,θ0+θ1x+θ2x2,…..,θ0+θ1x+...+θ10x10等等,本質上就是選擇多項式的次數;2.在區域性加權線性迴歸/其他加權中選擇頻寬函式;3.還包括在支援向量機中選擇引數C(引數C控制了一種權衡關係:你希望你的樣本會以多大的間隔被分隔?對於那些錯誤分類的樣本懲罰力度是多少?)。

接下來會提出一個自動選擇模型的方法

假設有一個包含有限個模型的集合,表示為H={M1,M2,M3...},集合中可以包括多項式函式,也可以包括頻寬函式等,可以將集合中的函式離散成不同的值,然後選擇一個具體的值。

那麼如何選擇一個合適的值呢?其實有很多中標準的方法。

其中一種稱作保留交叉驗證。給定一個訓練集合,隨機劃分成兩個子集。一個稱之為訓練子集,一個稱之為保留交叉驗證子集。訓練子集用來訓練模型,而保留交叉驗證自己用來進行測試。最後選擇具有最小測試誤差的模型作為結果。

通常情況下70%的資料訓練模型,剩下的30%進行交叉驗證。最後還可以用100%的資料對選出的模型進行重新訓練。

這一方法存在一個缺點:現實生活中訓練資料很難獲得,拿出30%的資料做模型選擇不太實際。

那麼接下來介紹幾種保留交叉驗證的變化方法,可以更高效的利用資料。

  • k重交叉驗證
    演算法思路如下:將資料劃分成k份(k = 10比較常見),然後利用k - 1個部分進行訓練,用剩下的一個部分做測試;最後對這k個誤差求平均,得到這個模型的一般誤差的估計。
    缺點:計算量大,為了驗證模型需要訓練k次。

  • 留1交叉驗證
    演算法思路如下:將資料劃分成k份(k = 訓練樣本的數量m),留出一個樣本,剩下的進行訓練。對資料的利用效率比k重交叉驗證要高,但計算量也會相應增多。所以,這種方法需要在樣本數量很少的情況下使用。

關於模型選擇還有一種特例:特徵選擇問題。舉個例子,對於很多機器學習的演算法來說,可能面對一個非常高維的特徵空間,即輸入特徵x的維數可能非常高。那麼這麼多的特徵如果都用上可能會存在過擬合的風險。那麼如果能減少特徵的數量,就可以減少演算法的方差。

所以,在特徵選擇問題中,我們會從原始的特徵中選出一個子集,我們認為這個子集對特定的學習問題來說是最為相關的,這樣就擁有了一個更為簡單的假設類。

那麼應該如何進行特徵選擇呢?對於n個特徵,會有2n個子集,在進行選取的過程中,可以使用不同的啟發式規則進行搜尋。如果用簡單的搜尋方式在2n個子集中搜索,那麼空間太大,我們不可能對每一種可能的子集進行列舉。

接下來提出幾個搜尋方法,用於便捷的進行特徵選擇:

1.前向選擇演算法

演算法流程如下:

  • 初始化特徵子集F=

  • 重複如下過程{

    (1) for i = 1,…n 嘗試將特徵i將入到F中,並對模型進行交叉驗證

    (2) 令F=F (1)中找到的最好的特徵
    }

  • 輸出得到的最好的假設

2.後向選擇演算法

演算法流程如下:

  • 初始化特徵集F={1,2,...n}

  • 之後每次從F中刪除一個特徵(與前向選擇演算法一樣,此處需要迴圈處理)

  • 輸出得到的最好的假設

因為後向選擇演算法中初始特徵集合包含所有的特徵,如果特徵維數很高,那麼一開始用這個特徵集合進行訓練模型可能不妥。所以前向選擇演算法用的更多一些。

(前向與後向選擇演算法可以統稱為封裝特徵選擇演算法。這種演算法效果通常很好,比接下來要講的這一類選擇演算法通常要好一些。但是這一封裝演算法需要很大的計算量。)

3.過濾特徵選擇演算法

演算法基本思想如下:對於每一個特徵i,我們都要計算一些衡量標準,來衡量對y的影響有多大。可以通過計算與y的相關度來衡量,然後選擇與y相關度最高的k個特徵;另一種方式是,計算特徵x與y的相互資訊,用MI(xiy)來代替,有如下等式:


等式中所有的概率分佈都可以用訓練資料進行估計。等式同樣可以這樣表示:


其中KL距離用來度量不同的概率分佈之間的差異。換句話說,KL距離是一種關於兩個概率分佈之間差異的一種度量標準。P(xi,y)代表兩個變數x,y之間的joint概率分佈。如果x,y相互獨立,那麼這兩個概率相等,分佈相同,KL距離為0;相反,如果x,y之間的依賴性很高,換句話說,如果x對y的值影響很大,那麼KL距離將會很大。

之後,選擇前k個特徵。對特徵驗證的話可以選擇交叉特徵驗證演算法。