機器學習中的特徵工程

目錄

一、特徵工程——概述

二、特徵工程——數據預處理

三、特徵工程——特徵選擇

四、特徵工程——降維


一、特徵工程——概述

特徵工程是數據分析中最耗時間和精力的一部分工作。數據和特徵決定了機器學習的上限,而模型和算法則是逼近這個上限。因此,特徵工程就變得尤爲重要了。特徵工程的主要工作就是對特徵的處理,包括數據的採集,數據預處理,特徵選擇,甚至降維技術等跟特徵有關的工作。

1、特徵(Feature)

特徵是數據中抽取出來的對結果預測有用的信息。

2、特徵工程(Feature Engineering)

特徵工程是使用專業背景知識和技巧處理數據,使得特徵能在機器學習算法上發揮更好的作用的過程。

3、特徵工程的意義

(1)特徵工程是將原始數據轉化爲特徵,能更好表示預測模型處理的實際問題,提升對於未知數據預測的準確性。

(2)更好的特徵意味着更強的靈活度、更好的特徵意味着只需要用簡單模型、更好的特徵意味着更好的結果。

 

二、特徵工程——數據預處理

1、缺失值處理

(1) 連續值:可以選擇該特徵值的所有樣本的均值中位數來填充缺失值

(2) 離散值:選擇該特徵值的所有樣本中最頻繁出現的類別值來填充缺失值

注:不可信的樣本丟掉,缺省值極多的字段考慮不用(即刪掉)

from sklearn.preprocessing import Imputer

 

2、離散特徵的連續化處理

(1)獨熱編碼(one-hot encoding)(啞變量)

處理方法比較簡單,比如某特徵的取值是高,中和低,那麼我們就可以創建三個取值爲0或者1的特徵,將高編碼爲1,0,0,中編碼爲0,1,0,低編碼爲0,0,1。也就是說,之前的一個特徵被我們轉化爲了三個特徵。

from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

(2)特徵嵌入(embedding)

這個一般用於深度學習中。比如對於用戶的ID這個特徵,如果要使用獨熱編碼,則維度會爆炸,如果使用特徵嵌入維度就低很多了。對於每個要嵌入的特徵,我們會有一個特徵嵌入矩陣,這個矩陣的行很大,對應我們該特徵的數目。比如用戶ID,如果有100萬個,那麼嵌入的特徵矩陣的行就是100萬。但是列一般比較小,比如可以取20。這樣每個用戶ID就轉化爲了一個20維的特徵向量,進而參與深度學習模型。

在tensorflow中,我們可以先隨機初始化一個特徵嵌入矩陣,對於每個用戶,可以用tf.nn.embedding_lookup找到該用戶的特徵嵌入向量。特徵嵌入矩陣會在反向傳播的迭代中優化。

 

3、連續特徵的離散化處理

連續特徵的離散化就是在數據的取值範圍內設定若干個離散的劃分點,將取值範圍劃分爲一些離散化的區間,最後用不同的符號或整數值代表落在每個子區間中的數據值。

首先要確定分類數,然後將連續特徵值映射到這些分類值(等寬法、等頻法、一維聚類)。

(1)根據閾值進行分組

比如我們根據連續值特徵的分位數,將該特徵分爲高,中和低三個特徵。將分位數從0~0.3的設置爲低,0.3~0.7的設置爲中,0.7~1的設置爲高。

(2)基於聚類分析的方法

一維聚類的方法包括兩個步驟,首先將連續特徵的值用聚類算法(如K-Means算法)進行聚類,然後再將聚類得到的簇進行處理,合併到一個簇的連續特徵值並做同一標記。聚類分析的離散化方法也需要用戶指定簇的個數,從而決定產生的區間數。

(3)使用梯度提升樹(GDBT)將連續值轉化爲離散值

在sklearn中,我們可以用GradientBoostingClassifier的 apply方法很方便的得到樣本離散化後的特徵,然後使用獨熱編碼即可

 

4、特徵的標準化和歸一化(數值型數據)

數據規範化處理是數據挖掘的一項基礎工作。不同的評價指標往往具有不同的量綱,數值間的差別可能很大,不進行處理可能會影響到數據分析的結果。爲了消除指標之間的量綱和取值範圍差異的影響,需要進行標準化處理,將數據按照比例進行縮放,使之落入一個特定的區域,便於進行綜合分析。

from sklearn.preprocessing import Normalizer

(1)零 - 均值標準化(Z - score)

具體的方法是求出樣本特徵x的均值mean和標準差std,然後用(x-mean)/std來代替原特徵。這樣特徵就變成了均值爲0,方差爲1。該方法是當前用的最多的數據標準化方法。

from sklearn.preprocessing import StandardScaler

(2)最小 - 最大標準化(min - max)

最小 - 最大標準化也成爲離差標準化,是對原始數據的線性變換,將數值映射到[0,1]之間。

具體的方法是求出樣本特徵x的最大值max和最小值min,然後用(x-min)/(max-min)來代替原特徵。如果我們希望將數據映射到任意一個區間[a,b],而不是[0,1],那麼也很簡單。用(x-min)(b-a)/(max-min)+a來代替原特徵即可。

from sklearn.preprocessing import MinMaxScaler

(3)L1/L2範數標準化

 

5、時間類型的數據處理

(1)連續的時間差值法

即計算出所有樣本的時間到某一個未來時間之間的數值差距,這樣這個差距是UTC的時間差,從而將時間特徵轉化爲連續值。

(2)將一個時間轉化爲離散特徵

根據時間所在的年,月,日,星期幾,小時數,將一個時間特徵轉化爲若干個離散特徵,這種方法在分析具有明顯時間趨勢的問題比較好用。

 

6、文本類型的數據預處理

參看文本預處理

(1)詞袋

直接把文本數據丟給模型,模型是無法解釋的,因此需要把文本型的數據用數值表示。去掉停用詞,標點符號,留下表達實際含義的詞組成列表,在詞庫中映射稀疏向量。

from sklearn.feature_extraction.text import CountVectorizer

(2)把詞袋中的詞擴充到 n-gram

它的思想是:在整個語言環境中,句子T的出現概率是由組成T的N個詞組成的。

(3)使用TF-IDF方法

參看TF-IDF算法

from sklearn.feature_extraction.text import TfidfVectorizer

(4)word2vec將詞轉化爲詞向量(NLP)

 

7、異常特徵樣本清洗

異常數據的清洗,目標是將原始數據中異常的數據清除。

(1)偏差檢測(  聚類(KMeans)和最近鄰(KNN))

比如我們可以用KMeans聚類將訓練樣本分成若干個簇,如果某一個簇裏的樣本數很少,而且簇質心和其他所有的簇都很遠,那麼這個簇裏面的樣本極有可能是異常特徵樣本了。我們可以將其從訓練集過濾掉。

(2)異常點檢測(iForest,one class SVM)

主要是使用iForest或者one class SVM,使用異常點檢測的機器學習算法來過濾所有的異常點。

(3)基於統計的異常點檢測

例如極差,四分位數間距,均差,標準差等,這種方法適合於挖掘單變量的數值型數據。全距(Range),又稱極差,是用來表示統計資料中的變異量數(measures of variation) ,其最大值與最小值之間的差距;四分位距通常是用來構建箱形圖,以及對概率分佈的簡要圖表概述。

(4)基於距離的異常點檢測

主要通過距離方法來檢測異常點,將數據集中與大多數點之間距離大於某個閾值的點視爲異常點,主要使用的距離度量方法有絕對距離 ( 曼哈頓距離 ) 、歐氏距離和馬氏距離等方法。

(5)基於密度的異常點檢測

考察當前點的周圍密度,可以發現局部異常點,例如LOF算法

 

8、處理不平衡數據

      不平衡數據集介紹和處理方法

 

三、特徵工程——特徵選擇

1、過濾法選擇特徵(Filter)

它按照特徵的發散性或者相關性指標對各個特徵進行評分,設定評分閾值或者待選擇閾值的個數,選擇合適的特徵。

(1)方差篩選法

使用方差選擇法,先要計算各個特徵的方差,然後根據閾值,選擇方差大於閾值的特徵。(方差越大的特徵,那麼我們可以認爲它是比較有用的。如果方差較小,比如小於1,那麼這個特徵可能對我們的算法作用沒有那麼大。最極端的,如果某個特徵方差爲0,即所有的樣本該特徵的取值都是一樣的,那麼它對我們的模型訓練沒有任何作用,可以直接捨棄。在實際應用中,我們會指定一個方差的閾值,當方差小於這個閾值的特徵會被我們篩掉。)

from sklearn.feature_selection import VarianceThreshold

(2)相關係數

這個主要用於輸出連續值的監督學習算法中。我們分別計算所有訓練集中各個特徵與輸出值之間的相關係數,設定一個閾值,選擇相關係數較大的部分特徵。即使用相關係數法,先要計算各個特徵對目標值的相關係數以及相關係數的P值。

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr

(3)假設檢驗法(卡方檢驗、F檢驗、t檢驗)

卡方檢驗可以檢驗某個特徵分佈和輸出值分佈之間的相關性。

經典的卡方檢驗是檢驗定性自變量對定性因變量的相關性。假設自變量有N種取值,因變量有M種取值,考慮自變量等於i且因變量等於j的樣本頻數的觀察值與期望的差距。

我們還可以使用F檢驗和t檢驗,它們都是使用假設檢驗的方法,只是使用的統計分佈不是卡方分佈,而是F分佈和t分佈而已。

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

(4)互信息

即從信息熵的角度分析各個特徵和輸出值之間的關係評分。在決策樹算法中我們講到過互信息(信息增益)。互信息值越大,說明該特徵和輸出值之間的相關性越大。

經典的互信息也是評價定性自變量對定性因變量的相關性。

熵與信息增益算法詳解

from sklearn.feature_selection import SelectKBest from minepy import MINE

注:過濾法特徵選擇的缺點:沒有考慮到特徵之間的關聯作用,可能把有用的關聯特徵誤踢掉。

  

