Python中機器學習的特徵選擇工具

摘要: 還在爲特徵選擇抓狂?這個工具瞭解一下!

clipboard.png

特徵選擇,即在數據集中查找和選擇最有用的特徵的過程,是機器學習的關鍵步驟。沒必要要的特徵會下降訓練速度、模型的可解釋性,最重要的是會下降測試集的泛化性能。算法

我對臨時的特徵選擇方法感到很失望,可是在解決機器學習問題時又反覆用到了這些方法,因此就建立了一個關於特徵選擇的Python類,該類能夠在GitHub上找到。FeatureSelector類包括一些最多見的特徵選擇方法:機器學習

1.高百分比的缺失值特徵選擇法ide

2.共線(高度相關)特徵選擇法函數

3.樹型結構模型中的零重要性特徵選擇法工具

4.低重要性特徵選擇法性能

5.惟一值特徵選擇法學習

在本文中,我將對機器學習數據集的示例使用FeatureSelector類。也會介紹該類是如何讓咱們快速地實現特徵選擇方法。測試

完整的代碼能夠在GitHub上找到,特徵選擇器仍是一個半成品,會根據社區的需求繼續改進!編碼

示例數據集

示例中使用的是Kaggle上家庭信用違約風險機器學習競賽的數據樣本。整個數據集能夠下載,演示樣本以下:spa

clipboard.png

該數據樣原本自一個有監督分類問題,也是一個很好的數據集。由於它有許多缺失值、高度相關(共線)的特徵以及對機器學習模型無用的不相關特徵。

建立一個實例

建立FeatureSelector類的實例需傳入結構化的數據集,該數據集行爲觀察值、列爲特徵。該類內有一些只需傳入特徵的方法,可是這些基於特徵重要性的方法需傳入訓練標籤。因此當用這些方法解決一個有監督分類問題時,需傳入一組特徵和一組標籤。

clipboard.png

方法

特徵選擇器有5種查找要刪除特徵的方法,找到被標識的特徵並手動地將它們從數據中刪除,或者使用特徵選擇器中的remove函數。

下面將詳細介紹每一種方法,並展現5種方法是如何同時運行的。FeatureSelector類內還有一些具備繪圖功能的方法,由於檢驗直觀的圖像數據也是機器學習的一個重要組成部分。

缺失值

缺失值特徵選擇法比較簡單:所查找的特徵是超過指定閾值的缺失值。下面的調用所標識的特徵都是超過60%的缺失值(粗體爲輸出)。

clipboard.png

按列顯示缺失值的dataframe:

clipboard.png

clipboard.png

經過FeatureSelector類的ops屬性能夠查看要刪除特徵。具體過程以下面所列的Python 命令所示:

clipboard.png

下面是缺失值佔特徵比例的分佈圖:

clipboard.png

clipboard.png

共線特徵

共線特徵是高度相關的特徵。在機器學習中,因爲共線特徵的高方差和低模型可解釋性,會致使測試集的泛化性能降低。

identify_collinear方法根據指定的相關係數值查找共線特徵,將相關特徵對中的一個標識爲要刪除特徵(由於只須要刪除一個):

clipboard.png

下面是基於相關性的熱度圖,該圖顯示了相關性超過閾值的全部特徵:

clipboard.png

clipboard.png

相似的,也能夠列出要刪除的共線特徵,或者查看共線特徵的dataframe。

clipboard.png

clipboard.png

若是想深刻研究數據集,還能夠傳入plot_all = True給調用,繪製全部數據相關性的圖表:

clipboard.png

零重要性特徵

前兩種方法能夠應用於任何結構化的數據集,且具備肯定性——對於給定的閾值,每次結果都是相同的。可是零重要性特徵選擇法只針對有監督的機器學習問題(有訓練模型的標籤),且具備不肯定性。identify_zero_important函數根據梯度提高機(GBM)學習模型來查找零重要性特徵。

經過基於樹型結構的機器學習模型,例如boosting集成算法,能夠發現特徵的重要性。重要性的相對值能夠肯定任務的最相關特徵,絕對值就沒有那麼重要了,可是能夠經過刪除零重要性特徵能夠進行特徵選擇。零重要性特徵不能做爲樹型模型中的節點,所以能夠在不影響模型性能的狀況下刪除它們。

FeatureSelector經過LightGBM庫的梯度提高機來查找特徵重要性。爲了減小差別,對特徵重要性進行平均超過10次的GBM訓練。此外,經過使用驗證集(可關閉)進行早期中止來訓練模型,以防止對訓練數據的過分擬合。

下面的代碼調用了該方法並提取了零重要性特徵:

clipboard.png

傳入的參數以下:

task:根據問題對應選擇「classification」或「regression」

eval_metric:衡量早期中止(若禁用了早期中止,則沒有必要)

n_iteration:訓練次數

early_stopping:是否使用早期中止來訓練模型

下面兩個圖由plot_feature_importances函數得出:

clipboard.png

clipboard.png

clipboard.png

左邊是關於plot_n最重要特徵的圖(根據歸一化的重要性所繪製,總和爲1)。右邊是累積重要性與特徵數量的關係圖。垂線畫在累積重要性達到的閾值處,本例中閾值爲99%。

基於重要性的方法須要記住兩個要點:

(1)訓練梯度提高機是隨機的,每一次模型運行,特徵重要性都將會改變。

這不會產生重大的影響(最重要的特徵不會忽然變成最少),可是它會改變某些特徵的順序,還會影響被標識的零重要性特徵的數量。若是特徵重要性每次都發生變化,不要感到驚訝!

(2)爲了對機器學習模型進行訓練,首先須要對特徵進行獨熱編碼。因此一些被標識爲零重要性的特徵多是在建模過程當中添加的獨熱編碼特徵。

在刪除特徵時能夠刪除任何添加的獨熱編碼特徵。可是,若是在特徵選擇以後要進行機器學習,則不能刪除!

低重要性特徵

這種方法構創建在零重要性函數的基礎上,再利用模型中的特徵重要性進行進一步的選擇。由函數identify_low_importance可知,低重要性特徵並不影響某些指定的總重要性。

例如,下面的調用顯示:在實現99%的總重要性時,最低重要性特徵並非必需的。

clipboard.png

由上面累積重要性的圖,以及低重要性不影響某些指定的總重要性這一信息可知,梯度提高機中有許多與學習無關的特徵。一樣,低重要性特徵選擇法的結果在每次訓練中都會發生變化。

查看全部的特徵重要性:

clipboard.png

clipboard.png

low_importance方法借鑑了使用主成分分析(PCA)的方法,只要求主成分所佔的比例要維持在必定的百分比(例如95%)。總重要性所佔比例也要維持在必定的百分比。

基於特徵重要性的方法最適合用來對樹型結構模型進行預測。基於重要性的方法是隨機的,也是一種黑盒方法,由於模型斷定特徵是否相關並不透明的。因此在使用基於特徵重要性的方法時,應屢次運行以查看結果如何變化,並儘量建立多個具備不一樣參數的數據集以進行測試!

惟一值特徵

最惟一值特徵選擇法是至關基本的:查找有惟一值的列。只有一個惟一值的特徵對於機器學習來講是無用的,由於這個特徵的方差爲零。例如,只有一個值的特徵不能做爲樹型結構模型的節點(由於該特徵不能再分組了)。

繪製各個區間惟一值數量的直方圖:

clipboard.png

clipboard.png

須要記住的一點是:默認在計算Pandas 中惟一值以前,NaNs會被刪除。

刪除特徵

肯定了要刪除特徵後,有兩個選擇能夠刪除它們。全部要刪除的特徵都存儲在FeatureSelector的ops屬性中,能夠根據出現的列表手動刪除特徵。另外一種選擇是使用remove內置函數。

使用remove函數刪除特徵時需傳入methods。若是想要使用全部的實現方法,只需傳入methods = 'all'。

clipboard.png

該方法刪除特徵後返回一個dataframe,在機器學習過程當中建立的one-hot編碼特徵也被刪除:

clipboard.png

在開始操做以前先檢查要刪除的特徵!原始數據集存儲在FeatureSelector的data屬性中做爲備份!

結論

在訓練機器學習模型以前,特徵選擇器類實現了一些常見的刪除特徵的操做。它具備選擇要刪除特徵和繪圖的功能。類內方法能夠單獨運行,也能夠爲實現高效的工做流而同時運行。

Missing方法, collinear方法和single_unique方法都是具備肯定性的,而基於特徵重要性的方法會隨着每次運行而改變。像機器學習同樣,特徵選擇很大程度上是經驗主義。測試多組數據才能獲得最佳結果,因此最好多嘗試幾回。特徵選擇器提供了一種快速評估特徵選擇參數的方法。

本文做者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索