数据筛选特征方法-递归特征消除

主要思想:对特征含有权重的预测模型(例如,线性模型对应参数coefficients),RFE通过递归减少考察的特征集规模来选择特征。首先,预测模型在原始特征上训练,每个特征指定一个权重。之后,那些拥有最小绝对值权重的特征被踢出特征集。如此往复递归,直至剩余的特征数量达到所需的特征数量。

RFECV 通过交叉验证的方式执行RFE,以此来选择最佳数量的特征:对于一个数量为d的feature的集合,他的所有的子集的个数是2的d次方减1(包含空集)。指定一个外部的学习算法,比如SVM之类的。通过该算法计算所有子集的validation error。选择error最小的那个子集作为所挑选的特征。

本例主要通过sklearn.feature_selection.RFE来实现

*class sklearn.feature_selection.RFE(estimator, , n_features_to_select=None, step=1, verbose=0)

https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html

在这里插入图片描述
代码示例

class feature_select_lr():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def feature_rfe(self, model):
        rfe = RFE(estimator=model, n_features_to_select=1,step=1)
        rfe.fit(x,y)
        feature_ranks = []
        for i,j in zip(x.columns,rfe.ranking_):
            feature_ranks.append([i,j])
        feature_ranks = pd.DataFrame(feature_ranks,columns=['var_name','rank'])
        return feature_ranks

    def get_opt_feature(self,rank_num):
        lr = LR(solver='liblinear')
        dt = DT(criterion='gini')
        rf = RF(n_estimators=100, criterion='gini', max_depth=3)
        estimator_list = [lr, dt, rf]
        results = pd.DataFrame()
        for e in estimator_list:
            result = self.feature_rfe(e);
            results = results.append(result)
        result_mean = results.groupby(['var_name'])['rank'].mean()
        return result_mean.sort_values(ascending=False)[:rank_num],results

if __name__ == '__main__':
    t = feature_select_lr(x, y).get_opt_feature(5)
    print(t)

首先利用某个算法如lr反复构建模型,然后依次选出最好的特征及顺序,然后用lr、dt、rf三个算法分别做一次再取顺序的平均值,最终按平均值的排序即为最优的顺序,结果如下:
在这里插入图片描述

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值