sklearn.feature_selection
中的類可以用于樣本集的特征選擇/降維,既可以提高估計器的精度得分,也可以提高它們在非常高維數(shù)據(jù)集上的性能。
方差閾值VarianceThreshold
是特征選擇的一種簡單的基本方法。它刪除了所有方差不滿足某些閾值的特征。默認(rèn)情況下,它刪除所有零方差特征,即在所有樣本中具有相同值的特征。
例如,假設(shè)我們有一個具有布爾特征的數(shù)據(jù)集,并且我們想要移除那些在整個數(shù)據(jù)集中特征值為0或者為1的比例超過80%的特征。布爾特征是伯努利(Bernoulli)隨機變量,并給出了這些變量的方差:
因此,我們可以使用閾值.8 * ( 1 - .8)
進行選擇:
>>> 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]])
正如預(yù)期的那樣,VarianceThreshold
刪除了第一列,該列包含一個0的概率是 。
單變量特征選擇是通過基于單變量統(tǒng)計檢驗來選擇最優(yōu)特征實現(xiàn)的。它可以看作是對估計器的預(yù)處理步驟。Scikit-learn將特征選擇的程序作為實現(xiàn)了transform
方法的對象:
SelectKBest
移除那些除了評分最高的 K 個特征之外的所有特征SelectPercentile
移除除了用戶指定的最高得分百分比之外的所有特征SelectFpr
, 偽發(fā)現(xiàn)率SelectFdr
, 或者族系誤差SelectFwe
。GenericUnivariateSelect
允許使用可配置策略執(zhí)行單變量特征選擇。它允許使用超參數(shù)搜索估計器來選擇最佳的單變量選擇策略。例如,我們可以對樣本執(zhí)行檢驗,只檢索兩個最好的特征,如下所示:
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import chi2
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)
這些對象以一個得分函數(shù)作為輸入,該函數(shù)返回單變量分?jǐn)?shù)和p值(或僅用于 SelectKBest
和SelectPercentile
):
f_regression
, mutual_info_regression
chi2
, f_classif
, mutual_info_classif
基于F檢驗的方法估計了兩個隨機變量之間的線性依賴程度。另一方面,互換信息方法(mutual information methods )可以捕獲任何類型的統(tǒng)計相關(guān)性,但由于非參數(shù)性,它們需要更多的樣本來精確估計。
稀疏數(shù)據(jù)的特征選擇
如果您使用稀疏數(shù)據(jù)(即數(shù)據(jù)被表示為稀疏矩陣),則
chi2
,mutual_info_regression
,mutual_info_classif
將處理這些數(shù)據(jù),而不會使其稠密。
警告:不要使用一個回歸評分函數(shù)來處理分類問題,你會得到無用的結(jié)果。
示例 |
---|
單變量特征選擇 F檢驗與互信息比較 |
給定一個外部的估計器,可以對特征賦予一定的權(quán)重(比如,線性模型的相關(guān)系數(shù)),遞歸特征消除(RFE
)通過考慮越來越小的特征集來遞歸的選擇特征。 首先,估計器在初始的特征集合上訓(xùn)練并且通過 coef_
屬性或者feature_importances_
獲取每一個特征的重要性。 然后,從當(dāng)前的特征集合中移除最不重要的特征。在特征集合上不斷的重復(fù)遞歸這個步驟,直到最終達到所需要的特征數(shù)量為止。
RFECV
在一個交叉驗證的循環(huán)中執(zhí)行 RFE 來找到最優(yōu)的特征數(shù)量。
示例 |
---|
遞歸特征消除: 數(shù)字分類任務(wù)中像素相關(guān)性的遞歸特征消除實例. 帶交叉驗證的遞歸特征消除:一個自動調(diào)整交叉驗證特征數(shù)的遞歸特征消除示例. |
SelectFromModel
是一個元轉(zhuǎn)換器(meta-transformer),它可以與任何具有 coef_
屬性或feature_importances_
屬性的估值器一起使用。如果相應(yīng)的coef_
或 feature_importances_
低于所提供的閾值參數(shù),則這些特征被視為不重要并被刪除。除了指定在數(shù)值上的閾值外,還可以通過給定字符串參數(shù)來使用內(nèi)置的啟發(fā)式方法找到一個合適的閾值??捎玫膯l(fā)式方法是“mean”, “median” 和浮點倍數(shù),如 “0.1*mean”。結(jié)合閾值標(biāo)準(zhǔn),可以使用max_features
參數(shù)來設(shè)置要選擇的特征數(shù)量的限制。
關(guān)于如何使用它的例子,請參閱下面的章節(jié)。
示例 |
---|
使用SelectFromModel和LassoCV進行特征選擇: 從 Boston 數(shù)據(jù)中自動選擇最重要兩個特征而不需要提前得知這一信息。 |
用L1范數(shù)懲罰的線性模型具有稀疏解:它們的許多估計系數(shù)為零。當(dāng)目標(biāo)是降低數(shù)據(jù)的維數(shù)以便與另一個分類器一起使用時,它們可以與feature_selection.SelectFromModel
一起使用來選擇非零系數(shù)。具體而言,可用于此目的的稀疏估計器對回歸而言是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
>>> X, y = load_iris(return_X_y=True)
>>> 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回歸,參數(shù)C控制稀疏性:C越小,選擇的特征越少。對于Lasso,alpha參數(shù)越高,所選擇的特征就越少。
示例 |
---|
基于稀疏特征的文本文檔分類: 基于L1特征選擇的文檔分類算法比較. |
L1-recovery和壓縮感知
當(dāng)選擇了正確的 alpha 值以后, Lasso 可以僅通過少量觀察點便恢復(fù)完整的非零特征, 假設(shè)特定的條件可以被滿足的話。特別的,數(shù)據(jù)量需要 “足夠大” ,不然 L1 模型的表現(xiàn)將隨機。 “足夠大” 的定義取決于非零系數(shù)的個數(shù)、特征數(shù)量的對數(shù)值、噪音的數(shù)量、非零系數(shù)的最小絕對值、 以及設(shè)計矩陣(design maxtrix) X 的結(jié)構(gòu)。此外, 特征矩陣必須表現(xiàn)出特定的性質(zhì),如數(shù)據(jù)不能太相關(guān)。
對于非零系數(shù)的恢復(fù), 如何選擇 alpha 值沒有通用的規(guī)則。alpha 值可以通過交叉驗證來確定(
LassoCV
或者LassoLarsCV
),盡管這可能會導(dǎo)致欠懲罰(under-penalized)的模型:包括少量的無關(guān)變量對于預(yù)測值來說并非致命的。相反的, BIC(LassoLarsIC
)傾向于給定高的 alpha 值。參考文獻 Richard G. Baraniuk “Compressive Sensing”, IEEE Signal Processing Magazine [120] July 2007 http://dsp.rice.edu/sites/dsp.rice.edu/files/cs/baraniukCSlecture07.pdf
基于樹的估計器(參看 sklearn.tree
模塊和在 sklearn.ensemble
模塊中的樹的森林) 可以用來計算基于不存度的特征重要性,然后可以消除不相關(guān)的特征(當(dāng)與 sklearn.feature_selection.SelectFromModel
等元轉(zhuǎn)換器一同使用時):
>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier(n_estimators=50)
>>> 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)
示例 |
---|
樹森林的特征重要性: 在合成數(shù)據(jù)上恢復(fù)有用特征的示例。 基于平行樹的森林的像素重要性: 在人臉識別數(shù)據(jù)上的示例。 |
特征選擇通常在實際的學(xué)習(xí)之前用來做預(yù)處理。在 scikit-learn 中推薦的方式是使用 :sklearn.pipeline.Pipeline
:
clf = Pipeline([
('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
('classification', RandomForestClassifier())
])
clf.fit(X, y)
在這段代碼中,我們利用 sklearn.svm.LinearSVC
和 sklearn.feature_selection.SelectFromModel
來評估特征的重要性并且選擇出最相關(guān)的特征。 然后,在轉(zhuǎn)化后的輸出中使用一個 sklearn.ensemble.RandomForestClassifier
分類器,比如只使用相關(guān)的特征。你也可以使用其他特征選擇的方法和可以提供評估特征重要性的分類器來執(zhí)行相似的操作。 請查閱 sklearn.pipeline.Pipeline
來了解更多的實例。
更多建議: