一文介紹機器學(xué)習中的三種特征選擇方法
作者 | luanhz來(lái)源 | 小數志
導讀
機器學(xué)習中的一個(gè)經(jīng)典理論是:數據和特征決定了機器學(xué)習的上限,而模型和算法只是逼近這個(gè)上限。也正因如此,特征工程在機器學(xué)習流程中占有著(zhù)重要地位。廣義的特征工程一般可分為三個(gè)環(huán)節:特征提取、特征選擇、特征衍生,三個(gè)環(huán)節并無(wú)明確的先手順序之分。本文主要介紹三種常用的特征選擇方法。
機器學(xué)習中的特征需要選擇,人生又何嘗不是如此?
特征選擇是指從眾多可用的特征中選擇一個(gè)子集的過(guò)程,其目的和預期效果一般有如下三方面考慮:
改善模型效果,主要是通過(guò)過(guò)濾無(wú)效特征或者噪聲特征來(lái)實(shí)現;
加速模型訓練,更為精簡(jiǎn)的特征空間自然可以實(shí)現模型訓練速度的提升
增強特征可解釋性,這方面的作用一般不是特別明顯,比如存在共線(xiàn)性較高的一組特征時(shí),通過(guò)合理的特征選擇可僅保留高效特征,從而提升模型的可解釋性
另一方面,理解特征選擇方法的不同,首先需要按照特征對訓練任務(wù)的價(jià)值高低而對特征作出如下分類(lèi):
高價(jià)值特征,這些特征對于模型訓練非常有幫助,特征選擇的目的就是盡可能精準的保留這些特征
低價(jià)值特征,這些特征對模型訓練幫助不大,但也屬于正相關(guān)特征,在特征選擇比例較低時(shí),這些特征可以被舍棄;
高相關(guān)性特征,這些特征對模型訓練也非常有幫助,但特征與特征之間往往相關(guān)性較高,換言之一組特征可由另一組特征替代,所以是存在冗余的特征,在特征選擇中應當將其過(guò)濾掉;
噪聲特征,這些特征對模型訓練不但沒(méi)有正向作用,反而會(huì )干擾模型的訓練效果。有效的特征選擇方法應當優(yōu)先將其濾除。
在實(shí)際應用中,特征選擇方法主要可分為如下三類(lèi):
本文將圍繞這三種方法分別介紹,最后以sklearn中自帶的數據集為例給出簡(jiǎn)單的應用和效果對比。01 過(guò)濾法基于過(guò)濾法(Filter)實(shí)現特征選擇是最為簡(jiǎn)單和常用的一種方法,其最大優(yōu)勢是不依賴(lài)于模型,僅從特征的角度來(lái)挖掘其價(jià)值高低,從而實(shí)現特征排序及選擇。實(shí)際上,基于過(guò)濾法的特征選擇方案,其核心在于對特征進(jìn)行排序——按照特征價(jià)值高低排序后,即可實(shí)現任意比例/數量的特征選擇或剔除。顯然,如何評估特征的價(jià)值高低從而實(shí)現排序是這里的關(guān)鍵環(huán)節。為了評估特征的價(jià)值高低,大體可分為如下3類(lèi)評估標準:
基于特征所含信息量的高低:這種一般就是特征基于方差法實(shí)現的特征選擇,即認為方差越大對于標簽的可區分性越高;否則,即低方差的特征認為其具有較低的區分度,極端情況下當一列特征所有取值均相同時(shí),方差為0,對于模型訓練也不具有任何價(jià)值。當然,實(shí)際上這里倘若直接以方差大小來(lái)度量特征所含信息量是不嚴謹的,例如對于[100, 110, 120]和[1, 5, 9]兩組特征來(lái)說(shuō),按照方差計算公式前者更大,但從機器學(xué)習的角度來(lái)看后者可能更具有區分度。所以,在使用方差法進(jìn)行特征選擇前一般需要對特征做歸一化
基于相關(guān)性:一般是基于統計學(xué)理論,逐一計算各列與標簽列的相關(guān)性系數,當某列特征與標簽相關(guān)性較高時(shí)認為其對于模型訓練價(jià)值更大。而度量?jì)闪袛祿嚓P(guān)性的指標則有很多,典型的包括歐式距離、卡方檢驗、T檢驗等等
基于信息熵理論:與源于統計學(xué)的相關(guān)性方法類(lèi)似,也可從信息論的角度來(lái)度量一列特征與標簽列的相關(guān)程度,典型的方法就是計算特征列與標簽列的互信息。當互信息越大時(shí),意味著(zhù)提供該列特征時(shí)對標簽的信息確定程度越高。這與決策樹(shù)中的分裂準則思想其實(shí)是有異曲同工之妙
當然,基于過(guò)濾法的特征選擇方法其弊端也極為明顯:
因為不依賴(lài)于模型,所以無(wú)法有針對性的挖掘出適應模型的最佳特征體系;
特征排序以及選擇是獨立進(jìn)行(此處的獨立是指特征與特征之間的獨立,不包含特征與標簽間的相關(guān)性計算等),對于某些特征單獨使用價(jià)值低、組合使用價(jià)值高的特征無(wú)法有效發(fā)掘和保留。
02 包裹法
過(guò)濾法是從特征重要性高低的角度來(lái)加以排序,從而完成目標特征選擇或者低效特征濾除的過(guò)程。如前所述,其最大的弊端之一在于因為不依賴(lài)任何模型,所以無(wú)法針對性的選擇出相應模型最適合的特征體系。同時(shí),其還存在一個(gè)隱藏的問(wèn)題:即特征選擇保留比例多少的問(wèn)題,實(shí)際上這往往是一個(gè)超參數,一般需要人為定義或者進(jìn)行超參尋優(yōu)。
與之不同,包裹法將特征選擇看做是一個(gè)黑盒問(wèn)題:即僅需指定目標函數(這個(gè)目標函數一般就是特定模型下的評估指標),通過(guò)一定方法實(shí)現這個(gè)目標函數最大化,而不關(guān)心其內部實(shí)現的問(wèn)題。進(jìn)一步地,從具體實(shí)現的角度來(lái)看,給定一個(gè)含有N個(gè)特征的特征選擇問(wèn)題,可將其抽象為從中選擇最優(yōu)的K個(gè)特征子集從而實(shí)現目標函數取值最優(yōu)。易見(jiàn),這里的K可能是從1到N之間的任意數值,所以該問(wèn)題的搜索復雜度是指數次冪:O(2^N)。
當然,對于這樣一個(gè)具有如此高復雜度的算法,聰明的前輩們是不可能去直接暴力嘗試的,尤其是考慮這個(gè)目標函數往往還是足夠expensive的(即模型在特定的特征子集上的評估過(guò)程一般是較為耗時(shí)的過(guò)程),所以具體的實(shí)現方式一般有如下兩種:
序貫選擇。美其名曰序貫選擇,其實(shí)就是貪心算法。即將含有K個(gè)特征的最優(yōu)子空間搜索問(wèn)題簡(jiǎn)化為從1->K的遞歸式選擇(Sequential Feature Selection, SFS)或者從N->K的遞歸式消除(Sequential Backward Selection, SBS)的過(guò)程,其中前者又稱(chēng)為前向選擇,后者相應的稱(chēng)作后向選擇。
具體而言,以遞歸式選擇為例,初始狀態(tài)時(shí)特征子空間為空,嘗試逐一選擇每個(gè)特征加入到特征子空間中,計算相應的目標函數取值,執行這一過(guò)程N次,得到當前最優(yōu)的第1個(gè)特征;如此遞歸,不斷選擇得到第2個(gè),第3個(gè),直至完成預期的特征數目K。這一過(guò)程的目標函數執行次數為O(K^2),相較于指數次冪的算法復雜度而言已經(jīng)可以接受。當然,在實(shí)際應用過(guò)程中還衍生了很多改進(jìn)算法,例如下面流程圖所示:
圖源:《A survey on feature selection methods》
啟發(fā)式搜索。啟發(fā)式搜索一般是應用了進(jìn)化算法,例如在優(yōu)化領(lǐng)域廣泛使用的遺傳算法。在具體實(shí)現中,需要考慮將特征子空間如何表達為種群中的一個(gè)個(gè)體(例如將含有N個(gè)特征的選擇問(wèn)題表達為長(cháng)度為N的0/1序列,其中1表示選擇該特征,0表示不選擇,序列中1的個(gè)數即為特征子空間中的特征數量),進(jìn)而可將模型在相應特征子空間的效果定義為對應個(gè)體在種群中的適應度;其次就是定義遺傳算法中的主要操作:交叉、變異以及繁殖等進(jìn)化過(guò)程。
基于包裹法的特征選擇方案是面向模型的實(shí)現方案,所以理論而言具有最佳的選擇效果。但實(shí)際上在上述實(shí)現過(guò)程中,其實(shí)一般也需要預先指定期望保留的特征數量,所以也就涉及到超參的問(wèn)題。此外,基于包裹法的最大缺陷在于巨大的計算量,雖然序貫選擇的實(shí)現方案將算法復雜度降低為平方階,但仍然是一個(gè)很大的數字;而以遺傳算法和粒子群算法為代表的啟發(fā)式搜索方案,由于其均是population-based的優(yōu)化實(shí)現,自然也更是涉及大量計算。
03 嵌入法與包裹法依賴(lài)于模型進(jìn)行選擇的思想相似,而又與之涉及巨大的計算量不同:基于嵌入法的特征選擇方案,顧名思義,是將特征選擇的過(guò)程"附著(zhù)"于一個(gè)模型訓練任務(wù)本身,從而依賴(lài)特定算法模型完成特征選擇的過(guò)程。
個(gè)人一直以為,"嵌入"(embedded)一詞在機器學(xué)習領(lǐng)域是一個(gè)很魔性的存在,甚至在剛接觸特征選擇方法之初,一度將嵌入法和包裹法混淆而不能感性理解。
實(shí)際上,行文至此,基于嵌入法的特征選擇方案也就呼之欲出了,最為常用的就是樹(shù)模型和以樹(shù)模型為基礎的系列集成算法,由于模型提供了特征重要性這個(gè)重要信息,所以其可天然的實(shí)現模型價(jià)值的高低,從而根據特征重要性的高低完成特征選擇或濾除的過(guò)程。另外,除了決策樹(shù)系列模型外,LR和SVM等廣義線(xiàn)性模型也可通過(guò)擬合權重系數來(lái)評估特征的重要程度。基于嵌入法的特征選擇方案簡(jiǎn)潔高效,一般被視作是集成了過(guò)濾法和包裹法兩種方案的優(yōu)點(diǎn):既具有包裹法中面向模型特征選擇的優(yōu)勢,又具有過(guò)濾法的低開(kāi)銷(xiāo)和速度快。但實(shí)際上,其也具有相應的短板:不能識別高相關(guān)性特征,例如特征A和特征B都具有較高的特征重要性系數,但同時(shí)二者相關(guān)性較高,甚至說(shuō)特征A=特征B,此時(shí)基于嵌入法的特征選擇方案是無(wú)能為力的。
04 三種特征選擇方案實(shí)戰對比
本小節以sklearn中的乳腺癌數據集為例,給出三種特征選擇方案的基本實(shí)現,并簡(jiǎn)單對比特征選擇結果。
加載數據集并引入必備包:
from sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_selection import SelectFromModel, SelectKBest, RFEfrom sklearn.ensemble import RandomForestClassifier
默認數據集訓練模型,通過(guò)在train_test_split中設置隨機數種子確保后續切分一致:
%%timeX, y = load_breast_cancer(return_X_y=True)X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=3)
rf = RandomForestClassifier(max_depth=5, random_state=3)rf.fit(X_train, y_train)rf.score(X_test, y_test)
# 輸出結果CPU times: user 237 ms, sys: 17.5 ms, total: 254 msWall time: 238 ms0.9370629370629371
過(guò)濾法的特征選擇方案,調用sklearn中的SelectKBest實(shí)現,內部默認采用F檢驗來(lái)度量特征與標簽間相關(guān)性,選擇特征維度設置為20個(gè):
%%timeX_skb = SelectKBest(k=20).fit_transform(X, y)X_skb_train, X_skb_test, y_train, y_test = train_test_split(X_skb, y, random_state=3)
rf = RandomForestClassifier(max_depth=5, random_state=3)rf.fit(X_skb_train, y_train)rf.score(X_skb_test, y_test)
# 輸出結果CPU times: user 204 ms, sys: 7.14 ms, total: 211 msWall time: 208 ms0.9300699300699301
包裹法的特征選擇方案,調用sklearn中的RFE實(shí)現,傳入的目標函數也就是算法模型為隨機森林,特征選擇維度也設置為20個(gè):
%%timeX_rfe = RFE(RandomForestClassifier(), n_features_to_select=20).fit_transform(X, y)X_rfe_train, X_rfe_test, y_train, y_test = train_test_split(X_rfe, y, random_state=3)
rf = RandomForestClassifier(max_depth=5, random_state=3)rf.fit(X_rfe_train, y_train)rf.score(X_rfe_test, y_test)
# 輸出結果CPU times: user 2.76 s, sys: 4.57 ms, total: 2.76 sWall time: 2.76 s0.9370629370629371
嵌入法的特征選擇方案,調用sklearn中的SelectFromModel實(shí)現,依賴(lài)的算法模型也設置為隨機森林,特征選擇維度仍然是20個(gè):
%%timeX_sfm = SelectFromModel(RandomForestClassifier(), threshold=-1, max_features=20).fit_transform(X, y)X_sfm_train, X_sfm_test, y_train, y_test = train_test_split(X_sfm, y, random_state=3)
rf = RandomForestClassifier(max_depth=5, random_state=3)rf.fit(X_sfm_train, y_train)rf.score(X_sfm_test, y_test)
# 輸出結果CPU times: user 455 ms, sys: 0 ns, total: 455 msWall time: 453 ms0.9370629370629371
通過(guò)以上簡(jiǎn)單的對比實(shí)驗可以發(fā)現:相較于原始全量特征的方案,在僅保留20維特征的情況下,過(guò)濾法帶來(lái)了一定的算法性能損失,而包裹法和嵌入法則保持了相同的模型效果,但嵌入法的耗時(shí)明顯更短。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。