中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

機(jī)器學(xué)習(xí)小竅門:Python 幫你進(jìn)行特征選擇

2018-07-26    來(lái)源:raincent

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

特征選擇,也就是從數(shù)據(jù)集中找出并選擇最有用特征的過(guò)程,是機(jī)器學(xué)習(xí)工作流中一個(gè)非常重要的步驟。不必要的特征降低了訓(xùn)練速度,降低了模型的可解釋性,最重要的是降低了測(cè)試數(shù)據(jù)集的泛化能力。

在做機(jī)器學(xué)習(xí)問(wèn)題的過(guò)程中,我們總是在重復(fù)應(yīng)用一些特征選擇方法,這很令人沮喪。因此我用 Python 建了一個(gè)特征選擇類,代碼已上傳至 GitHub。這個(gè) FeatureSelector 包含一些通用的特征選擇方法:

• 缺失值比例高的特征
• 共線 (高相關(guān))特征
• 決策樹(shù)中的零貢獻(xiàn)度特征
• 低貢獻(xiàn)度特征
• 單值特征

本文將通過(guò)一個(gè)機(jī)器學(xué)習(xí)數(shù)據(jù)集例子來(lái)展示如何使用 FeatureSelector。可以看到該工具如何快速實(shí)現(xiàn)這些方法,讓機(jī)器學(xué)習(xí)工作流更高效。

完整的代碼可在 GitHub 上找到,歡迎各位任何形式的貢獻(xiàn)。特征選擇器在不斷改進(jìn),它將根據(jù)社區(qū)的需要不斷修正和完善!

樣例數(shù)據(jù)集

本文將使用 Kaggle 的 Home Credit Default Risk 機(jī)器學(xué)習(xí)競(jìng)賽里的樣本數(shù)據(jù)。(想?yún)⒓颖荣惖目梢钥催@篇文章)。 完整的數(shù)據(jù)集可以在此處下載, 本文將使用樣本做演示用。

 

 

樣本數(shù)據(jù)。TARGET 為分類標(biāo)簽

競(jìng)賽是一個(gè)監(jiān)督分類問(wèn)題。這是一個(gè)非常合適的數(shù)據(jù)集,因?yàn)樗泻芏嗳笔е怠⒋罅扛叨认嚓P(guān)(共線)的特征以及許多無(wú)助于機(jī)器學(xué)習(xí)建模的不相關(guān)特征。

 

 

建立實(shí)例

為了建立一個(gè) FeatureSelector 類的實(shí)例,我們需要輸入一個(gè)結(jié)構(gòu)化的數(shù)據(jù)集,其中行記錄觀測(cè)結(jié)果,列記錄特征。有些方法中我們可以只使用特征來(lái)學(xué)習(xí),但另外一些重要的方法也需要標(biāo)簽。由于這是一個(gè)監(jiān)督分類的任務(wù),我們會(huì)同時(shí)用到特征和標(biāo)簽。

(在 feature_selector.py 所在目錄中執(zhí)行以下代碼)

 

 

方法說(shuō)明

特征選擇供有 5 個(gè)方法來(lái)找到需要剔除的特征。我們可以訪問(wèn)任意標(biāo)識(shí)出的特征然后手工從數(shù)據(jù)集中剔除它們,或用特征選擇器里的 remove 方法。

本文將依次瀏覽這些定位特征的方法,并展示如何一次性執(zhí)行這些方法。此外 FeatureSelector 還有一些繪圖功能,因?yàn)樵跈C(jī)器學(xué)習(xí)中可視化數(shù)據(jù)是非常關(guān)鍵的。

缺失值

第一個(gè)找到需要被剔除的特征的方法非常直接:缺失值比率超過(guò)指定閾值。以下代碼可以定位出所有缺失值比例超過(guò) 60% 的特征(粗體為輸出內(nèi)容)。

 

 

我們可以從 dataframe 看到這些特征的缺失值比例:

 

 

 

 

可以訪問(wèn) FeatureSelector 里的 ops 屬性來(lái)看到這些被標(biāo)記移除的特征。它存儲(chǔ)為一個(gè) Python dict,其中每一項(xiàng)以 list 形式存儲(chǔ)特征名稱。

 

 

最后,用以下命令繪制一下所有特征缺失值比例的分布情況:

 

 

 

 

共線特征

共線特征也就是那些互相之間高度相關(guān)的特征。由于其較高的方差和較低的可解釋性,它們將導(dǎo)致測(cè)試集數(shù)據(jù)泛化能力變差。

identify_collinear 方法基于指定的相關(guān)系數(shù)值,找到那些共線特征。對(duì)于每對(duì)相關(guān)的特征,程序識(shí)別出其中一個(gè)特征,并剔除它(因?yàn)橹恍枰蕹渲幸粋(gè)):

 

 

