Categories
程式開發

Scikit-Learn中的特徵排名與遞歸特徵消除


全文2K字,建議閱讀時間5分鐘​。

由於我本人最近正在做特徵工程方面的工作,以特徵選擇和特徵降維為主,所以本篇文章為同學們講解sklearn庫中常用的特徵選擇方法。

本文介紹如何使用scikit-learn為您的機器學習項目獲取最佳數量的特徵。

Scikit-Learn中的特徵排名與遞歸特徵消除 1

對於任何機器學習應用程序而言,特徵選擇“都是一項重要任務。當所討論的數據具有許多功能時,這尤其重要。最佳數量的特徵還可以提高模型的準確性。獲得最重要的特徵和最佳特徵的數量可以通過特徵重要性或特徵等級來獲得。在本文中,我們將探討功能排名。

遞歸特徵消除

消除遞歸特徵所需的第一項是估計器。例如,線性模型或決策樹模型。

這些模型具有線性模型的係數,並且在決策樹模型中具有重要的功能。在選擇最佳數量的特徵時,訓練估計器,並通過係數或特徵重要性選擇特徵。最不重要的功能已刪除。遞歸地重複此過程,直到獲得最佳數量的特徵。

在Sklearn中的應用

Scikit-learn使通過類實現遞歸特徵消除成為可能。該類具有以下參數:sklearn.feature_selection.RFE

estimator —可以通過coef_ 或 feature_importances_ 屬性提供功能重要性的機器學習估計器 。 n_features_to_select —要選擇的功能數量。選擇 half 是否未指定。 step —一個整數,指示每次迭代要刪除的特徵的數量,或者一個介於0和1之間的數字以指示每次迭代要刪除的特徵的百分比。

擬合後,可以獲得以下屬性:

ranking_ —功能的排名。 n_features_ —已選擇的功能數。 support_ —一個數組,指示是否選擇了功能。

應用

如前所述,我們需要使用提供feature_importance_s 屬性或 coeff_ 屬性的估計器 。讓我們來看一個簡單的例子。數據集具有13個要素-我們將努力獲得最佳數量的要素。

Scikit-Learn中的特徵排名與遞歸特徵消除 2

Scikit-Learn中的特徵排名與遞歸特徵消除 3

讓我們獲得 X 和 y 特徵。

Scikit-Learn中的特徵排名與遞歸特徵消除 4

我們將其分為測試和訓練集以準備建模:

Scikit-Learn中的特徵排名與遞歸特徵消除 5

幾個導入:

Pipeline —因為我們將執行一些交叉驗證。最佳實踐是為了避免數據洩漏。 RepeatedStratifiedKFold —用於重複分層交叉驗證。 cross_val_score —用於評估交叉驗證的分數。 GradientBoostingClassifier —我們將使用的估算器。 numpy -這樣我們就可以計算分數的平均值。

Scikit-Learn中的特徵排名與遞歸特徵消除 6

第一步是創建RFE 類的實例, 同時指定估算器和您要選擇的特徵數量。在這種情況下,我們選擇6:

Scikit-Learn中的特徵排名與遞歸特徵消除 7

接下來,我們創建要使用的模型的實例:

Scikit-Learn中的特徵排名與遞歸特徵消除 8

我們將使用 Pipeline 轉換數據。在中, Pipeline 我們指定 rfe 了特徵選擇步驟以及將在下一步中使用的模型。

然後,我們指定 RepeatedStratifiedKFold 10個拆分和5個重複的。分層的K折確保在每個折中每個類別的樣本數量均衡。 RepeatedStratifiedKFold重複分層K倍指定次數,每次重複具有不同的隨機性。

Scikit-Learn中的特徵排名與遞歸特徵消除 9

Scikit-Learn中的特徵排名與遞歸特徵消除 10

有了這些,我們可以檢查支持和排名。支持說明是否選擇了特徵。

rfe.support_array([ True, False, True, False, True, False, False, True, False,True, False, True, True])

我們可以將其放入數據框並檢查結果。

Scikit-Learn中的特徵排名與遞歸特徵消除 11

Scikit-Learn中的特徵排名與遞歸特徵消除 12

我們還可以檢查相對排名。

rf_df = pd.DataFrame(rfe.ranking_,index=X.columns,columns=[‘Rank’]).sort_values(by=’Rank’,ascending=True)rf_df.head()

Scikit-Learn中的特徵排名與遞歸特徵消除 13

如果我們可以自動選擇功能,那麼與其手動配置功能數量,不如說是很好。這可以通過遞歸特徵消除和交叉驗證來實現。這是通過sklearn.feature_selection.RFECV 類完成的 。該類具有以下參數:

estimator -與RFE 班級相似 。 min_features_to_select —最少要選擇的功能。 cv—交叉驗證拆分策略。

返回的屬性是:

n_features_ —通過交叉驗證選擇的最佳特徵數。 support_ —包含有關要素選擇信息的數組。 ranking_ —功能的排名。 grid_scores_ —從交叉驗證中獲得的分數。

第一步是導入類並創建其實例。

from sklearn.feature_selection import RFECVrfecv = RFECV(estimator=GradientBoostingClassifier())

下一步是指定管道。在此管道中,我們使用剛剛創建的 rfecv。

Scikit-Learn中的特徵排名與遞歸特徵消除 14

讓我們擬合管道,然後獲得最佳數量的特徵。

Scikit-Learn中的特徵排名與遞歸特徵消除 15

可以通過該n_features_ 屬性獲得最佳數量的特徵 。

Scikit-Learn中的特徵排名與遞歸特徵消除 16

排名和支持可以像上次一樣獲得。

rfecv.support_rfecv_df = pd.DataFrame(rfecv.ranking_,index=X.columns,columns=[‘Rank’]).sort_values(by=’Rank’,ascending=True)rfecv_df.head()

使用, grid_scores_ 我們可以繪製一個顯示交叉驗證得分的圖表。

Scikit-Learn中的特徵排名與遞歸特徵消除 17

Scikit-Learn中的特徵排名與遞歸特徵消除 18

將其應用於回歸問題的過程是相同的。只要確保使用回歸指標而不是準確性即可。我希望本文能為您提供一些有關為您的機器學習問題選擇最佳特徵的見解。

參考內容:

具有遞歸特徵消除的代碼庫

Scikit-Learn中的特徵排名與遞歸特徵消除 19

看完別走還有驚喜!

我精心整理了計算機/Python/機器學習/深度學習相關的2TB視頻課與書籍,價值1W元。關注微信公眾號“計算機與AI”,點擊下方菜單即可獲取網盤鏈接。