本文結合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(estimator, step=1, cv=None, scoring=None, verbose=0, n_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