可以用熱力圖簡(jiǎn)潔地可視化特征的相關(guān)性。圖中顯示了所有至少與一個(gè)特征的相關(guān)系數(shù)大于閾值的特征: fs.plot_collinear() 與之前方式類似,

 

 

 

 

在此之前,我們可通過(guò) ops 字典訪問(wèn)整個(gè)高相關(guān)度的(將被剔除的)特征列表, 也可用 dataframe 方式查看那些高度相關(guān)的特征對(duì)。

 

 

 

 

如果想直接了解整個(gè)數(shù)據(jù)集,我們也可以繪制數(shù)據(jù)集中所有特征的相關(guān)系數(shù)熱力圖。只要在方法中傳入 plot_all = True:

 

 

零重要度特征

前面兩種方法可以用于任何結(jié)構(gòu)的數(shù)據(jù)集。并且在給定閾值下,任何時(shí)候得到的結(jié)果都是一樣的。接下來(lái)一種方法適用于有監(jiān)督的機(jī)器學(xué)習(xí)。我們必須有用于訓(xùn)練的標(biāo)簽,結(jié)果也是不一定的。identify_zero_importance 函數(shù)根據(jù) GBM 學(xué)習(xí)模型找到零重要度特征。

通過(guò)基于樹(shù)的機(jī)器學(xué)習(xí)模型,比如 Boosting 集成方法,我們可以找到特征重要度。重要度的絕對(duì)值沒(méi)有相對(duì)值重要。通過(guò)相對(duì)值,我們可以決定與任務(wù)相關(guān)性最強(qiáng)的特征。我們也可以使用特征重要度,去除零重要度特征完成特征選擇。在基于樹(shù)的模型中我們并不使用零重要度特征來(lái)分割各點(diǎn),所以我們可以將它們?nèi)コ挥绊懩P托阅堋?/p>

FeatureSelector 使用 GBM 從 LightGBM library 中找到特征重要度。運(yùn)行 10 次以上 GBM 求平均得到特征重要性,從而減少方差。同時(shí),模型使用驗(yàn)證集的 early stopping(有關(guān)閉選項(xiàng)),避免訓(xùn)練數(shù)據(jù)的過(guò)擬合。

下面的代碼調(diào)用這種方法,輸出零重要度特征:

 

 

輸入?yún)?shù):

task: 任務(wù)是「分類」或是「回歸」

eval_metric:用于 early stopping 的矩陣 (如果禁用 early stopping,這項(xiàng)不是必須)

n_iterations:用于求特征重要性平均值的訓(xùn)練運(yùn)行次數(shù)

early_stopping:是否將 early stopping 用于模型訓(xùn)練

這時(shí)使用 plot_feature_importances 得到兩張曲線圖:

 

 

 

 

 

 

左邊的 plot_n 是最重要特征(畫出了重要性的歸一化項(xiàng),它們的和為 1)。右邊的是累計(jì)的重要性相對(duì)于特征的個(gè)數(shù),縱軸是累計(jì)重要度的 threshold。這個(gè)例子中是 99%。

對(duì)于基于重要度的方法,以下兩點(diǎn)需要記。

GBM 的訓(xùn)練具有隨機(jī)性,也就是說(shuō)每次運(yùn)行模型得到的特征重要度都是不同的

這不應(yīng)成為主要的問(wèn)題(最重要的特征不會(huì)突然變成最不重要的),但它會(huì)改變一些特征的排序。它也可能影響到識(shí)別出的零重要度特征數(shù)。你并不需要對(duì)特征重要度每次變化的問(wèn)題感到吃驚。

為了訓(xùn)練機(jī)器學(xué)習(xí)模型,首先將特征進(jìn)行獨(dú)熱編碼。這就意味著在建模時(shí)加入的獨(dú)熱編碼的特征可能是一些被識(shí)別為零重要度的特征

在特征去除階段有去除任何獨(dú)熱編碼特征的選項(xiàng),然而如果在特征選擇之后進(jìn)行機(jī)器學(xué)習(xí),我們必須對(duì)特征進(jìn)行獨(dú)熱編碼。

低重要度特征

接下來(lái)的方法建立在零重要度函數(shù)上,它使用模型的特征重要度來(lái)進(jìn)行之后的選擇。identify_low_importance 函數(shù)找到最低重要度的特征,這些特征對(duì)特定的總重要度沒(méi)有任何貢獻(xiàn)。

例如,下面的調(diào)用函數(shù)找到最低重要度的特征。它并不需要達(dá)到 99% 的總重要度:

 

 

基于總重要度及這些信息的曲線,GBM 將很多特征判斷為與學(xué)習(xí)無(wú)關(guān)。這種方法每次訓(xùn)練得到的結(jié)果并不相同。

