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

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

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

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

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

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

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

4.低重要性特徵選擇法

5.唯一值特徵選擇法

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

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

示例數據集

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

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

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

創建一個實例

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

from feature_selector import FeatureSelector

# Features are in train and labels are in train_labels

fs = FeatureSelector(data = train, labels = train_labels)

方法

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

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

缺失值

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

fs.identify_missing(missing_threshold = 0.6)

17 features with greater than 0.60 missing values.

按列顯示缺失值的dataframe:

fs.missing_stats.head()

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

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

missing_features = fs.ops['missing']

missing_features[:5]

['OWN_CAR_AGE',

'YEARS_BUILD_AVG',

'COMMONAREA_AVG',

'FLOORSMIN_AVG',

'LIVINGAPARTMENTS_AVG']

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

fs.plot_missing()

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

共線特徵

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

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

fs.identify_collinear(correlation_threshold = 0.98)

21 features with a correlation magnitude greater than 0.98.

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

fs.plot_collinear()

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

類似的,也可以列出要刪除的共線特徵,或者查看共線特徵的dataframe。

# list of collinear features to remove

collinear_features = fs.ops['collinear']

# dataframe of collinear features

fs.record_collinear.head()

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

如果想深入研究數據集,還可以傳入plot_all = True給調用,繪製所有數據相關性的圖表:

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

零重要性特徵

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

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

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

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

# Pass in the appropriate parameters

fs.identify_zero_importance(task = 'classification',

eval_metric = 'auc',

n_iterations = 10,

early_stopping = True)

# list of zero importance features

zero_importance_features = fs.ops['zero_importance']

63 features with zero importance after one-hot encoding.

傳入的參數如下:

task:根據問題對應選擇“classification”或“regression”

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

n_iteration:訓練次數

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

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

# plot the feature importances

fs.plot_feature_importances(threshold = 0.99, plot_n = 12)

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

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

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

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

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

(2)為了對機器學習模型進行訓練,首先需要對特徵進行獨熱編碼。所以一些被標識為零重要性的特徵可能是在建模過程中添加的獨熱編碼特徵。

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

低重要性特徵

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

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

fs.identify_low_importance(cumulative_importance = 0.99)

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

查看所有的特徵重要性:

fs.feature_importances.head(10)

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

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

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

唯一值特徵

最唯一值特徵選擇法是相當基本的:查找有唯一值的列。只有一個唯一值的特徵對於機器學習來說是無用的,因為這個特徵的方差為零。例如,只有一個值的特徵不能作為樹型結構模型的節點(因為該特徵不能再分組了)。

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

fs.plot_unique()

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

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

刪除特徵

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

使用remove函數刪除特徵時需傳入methods。如果想要使用所有的實現方法,只需傳入methods = 'all'。

# Remove the features from all methods (returns a df)

train_removed = fs.remove(methods = 'all')

['missing', 'single_unique', 'collinear', 'zero_importance', 'low_importance'] methods have been run

Removed 140 features.

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

train_removed_all = fs.remove(methods = 'all', keep_one_hot=False)

Removed 187 features including one-hot features.

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

結論

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

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

原文鏈接: https://yq.aliyun.com/articles/610496?spm=a2c4e.11153940.bloghomeflow.71.41ce291a1dOhYT

本文由阿里云云棲社區組織翻譯。

文章原標題《a-feature-selection-tool-for-machine-learning-in-python》

文章為簡譯,更為詳細的內容,請查看 原文文章 。

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


分享到:


相關文章: