Python中机器学习的特征选择工具
特征選擇,即在數據集中查找和選擇最有用的特征的過程,是機器學習的關鍵步驟。不必要的特征會降低訓練速度、模型的可解釋性,最重要的是會降低測試集的泛化性能。
我對臨時的特征選擇方法感到很失望,但是在解決機器學習問題時又反復用到了這些方法,所以就創建了一個關于特征選擇的Python類,該類可以在GitHub上找到。FeatureSelector類包括一些最常見的特征選擇方法:
1.高百分比的缺失值特征選擇法
2.共線(高度相關)特征選擇法
3.樹型結構模型中的零重要性特征選擇法
4.低重要性特征選擇法
5.唯一值特征選擇法
在本文中,我將對機器學習數據集的示例使用FeatureSelector類。也會介紹該類是如何讓我們快速地實現特征選擇方法。
完整的代碼可以在GitHub上找到,特征選擇器還是一個半成品,會根據社區的需求繼續改進!
示例數據集
示例中使用的是Kaggle上家庭信用違約風險機器學習競賽的數據樣本。整個數據集可以下載,演示樣本如下:
該數據樣本來自一個有監督分類問題,也是一個很好的數據集。因為它有許多缺失值、高度相關(共線)的特征以及對機器學習模型無用的不相關特征。
創建一個實例
創建FeatureSelector類的實例需傳入結構化的數據集,該數據集行為觀察值、列為特征。該類內有一些只需傳入特征的方法,但是這些基于特征重要性的方法需傳入訓練標簽。所以當用這些方法解決一個有監督分類問題時,需傳入一組特征和一組標簽。
方法
特征選擇器有5種查找要刪除特征的方法,找到被標識的特征并手動地將它們從數據中刪除,或者使用特征選擇器中的remove函數。
下面將詳細介紹每一種方法,并展示5種方法是如何同時運行的。FeatureSelector類內還有一些具有繪圖功能的方法,因為檢驗直觀的圖像數據也是機器學習的一個重要組成部分。
缺失值
缺失值特征選擇法比較簡單:所查找的特征是超過指定閾值的缺失值。下面的調用所標識的特征都是超過60%的缺失值(粗體為輸出)。
按列顯示缺失值的dataframe:
通過FeatureSelector類的ops屬性可以查看要刪除特征。具體過程如下面所列的Python 命令所示:
下面是缺失值占特征比例的分布圖:
共線特征
共線特征是高度相關的特征。在機器學習中,由于共線特征的高方差和低模型可解釋性,會導致測試集的泛化性能下降。
identify_collinear方法根據指定的相關系數值查找共線特征,將相關特征對中的一個標識為要刪除特征(因為只需要刪除一個):
fs.identify_collinear(correlation_threshold = 0.98)21 features with a correlation magnitude greater than 0.98.
下面是基于相關性的熱度圖,該圖顯示了相關性超過閾值的所有特征:
fs.plot_collinear()
類似的,也可以列出要刪除的共線特征,或者查看共線特征的dataframe。
# list of collinear features to removecollinear_features = fs.ops['collinear']# dataframe of collinear features
fs.record_collinear.head()
如果想深入研究數據集,還可以傳入plot_all = True給調用,繪制所有數據相關性的圖表:
零重要性特征
前兩種方法可以應用于任何結構化的數據集,且具有確定性——對于給定的閾值,每次結果都是相同的。但是零重要性特征選擇法只針對有監督的機器學習問題(有訓練模型的標簽),且具有不確定性。identify_zero_important函數根據梯度提升機(GBM)學習模型來查找零重要性特征。
通過基于樹型結構的機器學習模型,例如boosting集成算法,可以發現特征的重要性。重要性的相對值可以確定任務的最相關特征,絕對值就沒有那么重要了,但是可以通過刪除零重要性特征可以進行特征選擇。零重要性特征不能作為樹型模型中的節點,因此可以在不影響模型性能的情況下刪除它們。
FeatureSelector通過LightGBM庫的梯度提升機來查找特征重要性。為了減少差異,對特征重要性進行平均超過10次的GBM訓練。此外,通過使用驗證集(可關閉)進行早期停止來訓練模型,以防止對訓練數據的過度擬合。
下面的代碼調用了該方法并提取了零重要性特征:
傳入的參數如下:
task:根據問題對應選擇“classification”或“regression”
eval_metric:衡量早期停止(若禁用了早期停止,則沒有必要)
n_iteration:訓練次數
early_stopping:是否使用早期停止來訓練模型
下面兩個圖由plot_feature_importances函數得出:
fs.plot_feature_importances(threshold?=?0.99,?plot_n?=?12)
左邊是關于plot_n最重要特征的圖(根據歸一化的重要性所繪制,總和為1)。右邊是累積重要性與特征數量的關系圖。垂線畫在累積重要性達到的閾值處,本例中閾值為99%。
基于重要性的方法需要記住兩個要點:
(1)訓練梯度提升機是隨機的,每一次模型運行,特征重要性都將會改變。
這不會產生重大的影響(最重要的特征不會突然變成最少),但是它會改變某些特征的順序,還會影響被標識的零重要性特征的數量。如果特征重要性每次都發生變化,不要感到驚訝!
(2)為了對機器學習模型進行訓練,首先需要對特征進行獨熱編碼。所以一些被標識為零重要性的特征可能是在建模過程中添加的獨熱編碼特征。
在刪除特征時可以刪除任何添加的獨熱編碼特征。但是,如果在特征選擇之后要進行機器學習,則不能刪除!
低重要性特征
這種方法構建立在零重要性函數的基礎上,再利用模型中的特征重要性進行進一步的選擇。由函數identify_low_importance可知,低重要性特征并不影響某些指定的總重要性。
例如,下面的調用顯示:在實現99%的總重要性時,最低重要性特征并不是必需的。
由上面累積重要性的圖,以及低重要性不影響某些指定的總重要性這一信息可知,梯度提升機中有許多與學習無關的特征。同樣,低重要性特征選擇法的結果在每次訓練中都會發生變化。
查看所有的特征重要性:
low_importance方法借鑒了使用主成分分析(PCA)的方法,只要求主成分所占的比例要維持在一定的百分比(例如95%)。總重要性所占比例也要維持在一定的百分比。
基于特征重要性的方法最適合用來對樹型結構模型進行預測。基于重要性的方法是隨機的,也是一種黑盒方法,因為模型判定特征是否相關并不透明的。所以在使用基于特征重要性的方法時,應多次運行以查看結果如何變化,并盡可能創建多個具有不同參數的數據集以進行測試!
唯一值特征
最唯一值特征選擇法是相當基本的:查找有唯一值的列。只有一個唯一值的特征對于機器學習來說是無用的,因為這個特征的方差為零。例如,只有一個值的特征不能作為樹型結構模型的節點(因為該特征不能再分組了)。
繪制各個區間唯一值數量的直方圖:
fs.plot_unique()
需要記住的一點是:默認在計算Pandas 中唯一值之前,NaNs會被刪除。
刪除特征
確定了要刪除特征后,有兩個選擇可以刪除它們。所有要刪除的特征都存儲在FeatureSelector的ops屬性中,可以根據出現的列表手動刪除特征。另一種選擇是使用remove內置函數。
使用remove函數刪除特征時需傳入methods。如果想要使用所有的實現方法,只需傳入methods = 'all'。
該方法刪除特征后返回一個dataframe,在機器學習過程中創建的one-hot編碼特征也被刪除:
在開始操作之前先檢查要刪除的特征!原始數據集存儲在FeatureSelector的data屬性中作為備份!
結論
在訓練機器學習模型之前,特征選擇器類實現了一些常見的刪除特征的操作。它具有選擇要刪除特征和繪圖的功能。類內方法可以單獨運行,也可以為實現高效的工作流而同時運行。
Missing方法, collinear方法和single_unique方法都是具有確定性的,而基于特征重要性的方法會隨著每次運行而改變。像機器學習一樣,特征選擇很大程度上是經驗主義。測試多組數據才能得到最佳結果,所以最好多嘗試幾次。特征選擇器提供了一種快速評估特征選擇參數的方法。
總結
以上是生活随笔為你收集整理的Python中机器学习的特征选择工具的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java并发编程:volatile的使用
- 下一篇: 基于Elasticsearch实现搜索推