2、包裝法選擇特徵(Wrapper)

根據目標函數,通常是預測效果評分,每次選擇部分特徵,或者排除部分特徵。

(1)遞歸消除特徵算法法(recursive feature elimination algorithm)

遞歸消除特徵法使用一個機器學習模型來進行多輪訓練,每輪訓練後,消除若干權值係數的對應的特徵,再基於新的特徵集進行下一輪訓練。

from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression

 

3、嵌入法選擇特徵(Embedded)

先使用某些機器學習的算法和模型進行訓練,得到各個特徵的權值係數,根據權值係數從大到小來選擇特徵。(類似於Filter方法,但是是通過訓練來確定特徵的優劣。)

(1)基於懲罰項的特徵選擇法

使用帶懲罰項的基模型,除了篩選出特徵外,同時也進行了降維。

最常用的是使用L1正則化和L2正則化來選擇特徵。正則化懲罰項越大,那麼模型的係數就會越小。當正則化懲罰項大到一定的程度的時候,部分特徵係數會變成0,當正則化懲罰項繼續增大到一定程度時,所有的特徵係數都會趨於0. 但是我們會發現一部分特徵係數會更容易先變成0,這部分系數就是可以篩掉的。也就是說,我們選擇特徵係數較大的特徵。常用的L1正則化和L2正則化來選擇特徵的基學習器是邏輯迴歸。(L1懲罰項降維的原理在於保留多個對目標值具有同等相關性的特徵中的一個,所以沒選到的特徵不代表不重要。故,可結合L2懲罰項來優化。具體操作爲:若一個特徵在L1中的權值爲1,選擇在L2中權值差別不大且在L1中權值爲0的特徵構成同類集合,將這一集合中的特徵平分L1中的權值,故需要構建一個新的邏輯迴歸模型)

from sklearn.feature_selection import SelectFromModel from sklearn.linear_model import LogisticRegression

 

(2)基於樹模型的特徵選擇法

可以使用決策樹或者GBDT。一般來說,可以得到特徵係數coef或者可以得到特徵重要度(feature importances)的算法纔可以做爲嵌入法的基學習器。

樹模型中GBDT也可用來作爲基模型進行特徵選擇,使用feature_selection庫的SelectFromModel類結合GBDT模型。

from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import GradientBoostingClassifier

 

4、尋找高級特徵(特徵構造)

在數據挖掘的過程中,爲了提取更有用的信息,挖掘更深層次的模式,提高挖掘結果的精度,我們需要利用已有的特徵集構造出新的特徵,並加入到現有的特徵集合中。(即我們從業務特徵中自己去尋找高級數據特徵)

在Kaggle之類的算法競賽中,高分團隊主要使用的方法除了集成學習算法,剩下的主要就是在高級特徵上面做文章。所以尋找高級特徵是模型優化的必要步驟之一。當然,在第一次建立模型的時候,我們可以先不尋找高級特徵,得到基準模型後,再尋找高級特徵進行優化。(比如有車的路程特徵和時間間隔特徵,我們就可以得到車的平均速度這個二級特徵。根據車的速度特徵,我們就可以得到車的加速度這個三級特徵等)

尋找高級特徵最常用的方法有:若干項特徵加和,若干項特徵之差,若干項特徵乘積,若干項特徵除商。

尋找高級特徵它是根據業務和模型需要而得,而不是隨便的兩兩組合形成高級特徵,這樣容易導致特徵爆炸,反而沒有辦法得到較好的模型。

一般而言,聚類的時候高級特徵儘量少一點,分類迴歸的時候高級特徵適度的多一點。

 

四、特徵工程——降維

當特徵選擇完成後,可以直接訓練模型了,但是可能由於特徵矩陣過大,導致計算量大,訓練時間長的問題,因此降低特徵矩陣維度也是必不可少的。常見的降維方法除了以上提到的基於L1懲罰項的模型以外,另外還有主成分分析法(PCA)和線性判別分析(LDA),線性判別分析本身也是一個分類模型。PCA和LDA有很多的相似點,其本質是要將原始的樣本映射到維度更低的樣本空間中,但是PCA和LDA的映射目標不一樣:PCA是爲了讓映射後的樣本具有最大的發散性;而LDA是爲了讓映射後的樣本有最好的分類性能。所以說PCA是一種無監督的降維方法,而LDA是一種有監督的降維方法。

(1)主成分分析法(PCA)

from sklearn.decomposition import PCA

(2)線性判別分析法(LDA)

from sklearn.lda import LDA

(3)奇異值分解(SVD)-文本降維

在對文本數據進行向量化以後,由於是稀疏矩陣太稀疏,同樣可以使用降維技術,這裏使用的是奇異值分解。

from sklearn.decomposition import TruncatedSVD

 

注:降維技術不是特徵選擇,降維是把高維數據的特徵映射到低維空間中,而特徵選擇是在高維空間中直接剔除部分特徵,選出重要特徵。

 

 

 

 

參考資料:特徵工程方法

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