RFE递归特征消除

173 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

其算法本质是回归模型的反复构建。

Step1.数据标准化

Step2,:利用线性、lasso、岭回归或者向量机回归等等

Step3:根据回归系数大小,选出最好的特征,然后取出,保存下来。

Step4:在剩余特征中重复上述算法。

Step5:多次重复,直到遍历所有特征。特征逐步消失的顺序就是其重要性排序。

 

RFECV :通过交叉验证的方式进行RFE (sci-kitlearn 已经实现)


SS 算法(稳定性选择)( 通过随机lasso (RandomizedLasso )和随机逻辑回归(RandomizedLogisticRegression )来实现)

类似于RFE的算法。但运行的范围不同,RFE在整个数据集中进行特征选择算法。SS算法要在不同的子数据集(选取部分行组成子集)和不同的特征子集(选取部分列组成子集)上运行特征选择算法,即回归算法(也可以是其它算法)。然后把在每个特征子集和数据子集上的运行结果汇总。然后计算特征被选择的频率,即特征被选择为重要特征次数除以他所在子集被测试次数(更确切地说特征本身被测试次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。

例子:

 

from sklearn.feature_selection import RFE

from sklearn.linear_model import LinearRegression

from sklearn.datasets import load_boston

boston = load_boston()

#波士顿房价数据集

X = boston["data"]

Y = boston["target"]

names = boston["feature_names"]

lr = LinearRegression()

rfe = RFE(lr, n_features_to_select=1)

#创建rfe模型

rfe.fit(X,Y)

#训练rfe模型

rfe.support_,rfe.ranking_

array([False, False, False, False,  True, False, False, False, False,

        False, False, False, False], dtype=bool),

 array([ 8, 10,  9,  3,  1,  2, 13,  5,  7, 11,  4, 12,  6]))

sorted(zip(list(rfe.ranking_),list(names)))

#然后用岭回归模型运行一次,看一下结果是否有大的出入

from sklearn.linear_model import (LinearRegression, Ridge,

                                  Lasso, RandomizedLasso)

rd=Ridge()

rfe = RFE(rd, n_features_to_select=1)

rfe.fit(X,Y)

Out[46]:

RFE(estimator=Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,

   normalize=False, random_state=None, solver='auto', tol=0.001),

  n_features_to_select=1, step=1, verbose=0)

sorted(zip(list(rfe.ranking_),list(names)))

 

#我们发现,重要特征排序差不多一样

#下面我们应用SS算法来实现特征选取

 

from sklearn.linear_model import RandomizedLasso

from sklearn.datasets import load_boston

boston = load_boston()

X = boston["data"]

Y = boston["target"]

names = boston["feature_names"]

rlasso = RandomizedLasso('bic')

rlasso.fit(X, Y)

sorted(zip(list(map(lambda x:'%.2f'% x,rlasso.scores_)),list(names)))