title: sklearn-特征工程之特征選擇
date: 2016-11-25 22:49:24
categories: skearn
tags: sklearn
抄襲/參考資料
- 使用sklearn做單機特征工程
- sckearn中文
- 周志華《機器學習》
當數據預處理完成后,我們需要選擇有意義的特征輸入機器學習的算法和模型進行訓練。通常來說,從兩個方面考慮來選擇特征:
- 特征是否發散:如果一個特征不發散,例如方差接近於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模塊中),返回單變量的概率值:
- 用於回歸:
f_regression- 用於分類:
chi2(卡方)orf_classif
相關系數法
卡方檢驗
互信息法
Wrapper:包裝法
遞歸特征消除法
遞歸消除特征法使用一個基模型來進行多輪訓練,每輪訓練后,消除若干權值系數的特征,再基於新的特征集進行下一輪訓練。
Embedded:嵌入法 / 基於模型進行特征選擇
基於懲罰項的特征選擇法
class sklearn.feature_selection.SelectFromModel(estimator,
threshold=None,
prefit=False)
使用L1范數作為懲罰項的:ref:Linear models會得到稀疏解:大部分特征對應的系數為0。當你希望減少特征的維度以用於其它分類器時,可以通過 feature_selection.SelectFromModel 來選擇不為0的系數。特別指出,常用於此目的的稀疏預測模型有:
-
- 對於Lasso,參數\(alpha\)越大,被選中的特征越少 。
-
分類:
linear_model.LogisticRegression和svm.LinearSVC- 對於SVM和邏輯回歸,參數\(C\)控制稀疏性:\(C\)越小,被選中的特征越少。
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)
