機器學習入門講解:什麼是特徵和特徵選擇
在machine learning (機器學習)中,特徵工程是重中之重,我們今天就來簡單介紹一下特徵工程裡面的feature(特徵),以及feature selection (特徵選擇)。
首先我們來看看中文字典里是怎麼解釋特徵的:一事物異於其他事物的特點。
那我們再來看看英文字典里是怎麼解釋feature的:A feature of something is an interesting or important part or characteristic of it.
我們把這兩個綜合一下,特徵就是,於己而言,特徵是某些突出性質的表現,於他而言,特徵是區分事物的關鍵,所以,當我們要對事物進行分類或者識別,我們實際上就是提取『特徵』,通過特徵的表現進行判斷。好了,我們先來舉個例子:
在Prof Fei-Fei Li 等人的論文里<CLEVR: A Diagnostic Dataset for Compositional Language and Elementary Visual Reasoning>, 他們為了更好的用Compositional Language(組合語言) 去描述一幅圖,比如特點,數量,方位關係等,他們就會刻意去收集自己想要的feature,比如如下圖所示,Cubes are gray, blue, brown, or yellow,Cylinders are red, green, purple,這些都是能突出自己性質的特徵,『淺綠色方體在最大紅球的右邊』,這種也可以表徵自己方位的特徵。
事物的特徵非常多,但最終,提取的特徵應該要服從我們的目的,還是拿上圖舉例子,假如我想知道有多少個立方體, 上來就把形狀,顏色,大小等feature 全提了個遍是非常不明智的,這就是在浪費計算資源, 所以我們只需要選擇形狀這個feature就好啦。
』
你可能會想,對啊,我一開始就只去提取形狀這一個feature不就好了嗎?這是因為你肉眼就可以做出判斷了,但是,生活往往是艱難的,對於我們採集到的數據,很多情況下可能都不知道怎麼去提取特徵,或者我們需要去提取大量的feature來做分析。我再舉個栗子,我曾經做過一個項目,是通過分析EEG (腦電波圖)來查看病人是否得了癲癇,如果病人的癲癇發作,那麼他的腦電波會出現一些不同尋常的變化,這些變化,我們稱之為 』spike』, 這個spike 就是癲癇病人的特徵了,我們的目的,就是在EEG中把這些spike找出來。
首先我們來看看病人EEG:
紅色的波形就是spike,藍色的波形就是正常的腦電波了,我們稱之為『background』,我們的目的就是要把background和spike分別出來。我們再來看幾個spike的例子:
以上是不同情況下病人突發癲癇癥狀的腦電波,可以看見spike變換無常,我們很難找到其中規律,因此我們只能嘗試通過提取更高維的特徵再讓機器自己做分析。
首先我提取了Peak,Nonlinear Energy Operator(NLEO), Discrete Wavelet Transform(DWT) 3類特徵,每類6個特徵(同種類特徵參數不一樣,提取的特徵也不一樣),共18個特徵,得到的分類準確率只有76.25%,然後我又在原來的特徵基礎上做了一下嘗試:
- 特徵類別不變,修改特徵參數(比如修改特徵頻率),增加每種特徵個數,共30種,測試的分類準確率為76.83%,這個情況提升只有0.6%。
- 增加特徵類別,新增了如p2t, t2p等類別的特徵,測試的分類準確率為72.3%,準確率不升反降。
那麼,我們就可以假設出一個結論:
- 我們提取得特徵中有冗餘特徵,對模型的性能幾乎沒有幫助。
- 我們提取的特徵中有些可以列為雜訊(或者可以稱為老鼠屎),對模型的性能不僅沒有幫助,還會降低模型的性能。
那麼,我們很自然就會想到要進行feature selection(特徵選擇)。
那麼,我們接下來要講的就是今天的主題啦,feature selection。
Q1: 我們為什麼要進行feature selection?
要是你從事過machine learning相關工作,肯定會發現一個問題,模型一樣,演算法一樣,使用的機器,軟體啊也一樣,甚至連原始數據都一樣,但最後訓練得到的model效果還是有差別,這是為啥子咧?其中一個可能的原因,不同的model, 選取的特徵不一樣,效果也不一樣。
機器學習本質上就是針對一堆數據進行統計學的分析,最後得到的模型是根據分析的數據為基礎的。所以,敲黑板!!feature selection 的本質就是對一個給定特徵子集的優良性通過一個特定的評價標準(evaluation criterion)進行衡量.通過特徵選擇,原始特徵集合中的冗餘(redundant)特徵和不相關(irrelevant)特徵被除去。而有用特徵得以保留。
很多情況下,比如上面提到分析EEG來檢測癲癇,我們並不知道要提取什麼特徵,所以我們會提取大量特徵,少則幾十,多則上億,自己手中如果有上億元那真是好東西,一分錢都不能扔,但是手上有上億維的特徵值,那就得先想辦法把那些沒用的垃圾特徵統統扔掉,因為分析的是垃圾,結果也是垃圾。就像魯迅所說:「sometimes, less is better.」
好了,我們再來看看這個癲癇例子。我把所有的提取的特徵數據都放進模型里進行訓練(我這裡用的是隨機森林Random Forest,以後我會針對這些machine learning 的model做一個專門的解釋和分析),testing 準確率為71%左右,下面是在同樣的訓練和測試數據情況下,針對某些特徵進行單獨訓練和測試得到結果:
可以明顯的看到,不同的特徵,結果還是差別很大的,如果我只用選取上圖準確率最高的一類特徵來訓練模型,80.32%測試結果將比使用全部特徵作為訓練數據71%好不少,這個DWT-Approx(4-14Hz) db2,k=1 特徵就相當於我們第一個例子中找正方體的『形狀』特徵,即主要特徵。那麼針對未來的訓練,我們可以嘗試提取表現最好的幾個特徵就好了,這樣我們就:
- 降低了模型的複雜度,節省了大量計算資源以及計算時間。
- 提高了模型的泛化能力。什麼是泛化能力呢,我打個比方,一個模型是通過訓 測,可是有些人長的就像雜訊,對模型將會產生一定的影響,這樣第一個模型的泛化能力就比第二個模型好不少,因為他不看臉,普適性更強。
Q2: 有哪些feature selection的方法呢?
通常來說,我們要從兩個方面來考慮特徵選擇:
- 特徵是否發散:如果一個特徵不發散,就是說這個特徵大家都有或者非常相似,說明這個特徵不需要。
- 特徵和目標是否相關:與目標的相關性越高,越應該優先選擇。
總得來說,特徵選擇有三種常用的思路:(以下的方法由於涉及到大量專業知識以及公式推演,全部說清楚篇幅較長,請讀者們自己搜吧,網上都有)
(1)特徵過濾(Filter Methods):對各個特徵按照發散性或者相關 性進行評分,對分數設定閾值或者選擇靠前得分的特徵。
優點:簡單,快。
缺點:對於排序靠前的特徵,如果他們相關性較強,則引入了冗 余特徵,浪費了計算資源。 對於排序靠後的特徵,雖然獨立作 用不顯著,但和其他特徵想組合可能會對模型有很好的幫助, 這樣就損失了有價值的特徵。
方法有:
- Pearson』s Correlation,:皮爾遜相關係數,是用來度量 兩個變數相互關係(線性相關)的,不過更多反應兩個服從 正態分布的隨機變數的相關性,取值範圍在 [-1,+1] 之 間。
- Linear Discriminant Analysis(LDA,線性判別分析):更 像一種特徵抽取方式,基本思想是將高維的特徵影到最佳鑒 別矢量空間,這樣就可以抽取分類信息和達到壓縮特徵空 間維數的效果。投影后的樣本在子空間有最大可分離性。
- Analysis of Variance:ANOVA,方差分析,通過分析研究不 同來源的變異對總變異的貢獻大小,從而確定可控因素對研 究結果影響力的大小。
- Chi-Square:卡方檢驗,就是統計樣本的實際觀測值與理論 推斷值之間的偏離程度,實際觀測值與理論推斷值之間的偏 離程 度就決定卡方值的大小,卡方值越大,越不符合;卡 方值越小,偏差越小,越趨於符合。
(2)特徵篩選(Wrapper Methods)::通過不斷排除特徵或者不 斷選擇特徵,並對訓練得到的模型效果進行打分,通過預測 效果評 分來決定特徵的去留。
優點:能較好的保留有價值的特徵。
缺點:會消耗巨大的計算資源和計算時間。
方法有:
- 前向選擇法:從0開始不斷向模型加能最大限度提升模型效果的特徵數據用以訓練,直到任何訓練數據都無法提升模型表現。
- 後向剃除法:先用所有特徵數據進行建模,再逐一丟棄貢獻最低的特徵來提升模型效果,直到模型效果收斂。
- 迭代剃除法:反覆訓練模型並拋棄每次循環的最優或最劣特徵,然後按照拋棄的順序給特徵種類的重要性評分。
(3)嵌入法(Embedded Methods):有不少特徵篩選和特徵過濾的共性,主要的特點就是通過不同的方法去計算不同特徵對於模型的貢獻。
方法:Lasso,Elastic Net,Ridge Regression,等。
嵌入法需要涉及到大量的理論基礎和公式,這裡就不討論了。
實際上,特徵工程實際上是一個非常大的概念,包括數據預處理,特徵選擇,降維等等。本篇文章僅做一個入門級的特徵以及特徵選取的講解。後面我會對降維進行解析,因為降維在特徵工程中也是重中之重。
如要轉載,請聯繫我。
『
推薦閱讀: