帶你了解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