1. 程式人生 > >機器學習中特徵選擇概述

機器學習中特徵選擇概述

轉載出處:http://blog.csdn.net/iezengli/article/details/32686803

一、 背景

1) 問題

機器學習的實際應用中,特徵數量可能較多,其中可能存在不相關的特徵,特徵之間也可能存在相關性,容易導致如下的後果:

1.     特徵個數越多,分析特徵、訓練模型所需的時間就越長,模型也會越複雜。

2.     特徵個數越多,容易引起“維度災難”,其推廣能力會下降。

3.     特徵個數越多,容易導致機器學習中經常出現的特徵稀疏的問題,導致模型效果下降。

4.     對於模型來說,可能會導致不適定的情況,即是解出的引數會因為樣本的微小變化而出現大的波動。

特徵選擇,能剔除不相關、冗餘、沒有差異刻畫能力的特徵,從而達到減少特徵個數、減少訓練或者執行時間、提高模型精確度的作用。

2) 如何做特徵選擇

特徵選擇,即是指從全部特徵中選取一個特徵子集,使得使構造出來的模型效果更好,推廣能力更強。如何做特徵選擇呢,如果要從全部特徵中選擇一個最優的子集,使得其在一定的評價標準下,在當前訓練和測試資料上表現最好。

從這個層面上理解,特徵選擇可以看作三個問題:

1.  從原始特徵集中選出固定數目的特徵,使得分類器的錯誤率最小這是一個無約束的組合優化問題;

2.  對於給定的允許錯誤率,求維數最小的特徵子集,這是一種有約束的最優化問題;

3.  在錯誤率和特徵子集的維數之間進行折中。

上述3個問題都是一個NP難問題,當特徵維度較小時,實現起來可行,但是當維度較大時,實現起來的複雜度很大,所以實際應用中很難實用。上述三種特徵選擇都屬十NP難的問題。由於求最優解的計算量太大,需要在一定的時間限制下尋找能得到較好次優解的

演算法。以下介紹對次優解的求解過程。

二、 特徵選擇的一般過程

特徵選擇的一般過程可用圖1表示。首先從特徵全集中產生出一個特徵子集,然後用評價函式對該特徵子集進行評價,評價的結果與停止準則進行比較,若滿足停止準則就停止,否則就繼續產生下一組特徵子集,繼續進行特徵選擇。選出來的特徵子集一般還要驗證其有效性。

綜上所述,特徵選擇過程一般包括:特徵子集產生過程,評價函式,停止準則,驗證過程,這4個部分。

特徵子集產生過程( Generation Procedure )

採取一定的子集選取辦法,為評價函式提供特徵子集。根據搜尋過程的方法的不同,可以將特徵選擇分為窮舉、啟發式、隨機幾種方法。

以上幾種方法不改變特徵的原始屬性,而有些方法通過對特徵進行空間變換,去除相關性。比如PCA、傅立葉變換、小波變換等.

評價函式( EvaluationFunction )

評價函式是評價一個特徵子集好壞程度的一個準則。評價函式的設計在不同的應用場景下會不同,比如有的會根據其分佈是否均勻判斷,或者看對最終模型的效果進行判斷。每種評價函式各有優劣,所以需要根據實際情況進行選擇。根據不同的評價準則,可以分為:過濾器模型、封裝器模型以及混合模型。過濾器模型是將特徵選擇作為一個預處理過程,利用資料的內在特性對選取的特徵子集進行評價,獨立於學習演算法。而封裝器模型則將後續學習演算法的結果作為特徵評價準則的一部分根據評價函式的不同(與採用的分類方法是否關聯),可以將特徵選擇分為獨立性準則、關聯性度量。

篩選器通過分析特徵子集內部的特點來衡量其好壞。篩選器一般用作預處理,與分類器的選擇無關。篩選器的原理如下圖1:


圖1. Filter原理(RicardoGutierrez-Osuna 2008 )

封裝器實質上是一個分類器,封裝器用選取的特徵子集對樣本集進行分類,分類的精度作為衡量特徵子集好壞的標準。封裝器的原理如圖2所示。


圖2. Wrapper原理(RicardoGutierrez-Osuna 2008 )

停止準則( StoppingCriterion )

停止準則是與評價函式相關的,當評價函式值達到某個閾值後就可停止搜尋。比如對於獨立性準則,可以選擇樣本間平均間距最大;對於關聯性度量,可以選擇使得分類器的準確召回最高作為準則。

驗證過程(Validation Procedure )

度量測試資料集上驗證選出來的特徵子集的有效性。最好採取與前期選擇方法不相關的度量方法,這樣可以減少其間的耦合。

 

