【數(shù)據(jù)競賽】懶人特征篩選算法!
Kaggle競賽知識點--RFE!

Recursive Feature Elimination(RFE)算法是數(shù)據(jù)競賽中最為流行的特征篩選方案之一,和我們平時在做try and error的思路相似:
每次我們從數(shù)據(jù)集中找到最不重要的特征,然后將其刪除,再基于新數(shù)據(jù)集重新訓(xùn)練,重新篩選......
因而非常多的數(shù)據(jù)科學(xué)家都會推薦大家使用其作為非常強的Baseline。
RFE是一種wrapper類型的特征篩選算法,也就是說:
我們給定一個機器學(xué)習(xí)算法,該機器學(xué)習(xí)算法被RFE包裹,然后一起做特征選擇。
因為RFE的使用需要同時輸入模型以及保留的特征數(shù),但是保留多少的特征是一個未知的事情,較難控制,這個時候我們需要用到RFECV,一種結(jié)合了交叉驗證以及RFE的方案,該方案能自動篩選出保留的特征個數(shù),在實踐中效果也非常的不錯。
本文就重點介紹RFE以及REFCV特征篩選算法。

1. RFE
遞歸特征消除(RFE)方法的工作步驟為:
輸入用于特征篩選的模型以及需要保留的特征數(shù); 對指定的模型使用所有的特征進行訓(xùn)練; 依據(jù)模型給出的特征重要性,刪除最不重要的少數(shù)幾個特征;
特征一般是按照模型輸出的特征重要性排序的;
將剩余的特征重新輸入指定模型進行訓(xùn)練,刪除最不重要的少數(shù)幾個特征,依次類推,直至最后我們的特征數(shù)目小于等于我們要保留的數(shù)目之后停止。
2.RFECV
RFE方法使用所有數(shù)據(jù)進行訓(xùn)練,再依據(jù)模型給出特征重要性進行特征的篩選,之后再依據(jù)篩選之后的數(shù)據(jù)重新訓(xùn)練模型,再篩選,直到剩下的特征數(shù)達到我們設(shè)定的閾值時就停止,這么做受到一個非常大的限制:
保留的特征數(shù)需要預(yù)先人為設(shè)定,但很多時候我們并不知道需要保留多少特征;
所以最終我們得到的結(jié)果往往是次優(yōu)的。為了緩解該問題,我們將交叉策略與RFE進行結(jié)合;我們通過計算在不同特征數(shù)時模型的交叉分數(shù),然后選擇交叉分數(shù)最好的特征數(shù)進行輸出。

1. 基于RFC的特征選擇
# !pip install yellowbrick
from yellowbrick.datasets import load_credit
import numpy as np
from numpy import mean
from numpy import std
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.feature_selection import RFECV,RFE
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler,StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
import pandas as pd
# 1.構(gòu)建數(shù)據(jù)集
X, y = load_credit()
columns = X.columns
X = X[:5000]
X = StandardScaler().fit_transform(X)
y = y[:5000]
輸出每個特征的排名
# 2.輸入的模型;保留一個特征:這樣可以輸出每個特征的rankings
lr = LogisticRegression()
rfe = RFE(lr, n_features_to_select=1, verbose =-1 ) #
rfe.fit(X,y)
# 3.輸出每個特征的重要性,此處也可以直接觀察rankings來判定
ranks = {}
def ranking(ranks, names, order=1):
minmax = MinMaxScaler()
ranks = minmax.fit_transform(order*np.array([ranks]).T).T[0] # 1表示最重要
ranks = map(lambda x: round(x,2), ranks)
return dict(zip(names, ranks))
fea_imp = ranking(list(map(float, rfe.ranking_)), columns, order=-1)
rfe.ranking_
'''
array([20, 23, 14, 9, 13, 1, 16, 7, 19, 11, 12, 3, 8, 4, 22, 10, 21,5, 2, 18, 6, 17, 15])
'''輸出保留的特征名
columns[rfe.support_]
'''
Index(['apr_delay'], dtype='object')
'''
2.基于REFCV的特征選擇
輸出我們每個特征的排名
# 使用RFECV訓(xùn)練
rfecv = RFECV(estimator=DecisionTreeClassifier(), step=1, cv=5)
rfecv.fit(X, y)
rfecv.ranking_
'''
array([ 1, 12, 8, 10, 1, 1, 14, 7, 13, 9, 11, 1, 1, 5, 1, 1, 4, 2, 1, 3, 6, 1, 1])
'''
array([ 1, 12, 8, 10, 1, 1, 14, 7, 13, 9, 11, 1, 1, 5, 1, 1, 4,
2, 1, 3, 6, 1, 1])
輸出保留的特征名
columns[rfecv.support_]
'''
Index(['limit', 'age', 'apr_delay', 'apr_bill', 'may_bill', 'jul_bill',
'aug_bill', 'may_pay', 'aug_pay', 'sep_pay'],
dtype='object')
'''

Recursive Feature Elimination(RFE)算法是Wrapper類型的特征篩選算法,我們只需要簡單的改變輸入模型就可以得到篩選的特征,非常簡單易懂,RFE幾乎是適用于目前見到的90%的問題的,可以作為特征篩選的一個重要的Baseline。
因為RFE算法需要每次都重新訓(xùn)練進行特征篩選,當(dāng)數(shù)據(jù)集非常大的時候,時間成本非常大,如果使用RFECV則還需要進行N折的交叉驗證,帶來的時間成本會變?yōu)樵鹊膸妆?/span>,一般建議充分考慮計算資源以及數(shù)據(jù)大小再使用。

Recursive Feature Elimination (RFE) for Feature Selection in Python Recursive Feature Elimination Feature Ranking RFE, Random Forest, linear models Recursive Feature Elimination (RFE) example sklearn.feature_selection.RFECV sklearn.feature_selection.RFE
往期精彩回顧
本站qq群851320808,加入微信群請掃碼:
