機(jī)器學(xué)習(xí)中的特征工程(五)---- 特征選擇方法

簡(jiǎn)介

大概是今年6月份參加微信大數(shù)據(jù)挑戰(zhàn)賽的時(shí)候拂檩,我才開始認(rèn)識(shí)到特征選擇也是機(jī)器學(xué)習(xí)中非常重要的一環(huán)芬迄。在諸如CTR等比賽中便贵,原始特征往往是不足以挖掘出數(shù)據(jù)中隱藏的信息的隅茎,因此很多時(shí)候需要進(jìn)行特征組合,衍生出更多的組合特征嫉沽,但是這隨之也帶來了一個(gè)問題辟犀,那就是在成千上百的特征中,其實(shí)有很多特征對(duì)模型性能的提升是毫無幫助的绸硕,我們需要篩選出合適的堂竟,相對(duì)少量的特征來作為模型的輸入,這樣有助于模型的訓(xùn)練和提高精確度玻佩。但是我們?nèi)绾卧谳^多的特征池中挑選出合適的特征呢出嘹?這就是本文所要討論的特征選擇問題。

特征選擇

特征選擇(Feature Selection)又可稱特征子集的的選擇或者屬性選擇咬崔,是從大量的特征中選擇合適的领跛,相對(duì)少量的特征子集用來作為最終模型的輸入疙挺。通俗地來說,特征選擇就是在較多的特征中選擇最能體現(xiàn)數(shù)據(jù)本質(zhì)的的特征,猶如人類的學(xué)習(xí)過程蘑拯,將知識(shí)化繁為簡(jiǎn)枯怖,從紛繁復(fù)雜的信息中提煉挑選出最具代表性的特征唐片,進(jìn)而抓住最重要和最本質(zhì)的部分厚柳。
特征選擇是特征工程中最重要的內(nèi)容之一,我們期望丟棄不重要的特征熊杨,保留有效的特征曙旭。特征選擇之后,雖然特征數(shù)量減少了晶府,但是模型效果并沒有顯著下降甚至?xí)憩F(xiàn)得更好桂躏。特征選擇在某種程度上也是一種權(quán)衡的過程。
特征選擇有點(diǎn)類似于“降維”川陆,它有以下優(yōu)勢(shì):

  • 工程上剂习,避免‘維數(shù)災(zāi)難’,更少的特征需要的資源更小书劝,有利于模型訓(xùn)練和推理进倍,建模效率高,維護(hù)成本低
  • 理論上购对,更少的特征降低了模型假設(shè)類的復(fù)雜度猾昆,符合奧卡姆剃刀原則,有利于降低估計(jì)誤差并防止過擬合骡苞,在特征質(zhì)量較差的情況下垂蜗,甚至能避免建模的錯(cuò)誤楷扬。
  • 業(yè)務(wù)上,更少的特征有利于模型的解釋贴见,一定數(shù)量的特征是在人類的理解承受范圍之內(nèi)烘苹,并且可以對(duì)數(shù)據(jù)進(jìn)行可視化分析。但是超過上百個(gè)特征對(duì)于人類來說是難以理解的片部,也降低了業(yè)務(wù)上的推廣效率镣衡。

特征選擇算法

特征選擇技術(shù)的發(fā)展過程中,一種廣為流傳的特征選擇算法分類如下:

  • 過濾法(Filter Method)
    原理是對(duì)特征進(jìn)行某種得分排序档悠,去排名靠前的特征廊鸥。
  • 包裹法(Wrapper Method)
    借助模型,評(píng)價(jià)不同特征子集的效果辖所,去效果最好的子集
  • 嵌入法(Embedding Method)
    借助模型自帶的特征選擇功能實(shí)現(xiàn)特征選擇惰说,未被選擇的特征的系數(shù)或權(quán)重為0。

本文將針對(duì)這三種算法缘回,分別挑選具有代表性的算法來演示一下特征選擇的過程吆视。

過濾法

過濾法首先需要選擇評(píng)分方法,然后計(jì)算所有特征的得分酥宴,對(duì)特征排序啦吧,最后根據(jù)閾值或要求的特征數(shù)量過濾得到選中的特征。該特征選擇方法不涉及后續(xù)的模型構(gòu)建幅虑,通常被認(rèn)為是一種無偏的特征選擇方法丰滑。另外根據(jù)在進(jìn)行特征選擇的時(shí)候,是否使用到了目標(biāo)變量的相關(guān)信息倒庵,可以將特征方法分為有監(jiān)督的特征選擇和無監(jiān)督的特征選擇,下面會(huì)分別舉例炫刷。
首先我們需要確定評(píng)分方法擎宝,即如何來評(píng)價(jià)一個(gè)特征的好壞程度?這里先從簡(jiǎn)單的開始----方差指標(biāo)浑玛。方差的大小表明了數(shù)據(jù)的離散程度绍申,如果一個(gè)特征所有的取值都是一樣的或者接近,那說明它數(shù)據(jù)分布比較集中不夠分散顾彰,換言之這個(gè)特征對(duì)目標(biāo)變量沒有區(qū)分度极阅。通過方差指標(biāo)來篩選特征算法很簡(jiǎn)單,便于解釋和理解涨享,由于并沒有使用到目標(biāo)變量的信息筋搏,所以這屬于無監(jiān)督的特征選擇方法。sklearn中給出了相應(yīng)的實(shí)現(xiàn)厕隧,下面是官方的例子奔脐。如下:

from sklearn.feature_selection import VarianceThreshold

#     f1 f2 f3 f4
X = [[0, 2, 0, 3], 
     [0, 1, 4, 3], 
     [0, 1, 1, 3]]

selector = VarianceThreshold(threshold=0.0)
selector.fit_transform(X)
篩選結(jié)果

方差篩選的閾值設(shè)置為0.0俄周,原始一共有4個(gè)特征f1,f2,f3,f4,經(jīng)過方差篩選后只剩下f2髓迎,f3峦朗。因?yàn)樘卣鱢1,f4的方差為0,故被篩選掉了排龄。

上面的特征選擇使用的是無監(jiān)督的方差指標(biāo)評(píng)分方法波势,其優(yōu)點(diǎn)是簡(jiǎn)單快捷,但是不足以選擇出更具有代表性的特征橄维,并且沒有利用到目標(biāo)變量的信息艰亮,下面介紹相關(guān)性指標(biāo)評(píng)分方法。所謂相關(guān)性代表了特征與特征之間挣郭,以及特征與目標(biāo)變量之間的變化關(guān)系迄埃。如果特征值的變化會(huì)導(dǎo)致預(yù)測(cè)值的變化,那么特征就是相關(guān)的兑障。相關(guān)性的強(qiáng)弱代表了這種關(guān)系的程度侄非。如果在預(yù)測(cè)模型中使用特征A能明顯消除分類的模糊性,那么它就是強(qiáng)相關(guān)的流译,否則 為弱相關(guān)逞怨。如果從特征集中刪除掉某些特征后,特征A才變得相關(guān)福澡,那么它是弱相關(guān)的叠赦。如果一個(gè)特征既不是強(qiáng)相關(guān)的,也不是弱相關(guān)的革砸,那么認(rèn)為它是不相關(guān)的除秀。特征選擇的目標(biāo)是選擇相關(guān)性強(qiáng)的特征。評(píng)價(jià)相關(guān)性的指標(biāo)有很多算利,不過文本主要介紹皮爾遜相關(guān)系數(shù)册踩。兩個(gè)變量之間的皮爾遜相關(guān)系數(shù)定義為兩個(gè)變量的協(xié)方差除以它們標(biāo)準(zhǔn)差的乘積,如下:

皮爾遜相關(guān)公式
其物理含義為:一個(gè)變量的增加與另一個(gè)變量的增加越相關(guān)效拭,則\rho越接近1暂吉;反之,一個(gè)變量的增加與另外一個(gè)變量的減少越相關(guān)缎患,則\rho越接近-1慕的。如果XY獨(dú)立,則\rho越接近0挤渔;反之則不然肮街,如果兩個(gè)變量存在這很強(qiáng)的關(guān)系,但是皮爾遜相關(guān)系數(shù)仍可能很小蚂蕴。

關(guān)于協(xié)方差與相關(guān)系數(shù)等概念可以參考知乎如何通俗易懂地解釋「協(xié)方差」與「相關(guān)系數(shù)」的概念低散?

知道了皮爾遜相關(guān)系數(shù)的作用之后俯邓,我們就可以用它來做特征選擇了,具體來說就是分別計(jì)算每個(gè)特征與目標(biāo)變量之間的相關(guān)系數(shù)以及相關(guān)系數(shù)的P值熔号』蓿可以使用scipy中的pearsonr函數(shù)來計(jì)算皮爾遜相關(guān)系數(shù)從而來進(jìn)行特征選擇,代碼如下:

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
from sklearn.datasets import load_iris

iris = load_iris()

def scoring(x, y):
    t = [pearsonr(x[:,i], y) for i in range(x.shape[1])]
    l = [i[0] for i in t]
    tu = (i[1] for i in t)
    return l, tu 

X_new = SelectKBest(lambda X, Y: scoring(X, Y), k=2).fit_transform(iris.data, iris.target)
X_new

選擇的特征為:

