06.28 如何進行特徵選擇,避開那些機器學習的“坑”!

點擊上方關注,All in AI中國

使用特徵選擇實現高效的機器學習工作流程

如何進行特徵選擇,避開那些機器學習的“坑”!

特徵選擇是查找和選擇數據集中最有用特徵的過程,是機器學習管道的關鍵步驟。不必要的功能降低了訓練速度,降低了模型的可解釋性,並且最重要的是降低了測試集的泛化性能。

受特殊功能選擇方法的困擾,我發現自己在機器學習問題上反覆應用這些方法,我在GitHub(https://github.com/WillKoehrsen/feature-selector)上為Python中的特徵選擇構建了一個類。包含一些最常見的特徵選擇方法:

  1. 缺少值的百分比高的特徵
  2. 共線(高度相關)特徵
  3. 在基於樹的模型中不重要性的特徵
  4. 低重要性的特徵
  5. 具有單一獨特價值的功能

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

示例數據集

在這個例子中,我們將使用Kaggle的Home Credit Default Risk機器學習競賽中的一個數據樣本。 (要開始比賽,請參閱此文章(https://medium.com/m/global-identity?redirectUrl=https://towardsdatascience.com/machine-learning-kaggle-competition-part-one-getting-started-32fb9ff47426))。整個數據集可供下載,在這裡我們將使用一個樣本進行說明。

如何進行特徵選擇,避開那些機器學習的“坑”!

競爭是一個監督分類問題,這是一個很好的數據集,因為它有許多缺失值,眾多高度相關的(共線)特徵,以及一些無助於機器學習模型的不相關特徵。

創建一個實例

要創建FeatureSelector類的實例,我們需要傳入一個結構化數據集,其中包含列中行和特徵的觀察值。我們可以僅使用一些功能的方法,但基於重要性的方法也需要訓練標籤。由於我們有監督分類任務,因此我們將使用一組功能和一組標籤。

方法

它有五種方法來查找要移除的功能。我們可以訪問任何已識別的功能並手動從數據中刪除它們,或使用功能選擇器中的刪除功能。

在這裡,我們將通過每種識別方法,展示如何全部運行5次。 FeatureSelector還具有多種繪圖功能,因為視覺檢查數據是機器學習的關鍵組件。

缺少值

查找刪除要素的第一種方法很簡單:找到缺少高於指定閾值的部分缺失值的要素。以下調用識別缺失值超過60%的特徵(輸出為粗體)。

如何進行特徵選擇,避開那些機器學習的“坑”!

我們可以在數據框的每一列中看到缺失值的一小部分:

如何進行特徵選擇,避開那些機器學習的“坑”!

如何進行特徵選擇,避開那些機器學習的“坑”!

要查看確定要刪除的功能,我們訪問FeatureSelector的ops屬性,這是一個Python字典,其中的值為列表中的功能。

如何進行特徵選擇,避開那些機器學習的“坑”!

最後,我們繪製了所有特徵中缺失值的分佈圖:

如何進行特徵選擇,避開那些機器學習的“坑”!

如何進行特徵選擇,避開那些機器學習的“坑”!

共線特徵

共線特徵是相互高度相關的特徵。在機器學習中,由於方差高和模型可解釋性低,導致測試集上泛化性能下降。

identify_collinear方法根據指定的相關係數值查找共線特徵。對於每對相關特徵,它標識出要刪除的特徵(因為我們只需要刪除一個特徵):

如何進行特徵選擇,避開那些機器學習的“坑”!

我們可以使用相關性製作一個簡潔的可視化圖,它是一個熱度圖。這顯示了在閾值以上至少有一個相關性的所有特徵:

如何進行特徵選擇,避開那些機器學習的“坑”!

如何進行特徵選擇,避開那些機器學習的“坑”!

像以前一樣,我們可以訪問將被刪除的整個關聯特徵列表,或者查看數據框中高度相關的特徵對。

如何進行特徵選擇,避開那些機器學習的“坑”!

如果我們想調查我們的數據集,我們還可以通過將plot_all = True傳遞給調用來繪製數據中所有相關性的圖:

如何進行特徵選擇,避開那些機器學習的“坑”!

如何進行特徵選擇,避開那些機器學習的“坑”!

重要性為零的特徵

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

使用基於樹的機器學習模型(例如增強型合奏),我們可以找到特徵重要性。重要性的絕對值並不像相對值那麼重要,我們可以用它來確定任務的最相關特徵。我們還可以通過刪除零重要性功能來使用功能重要性進行功能選擇。在基於樹的模型中,重要性為零的特徵不用於分割任何節點,因此我們可以在不影響模型性能的情況下將其刪除。

FeatureSelector使用LightGBM庫中的梯度提升機器查找要素重要性。特徵重要性在GBM的10次訓練運行中進行平均以減少差異。此外,該模型通過使用驗證集提前停止(有一個選項可以關閉此功能)來訓練,以防止過度訓練數據。

下面的代碼調用方法並提取零重要性功能:

如何進行特徵選擇,避開那些機器學習的“坑”!

這次我們得到了兩個plot_feature_importances的圖:

如何進行特徵選擇,避開那些機器學習的“坑”!

在左邊,我們有plot_n最重要的特徵(根據標準化重要性繪製,其中總和為1)。 在右側,我們對功能數量具有累積重要性。 垂直線繪製在累積重要性的閾值處,在這種情況下為99%。

如何進行特徵選擇,避開那些機器學習的“坑”!

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

  • 訓練梯度提升機器是隨機的,意味著每次模型運行時,要素重要性都會發生變化

這應該不會產生重大影響(最重要的功能不會突然變得至少),但它會改變某些功能的排序。 它也會影響識別的零重要性特徵的數量。 如果功能重要性每次都改變,不要感到驚訝!

  • 為了訓練機器學習模型,這些特徵首先是一個熱點編碼。 這意味著被認為具有0重要性的一些特徵可能是在建模期間添加的一個熱門編碼特徵。

當我們進入功能刪除階段時,可以選擇刪除所有添加的熱門編碼功能。 但是,如果我們在特徵選擇之後進行機器學習,那麼我們必須對特徵進行熱編碼!

低重要性功能

下一個方法基於零重要性函數,使用模型中的要素重要性進一步選擇。 函數identify_low_importance發現沒有對指定的全部重要性做出貢獻的最重要的特性。

如何進行特徵選擇,避開那些機器學習的“坑”!

例如,下面的調用找到了達到總重要性99%所不需要的最不重要的功能:

根據累積重要性和這些信息的情節,梯度提升機器認為許多特徵與學習無關。 再次,這種方法的結果將在每次訓練中發生變化。

要查看數據框中的所有要素重要性,請執行以下操作:

如何進行特徵選擇,避開那些機器學習的“坑”!

如何進行特徵選擇,避開那些機器學習的“坑”!

low_importance方法借鑑了使用主成分分析(PCA)的一種方法,通常只保留一定比例方差(例如95%)所需的PC。佔總重要性的百分比是基於相同的想法。

基於特徵重要性的方法只有在我們要使用基於樹的模型進行預測時才適用。除了隨機性之外,基於重要性的方法是一種黑盒測試,因為我們並不真正知道為什麼模型認為這些特徵是無關緊要的。如果使用這些方法,請多次運行它們以查看結果如何變化,並可能創建具有不同參數的多個數據集進行測試!

單一的價值特徵

最後的方法非常基礎:找到任何具有單一唯一值的列。僅具有一個唯一值的特徵對於機器學習不具有用處,因為此特徵具有零差異。例如,基於樹的模型不能僅使用一個值對特徵進行分割(因為沒有組將觀察分割)。

這裡沒有參數可供選擇,它與其他方法不同:

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

需要記住的一點是,默認情況下,在計算Pandas中的唯一值之前,NaN會被丟棄。

刪除功能

一旦我們確定要丟棄的功能,我們有兩個選項可以將其刪除。所有要移除的要素都存儲在FeatureSelector的操作符中,我們可以使用這些列表手動移除要素。另一種選擇是使用刪除內置功能。

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

此方法返回刪除了要素的數據幀。還要刪除在機器學習期間創建的一個熱門編碼功能:

在繼續操作之前檢查將要刪除的功能可能是一個好主意!原始數據集作為備份存儲在FeatureSelector的數據屬性中!

一次運行所有方法

我們可以將所有這些方法與identify_all一起使用,而不是單獨使用這些方法。這需要每個方法的參數字典:

請注意,由於我們重新運行模型,總功能數量將發生變化。然後可以調用remove函數來放棄這些功能。

結論

特徵選擇器類在訓練機器學習模型之前需要執行幾個常用的操作以去除特徵。它提供了識別刪除功能以及可視化的功能。方法可以單獨運行或同時運行,以實現高效的工作流程。

缺失、共線和single_unique方法是確定性的,而基於特徵重要性的方法將隨著每次運行而改變。特徵選擇很像機器學習領域,很大程度上是經驗性的,需要測試多個組合才能找到最佳答案。在流水線中嘗試多種配置是最佳實踐,並且“特徵選擇器”提供了快速評估特徵選擇參數的方法。

如何進行特徵選擇,避開那些機器學習的“坑”!


分享到:


相關文章: