1. 程式人生 > >scikit-learn--Feature selection(特徵選擇)

scikit-learn--Feature selection(特徵選擇)

去掉方差較小的特徵

方差閾值(VarianceThreshold)是特徵選擇的一個簡單方法,去掉那些方差沒有達到閾值的特徵。預設情況下,刪除零方差的特徵,例如那些只有一個值的樣本。 假設我們有一個有布林特徵的資料集,然後我們想去掉那些超過80%的樣本都是0(或者1)的特徵。布林特徵是伯努利隨機變數,方差為 p(1-p)。

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)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])

VarianceThreshold去掉了第一列,第一列裡面0的比例為5/6。

單變數特徵選擇

單變數特徵選擇通過單變數統計檢驗選擇特徵,可以看作一個估計器的預處理步驟。Sklearn將特徵選擇視為日常的轉換操作:

  • SelectBest 只保留 k 個最高分的特徵;
  • SelectPercentile 只保留使用者指定百分比的最高得分的特徵;
  • 使用常見的單變數統計檢驗:假正率SelectFpr,錯誤發現率selectFdr,或者總體錯誤率SelectFwe;
  • GenericUnivariateSelect 通過結構化策略進行特徵選擇,通過超引數搜尋估計器進行特徵選擇。 舉個例子,使用卡方檢驗選擇兩個最優特徵:
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
X.shape
(150, 4)
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
X_new.shape
(150, 2)

SelectKBest和SelectPerecntile能夠返回特徵評價的得分和P值:

sklearn.feature_selection.SelectPercentile(score_func=<function f_classif>, percentile=10)
sklearn.feature_selection.SelectKBest(score_func=<function f_classif>, k=10

其中的引數 score_func 有以下選項:

  • 迴歸:f_regression:相關係數,計算每個變數與目標變數的相關係數,然後計算出F值和P值;
      degrees_of_freedom = y.size - (2 if center else 1)
      F = corr ** 2 / (1 - corr ** 2) * degrees_of_freedom
      pv = stats.f.sf(F, 1, degrees_of_freedom)
  • 分類 :chi2:卡方檢驗;f_classif:方差分析,計算方差分析(ANOVA)的F值 (組間均方 / 組內均方);mutual_info_classif:互資訊,互資訊方法可以捕捉任何一種統計依賴,但是作為非引數方法,需要更多的樣本進行準確的估計。

遞迴特徵淘汰(RFE)

給特徵賦予一個外部模型產生的權重(例如:線性模型係數),RFE遞迴地使用越來越少的特徵來進行特徵選擇。首先,在原始資料上建立模型並且給每個特徵一個權重;然後,淘汰絕對權重最小的特徵,遞迴地執行這個過程直到達到希望的特徵數。 RFECV使用交叉驗證方法發現最優特徵數量。

使用SelectFromModel方法特徵選擇

SelectFromModel是一種元轉換器,可以與那些有coef_ 或者feature_importances_屬性的模型一起使用。如果coef_ 或者feature_importances_小於閾值,我們就認為特徵是不重要的。除了指定閾值以外,也可以使用啟發式的方式。有效的啟發式方法包括均值、中位數或者乘以係數,比如 0.1*均值。

基於L1範數的特徵選擇

使用L1範數的線性模型有一個稀疏解:許多估計係數都為0。當降維的目的是為了使用其他分類器,他們能和feature_selection.SelectFromModel一起使用選擇非零係數。特別地,稀疏估計量對於迴歸中的 linear_model.Lasso、分類中的linear_model.LogisticRegression和svm.LinearSVC都很有用。

from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150,4)
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
X_new.shape
(150,3)

在SVM和Logistic迴歸中,引數 C 控制著稀疏性,C越小選擇的特徵越少。在Lasso中,引數 alpha越大,選擇的特徵越少。

隨機稀疏模型

就特徵選擇而言,在迴歸和分類中使用L1正則有眾所周知的侷限。例如,Lasso將從一組高度相關的特徵中選擇一個;此外,即使特徵間的相關性並不強,L1正則仍然會從中選出一個“好”的特徵。 為了解決這個問題,可以使用sklearn.linear_model中的stability selection這種隨機化方法。在stability selection中,使用資料的子集去擬合模型,係數的隨機子集的罰項將被縮小( the penalty of a random subset of coefficients has been scaled)。

其中

是公平伯努利隨機變數的獨立試驗( independent trials of a fair Bernoulli random variable),0<s<1是縮小因子。通過重複不同的隨機子樣本和伯努利實驗組合,可以統計每個特徵被隨機過程所選中的概率,然後用這些概率去選擇特徵。 RandomizedLasso在 Lasso 迴歸中使用了這個策略,RandomizedLogisticRegression 可以用來分類。要獲得整個過程中的全部得分,可以使用lasso_stability_path。 隨機稀疏模型比標準的 F統計量在探測非零特徵方面要有力的多,真實的模型(ground truth model)應該是稀疏的,換句話說,只有少部分是特徵是非零的。

基於決策樹的特徵選擇

決策樹能用來計算特徵重要性,反過來也可以用於去除不相關特徵。

from sklearn.ensemble import ExtraTreesClassifier
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150,4)
clf = ExtraTreesClassifier()
clf = clf.fit(X, y)
clf.feature_importances_  
array([ 0.04...,  0.05...,  0.4...,  0.4...])
model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)
X_new.shape       
(150, 2)        

作者:zhilaizhiwang 連結:https://www.jianshu.com/p/b3056d10a20f 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。