對(duì)比之后可知使用皮爾遜相關(guān)系數(shù)最終選出來iris數(shù)據(jù)集的后面2個(gè)特征引镊,即第三個(gè)和第四個(gè)特征朦蕴。
當(dāng)然也可以使用卡方檢驗(yàn)來衡量自變量uid定性因變量餓的相關(guān)性。假設(shè)自變量有N種取值弟头,因變量有M種取值吩抓,考慮自變量等于i且因變量等于j的樣本頻數(shù)的觀察值與期望的差距,構(gòu)建統(tǒng)計(jì)量:
卡方檢驗(yàn)
不難發(fā)現(xiàn)赴恨,這個(gè)統(tǒng)計(jì)量的含義簡(jiǎn)而言之就是自變量對(duì)因變量的相關(guān)性疹娶。用feature_selection庫的SelectKBest類結(jié)合卡方檢驗(yàn)來選擇特征的代碼如下:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

#選擇K個(gè)最好的特征,返回選擇特征后的數(shù)據(jù)
x_new = SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
x_new

結(jié)果跟使用皮爾遜相關(guān)系數(shù)選擇的特征一樣伦连。

互信息也是測(cè)量變量之間關(guān)聯(lián)程度的一種評(píng)價(jià)方法雨饺,當(dāng)且僅當(dāng)兩個(gè)隨機(jī)變量獨(dú)立時(shí),MI值為0惑淳,當(dāng)兩個(gè)隨機(jī)變量關(guān)聯(lián)性越強(qiáng)额港,MI值越大∑缃梗互信息在決策樹中成為信息增益移斩,它是信息論的基本概念之一。經(jīng)典的互信息也是評(píng)價(jià)定性自變量對(duì)定性因變量的相關(guān)性的绢馍,互信息計(jì)算公式如下:

為了處理定量數(shù)據(jù)向瓷,最大信息系數(shù)法被提出,使用feature_selection庫的SelectKBest類結(jié)合最大信息系數(shù)法來選擇特征的代碼如下:

from sklearn.feature_selection import SelectKBest
from minepy import MINE
 
def scoring(x, y):
    m = MINE()
    res = []
    for i in range(x.shape[1]):
        m.compute_score(x[:,i], y)
        res.append(m.mic())
    
    tu = (0.5 for _ in res)
    return res, tu

X_new = SelectKBest(lambda X, Y: scoring(X, Y), k=2).fit_transform(iris.data, iris.target)
X_new

這里得到的結(jié)果也是一樣的痕貌。

包裹法

如果特征加入后风罩,模型的性能提升只有萬分之幾,一般這樣的特征就不應(yīng)該被選中舵稠。包裹法設(shè)計(jì)模型構(gòu)建和子集搜索,相對(duì)過濾法是一種計(jì)算成本很高的特征選擇方法入宦,但是往往精度不高哺徊。有這樣一種觀點(diǎn),特征選擇方法的最終目的是尋找對(duì)性能有提升的特征(組合)乾闰,而不一定要找到相關(guān)的特征落追。
遞歸消除特征法使用一個(gè)基模型來進(jìn)行多輪訓(xùn)練,每輪訓(xùn)練后涯肩,消除若干權(quán)值系數(shù)的特征轿钠,再基于新的特征集進(jìn)行下一輪訓(xùn)練巢钓。使用feature_selection庫的RFE類來選擇特征的代碼如下:

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

#遞歸特征消除法,返回特征選擇后的數(shù)據(jù)
#參數(shù)estimator為基模型
#參數(shù)n_features_to_select為選擇的特征個(gè)數(shù)
x_new = RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
x_new

輸出依然是一樣的疗垛。

嵌入法

