
資源 | 一個Python特征選擇工具,助力實現高效機器學習
鑒于特征選擇在機器學習過程中的重要性,數據科學家 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 所在目錄下運行這段代碼)
fromfeature_selectorimportFeatureSelector
# Features areintrain and labels areintrain_labels
fs = FeatureSelector(data = train, labels = train_labels)
方法
這個特征選擇器有 5 種用于查找待移除特征的方法。我們可以訪問任何已被識別出來的特征并通過人工方式將它們移出數據,也可以使用 FeatureSelector 中的 remove 函數。
這里我們將介紹其中每種識別方法,還將展示如何同時運行這 5 種方法。此外,FeatureSelector 還有幾個圖表繪制功能,因為可視化地檢查數據是機器學習的一大關鍵部分。
缺失值
查找和移除特征的第一個方法很簡單:查找缺失值比例超過特定閾值的特征。下面的調用能識別缺失值比例超過 60% 的特征(粗體是輸出結果)。
fs.identify_missing(missing_threshold =0.6)
17featureswithgreater than0.60missing values.
我們可以在一個 dataframe 中查看每一列的缺失值比例:
fs.missing_stats.head()
要查看待移除特征,我們可以讀取 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()
共線性特征
共線性特征是指彼此之間高度關聯的特征。在機器學習領域,高方差和較低的模型可解釋性導致在測試集上的泛化能力下降。
identify_collinear 方法能基于指定的相關系數值查找共線性特征。對于每一對相關的特征,它都會標識出其中要移除的一個(因為我們只需要移除其中一個):
fs.identify_collinear(correlation_threshold =0.98)
21featureswitha correlation magnitude greater than0.98.
使用熱圖可以很好地可視化共線性。下圖展示了所有至少有一個相關關系(correlation)超過閾值的特征:
fs.plot_collinear()
和之前一樣,我們可以訪問將會被移除的整個相關特征列表,或者在一個 dataframe 中查看高度相關的特征對。
# listofcollinear features to remove
collinear_features = fs.ops['collinear']
# dataframeofcollinear features
fs.record_collinear.head()
如果我們想全面了解數據集,我們還可以通過將 plot_all = True 傳入該調用,繪制出數據中所有相關性的圖表:
零重要度特征
前面兩種方法可被應用于任何結構化的數據集并且結果是確定的——對于一個給定的閾值,每次結果都一樣。接下來的方法是專為監督式機器學習問題設計的,其中我們有訓練模型的標簽并且是非確定性的。identify_zero_importance 函數能根據梯度提升機(GBM)學習模型查找重要度為零的特征。
我們可以使用基于樹的機器學習模型(比如 boosting ensemble)求取特征重要度。這個重要度的絕對值沒有相對值重要,我們可以將相對值用于確定對一個任務而言最相關的特征。我們還可以通過移除零重要度特征來在特征選擇中使用特征重要度。在基于樹的模型中,零重要度的特征不會被用于分割任何節點,所以我們可以移除它們而不影響模型表現。
FeatureSelector 能使用來自 LightGBM 庫的梯度提升機來得到特征重要度。為了降低方差,所得到的特征重要度是在 GBM 的 10 輪訓練上的平均。另外,該模型還使用早停(early stopping)進行訓練(也可關閉該選項),以防止在訓練數據上過擬合。
LightGBM 庫:http://lightgbm.readthedocs.io/
下面的代碼調用了該方法并提取出了零重要度特征:
# Passinthe appropriate parameters
fs.identify_zero_importance(task ='classification',
eval_metric ='auc',
n_iterations =10,
early_stopping = True)
# listofzero importance features
zero_importance_features = fs.ops['zero_importance']
63featureswithzero importance after one-hot encoding.
我們傳入的參數解釋如下:
這時候我們可以使用 plot_feature_importances 繪制兩個圖表:
# plot the feature importances
fs.plot_feature_importances(threshold =0.99, plot_n =12)
124features requiredfor0.99ofcumulative importance
左圖給出了 plot_n 最重要的特征(重要度進行了歸一化,總和為 1)。右圖是對應特征數量的累積重要度。藍色豎線標出了累積重要度為 99% 的閾值。
對于基于重要度的方法,有兩點需要記?。?
這應該不會有太大的影響(最重要的特征不會突然就變成最不重要的),但這會改變某些特征的排序,也會影響識別出的零重要度特征的數量。如果特征重要度每次都改變,請不要感到驚訝!
當我們到達特征移除階段時,還有一個選項可移除任何被添加進來的 one-hot 編碼的特征。但是,如果我們要在特征選擇之后做機器學習,我們還是必須要 one-hot 編碼這些特征。
低重要度特征
接下來的方法基于零重要度函數,使用來自模型的特征重要度來進一步選擇。identify_low_importance 函數能找到重要度最低的特征,這些特征無助于指定的總重要性。
比如,下面的調用能找到最不重要的特征,即使沒有這些特征也能達到 99% 的重要度。
fs.identify_low_importance(cumulative_importance =0.99)
123features requiredforcumulative importanceof0.99after one hot encoding.
116featuresdonot contribute to cumulative importanceof0.99.
根據前面的累積重要度圖和這一信息,梯度提升機認為很多特征都與學習無關。重申一下,每次訓練運行后該方法的結果都不一樣。
我們也可以在一個 dataframe 中查看所有特征重要度:
fs.feature_importances.head(10)
low_importance 方法借鑒了主成分分析(PCA)中的一種方法,其中僅保留維持一定方差比例(比如 95%)所需的主成分是很常見的做法。要納入考慮的總重要度百分比基于同一思想。
只有當我們要用基于樹的模型來做預測時,基于特征重要度的方法才真正有用。除了結果隨機之外,基于重要度的方法還是一種黑箱方法,也就是說我們并不真正清楚模型認為某些特征無關的原因。如果使用這些方法,多次運行它們看到結果的改變情況,也許可以創建具有不同參數的多個數據集來進行測試!
單個唯一值特征
最后一個方法相當基礎:找出任何有單個唯一值的列。僅有單個唯一值的特征不能用于機器學習,因為這個特征的方差為 0。舉個例子,如果一個特征僅有一個值,那么基于樹的模型就永遠不能進行區分(因為沒有可做區分的依據)。
不同于其它方法,這個方法沒有可選參數:
fs.identify_single_unique()
4featureswitha single unique value.
我們可以繪制每個類別唯一值數量的直方圖:
fs.plot_unique()
還有一點要記住,在計算唯一值之前,NaNs 已經使用 Pandas 默認移除了。
移除特征
在確定了待移除特征之后,我們有兩種移除它們的選擇。所有要移除的特征都存儲在 FeatureSelector 的 ops 詞典中,我們可以使用這個列表來手動移除它們,當然也可使用內置的 remove 函數。
對于這一方法,我們需傳入要用于移除特征的 methods。如果我們想使用所實現的所有方法,我們只需使用 methods = 'all'
# Remove the featuresfromall methods (returns a df)
train_removed = fs.remove(methods ='all')
['missing','single_unique','collinear','zero_importance','low_importance'] methods have been run
Removed140features.
這個方法會返回一個包含被移除特征的 dataframe。另外,要移除在機器學習過程中創建的 one-hot 編碼的特征:
train_removed_all = fs.remove(methods ='all', keep_one_hot=False)
Removed187features including one-hot features.
在執行操作之前檢查將被移除的特征可能是個好想法!原來的數據集會被存儲在 FeatureSelector 的 data 屬性中用作備份!
一次運行所有方法
除了單獨使用各個方法之外,我們也可通過 identify_all 一次性使用所有方法。我們需要使用一個詞典來設定其中每個方法的參數:
fs.identify_all(selection_params = {'missing_threshold':0.6,
'correlation_threshold':0.98,
'task':'classification',
'eval_metric':'auc',
'cumulative_importance':0.99})
151total features outof255identifiedforremoval after one-hot encoding.
注意,多次運行該模型的總特征數量可能也各不相同。之后就可以調用 remove 函數來移除這些特征了。
總結
這個特征選擇器類實現了訓練機器學習模型之前幾種用于移除特征的常見操作。其提供了可用于識別待移除特征的函數以及可視化函數。這些方法可以單獨使用,也可以一次全部應用以實現高效的工作流程。
其中 missing、collinear 和 single_unique 方法是確定性的,而基于特征重要度的方法會隨每次運行而變化。與機器學習領域很相似,特征選擇很大程度上是實證式的,需要測試多種組合才能找到最優解。最好的做法是在流程中嘗試多種配置,并且 FeatureSelector 提供了一種用于快速評估特征選擇參數的方法。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25