0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數(shù)據科學高效工具:feature-selector,幫你快速完成特征選擇

lviY_AI_shequ ? 來源:lq ? 2018-12-13 09:56 ? 次閱讀

▍前言

本篇主要介紹一個基礎的特征選擇工具feature-selector,feature-selector是由Feature Labs的一名數(shù)據科學家williamkoehrsen寫的特征選擇庫。feature-selector主要對以下類型的特征進行選擇:

具有高missing-values百分比的特征

具有高相關性的特征

對模型預測結果無貢獻的特征(即zero importance)

對模型預測結果只有很小貢獻的特征(即low importance)

具有單個值的特征(即數(shù)據集中該特征取值的集合只有一個元素)

從上面可以看出feature-selector確實是非?;A的特征選擇工具,正因為非常的基礎,所以才非常的常用(這也是為什么williamkoehrsen要寫這個特征選擇庫的原因),在拿到一個數(shù)據集的時候,往往都需要將上述類型的特征從數(shù)據集中剔除掉。針對上面五種類型的特征,feature-selector分別提供以下五個函數(shù)來對此處理:

identify_missing(*)

identify_collinear(*)

identify_zero_importance(*)

identify_low_importance(*)

identify_single_unique(*)

▍數(shù)據集選擇

在這里使用kaggle上的訓練數(shù)據集。原訓練數(shù)據集稍微有點大,30+萬行(150+MB),pandas導入數(shù)據都花了一點時間,為此我從原數(shù)據集中采樣了1萬+行數(shù)據作為此次練習的數(shù)據集。數(shù)據集采樣代碼如下:

https://www.kaggle.com/c/home-credit-default-risk/data

importpandasaspddata=pd.read_csv('./appliation_train.csv')#從原數(shù)據中采樣5%的數(shù)據sample=data.sample(frac=0.05)#重新創(chuàng)建索引sample.reset_index(drop=True)#將采樣數(shù)據存到'application_train_sample.csv'文件中sample.to_csv('./application_train_sample.csv')

▍f(xié)eature-selector用法

導入數(shù)據并創(chuàng)建feaure-selector實例

importpandasaspd#注意:#作者并沒有把feature-selector發(fā)布到pypi上,所以不能使用pip和conda進行安裝,只能手動#從github下載下來,然后把feature_selector.py文件放到當前工作目錄,然后再進行import操作。fromfeature_selectorimportFeatureSelectordata=pd.read_csv('./application_train_sample.csv',index_col=0)#數(shù)據集中TARGET字段為對應樣本的labeltrain_labels=data.TARGET#獲取allfeaturestrain_features=data.drop(columns='TARGET')#創(chuàng)建feature-selector實例,并傳入features和labelsfs=FeatureSelector(data=train_features,lables=train_labels)1

特征選取方法

(1)identify_missing

該方法用于選擇missing value 百分比大于指定值(通過missing_threshold指定百分比)的feature。該方法能應用于監(jiān)督學習和非監(jiān)督學習的特征選擇。

#選擇出missingvalue百分比大于60%的特征fs.identify_missing(missing_threshold=0.6)#查看選擇出的特征fs.ops['missing']#繪制所有特征missingvalue百分比的直方圖fs.plot_missing()

圖1. 所有特征missing value百分比的直方圖

該方法內部使用pandas 統(tǒng)計數(shù)據集中所有feature的missing value 的百分比,然后選擇出百分比大于閾值的特征,詳見feature-selector.py的114-136行。

https://github.com/WillKoehrsen/feature-selector/blob/master/feature_selector/feature_selector.py#L114-L136

(2) identify_collinear

該方法用于選擇相關性大于指定值(通過correlation_threshold指定值)的feature。該方法同樣適用于監(jiān)督學習和非監(jiān)督學習。

#不對feature進行one-hotencoding(默認為False),然后選擇出相關性大于98%的feature,fs.identify_collinear(correlation_threshold=0.98,one_hot=False)#查看選擇的featurefs.ops['collinear']#繪制選擇的特征的相關性heatmapfs.plot_collinear()#繪制所有特征的相關性heatmap

圖2. 選擇的特征的相關矩陣圖

圖3. 所有特征相關矩陣圖

該方法內部主要執(zhí)行步驟如下:

1.根據參數(shù)'one_hot'對數(shù)據集特征進行one-hot encoding(調用pd.get_dummies方法)。如果'one_hot=True'則對特征將進行one-hot encoding,并將編碼的特征與原數(shù)據集整合起來組成新的數(shù)據集,如果'one_hot=False'則什么不做,進入下一步;

2.計算步驟1得出數(shù)據集的相關矩陣C(通過DataFrame.corr(),注意 C也為一個DateFrame),并取相關矩陣的上三角部分得到 C_upper;

3.遍歷C_upper的每一列(即每一個特征),如果該列的任何一個相關值大于correlation_threshold,則取出該列,并放到一個列表中(該列表中的feature,即具有high 相關性的特征,之后會從數(shù)據集去除);

4.到這一步,做什么呢?回到源碼看一波就知道了;

具體請見feature-selector.py的157-227行。

(3) identify_zero_importance

該方法用于選擇對模型預測結果毫無貢獻的feature(即zero importance,從數(shù)據集中去除或者保留該feature對模型的結果不會有任何影響)。

該方法以及之后的identify_low_importance都只適用于監(jiān)督學習(即需要label,這也是為什么實例化feature-selector時需要傳入labels參數(shù)的原因)。feature-selector通過用數(shù)據集訓練一個梯度提升機(Gradient Boosting machine, GBM),然后由GBM得到每一個feature的重要性分數(shù),對所有特征的重要性分數(shù)進行歸一化處理,選擇出重要性分數(shù)等于零的feature。

為了使計算得到的feature重要性分數(shù)具有很小的方差,identify_zero_importance內部會對GBM訓練多次,取多次訓練的平均值,得到最終的feature重要性分數(shù)。同時為了防止過擬合,identify_zero_importance內部從數(shù)據集中抽取一部分作為驗證集,在訓練GBM的時候,計算GBM在驗證集上的某一metric,當metric滿足一定條件時,停止GBM的訓練。

#選擇zeroimportance的feature,##參數(shù)說明:#task:'classification'/'regression',如果數(shù)據的模型是分類模型選擇'classificaiton',#否則選擇'regression'#eval_metric:判斷提前停止的metric.forexample,'auc'forclassification,and'l2'forregressionproblem#n_iteration:訓練的次數(shù)#early_stopping:True/False,是否需要提前停止fs.identify_zero_importance(task='classification',eval_metric='auc',n_iteration=10,early_stopping=True)#查看選擇出的zeroimportancefeaturefs.ops['zero_importance']#繪制featureimportance關系圖#參數(shù)說明:#plot_n:指定繪制前plot_n個最重要的feature的歸一化importance條形圖,如圖4所示#threshold:指定importance分數(shù)累積和的閾值,用于指定圖4中的藍色虛線.#藍色虛線指定了importance累積和達到threshold時,所需要的feature個數(shù)。#注意:在計算importance累積和之前,對feature列表安裝featureimportance的大小#進行了降序排序fs.plot_feature_importances(threshold=0.99,plot_n=12)

圖4. 前12個最重要的feature歸一化后的importance分數(shù)的條形圖

圖5. feature 個數(shù)與feature importance累積和的關系圖

需要注意GBM訓練過程是隨機的,所以每次運行identify_zero_importance得到feature importance分數(shù)都會發(fā)生變化,但按照importance排序之后,至少前幾個最重要的feature順序不會變化。

該方法內部主要執(zhí)行了以下步驟:

1.對各個feature進行one-hot encoding,然后將one-hot encoding的feature和原數(shù)據集合并成新的數(shù)據集(使用pd.get_dummies完成);

2.根據參數(shù) task 的取值,實例化lightgbm.LGBMClassifier, 或者實例化 lightgbm.LGBMRegressor model;

3.根據early_stopping的取值選擇是否需要提前停止訓練,并向model.fit傳入相應的參數(shù),然后開始訓練model;

4.根據model得到該次訓練的feature importance;

5.執(zhí)行n_iterations次步驟1-4;

6.取多次訓練的feature importance的平均值,得到最終的feature importance;

7.選擇出feature importance等于0的feature;

8.到這一步,主要步驟完成了,其他部分請查看源碼。

具體請見feature-selector.py的229-342行。

(4) identify_low_importance

該方法是使用identify_zero_importance計算的結果,選擇出對importance累積和達到指定閾值沒有貢獻的feature(這樣說有點拗口),即圖5中藍色虛線之后的feature。該方法只適用于監(jiān)督學習。identify_low_importance有點類似于PCA中留下主要分量去除不重要的分量。

#選擇出對importance累積和達到99%沒有貢獻的featurefs.identify_low_importance(cumulative_importance=0.99)#查看選擇出的featurefs.ops['low_importance']

該方法選擇出的feature其實包含了zero importance的feature。內部實現(xiàn)沒什么可說的,具體請見feature-selector.py的344-378行。

(5) identify_single_unique

該方法用于選擇只有單個取值的feature,單個值的feature的方差為0,對于模型的訓練不會有任何作用(從信息熵的角度看,該feature的熵為0)。該方法可應用于監(jiān)督學習和非監(jiān)督學習。

#選擇出只有單個值的featurefs.identify_single_unique()#查看選擇出的featurefs.ops['single_unique']#繪制所有featureuniquevalue的直方圖fs.plot_unique()

圖6. 所有feature unique value的直方圖

該方法內部的內部實現(xiàn)很簡單,只是通過DataFrame.nunique方法統(tǒng)計了每個feature取值的個數(shù),然后選擇出nunique==1等于1的feature。具體請見feature-selector.py的138-155行。

從數(shù)據集去除選擇的特征

上面介紹了feature-selector提供的特征選擇方法,這些方法從數(shù)據集中識別了feature,但并沒有從數(shù)據集中將這些feature去除。feature-selector中提供了remove方法將選擇的特征從數(shù)據集中去除,并返回去除特征之后的數(shù)據集。

#去除所有類型的特征#參數(shù)說明:#methods:#desc:需要去除哪些類型的特征#type:string/list-likeobject#values:'all'或者是['missing','single_unique','collinear','zero_importance','low_importance']#中多個方法名的組合#keep_one_hot:#desc:是否需要保留one-hotencoding的特征#type:boolean#values:True/False#default:Truetrain_removed=fs.remove(methods='all',keep_one_hot=False)

注意:調用remove函數(shù)的時候,必須先調用特征選擇函數(shù),即identify_*函數(shù)。

該方法的實現(xiàn)代碼在feature-selector.py的430-510行。

一次性選擇所有類型的特征

feature-selector除了能每次運行一個identify_*函數(shù)來選擇一種類型特征外,還可以使用identify_all函數(shù)一次性選擇5種類型的特征選。

#注意:#少了下面任何一個參數(shù)都會報錯,raiseValueErrorfs.identify_all(selection_params= {'missing_threshold':0.6,'correlation_threshold':0.98,'task':'classification','eval_metric':'auc','cumulative_importance':0.99})

▍總結

feature-selector屬于非?;A的特征選擇工具,它提供了五種特征的選擇函數(shù),每個函數(shù)負責選擇一種類型的特征。一般情況下,在對某一數(shù)據集構建模型之前,都需要考慮從數(shù)據集中去除這五種類型的特征,所以feature-selector幫你省去data-science生活中一部分重復性的代碼工作。

如果有興趣和充足的時間,建議閱讀一下feature-selector的代碼,代碼量很少,七百多行,相信看了之后對feature-selector各個函數(shù)的實現(xiàn)思路以及相應代碼實現(xiàn)有一定認識,有心者還可以貢獻一下自己的代碼。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關注

    關注

    3

    文章

    4237

    瀏覽量

    61967
  • 數(shù)據集
    +關注

    關注

    4

    文章

    1197

    瀏覽量

    24538

原文標題:一款非常棒的特征選擇工具:feature-selector

文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用NineData快速完成MySQL數(shù)據的差異對比!

    NineData 是一款功能強大的數(shù)據庫對比工具,能夠幫助企業(yè)追蹤數(shù)據庫的變化、發(fā)現(xiàn)問題并快速修復。相比其他工具,NineData 具有以下
    的頭像 發(fā)表于 08-08 15:07 ?843次閱讀
    使用NineData<b class='flag-5'>快速</b><b class='flag-5'>完成</b>MySQL<b class='flag-5'>數(shù)據</b>的差異對比!

    Package dimensions selector gu

    Package dimensions selector guide
    發(fā)表于 03-28 14:49 ?0次下載
    Package dimensions <b class='flag-5'>selector</b> gu

    機器學習特征選擇常用算法

    特征選擇 ( Feature Selection )也稱特征子集選擇( Feature Subs
    發(fā)表于 11-16 01:28 ?8435次閱讀
    機器學習<b class='flag-5'>特征</b><b class='flag-5'>選擇</b>常用算法

    機器視覺的Gabor Feature特征表達

    在機器視覺中,gabor feature是一種比較常見的特征,因為其可以很好地模擬人類的視覺沖擊響應而被廣泛應用于圖像處理, gabor feature 一般是通過對圖像與gabor filter做卷積而得到,gabor fil
    發(fā)表于 11-17 07:02 ?4578次閱讀
    機器視覺的Gabor <b class='flag-5'>Feature</b><b class='flag-5'>特征</b>表達

    一種面向高維微陣列數(shù)據的集成特征選擇算法

    特征選擇算法是微陣列數(shù)據分析的重要工具,特征選擇算法的分類性能和穩(wěn)定性對微陣列
    發(fā)表于 11-28 16:25 ?0次下載
    一種面向高維微陣列<b class='flag-5'>數(shù)據</b>的集成<b class='flag-5'>特征</b><b class='flag-5'>選擇</b>算法

    十大機器學習工具數(shù)據科學工具

    2018年將會是人工智能和機器學習快速發(fā)展的一年,有專家表示:相較之下Python比Java更加接地氣,也自然而然地成為機器學習的首選語言。在數(shù)據科學方面,Python的語法與數(shù)學語法最為接近
    發(fā)表于 05-29 13:57 ?3783次閱讀

    2018年數(shù)據科學和機器學習工具調查

    近日,數(shù)據科學網站KDnuggets發(fā)布 2018年數(shù)據科學和機器學習工具調查結果。
    的頭像 發(fā)表于 06-07 17:05 ?4170次閱讀
    2018年<b class='flag-5'>數(shù)據</b><b class='flag-5'>科學</b>和機器學習<b class='flag-5'>工具</b>調查

    數(shù)據科學工具數(shù)不勝數(shù)——你應該選擇哪一個?

    我們得承認——數(shù)據科學的范圍龐雜,每一個領域要求處理數(shù)據的方式各有不同,這讓許多分析家/數(shù)據科學家陷入困惑。而如果你是一位商業(yè)領袖,你將要
    的頭像 發(fā)表于 08-27 15:55 ?1629次閱讀

    2020年常見的20種數(shù)據科學工具,你了解多少

    執(zhí)行數(shù)據科學任務的最佳工具有哪些?作為數(shù)據科學新手,你應該選擇哪些
    的頭像 發(fā)表于 08-27 15:56 ?3931次閱讀

    機器學習之特征提取 VS 特征選擇

    機器學習中特征選擇特征提取區(qū)別 demi 在 周四, 06/11/2020 - 16:08 提交 1. 特征提取 V.S 特征
    的頭像 發(fā)表于 09-14 16:23 ?3988次閱讀
    機器學習之<b class='flag-5'>特征</b>提取 VS <b class='flag-5'>特征</b><b class='flag-5'>選擇</b>

    特征選擇-嵌入式選擇

    嵌入式特征選擇是將特征選擇過程與學習器訓練過程融為一體,兩者在同一個優(yōu)化過程中完成,即在學習器訓練過程中自動地進行了
    發(fā)表于 10-21 10:36 ?1次下載
    <b class='flag-5'>特征</b><b class='flag-5'>選擇</b>-嵌入式<b class='flag-5'>選擇</b>

    aof-selector aof文件分析工具

    aof-selector.zip
    發(fā)表于 04-27 09:55 ?3次下載
    aof-<b class='flag-5'>selector</b> aof文件分析<b class='flag-5'>工具</b>

    合泰半導體全新發(fā)布MCU Selector App選型工具

    近日,合泰半導體全新MCU Selector App選型工具已正式亮相,為廣大的客戶提供一個更為便捷且容易操作的選型輔助。通過MCU Selector App選型工具,可針對Holte
    的頭像 發(fā)表于 08-17 14:56 ?1178次閱讀
    合泰半導體全新發(fā)布MCU <b class='flag-5'>Selector</b> App選型<b class='flag-5'>工具</b>

    使用NineData快速高效完成Redis差異數(shù)據對比!

    NineData在Redis數(shù)據遷移場景下表現(xiàn)出色,可快速準確完成Redis數(shù)據對比,找出不一致的key并生成詳細報告。數(shù)據對比方案需考慮
    的頭像 發(fā)表于 10-07 11:57 ?379次閱讀
    使用NineData<b class='flag-5'>快速</b>、<b class='flag-5'>高效</b><b class='flag-5'>完成</b>Redis差異<b class='flag-5'>數(shù)據</b>對比!

    合泰半導體全新發(fā)布MCU Selector Web選型工具

    為滿足不同用戶需求,合泰半導體繼推出MCU Selector App選型工具后,近日再推出MCU Selector Web選型工具,為廣大客戶提供更為全面且容易操作的選型輔助。
    的頭像 發(fā)表于 12-08 14:49 ?510次閱讀