天天看點

【Python學習】sklearn Feature selection(特征選擇)

(1)去掉方差較小的特征

方差門檻值(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]])
           

(2)單變量特征選擇

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

舉個例子,使用卡方檢驗選擇兩個最優特征:

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)
           

(3)基于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)
           

(4)基于決策樹的特征選擇

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

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)