數據預處理 | 使用 Filter Wrapper Embedded 實現特征工程中的特征選擇


目錄

1 Filter

  1.1 移除低方差特征(Removing features with low variance)

  1.2 單變量特征選擇 (Univariate feature selection)

    1.2.1 卡方檢驗 (Chi2)

    1.2.2 Pearson 相關系數 (Pearson Correlation)

2 Wrapper

  2.1 遞歸特征消除 (Recursive Feature Elimination)

3 Embedding

  3.1 使用 SelectFromModel 選擇特征 (Feature selection using SelectFromModel)

 

1 Filter 

1.1 移除低方差特征 (Removing features with low variance)

  即去掉那些取值變化小的特征

  當特征值都是離散型變量的時候這種方法才能用,如果是連續型變量,就需要將連續變量離散化之后才能用。

# Variance 偏差  Threshold閾值
from sklearn.feature_selection import VarianceThreshold
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
sel = VarianceThreshold(threshold=(.8*(1-.8)))
sel.fit_transform(X)

 可見,移除了 特征值為 0 的概率達到了 5/6 的第一列。

 

1.2 單變量特征選擇 (Univariate feature selection)

  原理是分別單獨的計算每個變量的某個統計指標,根據該指標來判斷哪些變量重要,剔除那些不重要的變量

  對於分類問題 (y離散),可采用:

    •   卡方檢驗

  對於回歸問題 (y連續),可采用:

    •   皮爾森相關系數 余弦值cos(只考慮了方向)

    •   f_regression,

    •   mutual_info_regression

    •   最大信息系數

 

1.2.1 卡方檢驗 (Chi2)

  檢驗定性自變量對定性因變量的相關性。如 對樣本進行一次卡方檢驗來選擇最佳的兩項特征:

from sklearn.datasets import load_iris  # 鳶尾花數據集

# 用於特征選擇的包
from sklearn.feature_selection import SelectKBest  # 訓練的套路
from sklearn.feature_selection import chi2  

iris = load_iris()
x, y = iris.data, iris.target

# 參數解釋:chi2 使用卡方檢驗,k=2 留下兩個特征
x_new = SelectKBest(chi2,k=2).fit_transform(x,y)

 4 個特征只剩 2 個

 

1.2.2 Pearson 相關系數 (Pearson Correlation)

  該方法衡量的是變量之間的線性相關性,結果的取值區間為[-1,1],-1表示完全的負相關,+1表示完全的正相關,0表示沒有線性相關。

  使用Pearson相關系數主要是為了看特征之間的相關性,而不是和因變量之間的

  pearsonr(x, y)的輸入為特征矩陣目標向量,能夠同時計算 相關系數 和 p-value (顯著性水平那個p值).

import numpy as np
from scipy.stats import pearsonr  # sciPy 科學python哈哈,stats:統計學
np.random.seed(0)  # 設置生成隨機數的種子
size = 300
x = np.random.normal(0,1,size=size)  # 生成標准正態分布的300個數

# Lower noise
pearsonr(x, x + np.random.normal(0,1,size))

# Higher noise
pearsonr(x, x + np.random.normal(1,10,size))

 

當噪音比較小的時候,相關性很強,p-value很低。

 

2. Wrapper

2.1 遞歸特征消除 (Recursive Feature Elimination)

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

  對特征含有權重的預測模型(例如,線性模型對應參數coefficients),RFE (即 一個訓練的套路) 通過遞歸減少考察的特征集規模來選擇特征。首先,預測模型在原始特征上訓練,每個特征指定一個權重。之后,那些擁有最小絕對值權重的特征被踢出特征集。如此往復遞歸,直至剩余的特征數量達到所需的特征數量。

from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

# 建立一個決策樹模型
rf = RandomForestClassifier()
# 加載鳶尾花數據
iris=load_iris()
x, y=iris.data,iris.target

# 創建RFE 遞歸消除特征
# estimator 傳入RFE使用到的模型,n_features_to_select 最終剩下幾個特征
rfe = RFE(estimator=rf, n_features_to_select=3)
x_rfe = rfe.fit_transform(x,y)
x_rfe.shape

 

3 Embedded

3.1 基於L1的特征選擇 (L1-based feature selection)

  很難指定最終剩幾個特征,剩多少算多少哈哈

  使用L1范數作為懲罰項的線性模型(Linear models)會得到稀疏解:大部分特征對應的系數為0。當你希望減少特征的維度以用於其它分類器時,可以通過 feature_selection.SelectFromModel 來選擇不為0的系數。

  常用於此目的的稀疏預測模型有 linear_model.Lasso(回歸), linear_model.LogisticRegression 和 svm.LinearSVC(分類)

from sklearn.feature_selection import SelectFromModel  # 訓練套路
from sklearn.svm import LinearSVC  # 模型

# penalty 懲罰項,邏輯回歸中也有。一般都是默認 l2范數,這里【必須改成 l1】
lsvc = LinearSVC(C=1, penalty='l1', dual=False).fit(x,y)

# 進行特征選擇,很難預測最后剩幾個特征
model = SelectFromModel(lsvc, prefit=True) 
x_embed = model.transform(x)

 

 

 

本文只用於學習


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM