去掉方差較小的特征
方差閾值(VarianceThreshold)是特征選擇的一個簡單方法混巧,去掉那些方差沒有達到閾值的特征。默認情況下羞福,刪除零方差的特征炫惩,例如那些只有一個值的樣本焊刹。
假設我們有一個有布爾特征的數(shù)據(jù)集,然后我們想去掉那些超過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涯肩。
單變量特征選擇
單變量特征選擇通過單變量統(tǒng)計檢驗選擇特征,可以看作一個估計器的預處理步驟巢钓。Sklearn將特征選擇視為日常的轉換操作:
- SelectBest 只保留 k 個最高分的特征病苗;
- SelectPercentile 只保留用戶指定百分比的最高得分的特征;
- 使用常見的單變量統(tǒng)計檢驗:假正率SelectFpr症汹,錯誤發(fā)現(xiàn)率selectFdr硫朦,或者總體錯誤率SelectFwe;
- GenericUnivariateSelect 通過結構化策略進行特征選擇背镇,通過超參數(shù)搜索估計器進行特征選擇咬展。
舉個例子,使用卡方檢驗選擇兩個最優(yōu)特征:
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
其中的參數(shù) score_func 有以下選項:
- 回歸:
f_regression:相關系數(shù)瞒斩,計算每個變量與目標變量的相關系數(shù)破婆,然后計算出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)
mutual_info_regression:互信息胸囱,互信息度量 X 和 Y 共享的信息:它度量知道這兩個變量其中一個祷舀,對另一個不確定度減少的程度。
參考:http://www.cnblogs.com/gatherstars/p/6004075.html
- 分類 :
chi2:卡方檢驗烹笔;
f_classif:方差分析裳扯,計算方差分析(ANOVA)的F值 (組間均方 / 組內(nèi)均方);
mutual_info_classif:互信息谤职,互信息方法可以捕捉任何一種統(tǒng)計依賴饰豺,但是作為非參數(shù)方法,需要更多的樣本進行準確的估計允蜈。
遞歸特征淘汰(RFE)
給特征賦予一個外部模型產(chǎn)生的權重(例如:線性模型系數(shù))冤吨,RFE遞歸地使用越來越少的特征來進行特征選擇蒿柳。首先,在原始數(shù)據(jù)上建立模型并且給每個特征一個權重锅很;然后其馏,淘汰絕對權重最小的特征,遞歸地執(zhí)行這個過程直到達到希望的特征數(shù)爆安。
RFECV使用交叉驗證方法發(fā)現(xiàn)最優(yōu)特征數(shù)量叛复。
使用SelectFromModel方法特征選擇
SelectFromModel是一種元轉換器,可以與那些有coef_ 或者feature_importances_屬性的模型一起使用扔仓。如果coef_ 或者feature_importances_小于閾值褐奥,我們就認為特征是不重要的。除了指定閾值以外翘簇,也可以使用啟發(fā)式的方式撬码。有效的啟發(fā)式方法包括均值、中位數(shù)或者乘以系數(shù)版保,比如 0.1*均值呜笑。
基于L1范數(shù)的特征選擇
使用L1范數(shù)的線性模型有一個稀疏解:許多估計系數(shù)都為0。當降維的目的是為了使用其他分類器彻犁,他們能和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
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回歸中输钩,參數(shù) C 控制著稀疏性,C越小選擇的特征越少仲智。在Lasso中买乃,參數(shù) alpha越大,選擇的特征越少钓辆。
隨機稀疏模型
就特征選擇而言为牍,在回歸和分類中使用L1正則有眾所周知的局限。例如岩馍,Lasso將從一組高度相關的特征中選擇一個;此外抖韩,即使特征間的相關性并不強蛀恩,L1正則仍然會從中選出一個“好”的特征。
為了解決這個問題茂浮,可以使用sklearn.linear_model中的stability selection這種隨機化方法双谆。在stability selection中壳咕,使用數(shù)據(jù)的子集去擬合模型,系數(shù)的隨機子集的罰項將被縮型绮觥( the penalty of a random subset of coefficients has been scaled)谓厘。
其中
是公平伯努利隨機變量的獨立試驗( independent trials of a fair Bernoulli random variable),0<s<1是縮小因子寸谜。通過重復不同的隨機子樣本和伯努利實驗組合竟稳,可以統(tǒng)計每個特征被隨機過程所選中的概率,然后用這些概率去選擇特征熊痴。
RandomizedLasso在 Lasso 回歸中使用了這個策略他爸,RandomizedLogisticRegression 可以用來分類。要獲得整個過程中的全部得分果善,可以使用lasso_stability_path诊笤。
隨機稀疏模型比標準的 F統(tǒng)計量在探測非零特征方面要有力的多,真實的模型(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)
來源:http://scikit-learn.org/stable/modules/feature_selection.html