1.13. 特徵選擇#
sklearn.feature_selection
模組中的類別可以用於樣本集的特徵選擇/降維,以提高估計器的準確性分數或提高它們在非常高維資料集上的效能。
1.13.1. 移除低變異數的特徵#
VarianceThreshold
是一種簡單的特徵選擇基準方法。它會移除所有變異數不符合某個閾值的特徵。預設情況下,它會移除所有零變異數特徵,也就是說,在所有樣本中具有相同值的特徵。
例如,假設我們有一個具有布林特徵的資料集,並且我們想移除所有在超過 80% 的樣本中為一或零 (開啟或關閉) 的特徵。布林特徵是白努利隨機變數,而此類變數的變異數由下式給出
因此,我們可以利用閾值 .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]])
正如預期的,VarianceThreshold
已移除第一欄,其包含零的機率為 \(p = 5/6 > .8\)。
1.13.2. 單變量特徵選擇#
單變量特徵選擇透過基於單變量統計檢定選擇最佳特徵來運作。它可以被視為估計器的預處理步驟。Scikit-learn 將特徵選擇常式公開為實作 transform
方法的物件
SelectKBest
移除除了 \(k\) 個最高分特徵以外的所有特徵SelectPercentile
移除除了使用者指定的最高分特徵百分比以外的所有特徵使用每個特徵的常見單變量統計檢定:偽陽性率
SelectFpr
、偽發現率SelectFdr
或家族式誤差SelectFwe
。GenericUnivariateSelect
允許使用可設定的策略執行單變量特徵選擇。這允許使用超參數搜尋估計器選擇最佳的單變量選擇策略。
例如,我們可以如下使用 F 檢定來檢索資料集的兩個最佳特徵
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import f_classif
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(f_classif, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)
這些物件會將返回單變量分數和 p 值 (或僅針對 SelectKBest
和 SelectPercentile
的分數) 的評分函數作為輸入
基於 F 檢定的方法會估計兩個隨機變數之間線性依賴的程度。另一方面,互資訊方法可以捕獲任何類型的統計依賴關係,但是作為非參數方法,它們需要更多樣本才能進行準確估計。請注意,\(\chi^2\) 檢定只應應用於非負特徵,例如頻率。
警告
請注意,不要將迴歸評分函數與分類問題一起使用,否則您會得到無用的結果。
注意
範例
1.13.3. 遞迴特徵消除#
範例
1.13.4. 使用 SelectFromModel 進行特徵選擇#
有關如何使用它的範例,請參閱以下章節。
範例
1.13.4.1. 基於 L1 的特徵選擇#
>>> 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 和邏輯回歸,參數 C 控制稀疏性:C 越小,選取的特徵越少。對於 Lasso,alpha 參數越高,選取的特徵越少。
範例
L1 恢復和壓縮感知#
對於 alpha 的一個良好選擇,Lasso 可以在僅使用少量觀察的情況下完全恢復非零變數的確切集合,前提是滿足某些特定條件。特別是,樣本的數量應該「足夠大」,否則 L1 模型將隨機執行,其中「足夠大」取決於非零係數的數量、特徵數量的對數、雜訊量、非零係數的最小絕對值以及設計矩陣 X 的結構。此外,設計矩陣必須顯示某些特定屬性,例如不能過度相關。關於使用 Lasso 進行稀疏訊號恢復,請參閱此關於壓縮感知的範例:壓縮感知:使用 L1 先驗 (Lasso) 進行斷層掃描重建。
沒有選擇用於恢復非零係數的 alpha 參數的一般規則。它可以透過交叉驗證 (LassoCV
或 LassoLarsCV
) 進行設定,儘管這可能會導致懲罰不足的模型:包含少量不相關變數對預測分數沒有不利影響。相反,BIC (LassoLarsIC
) 傾向於設定較高的 alpha 值。
參考文獻
Richard G. Baraniuk “Compressive Sensing”,IEEE 訊號處理雜誌 [120] 2007 年 7 月 http://users.isr.ist.utl.pt/~aguiar/CS_notes.pdf
1.13.4.2. 基於樹的特徵選擇#
>>> 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)
範例
1.13.5. 循序特徵選擇#
正向循序特徵選擇 (Forward-SFS) 是一種貪婪演算法,它會迭代地尋找加入已選取特徵集合中的最佳新特徵。具體來說,我們最初從零個特徵開始,然後找出當估算器僅以該單一特徵訓練時,能最大化交叉驗證分數的那個特徵。一旦選取了第一個特徵,我們會重複此步驟,將一個新特徵加入已選取的特徵集合中。當達到所需的已選取特徵數量時,此步驟就會停止,此數量由 n_features_to_select
參數決定。
反向循序特徵選擇 (Backward-SFS) 遵循相同的概念,但方向相反:不是從沒有特徵開始並貪婪地加入特徵,而是從所有特徵開始,然後貪婪地從集合中移除特徵。direction
參數控制使用正向或反向 SFS。
循序特徵選擇的詳細資訊#
一般而言,正向和反向選擇不會產生相同的結果。此外,根據要求的選取特徵數量,其中一種可能會比另一種快得多:如果我們有 10 個特徵並要求選取 7 個特徵,正向選擇需要執行 7 次迭代,而反向選擇只需要執行 3 次。
SFS 與 RFE
和 SelectFromModel
的不同之處在於,它不要求底層模型公開 coef_
或 feature_importances_
屬性。然而,考慮到需要評估更多模型,它可能會比較慢,與其他方法相比。例如,在反向選擇中,使用 k 折交叉驗證,從 m
個特徵迭代到 m - 1
個特徵需要擬合 m * k
個模型,而 RFE
只需要單次擬合,而 SelectFromModel
始終只執行單次擬合且不需要迭代。
參考文獻
Ferri 等人,《大規模特徵選擇技術的比較研究》。
範例
1.13.6. 作為管道一部分的特徵選擇#
特徵選擇通常用作實際學習之前的預處理步驟。在 scikit-learn 中,建議的方法是使用 Pipeline
clf = Pipeline([
('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
('classification', RandomForestClassifier())
])
clf.fit(X, y)
在此程式碼片段中,我們使用 LinearSVC
搭配 SelectFromModel
來評估特徵重要性並選取最相關的特徵。然後,在轉換後的輸出上(即僅使用相關特徵)訓練 RandomForestClassifier
。您可以使用其他特徵選擇方法以及提供評估特徵重要性方式的分類器來執行類似的操作。有關更多詳細資訊,請參閱 Pipeline
範例。