特徵選擇(過濾法、包裝法、嵌入法)


有這麼一句話在業界廣泛流傳:數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已。特徵工程目的是最大限度地從原始數據中提取特徵以供算法和模型使用。這裏主要說的是特徵選擇。

當數據預處理完成後,我們需要進行特徵選擇,即選擇有意義的特徵輸入機器學習的算法和模型進行訓練。特徵選擇主要有兩個功能:

  • 減少特徵數量、降維,使模型泛化能力更強,減少過擬合。
  • 去掉似是而非不易判別的特徵,提高精度。

通常來說,從兩個方面考慮來選擇特徵:

  • 特徵是否發散:如果一個特徵不發散,例如方差接近於0,那麼就是說樣本在這個特徵上基本上沒有差異,這個特徵對於樣本的區分並沒有什麼用。
  • 特徵與目標的相關性:這點比較顯而易見,與目標相關性高的特徵,應當優選選擇。
    根據特徵選擇的形式又可以將特徵選擇方法分爲3種:

Filter:過濾法,按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的個數,選擇特徵。
Wrapper:包裝法,根據目標函數(通常是預測效果評分),每次選擇若干特徵,或者排除若干特徵。
Embedded:嵌入法,先使用某些機器學習的算法和模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。類似於Filter方法,但是是通過訓練來確定特徵的優劣。

Filter過濾式方法

過濾式方法(Filter)通常是獨立地選擇特徵,這可能會忽略特徵組合之間的相關性。

方差選擇法

使用方差選擇法,先要計算各個特徵的方差,然後根據閾值,選擇方差大於閾值的特徵。使用feature_selection庫的VarianceThreshold類來選擇特徵的代碼如下:

from sklearn.feature_selection import VarianceThreshold
# 方差選擇法,返回值爲特徵選擇後的數據
# 參數threshold爲方差的閾值
VarianceThreshold(threshold=3).fit_transform(iris.data)
# iris.data爲鳶尾花數據

相關係數法

使用相關係數法,先要計算各個特徵對目標值的相關係數以及相關係數的P值。用feature_selection庫的SelectKBest類結合相關係數來選擇特徵的代碼如下:

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
#選擇K個最好的特徵,返回選擇特徵後的數據
#第一個參數爲計算評估特徵是否好的函數,該函數輸入特徵矩陣和目標向量,輸出二元組(評分,P值)的數組,數組第i項爲第i個特徵的評分和P值。在此定義爲計算相關係數
#參數k爲選擇的特徵個數
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

卡方檢驗

經典的卡方檢驗是檢驗定性自變量對定性因變量的相關性。假設自變量有N種取值,因變量有M種取值,考慮自變量等於i且因變量等於j的樣本頻數的觀察值與期望的差距,構建統計量:
χ2=(AE)2E \chi^{2}=\frac{\sum (A-E)^{2}}{E}
用feature_selection庫的SelectKBest類結合卡方檢驗來選擇特徵的代碼如下:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#選擇K個最好的特徵,返回選擇特徵後的數據
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

互信息法和最大信息係數Mutual information and maximal information coefficient (MIC)

經典的互信息也是評價定性自變量對定性因變量的相關性的,互信息計算公式如下:
I(X;Y)=xϵXyϵYp(x,y)logp(x,y)p(x)p(y)) I(X;Y)= \sum_{x\epsilon X} \sum_{y\epsilon Y}p(x,y)log \frac{p(x,y)}{p(x)p(y))}
若想把互信息直接用於特徵選擇其實不是太方便:1、它不屬於度量方式,也沒有辦法歸一化,在不同數據及上的結果無法做比較;2、對於連續變量的計算不是很方便(X和Y都是集合,x,y都是離散的取值),通常變量需要先離散化,而互信息的結果對離散化的方式很敏感。最大信息係數克服了這兩個問題。它首先尋找一種最優的離散化方式,然後把互信息取值轉換成一種度量方式,取值區間在[0,1]。
使用feature_selection庫的SelectKBest類結合最大信息係數法來選擇特徵的代碼如下:

from sklearn.feature_selection import SelectKBest
from minepy import MINE 
#由於MINE的設計不是函數式的,定義mic方法將其爲函數式的,返回一個二元組,二元組的第2項設置成固定的P值0.5
def mic(x, y):
    m = MINE()
    m.compute_score(x, y)
    return (m.mic(), 0.5)
#選擇K個最好的特徵,返回特徵選擇後的數據
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

Wrapper封裝式方法

遞歸特徵消除法Recursive feature elimination (RFE)

遞歸特徵消除的主要思想是反覆的構建模型(如SVM或者回歸模型)然後選出最差的(或者最好的)的特徵(可以根據係數來選),把選出來的特徵放到一邊,然後在剩餘的特徵上重複這個過程,直到所有特徵都遍歷了。這個過程中特徵被消除的次序就是特徵的排序。因此,這是一種尋找最優特徵子集的貪心算法。

RFE的穩定性很大程度上取決於在迭代的時候底層用哪種模型。例如,假如RFE採用的普通的迴歸,沒有經過正則化的迴歸是不穩定的,那麼RFE就是不穩定的;假如採用的是Ridge,而用Ridge正則化的迴歸是穩定的,那麼RFE就是穩定的。
使用feature_selection庫的RFE類來選擇特徵的代碼如下:

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#遞歸特徵消除法,返回特徵選擇後的數據
#參數estimator爲基模型
#參數n_features_to_select爲選擇的特徵個數
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)

Embedded過濾式方法

基於懲罰項的特徵選擇法

基於懲罰項的特徵選擇法其實是基於正則的特徵選擇法。正則化就是把額外的約束或者懲罰項加到已有模型(損失函數)上,以防止過擬合併提高泛化能力。損失函數由原來的E(X,Y)E(X,Y)變爲E(X,Y)+αwE(X,Y)+\alpha||w||,w是模型係數組成的向量(有些地方也叫參數parameter,coefficients),||·||一般是L1L_{1}或者L2L_{2}範數,α\alpha是一個可調的參數,控制着正則化的強度。當用在線性模型上時,L1L_{1}正則化和L2L_{2}正則化也稱爲Lasso和Ridge。

L1L_{1}正則化Lasso

L1L_{1}正則化將係數w的l1範數作爲懲罰項加到損失函數上,由於正則項非零,這就迫使那些弱的特徵所對應的係數變成0。因此L1L_{1}正則化往往會使學到的模型很稀疏(係數w經常爲0),這個特性使得L1L_{1}正則化成爲一種很好的特徵選擇方法。

L2正則化Ridge regression

L2L_{2}正則化將係數向量的L2L_{2}範數添加到了損失函數中。由於L2L_{2}懲罰項中係數是二次方的,這使得L2L_{2}L1L_{1}有着諸多差異,最明顯的一點就是,L2L_{2}正則化會讓係數的取值變得平均。對於關聯特徵,這意味着他們能夠獲得更相近的對應係數。以Y=X1+X2爲例,假設X1和X2具有很強的關聯,如果用L1正則化,不論學到的模型是Y=X1+X2還是Y=2X1,懲罰都是一樣的,都是2 alpha。但是對於L2來說,第一個模型的懲罰項是2α\alpha,但第二個模型的是4*α\alpha。可以看出,係數之和爲常數時,各系數相等時懲罰是最小的,所以纔有了L2會讓各個係數趨於相同的特點。

基於樹模型的特徵選擇法

樹模型有準確率高、魯棒性好、易於使用等優點,這使得它成爲了目前最流行的機器學習算法之一。以下以隨機森林爲例。

平均不純度減少 mean decrease impurity

隨機森林由多個決策樹構成。決策樹中的每一個節點都是關於某個特徵的條件,爲的是將數據集按照不同的響應變量進行分裂。利用不純度可以確定節點基於哪個特徵進行分裂,對於分類問題,通常採用基尼係數或者信息增益 ,對於迴歸問題,通常採用的是方差或者最小二乘擬合。當訓練決策樹的時候,可以計算出每個特徵減少了多少樹的不純度。對於一個決策樹森林來說,可以算出每個特徵平均減少了多少不純度,並把它平均減少的不純度作爲特徵選擇的值。

平均精確率減少 Mean decrease accuracy

另一種常用的特徵選擇方法就是直接度量每個特徵對模型精確率的影響。主要思路是打亂每個特徵的特徵值順序,並且度量順序變動對模型的精確率的影響。很明顯,對於不重要的變量來說,打亂順序對模型的精確率影響不會太大,但是對於重要的變量來說,打亂順序就會降低模型的精確率。

決定節點分裂的次數

查看每個特徵作爲節點分裂依據的次數,次數越多則認爲這個特徵越重要。根據次數對特徵進行排序。

參考:
https://www.cnblogs.com/bonelee/p/8632866.html
https://blog.csdn.net/akenseren/article/details/80816210
卡方分佈
https://blog.csdn.net/bitcarmanlee/article/details/52279907

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