【特征選擇】包裹式特征選擇法


原創博文,轉載請注明出處!

      包裹式特征選擇法的特征選擇過程與學習器相關,使用學習器的性能作為特征選擇的評價准則,選擇最有利於學習器性能的特征子集。常用的包裹式特征選擇法有遞歸特征消除法RFE。

#  遞歸特征消除法

  • 遞歸特征消除法RFE

    遞歸特征消除法的英文全名為recursive feature elimination,簡稱RFE。首先設定n_features_to_select( 經過特征選擇后,特征集中剩余的特征個數),然后使用一個基模型來進行多輪訓練,每輪訓練后移除若干權值系數的特征,再基於新的特征集進行下一輪訓練,直至特征個數為n_features_to_select。sklearn在feature_selection模塊中封裝了RFE。sklearn中RFE的主要參數為:

* estimator  -- 基學習器

* n_features_to_select -- 經過特征選擇后,特征集中剩余的特征個數

* step -- 默認1,即每次迭代移除一個特征

* verbose -- 默認0,不顯示中間過程

  • 結合交叉驗證的遞歸特征消除法RFECV

    RFE設定n_features_to_select時存在一定的盲目性,可能使得模型性能變差。比如,n_features_to_select過小時,相關特征可能被移除特征集,信息丟失;n_features_to_select過大時,無關特征沒有被移除特征集,信息冗余。在工程實踐中,RFE通過CV尋找最優的n_features_to_select,sklearn封裝了結合CV的RFE,即RFECV。在RFECV中,如果減少特征會造成性能損失,那么將不會去除任何特征。RFECV適合選取單模型特征,但是計算量較大。sklearn中RFECV的主要參數為:

* estimator -- 基學習器

* step -- 默認1,即每次迭代移除一個特征

* cv – 默認2,即二折交叉驗證的方式進行特征選擇

* scoring -- 根據學習目標設定的模型評分標准

* verbose -- 默認0,即不顯示中間過程

* n_jobs -- 默認1,即不使用並行計算,單核計算

# 遞歸特征消除法的工程實踐

    下面程序中,分別使用原始特征集、經過RFE特征選擇后的特征集、經過RFECV特征選擇后的特征集,訓練線性支持向量機,結果顯示使用RFECV處理后的特征集訓練線性支持向量機模型效果最好。

# -*- coding: utf-8 -*-
"""
# author: wanglei5205
# blog:http://cnblogs.com/wanglei5205
# github:http://github.com/wanglei5205
"""
### 生成數據
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000,         # 樣本個數
                           n_features=25,          # 特征個數
                           n_informative=3,        # 有效特征個數
                           n_redundant=2,          # 冗余特征個數(有效特征的隨機組合)
                           n_repeated=0,           # 重復特征個數(有效特征和冗余特征的隨機組合)
                           n_classes=8,            # 樣本類別
                           n_clusters_per_class=1, # 簇的個數
                           random_state=0)

### 特征選擇
# RFE
from sklearn.svm import SVC
svc = SVC(kernel="linear")

from sklearn.feature_selection import RFE
rfe = RFE(estimator = svc,           # 基分類器
          n_features_to_select = 2,  # 選擇特征個數
          step = 1,                  # 每次迭代移除的特征個數 
          verbose = 1                # 顯示中間過程
          ).fit(X,y)
X_RFE = rfe.transform(X)
print("RFE特征選擇結果——————————————————————————————————————————————————")
print("有效特征個數 : %d" % rfe.n_features_)
print("全部特征等級 : %s" % list(rfe.ranking_))
"""
有效特征個數 : 2
全部特征等級 : [6, 1, 13, 20, 16, 7, 18, 2, 3, 22, 24, 12, 17, 11, 14, 23, 9, 15, 1, 21, 8, 10, 4, 5, 19]
"""
# RFECV
from sklearn.svm import SVC
svc = SVC(kernel="linear")

from sklearn.model_selection import StratifiedKFold
from sklearn.feature_selection import RFECV
rfecv = RFECV(estimator=svc,          # 學習器
              step=1,                 # 移除特征個數
              cv=StratifiedKFold(2),  # 交叉驗證次數
              scoring='accuracy',     # 學習器的評價標准
              verbose = 1,
              n_jobs = 1
              ).fit(X, y)
X_RFECV = rfecv.transform(X)
print("RFECV特征選擇結果——————————————————————————————————————————————————")
print("有效特征個數 : %d" % rfecv.n_features_)
print("全部特征等級 : %s" % list(rfecv.ranking_))
"""
有效特征個數 : 3
全部特征等級 : [5, 1, 12, 19, 15, 6, 17, 1, 2, 21, 23, 11, 16, 10, 13, 22, 8, 14, 1, 20, 7, 9, 3, 4, 18]
"""

### 數據拆分
from sklearn.model_selection import train_test_split
x_a_train,x_a_test,y_a_train,y_a_test = train_test_split(X,y,random_state = 33,test_size = 0.25)
x_b_train,x_b_test,y_b_train,y_b_test = train_test_split(X_RFE,y,random_state = 33,test_size = 0.25)
x_c_train,x_c_test,y_c_train,y_c_test = train_test_split(X_RFECV,y,random_state = 33,test_size = 0.25)

### 效果比較
svc_a = SVC(kernel="linear").fit(x_a_train,y_a_train)
svc_b = SVC(kernel="linear").fit(x_b_train,y_b_train)
svc_c = SVC(kernel="linear").fit(x_c_train,y_c_train)

print("效果比較————————————————————————————————————————————————————————")
print("no feature select",svc_a.score(x_a_test,y_a_test))
print("RFE feature select",svc_b.score(x_b_test,y_b_test))
print("RFECV feature select",svc_c.score(x_c_test,y_c_test))

"""
no feature select 0.74
RFE feature select 0.448
RFECV feature select 0.84
"""


免責聲明!

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



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