圖3特徵選擇的過程 ( M.Dash and H. Liu 1997 )

這幾個過程中的不同方法可以看作一種元件,分別進行組合。比如可以採取啟發式特徵篩選方法,結合相關性度量作為評價函式等。

三、 特徵子集產生過程   

產生過程是搜尋特徵子空間的過程。搜尋的演算法分為完全搜尋(Complete),啟發式搜尋(Heuristic),隨機搜尋(Random)3大類,如圖4所示。


圖4搜尋過程分類


當然,每種方法都不是互斥的,也可以將多種方法結合起來使用,取長補短。下面對常見的搜尋演算法進行簡單介紹。

1) 完全搜尋(complete)

完全搜尋分為窮舉搜尋(Exhaustive)與非窮舉搜尋(Non-Exhaustive)兩類。完全搜尋部分考慮特徵之間的相關性,從而能更好地找到最優集合。

A.    廣度優先搜尋( Breadth First Search )

演算法描述:廣度優先遍歷特徵子空間。

Step1:首先將根節點放入佇列中。

Step2:從佇列中取出第一個節點,並檢驗它是否為目標。

substep:如果找到目標,則結束搜尋並回傳結果。

substep:否則將它所有尚未檢驗過的直接子節點加入佇列中。

Step3:若佇列為空,表示所有特徵都檢查過了。結束搜尋並回傳「找不到目標」。

Step4:重複step2。

演算法評價:枚舉了所有的特徵組合,屬於窮舉搜尋,時間複雜度是O(2n),實用性不高。

B.    分支限界搜尋( Branch and Bound )

演算法描述:在窮舉搜尋的基礎上加入分支限界。例如:若斷定某些分支不可能搜尋出比當前找到的最優解更優的解,則可以剪掉這些分支。

C.     定向搜尋(Beam Search )

演算法描述:首先選擇N個得分最高的特徵作為特徵子集,將其加入一個限制最大長度的優先佇列,每次從佇列中取出得分最高的子集,然後窮舉向該子集加入1個特徵後產生的所有特徵集,將這些特徵集加入佇列。

D.    最優優先搜尋( Best First Search )

演算法描述:與定向搜尋類似,唯一的不同點是不限制優先佇列的長度。

2) 啟發式搜尋(heuristic)

啟發式搜尋更多地採用貪心的思想,某些演算法沒有考慮特徵之間的相關性,而單純考慮單個特徵對最終結果的影響,然而現實中的特徵可能存在各種相關性。某些演算法也從這些方面進行改進,比如增L去R選擇演算法,序列浮動選擇。

A.    序列前向選擇( SFS , Sequential Forward Selection )

演算法描述:特徵子集X從空集開始,每次選擇一個特徵x加入特徵子集X,使得特徵函式J( X)最優。簡單說就是,每次都選擇一個使得評價函式的取值達到更優的特徵加入,是一種簡單的貪心演算法。

演算法評價:缺點是隻能加入特徵而不能去除特徵。例如:特徵A完全依賴於特徵B與C,可以認為如果加入了特徵B與C則A就是多餘的。假設序列前向選擇演算法首先將A加入特徵集,然後又將B與C加入,那麼特徵子集中就包含了多餘的特徵A。

B.    序列後向選擇( SBS , Sequential Backward Selection )

演算法描述:從特徵全集O開始,每次從特徵集O中剔除一個特徵x,使得剔除特徵x後評價函式值達到最優。

演算法評價:序列後向選擇與序列前向選擇正好相反,它的缺點是特徵只能去除不能加入。

另外,SFS與SBS都屬於貪心演算法,容易陷入區域性最優值。

C.     雙向搜尋( BDS , Bidirectional Search )

演算法描述:使用序列前向選擇(SFS)從空集開始,同時使用序列後向選擇(SBS)從全集開始搜尋,當兩者搜尋到一個相同的特徵子集C時停止搜尋。

雙向搜尋的出發點是  。如下圖所示,O點代表搜尋起點,A點代表搜尋目標。灰色的圓代表單向搜尋可能的搜尋範圍,綠色的2個圓表示某次雙向搜尋的搜尋範圍,容易證明綠色的面積必定要比灰色的要小。


圖5. 雙向搜尋

D.    增L去R選擇演算法( LRS , Plus-L Minus-R Selection )

  該演算法有兩種形式:

    <1>演算法從空集開始,每輪先加入L個特徵,然後從中去除R個特徵,使得評價函式值最優。( L> R )

    <2> 演算法從全集開始,每輪先去除R個特徵,然後加入L個特徵,使得評價函式值最優。( L< R )

  演算法評價:增L去R選擇演算法結合了序列前向選擇與序列後向選擇思想, L與R的選擇是演算法的關鍵。

E.     序列浮動選擇( Sequential Floating Selection )

  演算法描述:序列浮動選擇由增L去R選擇演算法發展而來,該演算法與增L去R選擇演算法的不同之處在於:序列浮動選擇的L與R不是固定的,而是“浮動”的,也就是會變化的。

    序列浮動選擇根據搜尋方向的不同,有以下兩種變種。

    <1>序列浮動前向選擇( SFFS, Sequential Floating Forward Selection )

      演算法描述:從空集開始,每輪在未選擇的特徵中選擇一個子集x,使加入子集x後評價函式達到最優,然後在已選擇的特徵中選擇子集z,使剔除子集z後評價函式達到最優。

    <2>序列浮動後向選擇( SFBS, Sequential Floating Backward Selection )

      演算法描述:與SFFS類似,不同之處在於SFBS是從全集開始,每輪先剔除特徵,然後加入特徵。

           演算法評價:序列浮動選擇結合了序列前向選擇、序列後向選擇、增L去R選擇的特點,並彌補了它們的缺點。

A.     決策樹( Decision Tree Method , DTM)

演算法描述:在訓練樣本集上執行C4.5或其他決策樹生成演算法,待決策樹充分生長後,再在樹上執行剪枝演算法。則最終決策樹各分支處的特徵就是選出來的特徵子集了。決策樹方法一般使用資訊增益作為評價函式。

3) 隨機演算法(random)

A.    隨機產生序列選擇演算法(RGSS, Random Generation plus Sequential Selection)

演算法描述:隨機產生一個特徵子集,然後在該子集上執行SFS與SBS演算法。

演算法評價:可作為SFS與SBS的補充,用於跳出區域性最優值。

B.    模擬退火演算法( SA, Simulated Annealing )

演算法評價:模擬退火一定程度克服了序列搜尋演算法容易陷入區域性最優值的缺點,但是若最優解的區域太小(如所謂的“高爾夫球洞”地形),則模擬退火難以求解。

C.     遺傳演算法( GA,  Genetic Algorithms )

演算法描述:首先隨機產生一批特徵子集,並用評價函式給這些特徵子集評分,然後通過交叉、突變等操作繁殖出下一代的特徵子集,並且評分越高的特徵子集被選中參加繁殖的概率越高。這樣經過N代的繁殖和優勝劣汰後,種群中就可能產生了評價函式值最高的特徵子集。

隨機演算法的共同缺點:依賴於隨機因素,有實驗結果難以重現。

4) 特徵變換方法

A.    PCA

PCA(Principal ComponentAnalysis),中文名為主成份變換,是一種座標變換的方法,可以去除冗餘特徵。

具體特徵變換過程中,去掉較小的特徵值,從而達到去噪、去除相關性和特徵減少的目的。

B.    小波變換

小波也是一種特徵空間變換的方法,相較於傅立葉變換,小波變換能更好地適應劇烈的變換。

四、 評價函式      

評價函式的作用是評價產生過程所提供的特徵子集的好壞。

1) 獨立準則

獨立準則通常應用在過濾器模型的特徵選擇演算法中,試圖通過訓練資料的內在特性對所選擇的特徵子集進行評價,獨立於特定的學習演算法。通常包括:距離度置、資訊度量,關聯性性度量和一致性度量。

在做比較通用的特徵選擇方法時,建議採用這種方法,因為這是獨立於特定機器學習演算法的,適用於大多數後續機器學習方法。

2) 關聯性度量

關聯準則通常應用在封裝器模型的特徵選擇演算法中,先確定一個學習演算法並且利機器學習演算法的效能作為評價準則。對於特定的學習演算法來說,通常可以找到比過濾器模型更好的特徵子集,但是需要多次呼叫學習演算法,一般時間開銷較大,並且可能不適介其它學習演算法。

在我們做模式分類演算法時,可以根據自己的實際情況,採用關聯性度量方法,這樣能更好地和我們的分類方法相結合,通常能找到比較好的子集。

綜上,兩種種評價函式的優缺點和適用情況總結如下:

方法

獨立性準確

關聯性度量

優點

通用,獨立於特定演算法

對於關聯分類演算法可能是最優的

缺點

效果一般

對其他演算法不適用

適用情況

表格1 兩種種評價函式的優缺點

3) 常見的評價函式

A.     卡方檢驗

卡方檢驗最基本的思想就是通過觀察實際值與理論值的偏差來確定理論的正確與否.具體做的時候常常先假設兩個變數確實是獨立的(“原假設”),然後觀察實際值(觀察值)與理論值(這個理論值是指“如果兩者確實獨立”的情況下應該有的值)的偏差程度,如果偏差足夠小,我們就認為誤差是很自然的樣本誤差,是測量手段不夠精確導致或者偶然發生的,兩者確確實實是獨立的,此時就接受原假設;如果偏差大到一定程度,使得這樣的誤差不太可能是偶然產生或者測量不精確所致,我們就認為兩者實際上是相關的,即否定原假設,而接受備擇假設.

理論值為E,實際值為x,偏差程度的計算公式為:

這個式子就是開方檢驗使用的差值衡量公式.當提供了數個樣本的觀察值x1,x2,……xi,……xn之後,代入到式中就可以求得開方值,用這個值與事先設定的閾值比較,如果大於閾值(即偏差很大),就認為原假設不成立,反之則認為原假設成立.[請參考我的另外一篇卡方檢驗的普及文章]

B.    相關性( Correlation)

 運用相關性來度量特徵子集的好壞是基於這樣一個假設:好的特徵子集所包含的特徵應該是與分類的相關度較高(相關度高),而特徵之間相關度較低的(冗餘度低)。

可以使用線性相關係數(correlationcoefficient) 來衡量向量之間線性相關度。


C.     距離(Distance Metrics )

運用距離度量進行特徵選擇是基於這樣的假設:好的特徵子集應該使得屬於同一類的樣本距離儘可能小,屬於不同類的樣本之間的距離儘可能遠。同樣基於此種思想的有fisher判別分類反法。

常用的距離度量(相似性度量)包括歐氏距離、標準化歐氏距離、馬氏距離等。

D.    資訊增益( Information Gain )      

假設存在離散變數Y,Y中的取值包括{y1,y2,....,ym} ,yi出現的概率為Pi。則Y的資訊熵定義為:


資訊熵是對不確定性的一種描述。具有如下特性:若集合Y的元素分佈不均,則其資訊熵越小;若Y分佈越平均,則其資訊熵越大。在極端的情況下:若Y只能取一個值,即P1=1,則H(Y)取最小值0;反之若各種取值出現的概率都相等,即都是1/m,則H(Y)取最大值log2m。

對於一個特徵t,系統有它和沒它的時候資訊量各是多少,兩者的差值就是這個特徵給系統帶來的資訊量.有它即資訊熵,無它則是條件熵.

條件熵:計算當一個特徵t不能變化時,系統的資訊量是多少.

對於一個特徵X,它可能的取值有n多種(x1,x2,……,xn),計算每個值的條件熵,再取平均值.

在文字分類中,特徵詞t的取值只有t(代表t出現)和(代表t不出現).那麼

最後,資訊增益


但資訊增益最大的問題[對於多分類存在這個問題,對於二分類則不存在]還在於它只能考察特徵對整個系統的貢獻,而不能具體到某個類別上,這就使得它只適合用來做所謂“全域性”的特徵選擇(指所有的類都使用相同的特徵集合),而無法做“本地”的特徵選擇(每個類別有自己的特徵集合,因為有的詞,對這個類別很有區分度,對另一個類別則無足輕重).

同時,資訊熵會偏向於特徵的分佈較多的特徵,所以改進方法是可以嘗試資訊增益率。

E.     分類器錯誤率(Classifier error rate )

使用特定的分類器,用給定的特徵子集對樣本集進行分類,用分類的精度來衡量特徵子集的好壞。   

以上4種度量方法中,卡方檢驗、相關性、距離、資訊增益、屬於篩選器,而分類器錯誤率屬於封裝器。       

篩選器由於與具體的分類演算法無關,因此其在不同的分類演算法之間的推廣能力較強,而且計算量也較小。而封裝器由於在評價的過程中應用了具體的分類演算法進行分類,因此其推廣到其他分類演算法的效果可能較差,而且計算量也較大。

五、 應用例項

此處舉出一個實際應用中的栗子,基本方法為啟發式搜尋(順序新增)+關聯性準則(卡方檢驗、最大熵)+準召停止準則。以下詳細介紹操作步驟。

Step1:統計每種特徵的卡方值.

Step2:取topN的特徵值.

Step3:帶入模型訓練,並在測試集合上計算準確和召回.

Step4:如果達標,停止,否則,gotostep2.

參考文獻

[1]李雲,機器學習中若干特徵選擇演算法研究,博士後學位論文

[2]http://casparzhang.blog.163.com/blog/static/126626558201332701016809/