在 dataframe 中查看特征重要度:

 

 

 

 

low_importance 方法來(lái)源于一種使用主成分分析(PCA)的方法。它通常只保留所需的主成分以將方差百分比保持在特定值上(比如 95%)。總重要度的百分比的計(jì)算也是基于這個(gè)想法。

這種基于特征重要度的方法只在使用基于樹(shù)的模型做預(yù)測(cè)時(shí)有用。除了具有隨機(jī)性之外,這種基于重要度的方法是一個(gè)黑盒子。我們并不知道模型為什么將某種特征判斷為無(wú)關(guān)。如果使用這些方法,將它們運(yùn)行幾次并觀察結(jié)果如何變化。創(chuàng)建多個(gè)不同參數(shù)的數(shù)據(jù)集進(jìn)行測(cè)試。

唯一值特征

最后一個(gè)是很基礎(chǔ)的一種方法:找到任何有單一值的列。一個(gè)只有唯一值的特征無(wú)法用于機(jī)器學(xué)習(xí),因?yàn)檫@個(gè)特征的方差為 0。比如,一個(gè)基于樹(shù)的模型無(wú)法在只有一個(gè)值的特征上進(jìn)行劃分 (因?yàn)椴荒軐⒂^察對(duì)象分組)。

與其他方法不同,這里沒(méi)有參數(shù)可以選擇:

 

 

我們可以畫出每個(gè)分類唯一值的柱狀圖:

 

 

 

 

需要記住的一點(diǎn)是默認(rèn)在 Pandas 中計(jì)算唯一值之前先去掉非數(shù)元素(NaNs)。

去除特征

一旦我們識(shí)別出需要去掉的特征,我們有兩個(gè)選項(xiàng)來(lái)去掉它們。所有需要去掉的特征都存儲(chǔ)在 FeatureSelector 的字典 ops 當(dāng)中。我們可以使用這個(gè)清單來(lái)手動(dòng)去掉這些特征,另一個(gè)選項(xiàng)是使用 remove 的內(nèi)建函數(shù)。

使用這種方法,我們使用 methods 來(lái)去掉特征。如果我們希望使用所有方法,我們只需要在函數(shù)中放入 methods = 'all'。

 

 

通過(guò)這種方法返回一個(gè)已經(jīng)去除了特征的 datafram,同時(shí)也去除了在機(jī)器學(xué)習(xí)過(guò)程中創(chuàng)建的獨(dú)熱編碼特征:

 

 

在進(jìn)一步操作之前,先檢查將要被去除的特征是一個(gè)好主意!原始的數(shù)據(jù)集被作為備份存儲(chǔ)在 FeatureSelector 的 data 特性中。

一次運(yùn)行所有方法

比起單獨(dú)運(yùn)行這些方法,我們可以使用 identify_all 來(lái)運(yùn)行所有的方法。它為每種方法建立了一個(gè)參數(shù)字典:

 

 

由于我們重新運(yùn)行了模型,你需要注意到總特征的個(gè)數(shù)將會(huì)變化,然后就可以調(diào)用 remove 函數(shù)來(lái)去除特征。

結(jié)論

在訓(xùn)練機(jī)器學(xué)習(xí)模型之前,F(xiàn)eature Selector 類會(huì)執(zhí)行一些常用操作來(lái)去除特征。它提供識(shí)別特征并去除的函數(shù),并將之可視化。為了提高工作效率,可以單獨(dú)或一次運(yùn)行所有方法。

missing,collinear和 single_unique 方法結(jié)果是確定的。而基于特征重要度的方法每次運(yùn)行的結(jié)果都會(huì)變化。特征選擇和機(jī)器學(xué)習(xí)很像,它們都需要大量經(jīng)驗(yàn),需要測(cè)試多種組合來(lái)找到最優(yōu)答案。最好是在過(guò)程中嘗試多種配置,特征選擇器提供一種方法快速評(píng)估特征選擇的參數(shù)。

和往常一樣,歡迎各位提出反饋和建設(shè)性的意見(jiàn)。我想強(qiáng)調(diào),我正在 FeatureSelector 尋求幫助。任何人都可以在 GitHub 上做出貢獻(xiàn)。對(duì)所有使用這個(gè)工具并提出的建議的人表示感謝!也可以通過(guò)推特 @koehrsen_will 和我聯(lián)系。

原文鏈接:https://towardsdatascience.com/a-feature-selection-tool-for-machine-learning-in-python-b64dd23710f0

標(biāo)簽: 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:《Nature》紀(jì)念人工智能60周年專題:深度學(xué)習(xí)綜述

下一篇:中國(guó)有意超越美國(guó),計(jì)劃到2030年成為主要的AI創(chuàng)新大國(guó)