sklearn特征選擇方法及參數


  本文結合sklearn中的特征選擇的方法,講解相關方法函數及參數的含義。

1. 移除低方差特征

  方差越大的特征,可以認為是對目標變量越有影響的特征,是我們需要研究的特征。可以利用 VarianceThreshold,移除方差不滿足一定閾值的特征。

  class sklearn.feature_selection.VarianceThreshold(threshold=0.0)

  參數 threshold 為設定的方差閾值,小於該值的特征將被移除,默認取值0,即移除方差為0的特征。

  需要注意的是,不同分布的數據,方差的計算方式不同。連續性變量的方差,大家都比較熟悉它的計算方式;但是離散型變量的方差,計算就有所不同了。例如官方文檔中的例子,假設一個二元隨機變量,它的取值為0、1,服從二項分布,而二項分布的方差計算公式為:D(x) = n*p*q = n*p*(1-p),p為實驗“成功”的概率,q為失敗的概率,n為試驗次數。(注:官方文檔中寫的方差計算公式少了n,個人認為他是錯的,雖然不影響結果。如果我理解錯了,也希望博友指正。)。針對二元變量,我們希望取值為0或者1比例不要太大。例如,我們不希望其中一個取值的比例超過80%,那么,此時 threshold 參數的可設置為:threshold = 0.8*(1- 0.8)。

2. 單變量特征選擇

  所謂的單變量特征選擇,就是對樣本數據中的特征分別進行統計檢驗,並根據檢驗結果對特征進行評分,然后按照設定的規則進行篩選。主要有以下四種方法:

  • SelectKBest(score_func,k)

  其中 score_func 傳入用於特征評分的統計檢驗方法,默認是 f_classif,它計算的是單變量與訓練 target 間的方差分析F值(Anova F-value);k 傳入用戶想要根據評分從高到低留下的變量的個數,默認是10。

  注意,當選用默認的 f_classif 方法時,只適用於分類任務,即目標變量為分類變量(因為只有目標變量是分類變量,才好進行方差分析)。

  • SelectPercentile(score_func,percentile)

  其中 score_func 同上;percentile 傳入用戶想要根據評分從高到低留下的變量個數占總個數的比例,默認10,表示10%。 

  • SelectFpr(score_func,alpha)

  通過控制統計檢驗中取偽錯誤發生的概率來選擇特征,其中score_func同上;alpha用來控制置信水平,alpha值為保留該變量的最高p值,即p值大於該值,移除對應的變量。

  • GenericUnivariateSelect(score_func,mode,param)

  這是一個整合上述幾種方法的廣義方法,其中score_func同上;mode 用來指定特征選擇的方法,可選項有{‘percentile’, ‘k_best’, ‘fpr’, ‘fdr’, ‘fwe’},與上面幾種方法相對應;param的輸入取決於mode中指定的方式,即指定方式對應的傳入參數。

3. 遞歸特征消除法

  class sklearn.feature_selection.RFECV(estimatorstep=1cv=Nonescoring=Noneverbose=0n_jobs=1)

  遞歸特征消除法(Recursive feature elimination)的基本思想是反復地構建多個模型(如回歸模型、支持向量機等),例如,在回歸任務中,對n個變量,第一輪構造n個模型,每個模型都對應着剔除掉一個變量,選擇出其中效果最佳的模型對應的變量,將其剔除,再進入第二輪,這樣通過遞歸構建模型,最終將剩余的變量控制在最佳的水平,這類似交叉驗證(cross validation)的過程,我們使用 sklearn.feature_selection中的RFECV() 來實施這個過程,其具體參數如下: 

  estimator:該參數傳入用於遞歸構建模型的有監督型基學習器,要求該基學習器具有fit方法,且其輸出含有coef_或feature_importances_這種結果;

  step:數值型,默認為1,控制每次迭代過程中刪去的特征個數,有以下兩種情況:

    1.若傳入大於等於1的整數,則在每次迭代構建模型的過程中刪去對應數量的特征;

    2.若傳入介於0.0到1.0之間的浮點數,則在每次第迭代構造模型的過程中刪去對應比例的特征。

  cv:控制交叉驗證的分割策略,默認是3折交叉驗證,有以下幾種情況:

    1.None,等價於不傳入參數,即使用默認設置的3折交叉驗證;

    2.正整數,這時即指定了交叉驗證中分裂的子集個數,即k折中的k;

  n_jobs:控制並行運算中利用到的CPU核心數,默認為1,即單核工作,若設置為-1,則啟用所有核心進行運算;

  函數返回值: 

  n_features_:通過交叉驗證過程最終剩下的特征個數;

  support_:被選擇的特征的被選擇情況(True表示被選擇,False表示被淘汰);

  ranking_:所有特征的評分排名;

  estimator_:利用剩下的特征訓練出的模型;

4. SelectFromModel 選取特征

  SelectFromModel包括:L1-based feature selection (基於 L1 的特征選取)、Tree-based feature selection(基於 Tree(樹)的特征選取) 等。

  class sklearn.feature_selection.SelectFromModel(estimator, threshold=None, prefit=False)

  • 有系數的線性模型中,L1正則化可生成一個稀疏矩陣,利於計算,所以可以做特征選擇。
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Lasso            # 此處以L1正則化的線性模型Lasso為例
lasso = Lasso()                                   # 可在此步對模型進行參數設置,這里用默認值。
lasso.fit(X, y)                                   # 訓練模型,傳入X、y, 數據中不能包含miss_value
model = SelectFromModel(lasso)
X_new = model.transform(X)
  • 在無系數的非線性模型中,通過計算得到特征重要性,根據重要性篩選無關特征
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestRegressor        # 獲得特征重要度
rf = RandomForestRegressor()                              # 默認參數
rf.fit(X, y)
model = SelectFromModel(rf)
X_new = model.transform(X)

 

  

參考: https://www.cnblogs.com/feffery/p/8808398.html#commentform

    https://blog.csdn.net/sscc_learning/article/details/73929038

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM