遞歸特征消除(RFE)+ 交叉驗證

遞歸特征消除(Recursive feature elimination)

遞歸特征消除的主要思想是反復(fù)構(gòu)建模型,然后選出最好的(或者最差的)特征(根據(jù)系數(shù)來選),把選出來的特征放到一邊,然后在剩余的特征上重復(fù)這個過程,直到遍歷了所有的特征。在這個過程中被消除的次序就是特征的排序。

RFE的穩(wěn)定性很大程度上取決于迭代時,底層用的哪種模型。比如RFE采用的是普通的回歸(LR),沒有經(jīng)過正則化的回歸是不穩(wěn)定的,那么RFE就是不穩(wěn)定的。假如采用的是Lasso/Ridge,正則化的回歸是穩(wěn)定的,那么RFE就是穩(wěn)定的。

from sklearn.feature_selection import RFE
from sklearn.feature_selection import RFECV
from sklearn.linear_model import LinearRegression,Ridge,Lasso
from pandas import read_csv
import numpy as np
from scipy.stats import pearsonr
from sklearn.model_selection import StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
import csv

tps = read_csv('E:\workfile\data\trade\tps.csv', header=0)
label = np.array(tps)[:, 0]
feature = np.array(tps)[:, 1:]

def RFErfe():

# 這里的算法可以換成其他
# lr = LinearRegression()
# 這里一開始選擇的是不帶正則化的LR
# 但是如果RFE采用的底層模型不穩(wěn)定的話,RFE就是不穩(wěn)定的
lr = Ridge(alpha=100000, fit_intercept=True, normalize=True,
           copy_X=True, max_iter=1500, tol=1e-4, solver='auto')

# 這里不帶交叉驗證的部分
# estimator估計函數(shù)
rfe = RFE(estimator=lr, n_features_to_select=1)
rfe.fit(feature, label)
# 和傳參對應(yīng),所選擇的屬性的個數(shù)
print(rfe.n_features_)
# 打印的是相應(yīng)位置上屬性的排名
print(rfe.ranking_)
# 屬性選擇的一種模糊表示,選擇的是true,未選擇的是false
print(rfe.support_)
# 第1個屬相的排名
print(rfe.ranking_[1])
# 外部估計函數(shù)的相關(guān)信息
print(rfe.estimator_)

看一下RFE的輸入?yún)?shù):
estimator:估計函數(shù),底層的回歸模型。一個監(jiān)督學(xué)習(xí)的估計函數(shù),有fit方法,fit方法,通過coef_ 屬性或者 feature_importances_ 屬性來提供feature重要性的信息。
n_features_to_select : int or None (default=None)選擇(最優(yōu))feature的數(shù)量,超出的部分按照關(guān)聯(lián)性排序。如果選擇None, 就選擇一半的feature。
step:int or float, 可選(default=1)如果大于等于1,step對應(yīng)于迭代過程中每次移除的屬性的數(shù)量(integer)。如果是(0.0,1.0),就對應(yīng)于每次移除的特征的比例,四舍五入。

可以調(diào)用的屬性:
n_features_ : int所選特征的數(shù)量。


image.png

這是n_features_to_select=2時候的運(yùn)行結(jié)果,可以看出來,兩個部分的屬性應(yīng)該是最好的,超過的部分按照屬性相關(guān)的強(qiáng)弱一次排序。


image.png

這是n_features_to_select=1時候的運(yùn)行截圖。
兩相對比可以很清楚的看明白了。

support_ : array of shape [n_features],[n_features]大小的array,所選特征的一種模糊的表示,可以看出來,打印結(jié)果就是true和false,最優(yōu)的是true,別的是false。
ranking_ : array of shape [n_features],[n_features]大小的array,特征的排序,比如 ranking_[i]表示的就是第i個特征的排名位置。估計最佳的屬性被排為1.

image.png

由上圖可以看出,第1個屬性的排名是第9位。
estimator_ : object外部估計函數(shù)的相關(guān)信息。
image.png

-------------------------------------------------------------------------------------------------------------------上面說的是不帶交叉驗證的部分,下面講一下帶交叉驗證的部分。--------------------------------------------------------------------------------------------------------
from sklearn.feature_selection import RFECV
from pandas import read_csv
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import KFold

tps = read_csv('E:\workfile\data\trade\tps.csv', header=0)
label = np.array(tps)[:, 0]
feature = np.array(tps)[:, 1:]

rfr = RandomForestRegressor()

rfecv = RFECV(estimator=rfr, cv=KFold(n_splits=2, random_state=1), scoring='neg_mean_squared_error')
rfecv.fit(feature, label)
print(rfecv.n_features_)
print(rfecv.ranking_)
image.png

這是運(yùn)行結(jié)果。
按照慣例跟進(jìn)去看一下源碼。
傳入?yún)?shù):
estimator:和上面的一樣。

step:和上面的一樣。

cv:int,交叉驗證的生成器或者迭代器。可選。
cv可選擇的輸入為:
-None,使用默認(rèn)的3折交叉驗證。
-integer,指定交叉驗證的折數(shù)。
-一個object用作交叉驗證的生成器。
-一種迭代的訓(xùn)練/測試集的分割。
對于None或者integer的輸入。如果“y”是二分類或者多分類,就要用
class:sklearn.model_selection.StratifiedKFold
如果估計函數(shù)是一個分類器,或者“y”不是二分類也不是多分類,就要用
class:sklearn.model_selection.KFold
這里可以使用多種交叉驗證的方法。
我這里使用的是回歸的數(shù)據(jù),因此可以知道使用的是KFold。
跟進(jìn)去看一下KFold的源碼。
n_splits : int, default=3,交叉驗證的折數(shù),默認(rèn)3,最少是2。
shuffle : boolean, optional,可選。是否在分割成若干批次之前對數(shù)據(jù)進(jìn)行洗牌。
random_state : int, RandomState 實例,或者None, optional, 可選default=None默認(rèn)None。
如果是int, random_state是隨機(jī)數(shù)生成器的種子。(指定一個,不指定的話每次結(jié)果都會不一樣)
如果是RandomState 實例, random_state是隨機(jī)數(shù)生成器。
如果是None,隨機(jī)數(shù)是通過 RandomState 實例np.random生成的。此時shuffle == True.

scoring : string, callable(可調(diào)用的) or None, optional,可選的 default: None,默認(rèn):None,評分標(biāo)準(zhǔn)。一個string型(參考model evaluation documentation模型評估文檔)或者一個可以調(diào)用的評分object/function
with signaturescorer(estimator, X, y).
可調(diào)用的屬性:
n_features_ : int,通過交叉驗證得到的特征選擇的數(shù)量。
support_:和上面一樣。
ranking_:和上面一樣。
grid_scores_:array of shape [n_subsets_of_features],交叉驗證的分?jǐn)?shù),比如 grid_scores_[i] 第i個特征子集的CV分?jǐn)?shù)。grid_scores_ is equal to ceil((n_features - 1) / step) + 1,
estimator_ :和上面一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容