嵌入法特征選擇比較特殊症汹,它要求學(xué)習(xí)算法本身具有特征選擇的功能。例如帶L1正則項(xiàng)的回歸算法贷腕,算法輸出回歸系數(shù)為0的特征即是被刪除掉的特征背镇,說明其重要程度不高,從而表現(xiàn)為學(xué)習(xí)算法自帶特征選擇功能泽裳。正則化的決策樹也具有同樣的功能瞒斩。樹模型中權(quán)重為0的特征是沒有被模型選中的特征,所以樹模型的特征選擇也應(yīng)該歸屬于嵌入法涮总。
由于嵌入法設(shè)置未選中的特征稀疏或權(quán)重為0胸囱,所以在實(shí)踐中,嵌入法會(huì)是一個(gè)循環(huán)的過程瀑梗,例如第二次建模只輸入第一次選中的特征烹笔,此時(shí)由于特征空間的變化,第二次建模的時(shí)候也可能產(chǎn)生系數(shù)或權(quán)重為0的特征夺克,此時(shí)再重復(fù)運(yùn)行箕宙,直到所有的特征系數(shù)或權(quán)重都不為0。
1铺纽、基于隨機(jī)森林的特征選擇
決策樹構(gòu)造的過程也是特征選擇的過程柬帕。決策樹在構(gòu)造的過程中會(huì)選擇具有最大信息增益(ID3算法)、最大信息增益比(C4.5)狡门、最大GINI指數(shù)(CART算法)的特征陷寝,關(guān)于決策樹的構(gòu)造算法,可以參考我這篇博客機(jī)器學(xué)習(xí)中的特征工程(四)---- 特征離散化處理方法其馏。隨機(jī)森林基于決策樹在行列上采樣構(gòu)造樹模型凤跑,最終計(jì)算每個(gè)特征的不純度或基尼的減少的平均數(shù),排序后的得到特征的重要性叛复,從而得到平均不純度減少仔引、基尼減少、方差的特征選擇方法褐奥。該方法具有穩(wěn)定性特征選擇的特點(diǎn)咖耘。同樣,也可以使用梯度提升樹(GBDT)來作為特征選擇的基模型撬码,它們本質(zhì)上原理都差不多儿倒。基于隨機(jī)森林和GBDT的特征選擇算法代碼示例如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier

#GBDT作為基模型的特征選擇
# clf = GradientBoostingClassifier()
# x_new = SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)

# 隨機(jī)森林作為基模型的特征選擇
clf = RandomForestClassifier()
x_new = SelectFromModel(clf).fit_transform(iris.data, iris.target)

clf.fit(iris.data, iris.target)
print("selected feature's shape: ", x_new.shape)
print("the importances of all original features: ", clf.feature_importances_.round(6))
結(jié)果

這里打印出來了選擇的特征的形狀呜笑,跟上面一樣夫否,是選擇了后面2個(gè)特征彻犁。并且打印出了每個(gè)特征的重要程度,也可以看出是后面兩個(gè)特征更加重要一點(diǎn)凰慈。

2汞幢、基于正則的特征選擇
使用L1正則的模型中會(huì)得到稀疏解,即大部分特征對(duì)應(yīng)的系數(shù)為0溉瓶,很明顯系數(shù)為0或者接近0的特征是沒有被選擇的特征急鳄,即L1正則化的效果具有特征選擇的作用。使用L2的模型中則會(huì)輸出趨于一致的系數(shù)堰酿,得到較為穩(wěn)定的模型疾宏。下面是Sklearn中給出的使用帶L1正則的邏輯回歸來進(jìn)行特征選擇的例子。如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression

X = [[ 0.87, -1.34,  0.31 ],
     [-2.79, -0.02, -0.85 ],
     [-1.34, -0.48, -2.55 ],
     [ 1.92,  1.48,  0.65 ]]
y = [0, 1, 0, 1]

lr = LogisticRegression(penalty='l2', C=0.01)
selector = SelectFromModel(estimator=lr).fit(X, y)
print('特征的系數(shù): ', selector.estimator_.coef_)

print('選擇器的閾值: ', selector.threshold_)

print('特征選擇: ', selector.get_support())
print(selector.transform(X))
特征選擇

注意触创,最新的sklearn版本中的SelecFromModel貌似已經(jīng)不支持L1正則化坎藐,會(huì)報(bào)錯(cuò),因此這里使用的是L1正則化哼绑。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岩馍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抖韩,更是在濱河造成了極大的恐慌蛀恩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茂浮,死亡現(xiàn)場(chǎng)離奇詭異双谆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)席揽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門顽馋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幌羞,你說我怎么就攤上這事寸谜。” “怎么了属桦?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵熊痴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我聂宾,道長(zhǎng)愁拭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任亏吝,我火速辦了婚禮,結(jié)果婚禮上盏混,老公的妹妹穿的比我還像新娘蔚鸥。我一直安慰自己惜论,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布止喷。 她就那樣靜靜地躺著馆类,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弹谁。 梳的紋絲不亂的頭發(fā)上乾巧,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音预愤,去河邊找鬼沟于。 笑死,一個(gè)胖子當(dāng)著我的面吹牛植康,可吹牛的內(nèi)容都是我干的旷太。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼销睁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼供璧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冻记,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤睡毒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后冗栗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體演顾,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年贞瞒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偶房。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡军浆,死狀恐怖棕洋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乒融,我是刑警寧澤掰盘,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站赞季,受9級(jí)特大地震影響愧捕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜申钩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一次绘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦邮偎、人聲如沸管跺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豁跑。三九已至,卻和暖如春泻云,著一層夾襖步出監(jiān)牢的瞬間艇拍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工宠纯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卸夕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓征椒,卻偏偏與公主長(zhǎng)得像娇哆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勃救,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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