《美團機器學習實踐》第2章 特徵工程

2.1 特徵提取
從數學的角度,特徵工程就是將原始數據空間變換到新的特徵空間,所以特徵提取就是對原始數據進行變化的過程。
特徵工程和模型之間存在trade off,即特徵工程如果很複雜,即使用簡單的模型也可以得到不錯的結果。如果特徵工程做的很糙,只能寄希望於用很複雜的模型了。
特徵工程應該怎麼做呢?特徵工程一般跟專業領域知識強相關,特徵工程可以說是業務邏輯的一種數據層面的表示。所以特徵工程的第一步是理解業務數據和業務邏輯。特徵提取可以看作用特徵描述業務邏輯的過程。

2.1.1 探索性數據分析
探索性數據分析,即EDA,目的是儘可能地洞察數據集、發現數據的內部結構,、提取重要的特徵、檢測異常值、檢驗基本假設、建立初步的模型。

2.1.2 數值特徵
對於數值類型的特徵,我們主要考慮的是大小和分佈。對於那些目標變量爲輸入特徵的光滑函數的模型,如線性模型、邏輯迴歸等。這些模型對輸入特徵的大小很敏感。因此, 當使用光滑函數時,有必要對輸入進行歸一化。而對於那些基於樹的模型,例如隨機森林、剃度提升樹等,這些模型對輸入特徵的大小不敏感,輸入不需要歸一化。
下面介紹8種常見的數值類型特徵的處理方法。
1)截斷
對連續型數值特徵進行截斷,可以生成類別特徵。對於長尾數據,可以先進行對數轉換,然後進行截斷。

2)二值化

3)分桶
i) 均勻分桶:每個桶的值域是一樣的,比如把年齡分爲0~9歲,10~19歲等
ii) 分位數分桶:可以使得每個桶裏的數據量大體一致
iii) 最佳分桶:通過模型,找到最佳分段。R中有smbinning包可以做基於監督學習的分桶。

4)縮放
i)標準化縮放 (z縮放)
將數值變量的均值變爲0,方差變爲1
ii)最大最小值縮放
iii)基於某種範數的歸一化
如使用L1範數、L2範數將數值向量的範數變爲1
iv)平方根縮放或對數縮放
對數縮放對於長尾分佈且取值爲正的數值變量非常有效,它可以將大段長尾壓縮爲短尾。
v)健壯縮放
針對有異常點的數據,改進標準化縮放,使用中位數代替均值,使用分位數代替方差。

5)缺失值處理
i)補一個值,例如用均值或中位數代替缺失值,或者用模型進行預測。
ii)直接忽略,不對缺失值做特殊處理,有一些模型可以直接處理缺失值,如很多樹模型。

6)特徵交叉
特徵交叉可以在模型中引入非線性特徵,提高模型的表達能力。

7)非線性編碼
線性模型很難學習到數據中的非線性關係,除了用特徵交叉的方式外,還可以通過非線性編碼來提升模型效果。例如選用多項式核、高斯核等;或者用隨機森林模型的葉節點進行編碼餵給線性模型,使得模型的特徵包含了複雜的非線性信息,可以參考facebook論文 Practical Lessons from Predicting Clicks on Ads at Facebook

8)行統計量
統計行向量(即一個樣本)中空值的個數、0的個數、正值的個數、負值的個數、以及均值、方差、最大值、最小值、偏度、峯度等。

2.1.3 類別特徵
下面介紹幾種常見的類別變量的處理方法。
1)自然數編碼
每個類別分配一個編號
2)獨熱編碼
直接將類別特徵的自然數編碼餵給模型效果可能比較差,這是因爲類別特徵的自然數編碼,取值大小沒有物理意義。直接餵給(線性)模型沒有意義。常見的做法是對類別特徵進行獨熱編碼,這樣每個特徵取值對應一維特徵,獨熱編碼得到稀疏的矩陣。
3)分層編碼
對於郵政編碼或身份證號等類別特徵,可以取不同位數進行分層,然後按層次進行自然數編碼。
4)散列編碼
對於取值特別多的類別特徵,直接進行獨熱編碼的話會使得特徵矩陣過於稀疏,實際應用中我們可以重複多次使用不同的散列函數,利用融合的方式來提升模型的效果。
5)計數編碼
將類別特徵用其對應的計數來代替。對異常值敏感,特徵取值可能衝突,
6)計數排名編碼
利用計數的排名對類別進行編碼,
7)目標編碼
沒看懂
8)類別特徵之間交叉組合
兩個類別特徵進行笛卡爾積操作,可以產生新的類別特徵,這種操作適用於兩個類別特徵的基數較小的情況。除了兩個類別特徵的交叉,多個類別特徵之間也可以進行交叉。
9)類別特徵和數值特徵間的交叉組合

2.1.4 時間特徵

2.1.5 空間特徵

2.1.6 文本特徵

2.2 特徵選擇
特徵選擇的目的是提升性能、降低過擬合風險。

