雖然說特徵愈多,愈容易得到好的預測效果。然而,當特徵過多時,除了運算成本的增加,更容易造成過度擬和、維度災難等問題。因此,今天我們要來聊聊,如何在眾多特徵中篩選出相對質量好的特徵,以提升模型的效率,並降低過度擬合的問題。本單元我們簡單分享幾個常用的過濾式特徵選擇方法。
1. 引入特徵選擇模組
from sklearn import feature_selection as fs
2. Removing features with low variance
這個方法非常簡單也非常直覺,簡單來說就是透過設定特徵變異數的門檻值,當特徵的變異數小於這個門檻值則遭到剔除。為什麼會這樣設計呢? 想像一下,假設我們的資料中有個二元特徵,比方說男性或女性,結果特徵資料中顯示全部都是男性,在這樣的情況下,這組特徵基本上對我們的結果(target)不會產生影響,也就是無用特徵的意思,而他的變異數剛好為0。對於布林特徵來說,當變異數愈小,代表特徵間差異愈小,也就是此特徵間同質性很高的意思,所以較不具鑑別度。
$$Var(X)=E[(X-\mu)^2]$$
sel=fs.VarianceThreshold(threshold=0.8*(1-0.8))
sel.fit_transform(X)
3. Univariate feature selection
在這個方法中,我們可以透過單獨計算每個特徵的統計值來決定最重要的K個特徵(SelectKBest
)或排名前多少百分比的特徵(SelectPercentile
)。
那麼,有哪些統計方法呢?
對於連續型的目標(regression),我們可以採用f_regression
, mutual_info_regression
對於離散型的目標(classification),我們可以採用chi2
, f_classif
, mutual_info_classif
X_new=fs.SelectKBest(fs.chi2,k=3).fit_transform(X,y)
X_new=fs.SelectPercentile(fs.mutual_info_classif,percentile=50).fit_transform(X,y)
當然除了這兩種方法,還有許多像是Recursive feature elimination, Feature selection using SelectFromModel等方法,各位讀者有興趣都可以參考scikit learn所提供的官方文件唷。
完整程式檔案,歡迎下載github