當前位置:
首頁 > 知識 > 一個Python特徵選擇工具,助力實現高效機器學習

一個Python特徵選擇工具,助力實現高效機器學習

選自GitHub

機器之心編譯

參與:Panda

鑒於特徵選擇在機器學習過程中的重要性,數據科學家 William Koehrsen 近日在 GitHub 上公布了一個特徵選擇器 Python 類,幫助研究者更高效地完成特徵選擇。本文是 Koehrsen 寫的項目介紹及案例演示文章。

項目地址:https://github.com/WillKoehrsen/feature-selector

特徵選擇(feature selection)是查找和選擇數據集中最有用特徵的過程,是機器學習流程中的一大關鍵步驟。不必要的特徵會降低訓練速度、降低模型可解釋性,並且最重要的是還會降低其在測試集上的泛化表現。

目前存在一些專用型的特徵選擇方法,我常常要一遍又一遍地將它們應用於機器學習問題,這實在讓人心累。所以我用 Python 構建了一個特徵選擇類並開放在了 GitHub 上。這個 FeatureSelector 包含一些最常用的特徵選擇方法:

1.具有高缺失值百分比的特徵

2.共線性(高度相關的)特徵

3.在基於樹的模型中重要度為零的特徵

4.重要度較低的特徵

5.具有單個唯一值(unique value)的特徵

在本文中,我們將介紹在示例機器學習數據集上使用 FeatureSelector 的全過程。我們將看到如何快速實現這些方法,從而實現更高效的工作流程。

完整代碼已在 GitHub 上提供,歡迎任何人貢獻。這個特徵選擇器是一項正在進行的工作,將根據社區需求繼續改進!

示例數據集

為了進行演示,我們將使用來自 Kaggle「家庭信用違約風險」機器學習競賽的一個數據樣本。了解該競賽可參閱:https://towardsdatascience.com/machine-learning-kaggle-competition-part-one-getting-started-32fb9ff47426,完整數據集可在這裡下載:https://www.kaggle.com/c/home-credit-default-risk/data。這裡我們將使用部分數據樣本來進行演示。

數據示例。TARGET 是分類標籤

這個競賽是一個監督分類問題,這也是一個非常合適的數據集,因為其中有很多缺失值、大量高度關聯的(共線性)特徵,還有一些無助於機器學習模型的無關特徵。

創建實例

要創建一個 FeatureSelector 類的實例,我們需要傳入一個結構化數據集,其中觀察在行中,特徵在列中。我們可以使用一些僅操作特徵的方法,但基於重要度的方法也需要訓練標籤。因為這是一個監督分類任務,所以我們將使用一組特徵和一組標籤。

(請確保在 feature_selector.py 所在目錄下運行這段代碼)

方法

這個特徵選擇器有 5 種用於查找待移除特徵的方法。我們可以訪問任何已被識別出來的特徵並通過人工方式將它們移出數據,也可以使用 FeatureSelector 中的 remove 函數。

這裡我們將介紹其中每種識別方法,還將展示如何同時運行這 5 種方法。此外,FeatureSelector 還有幾個圖表繪製功能,因為可視化地檢查數據是機器學習的一大關鍵部分。

缺失值

查找和移除特徵的第一個方法很簡單:查找缺失值比例超過特定閾值的特徵。下面的調用能識別缺失值比例超過 60% 的特徵(粗體是輸出結果)。

我們可以在一個 dataframe 中查看每一列的缺失值比例:

要查看待移除特徵,我們可以讀取 FeatureSelector 的 ops 屬性,這是一個 Python 特徵詞典,特徵會以列表的形式給出。

最後,我們可以繪製一張所有特徵的缺失值分布圖:

共線性特徵

共線性特徵是指彼此之間高度關聯的特徵。在機器學習領域,高方差和較低的模型可解釋性導致在測試集上的泛化能力下降。

identify_collinear 方法能基於指定的相關係數值查找共線性特徵。對於每一對相關的特徵,它都會標識出其中要移除的一個(因為我們只需要移除其中一個):

使用熱圖可以很好地可視化共線性。下圖展示了所有至少有一個相關關係(correlation)超過閾值的特徵:

和之前一樣,我們可以訪問將會被移除的整個相關特徵列表,或者在一個 dataframe 中查看高度相關的特徵對。

如果我們想全面了解數據集,我們還可以通過將 plot_all = True 傳入該調用,繪製出數據中所有相關性的圖表:

零重要度特徵

前面兩種方法可被應用於任何結構化的數據集並且結果是確定的——對於一個給定的閾值,每次結果都一樣。接下來的方法是專為監督式機器學習問題設計的,其中我們有訓練模型的標籤並且是非確定性的。identify_zero_importance 函數能根據梯度提升機(GBM)學習模型查找重要度為零的特徵。

我們可以使用基於樹的機器學習模型(比如 boosting ensemble)求取特徵重要度。這個重要度的絕對值沒有相對值重要,我們可以將相對值用於確定對一個任務而言最相關的特徵。我們還可以通過移除零重要度特徵來在特徵選擇中使用特徵重要度。在基於樹的模型中,零重要度的特徵不會被用於分割任何節點,所以我們可以移除它們而不影響模型表現。