2.2.1 過濾方法
過濾方法分爲單變量和多變量兩種。由於單變量方法只考慮單特徵變量和目標變量的相關性,所以可能會選出冗餘特徵。
在這裏插入圖片描述
常見的過濾方法如下
1)覆蓋率
如果一個特徵的缺失值特別多,則該特徵基本沒用,可以考慮刪去
2)方差
如果一個特徵在樣本集上取值基本相同,方差極小,則該特徵區分度很低,可以刪去。
3)皮爾森相關係數
皮爾森相關係數主要用於衡量兩個連續型變量的相關性,從計算的角度,皮爾森相關係數就是先把兩個向量做中心化(減去平均值)然後計算cosine similarity
在這裏插入圖片描述
4)Fisher 得分
對於分類問題,好的特徵應該在同一類別中取值比較像,而在不同類別中取值差異比較大,因此特徵ii的重要性可以用Fisher得分SiS_{i}來表示:
在這裏插入圖片描述
其中,KK代表類別數。如果不同類別之間的差異較大(即uiju_{ij}差別較大),而同一類別內部的差異較小(即ρij\rho_{ij}均較小),就會使得SiS_{i}變得較大。SiS_{i}越大,則特徵ii越重要。
Fisher得分一般用來衡量一個連續型變量和一個類別變量之間的相關性
5)F檢驗
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
可以發現F檢驗其實就是上面的Fisher score
6)卡方檢驗
卡方檢驗用於判斷兩個類別變量之間的相關性大小
考察兩個類別變量,生成的二維列聯表爲
在這裏插入圖片描述
那麼第iijj列的單元中的預期值爲
在這裏插入圖片描述
我們定義皮爾森卡方統計量爲
在這裏插入圖片描述
X2X^{2}服從自由度爲df=(r1)(c1)df=(r-1)(c-1)的卡方分佈,可以通過查卡方分佈表,來確定兩個類別變量之間是否是獨立的。
7)互信息
互信息(或相對熵)用來度量兩個變量的相關性。互信息越大,說明兩個變量相關性越高,互信息爲0時,則兩個變量獨立。
兩個離散變量間的互信息爲
在這裏插入圖片描述
兩個連續變量的互信息爲
在這裏插入圖片描述
8)相關特徵選擇
相關特徵選擇(Correlation Feature selection,CFS)基於以下一個假設來評估一個特徵集合的重要性:好的特徵集合包含跟目標變量非常相關的特徵,但這些特徵之間彼此不相關。對於包含kk個特徵的集合,CFS準則定義如下
在這裏插入圖片描述
其中,rcfir_{cf_{i}}rfifjr_{f_{i}f_{j}}是特徵變量和目標變量間的相關性以及特徵變量間的相關性。

2.2.2 封裝方法
過濾方法是與機器學習算法相互對立的,因此過濾方法沒有考慮選擇的特徵集合在具體機器學習算法上的效果。與過濾方法不同的是,封裝方法直接使用機器學習算法評估特徵子集的效果。它可以檢測出兩個或多個特徵之間的交互關係,而且選擇的特徵子集使得模型的效果達到最優。封裝方法是特徵子集搜索與評估指標相結合的方法,前者提供候選的新特徵子集,後者則基於新特徵子集訓練一個模型,並用驗證集進行評估,爲每一組特徵進行打分。
最簡單的方法是在每一個特徵子集上訓練並評估模型,從而找出最優的特徵子集。
在這裏插入圖片描述
封裝方法需要對每一組特徵子集訓練一個模型,所以計算量很大,這是封裝法主要的缺點。如果特徵集合比較大,封裝法甚至無法操作,如果總的特徵個數爲NN ,那麼特徵子集的個數爲2N2^{N}個,可以是一個很大的數。
幾種常用的特徵子集搜索算法爲
1)完全搜索
2)啓發式搜索
i)正向選擇
ii)逆向選擇
iii)雙向選擇(逐步選擇,stepwise)
以上三種算法都是在每一步採用wald 卡方統計量的p值來決定是否要將一個特徵納入或刪除。

3)隨機搜索

2.2.3 嵌入方法
過濾方法將特徵選擇與機器學習獨立開來,而且不需要交叉驗證,計算效率比較高。但是過濾方法沒有考慮機器學習的特點;封裝方法運用預先定義的機器學習算法來評估特徵子集的質量,需要很多次訓練模型,計算效率很低。嵌入方法則將特徵選擇嵌入到模型的構建過程中,具有封裝方法與機器學習相結合的優點,而且具有過濾方法計算效率高的優點。
在這裏插入圖片描述
嵌入方法最經典的例子是LASSO方法。
在這裏插入圖片描述
在LASSO之前,大家都用嶺迴歸來防止過擬合,但是嶺迴歸沒有特徵選擇的能力。而LASSO與嶺迴歸類似,通過對係數添加L1懲罰項來防止過擬合,可以讓特定的迴歸係數變爲0,從而可以選擇一個不包含那些係數的模型。
另一種常見的嵌入方法是基於樹模型的特徵選擇方法。例如在隨機森林中,重要的特徵更有可能出現在深度較淺的節點,而且出現的次數可能越多。因此可以基於數模型中特徵出現次數等特徵對特徵的重要性進行排序。
sklearn的random forest模型中有feature importance來評價每個特徵的重要性。

參考文獻:
https://www.jianshu.com/p/807b2c2bfd9b
https://www.cnblogs.com/biyeymyhjob/archive/2012/07/18/2595410.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章