【数据竞赛】懒人特征筛选算法!

共 4469字,需浏览 9分钟

 ·

2021-05-29 13:41

作者:杰少

Kaggle竞赛知识点--RFE!

简 介

Recursive Feature Elimination(RFE)算法是数据竞赛中最为流行的特征筛选方案之一,和我们平时在做try and error的思路相似:

  • 每次我们从数据集中找到最不重要的特征,然后将其删除,再基于新数据集重新训练,重新筛选......

因而非常多的数据科学家都会推荐大家使用其作为非常强的Baseline。

RFE是一种wrapper类型的特征筛选算法,也就是说:

  • 我们给定一个机器学习算法,该机器学习算法被RFE包裹,然后一起做特征选择。

因为RFE的使用需要同时输入模型以及保留的特征数,但是保留多少的特征是一个未知的事情,较难控制,这个时候我们需要用到RFECV,一种结合了交叉验证以及RFE的方案,该方案能自动筛选出保留的特征个数,在实践中效果也非常的不错。

本文就重点介绍RFE以及REFCV特征筛选算法。

Recursive Feature Elimination

1. RFE

递归特征消除(RFE)方法的工作步骤为:

  1. 输入用于特征筛选的模型以及需要保留的特征数;
  2. 对指定的模型使用所有的特征进行训练;
  3. 依据模型给出的特征重要性,删除最不重要的少数几个特征;
    • 特征一般是按照模型输出的特征重要性排序的;
  1. 将剩余的特征重新输入指定模型进行训练,删除最不重要的少数几个特征,依次类推,直至最后我们的特征数目小于等于我们要保留的数目之后停止。

2.RFECV

RFE方法使用所有数据进行训练,再依据模型给出特征重要性进行特征的筛选,之后再依据筛选之后的数据重新训练模型,再筛选,直到剩下的特征数达到我们设定的阈值时就停止,这么做受到一个非常大的限制:

  • 保留的特征数需要预先人为设定,但很多时候我们并不知道需要保留多少特征;

所以最终我们得到的结果往往是次优的。为了缓解该问题,我们将交叉策略与RFE进行结合;我们通过计算在不同特征数时模型的交叉分数,然后选择交叉分数最好的特征数进行输出。

代 码

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.构建数据集
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训练
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算法需要每次都重新训练进行特征筛选,当数据集非常大的时候,时间成本非常大,如果使用RFECV则还需要进行N折的交叉验证,带来的时间成本会变为原先的几倍,一般建议充分考虑计算资源以及数据大小再使用。

参考文献
  1. Recursive Feature Elimination (RFE) for Feature Selection in Python
  2. Recursive Feature Elimination
  3. Feature Ranking RFE, Random Forest, linear models
  4. Recursive Feature Elimination (RFE) example
  5. sklearn.feature_selection.RFECV
  6. sklearn.feature_selection.RFE


往期精彩回顾





本站qq群851320808,加入微信群请扫码:

浏览 83
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报