FeatureSelector 能使用來自 LightGBM 庫的梯度提升機來得到特徵重要度。為了降低方差,所得到的特徵重要度是在 GBM 的 10 輪訓練上的平均。另外,該模型還使用早停(early stopping)進行訓練(也可關閉該選項),以防止在訓練數據上過擬合。

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

我們傳入的參數解釋如下:

task:根據我們的問題,要麼是「classification」,要麼是「regression」

eval_metric:用於早停的度量(如果早停禁用了,就不必使用)

n_iterations:訓練輪數,最後結果取多輪的平均

early_stopping:是否為訓練模型使用早停

這時候我們可以使用 plot_feature_importances 繪製兩個圖表:

左圖給出了 plot_n 最重要的特徵(重要度進行了歸一化,總和為 1)。右圖是對應特徵數量的累積重要度。藍色豎線標出了累積重要度為 99% 的閾值。

對於基於重要度的方法,有兩點需要記住:

訓練梯度提升機是隨機的,這意味著模型每次運行後,特徵重要度都會改變。

這應該不會有太大的影響(最重要的特徵不會突然就變成最不重要的),但這會改變某些特徵的排序,也會影響識別出的零重要度特徵的數量。如果特徵重要度每次都改變,請不要感到驚訝!

要訓練機器學習模型,特徵首先要經過 one-hot 編碼。這意味著某些被識別為零重要度的特徵可能是在建模過程中加入的 one-hot 編碼特徵。

當我們到達特徵移除階段時,還有一個選項可移除任何被添加進來的 one-hot 編碼的特徵。但是,如果我們要在特徵選擇之後做機器學習,我們還是必須要 one-hot 編碼這些特徵。

低重要度特徵

接下來的方法基於零重要度函數,使用來自模型的特徵重要度來進一步選擇。identify_low_importance 函數能找到重要度最低的特徵,這些特徵無助於指定的總重要性。

比如,下面的調用能找到最不重要的特徵,即使沒有這些特徵也能達到 99% 的重要度。

根據前面的累積重要度圖和這一信息,梯度提升機認為很多特徵都與學習無關。重申一下,每次訓練運行後該方法的結果都不一樣。

我們也可以在一個 dataframe 中查看所有特徵重要度:

low_importance 方法借鑒了主成分分析(PCA)中的一種方法,其中僅保留維持一定方差比例(比如 95%)所需的主成分是很常見的做法。要納入考慮的總重要度百分比基於同一思想。

只有當我們要用基於樹的模型來做預測時,基於特徵重要度的方法才真正有用。除了結果隨機之外,基於重要度的方法還是一種黑箱方法,也就是說我們並不真正清楚模型認為某些特徵無關的原因。如果使用這些方法,多次運行它們看到結果的改變情況,也許可以創建具有不同參數的多個數據集來進行測試!

單個唯一值特徵

最後一個方法相當基礎:找出任何有單個唯一值的列。僅有單個唯一值的特徵不能用於機器學習,因為這個特徵的方差為 0。舉個例子,如果一個特徵僅有一個值,那麼基於樹的模型就永遠不能進行區分(因為沒有可做區分的依據)。

不同於其它方法,這個方法沒有可選參數:

我們可以繪製每個類別唯一值數量的直方圖:

還有一點要記住,在計算唯一值之前,NaNs 已經使用 Pandas 默認移除了。

移除特徵

在確定了待移除特徵之後,我們有兩種移除它們的選擇。所有要移除的特徵都存儲在 FeatureSelector 的 ops 詞典中,我們可以使用這個列表來手動移除它們,當然也可使用內置的 remove 函數。

對於這一方法,我們需傳入要用於移除特徵的 methods。如果我們想使用所實現的所有方法,我們只需使用 methods = "all"

這個方法會返回一個包含被移除特徵的 dataframe。另外,要移除在機器學習過程中創建的 one-hot 編碼的特徵:

在執行操作之前檢查將被移除的特徵可能是個好想法!原來的數據集會被存儲在 FeatureSelector 的 data 屬性中用作備份!

一次運行所有方法

注意,多次運行該模型的總特徵數量可能也各不相同。之後就可以調用 remove 函數來移除這些特徵了。

總結

這個特徵選擇器類實現了訓練機器學習模型之前幾種用於移除特徵的常見操作。其提供了可用於識別待移除特徵的函數以及可視化函數。這些方法可以單獨使用,也可以一次全部應用以實現高效的工作流程。

其中 missing、collinear 和 single_unique 方法是確定性的,而基於特徵重要度的方法會隨每次運行而變化。與機器學習領域很相似,特徵選擇很大程度上是實證式的,需要測試多種組合才能找到最優解。最好的做法是在流程中嘗試多種配置,並且 FeatureSelector 提供了一種用於快速評估特徵選擇參數的方法。

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

權威舉辦|「人工智慧與智能控制」學科前沿講習班
強化學習+樹搜索:一種新型程序合成方法

TAG:機器之心 |