scikit-learn--Feature selection(特征選擇)

去掉方差較小的特征

方差閾值(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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馆类,隨后出現(xiàn)的幾起案子混聊,更是在濱河造成了極大的恐慌,老刑警劉巖乾巧,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件句喜,死亡現(xiàn)場離奇詭異,居然都是意外死亡沟于,警方通過查閱死者的電腦和手機咳胃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旷太,“玉大人展懈,你說我怎么就攤上這事」╄担” “怎么了存崖?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長睡毒。 經(jīng)常有香客問我来惧,道長,這世上最難降的妖魔是什么演顾? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任供搀,我火速辦了婚禮隅居,結果婚禮上,老公的妹妹穿的比我還像新娘葛虐。我一直安慰自己胎源,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布屿脐。 她就那樣靜靜地躺著涕蚤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摄悯。 梳的紋絲不亂的頭發(fā)上赞季,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音奢驯,去河邊找鬼申钩。 笑死,一個胖子當著我的面吹牛瘪阁,可吹牛的內(nèi)容都是我干的撒遣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼管跺,長吁一口氣:“原來是場噩夢啊……” “哼义黎!你這毒婦竟也來了?” 一聲冷哼從身側響起豁跑,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤廉涕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后艇拍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狐蜕,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年卸夕,在試婚紗的時候發(fā)現(xiàn)自己被綠了层释。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡快集,死狀恐怖贡羔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情个初,我是刑警寧澤乖寒,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站院溺,受9級特大地震影響宵统,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一马澈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弄息,春花似錦痊班、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缨称,卻和暖如春凝果,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睦尽。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工器净, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人当凡。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓山害,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沿量。 傳聞我的和親對象是個殘疾皇子浪慌,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容