【特征工程】特征選擇與特征學習
特征選擇(Feature Selection,FS)和特征抽取(Feature Extraction, FE)是特征工程(Feature Engineering)的兩個重要的方面。 他們之間最大的區別就是是否生成新的屬性。 FS僅僅對特征進行排序(Ranking)和選擇, FE更為復雜,需要重新認識事物, 挖掘新的角度, 創新性的創立新的屬性, 而目前深度學習這么火, 一個很重要的原因是縮減了特征提取的任務。 不過, 目前特征工程依然是各種機器學習應用領域的重要組成部分。
1.為什么要特征選擇?
1.1特征選擇與分類器性能的關系
一般說來,當固定一個分類器的話, 所選擇的特征數量和分類器的效果之間會有一個曲線, 在某個x(1<=x<=n)的地方, 會達到最優。那么, 該怎么選這x個特征呢? 這是一個比較難的問題。
1.2 為什么特征少了不行?
這個比較直觀, 特征少了會導致無法區分的情況發生。 如下圖所示,僅僅依賴x1或者x2特征, 都無法區分這兩類數據, 所以當特征數量過小, 很可能導致數據重疊。進而, 所有分類器都會失效。
1.3 為什么特征多了也不行?
那為什么特征多了也不行呢? 如下圖所示,明明根據縱軸來判斷就可以容易的區分兩類, 但是因為引入了橫軸的特征, 使得同類數據在空間中距離變遠,變稀疏了。 進而使得很多分類器失效。 所以, 特征不是越多越好!
2. 特征選擇的一般流程
根據前面如何得到一個最優的子集, 那么特征選擇的的一般流程就是, 找一個集合,然后針對某個學習算法, 測試效果如何, 一直循環直到找到最優集合為止。
如果把Evaluation再突出表示, 那么整個流程就會是如下圖這樣一個過程。
那么按照這個流程, 是不是特征選擇就解決呢? 固定一個算法, 然后搜索(Search)一個測試子集, 然后進行Cross-Validation進行評價,直到找到最優目標。 那么這個搜索空間有多大呢?假設有n個特征, 每個特征可以選擇或者不選擇, 那么就是2的n次方的搜索空間,n為特征數量。所以基本上n=10的時候,就是一個1024次的嘗試。如果每次嘗試1分鍾, 光這個就需要1天時間。 尤其當n>10的情況, 是非常常見的。
所以當n<10的時候, 看上去一些暴力搜索算法還是可以嘗試一下的。其他一些常見的搜索算法也可以試試:
窮舉法(Exhaustive): 暴力窮盡
貪心法(Greedy Selection): 線性時間
模擬退火(Simulated Annealing): 隨機嘗試找最優
基因算法(Genetic Algorithm): 組合深度優先嘗試
鄰居搜索(Variable Neighbor Search): 利用相近關系搜索
我們把基於Cross-Validation和基因算法(GA)的一般流程列在如下:
但是, 始終當n很大的時候, 這個搜索空間會很大,如何找最優值還是需要一些經驗結論。
3. 機器學習特征選擇的經典三刀?
特征選擇的經典經驗總結起來主要有三刀: 飛刀(Filter), 彎刀(Wrapper), 電刀(Embedded)。 類比起來:
小李飛刀(Filter): 快速無比, 但是能不能打的准,還得看各自功力。
圓月彎刀(Wrapper): 實力無窮, 但是會不會用, 需要點悟性和魔力,還靠點運氣。
高頻電刀(Embedded): 模式單調,快速並且效果明顯, 但是如何參數設置, 需要深厚的背景知識。
Filter, Wrapper, Embedded 為什么是具有這些特性呢?
3.1 Filter 過濾式 (飛刀)
顧名思義,就是要基於貪心的思想, 把需要的特征篩/濾出來。 一般說來, 基於貪心就需要對特征進行打分。 而這個打分可以基於領域知識, 相關性, 距離,缺失, 穩定性 等等。
單一特征選擇
根據每個特征屬性和目標屬性之間的計算值來進行排序選擇:
a. Welch's t-Test: 來判斷兩個屬性的分布的均值方差距離。
b. Fish-Score: 和Welch's t-Test類似, 計算兩個分布的距離, 均值只差和方差之和的距離。
c. Chi-Squared test: 計算類別離散值之間的相關性。
d. Information Gain:計算兩個划分的一致性。
多特征選擇
根據多個特征屬性和目標屬性之間的計算值來進行排序選擇:
e. Relief-F: 根據隨機選擇的樣本點,來計算屬性之間的相關性。
f. Correlation Feature Selection (CFS): 利用屬性之間的相關性, 進行選擇。
3.2. Wrapper 包裹式 (彎刀)
就是先選定特定算法,然后再根據算法效果來選擇特征集合。 一般會選用普遍效果較好的算法, 例如Random Forest, SVM, kNN等等。
這可以使用前面提到的各種減小搜索空間的嘗試。 其中最經典的是使用啟發式搜索(Heuristic Search), 而概括的來說主要分為兩大類:
g. Forward Selection: 挑出一些屬性, 然后慢慢增大挑出的集合。
h. Backward Elimination: 刪除一些屬性,然后慢慢減小保留的集合。
3.3 Embedded 嵌入式 (電刀)
利用正則化思想, 將部分特征屬性的權重變成零。 常見的正則化有L1的Lasso,L2的Ridge和混合的Elastic Net。其中L1的算子有明顯的特征選擇的功能。
在這里面,比較簡單的就是會自動進行特征選擇, 而且一次性就搞定了, 速度也不錯, 難點就是損失函數的選擇和縮放參數的選擇。 常見的損失函數如下圖所示:
Binary(0-1) loss: 灰線 對應錯誤率
Square loss: 紫線 對應 最新二乘法
Hinge loss: 淺藍 對應 SVM
Logistic loss:紅線 對應 邏輯回歸
Exponential loss:綠線 對應 adaboost
結構化Lasso
除了上述的簡單的Lasso,還有結構化的Lasso。
i. Group Lasso: 先將屬性進行分組, 然后對每個分組,看成一個屬性那樣 的采用Lasso的方法選擇, 要么全要, 要么全部不要。 再進一步, Sparse Group Lasso再在組內進行選擇。
j. Tree-Structured Lasso: 除了前面的扁平(Flat)的結構外, 還有層次化的結構。
對於這種情況, 同樣采用類似Group Lasso的思想。 對於一個數的子結構, 要么全要或者全不要,也可以允許分支單獨要。
在這種樹結構的思想下, 那么每個樹的分支的正則化懲罰也可以采用不同的形式。
k. Graph Structure Lasso: 更進一步還可以推廣到基於圖的Lasso
在圖的情況下, 那么兩兩節點之間要定義一個懲罰項。
樹結構Lasso也可以利用圖來表示。
再次強調, 很多時候, 需要綜合上面的三刀來進行綜合選擇。 特征選擇不是一個容易的任務噢。
小結, 特征選擇的三刀要用的好需要自己實戰體會的, 下面再簡單歸納下:
Filter (F刀):
優點: 快速, 只需要基礎統計知識。
缺點:特征之間的組合效應難以挖掘。
Wrapper(W刀):
優點: 直接面向算法優化, 不需要太多知識。
缺點: 龐大的搜索空間, 需要定義啟發式策略。
Embedded(E刀):
優點: 快速, 並且面向算法。
缺點: 需要調整結構和參數配置, 而這需要深入的知識和經驗。