Selecting good features——IV. Stability selection & RFE

在特征工程当中,我们经常要对特征进行选择。最近在做股票的多因子分析,指导老师给了我一篇英文文献让我看一下,文献中用到了Stability和RFE两种方法,因此,我在这里对这两种方法进行一下说明。

Stability——稳定性选择
RFE——递归特征消除(Recursive Feature Elimination)

以上两种方法都可以考虑wrapper方法。他们都建立在基于模型的选择方法之上,利用不同的数据子集,构建不同的模型,并从聚合中给出排名。

Stability selection

稳定性选择是用于特征选择的相对新颖的方法,高层次的想法是将特征选择算法应用于不同的数据子集和不同的特征子集。对这个方法进行多次重复,然后我们汇总选择结果。例如,通过检查特征在被检查的特征子集中的被选择为最重要的次数。我们可以预期,最强大的特征的出现次数将达到100%,因为他们总是在可能的情况下被选择到;较弱但是也比较相关的特征的将具有一个非零的数字,因为当在当前选择的子集中不存在较强特征时将选择它们,而不相关特征将具有零分(接近于零),因为它们将永远不会被选中特征。

Sklearn在randomized lasso和randomized logistics regression classes中实现稳定性选择,代码如下所示。

from sklearn.linear_model import RandomizedLasso
from sklearn.datasets import load_boston
boston = load_boston()

#using the Boston housing data. 
#Data gets scaled automatically by sklearn's implementation
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]

rlasso = RandomizedLasso(alpha=0.025)
rlasso.fit(X, Y)

print "Features sorted by their score:"
print sorted(zip(map(lambda x: round(x, 4), rlasso.scores_), 
                 names), reverse=True)

得到以下结果:

Features sorted by their score:
[(1.0, ‘RM’), (1.0, ‘PTRATIO’), (1.0, ‘LSTAT’), (0.62, ‘CHAS’), (0.595, ‘B’), (0.39, ‘TAX’), (0.385, ‘CRIM’), (0.25, ‘DIS’), (0.22, ‘NOX’), (0.125, ‘INDUS’), (0.045, ‘ZN’), (0.02, ‘RAD’), (0.015, ‘AGE’)]

前三个特征的分数相等,这意味着它们总是被选为有用的特征(当然,当改变正则化参数时,这可能并且会改变,但sklearn可以实现自动选择好的α 参数)。分数开始平稳下降,但总的来说,下降并不像在纯粹的lasso或随机森林中那样急剧下降,这意味着稳定性选择对于纯粹的特征选择以减少过度拟合和对于数据解释都是有用的:一般而言,好的特征不会得到0作为系数,因为数据集中存在类似的相关特征(与lasso相同)。对于特征选择,我发现它是许多不同数据集和设置的最佳执行方法之一

Recursive feature elimination

递归特征消除是重复构建模型(比如SVM或者回归模型),然后选择表现最佳或最差的特征(比如基于corr),把特征放在一遍,然后重复该过程。对这个过程一直进行重复,直到数据集中的所有特征都用尽,然后根据特征被消除的先后顺序进行排序。所以这是一种寻找最佳特征子集的贪婪算法

RFE的稳定性在很大程度上取决于每次迭代中用于特征排序的模型类型。 正如非正则回归可能不稳定一样,RFE在使用它时也是如此,使用岭回归可以提供更稳定的结果。

Sklearn提供了RFE,也提供了RFECV,通过循环的交叉验证找到规定数量的最佳特征。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression

boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]

#use linear regression as the model
lr = LinearRegression()
#rank all features, i.e continue the elimination until the last one
rfe = RFE(lr, n_features_to_select=1)
rfe.fit(X,Y)

print "Features sorted by their rank:"
print sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names))

Features sorted by their rank:
[(1.0, ‘NOX’), (2.0, ‘RM’), (3.0, ‘CHAS’), (4.0, ‘PTRATIO’), (5.0, ‘DIS’), (6.0, ‘LSTAT’), (7.0, ‘RAD’), (8.0, ‘CRIM’), (9.0, ‘INDUS’), (10.0, ‘ZN’), (11.0, ‘TAX’), (12.0, ‘B’), (13.0, ‘AGE’)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值