sklearn-特征工程之特征選擇



title: sklearn-特征工程之特征選擇
date: 2016-11-25 22:49:24
categories: skearn
tags: sklearn

抄襲/參考資料


當數據預處理完成后,我們需要選擇有意義的特征輸入機器學習的算法和模型進行訓練。通常來說,從兩個方面考慮來選擇特征:

  • 特征是否發散:如果一個特征不發散,例如方差接近於0,也就是說樣本在這個特征上基本上沒有差異,這個特征對於樣本的區分並沒有什么用。
  • 特征與目標的相關性:這點比較顯見,與目標相關性高的特征,應當優選選擇。除方差法外,本文介紹的其他方法均從相關性考慮。

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

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

我們使用sklearn中的feature_selection庫來進行特征選擇。

Filter:過濾法

方差選擇法

VarianceThreshold 是特征選擇中的一項基本方法。它會移除所有方差不滿足閾值的特征。默認設置下,它將移除所有方差為0的特征,即那些在所有樣本中數值完全相同的特征。

from sklearn.feature_selection import VarianceThreshold
# 設置方差閾值為100
sel = VarianceThreshold(threshold=100)
sel.fit_transform(X)

單變量特征選擇

單變量特征選擇基於單變量的統計測試來選擇最佳特征。它可以看作預測模型的一項預處理。Scikit-learn將特征選擇程序用包含transform 函數的對象來展現:

  • SelectKBest 移除得分前 \(k\) 名以外的所有特征
  • SelectPercentile 移除得分在用戶指定百分比以后的特征
  • 對每個特征使用通用的單變量統計測試: 假正率(false positive rate) SelectFpr, 偽發現率(false discovery rate) SelectFdr, 或族系誤差率 SelectFwe.
  • GenericUnivariateSelect 可以設置不同的策略來進行單變量特征選擇。同時不同的選擇策略也能夠使用超參數尋優,從而讓我們找到最佳的單變量特征選擇策略。

這些作為打分函數輸入的對象(同樣位於feature_selection模塊中),返回單變量的概率值:

相關系數法

卡方檢驗

互信息法


Wrapper:包裝法

遞歸特征消除法

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


Embedded:嵌入法 / 基於模型進行特征選擇

基於懲罰項的特征選擇法

class sklearn.feature_selection.SelectFromModel(estimator, 
                                                threshold=None, 
                                                prefit=False)

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

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Lasso

lr = Lasso(alpha=10)
lr.fit(X,y)

#帶L1懲罰項的邏輯回歸作為基模型的特征選擇
model = SelectFromModel(lr, prefit=True)
model.transform(X)

基於樹模型的特征選擇法

基於樹的預測模型(見 sklearn.tree 模塊,森林見 sklearn.ensemble 模塊)能夠用來計算特征的重要程度,因此能用來去除不相關的特征(結合 sklearn.feature_selection.SelectFromModel )

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingRegressor

gbdt = GradientBoostingRegressor()
gbdt.fit(X,y)

#GBDT作為基模型的特征選擇
model = SelectFromModel(gbdt, prefit=True)
model.transform(X)


免責聲明!

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



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