帶你了解sklearn中特徵工程的幾個使用方法

  • 2019 年 10 月 4 日
  • 筆記

特徵工程

數據和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上 限而已。根據特徵使用方案,有計劃地獲取、處理和監控數據和特徵的工作稱之為特徵工程,目的是 最大限度地從原始數據中提取特徵以供演算法和模型使用。

根據特徵選擇的形式又可以將特徵選擇方法分為3種:

sklearn中的feature_selection庫來進行特徵選擇

  • Filter:

過濾法:按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的 個數,選擇特徵。

  • Wrapper:

包裝法:根據目標函數(通常是預測效果評分),每次選擇若干特徵,或者排 除若干特徵。

  • Embedded:

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

採用iris數據集,iris數據集有四個特徵

['sepal length (cm)',   'sepal width (cm)',   'petal length (cm)',   'petal width (cm)']  

Filter過濾法

  • 方差選擇法 VarianceThreshold

使用方差選擇法,先要計算各個特徵的方差,然後根據閾值,選擇方差大於閾值的特徵。

from sklearn import datasets  iris = datasets.load_iris()    from sklearn.feature_selection import VarianceThreshold  #方差選擇法,返回值為特徵選擇後的數據  #參數threshold為方差的閾值  vardata = VarianceThreshold(threshold=3).fit_transform(iris.data)  print(vardata[:10])  輸出 第三個特徵  petal length  
  • 相關係數法 SelectKBest

使用相關係數法,先要計算各個特徵對目標值的相關係數。用feature_selection庫的SelectKBest類 結合相關係數來選擇特徵

from sklearn.feature_selection import SelectKBest  from scipy.stats import pearsonr import numpy as np  #選擇K個最好的特徵,返回選擇特徵後的數據  #第一個參數為計算評估特徵是否好的函數,該函數輸入特徵矩陣和目標向量,  #輸出二元組(評分,P值)的數組,數組第i項為第i個特徵的評分和P值。  #在此定義為計算相關係數  f = lambda X, Y:np.array(list(map(lambda x:pearsonr(x, Y)[0], X.T))).T  #參數k為選擇的特徵個數  SelectKBest(f,k=2).fit_transform(iris.data, iris.target)[:10]    輸出  第三和第四個特徵  petal length petal width  
  • 卡方檢驗

卡方分布

卡方檢驗就是統計樣本的實際觀測值與理論推斷值之間的偏離程度,實際觀測值與理論推斷值之間的偏離程度就決定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若兩個值完全相等時,卡方值就為0,表明理論值完全符合。

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

from sklearn.feature_selection import SelectKBest  from sklearn.feature_selection import chi2  #選擇K個最好的特徵,返回選擇特徵後的數據  SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)[:10]    輸出  第三和第四個特徵  petal length petal width  
  • 互資訊法

經典的互資訊也是評價定性自變數對定性因變數的相關性的。相關係數,卡方檢驗,互資訊法選擇 特徵的原理是相似的,但相關係數通常只適合於連續特徵的選擇。

import numpy as np from sklearn.feature_selection import SelectKBest  from sklearn import metrics  mic = metrics.mutual_info_score  g = lambda X, Y: np.array(list(map(lambda x:mic(x, Y), X.T))).T #選擇K個最好的特徵,返回特徵選擇後的數據  SelectKBest(g, k=2).fit_transform(iris.data, iris.target)[:10]    輸出  第三和第四個特徵  petal length petal width  

Wrapper包裝法

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

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

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)[:10]  輸出:    第二和第四個特徵  sepal width petal width  

Embedded嵌入法

  • 基於懲罰項的特徵選擇法

使用帶懲罰項的基模型,除了篩選出特徵外,同時也進行了降維。使用feature_selection庫的 SelectFromModel類結合帶L1懲罰項的邏輯回歸模型,

from sklearn.feature_selection import SelectFromModel  from sklearn.linear_model import LogisticRegression  #帶L1懲罰項的邏輯回歸作為基模型的特徵選擇  SelectFromModel(LogisticRegression( penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)[:10]    輸出  第一,第二和第三個特徵  sepal length ,sepal width ,petal length  
  • 基於樹模型的特徵選擇法

樹模型中GBDT也可用來作為基模型進行特徵選擇,使用feature_selection庫的SelectFromModel類 結合GBDT模型,來選擇特徵的程式碼如下:

from sklearn.feature_selection import SelectFromModel  from sklearn.ensemble import GradientBoostingClassifier  #GBDT作為基模型的特徵選擇  SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)[:10]    輸出  第三和第四個特徵  petal length petal width