【数据竞赛】懒人特征筛选算法!
Kaggle竞赛知识点--RFE!
Recursive Feature Elimination(RFE)算法是数据竞赛中最为流行的特征筛选方案之一,和我们平时在做try and error的思路相似:
每次我们从数据集中找到最不重要的特征,然后将其删除,再基于新数据集重新训练,重新筛选......
因而非常多的数据科学家都会推荐大家使用其作为非常强的Baseline。
RFE是一种wrapper类型的特征筛选算法,也就是说:
我们给定一个机器学习算法,该机器学习算法被RFE包裹,然后一起做特征选择。
因为RFE的使用需要同时输入模型以及保留的特征数,但是保留多少的特征是一个未知的事情,较难控制,这个时候我们需要用到RFECV,一种结合了交叉验证以及RFE的方案,该方案能自动筛选出保留的特征个数,在实践中效果也非常的不错。
本文就重点介绍RFE以及REFCV特征筛选算法。
1. RFE
递归特征消除(RFE)方法的工作步骤为:
输入用于特征筛选的模型以及需要保留的特征数; 对指定的模型使用所有的特征进行训练; 依据模型给出的特征重要性,删除最不重要的少数几个特征;
特征一般是按照模型输出的特征重要性排序的;
将剩余的特征重新输入指定模型进行训练,删除最不重要的少数几个特征,依次类推,直至最后我们的特征数目小于等于我们要保留的数目之后停止。
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折的交叉验证,带来的时间成本会变为原先的几倍,一般建议充分考虑计算资源以及数据大小再使用。
Recursive Feature Elimination (RFE) for Feature Selection in Python Recursive Feature Elimination Feature Ranking RFE, Random Forest, linear models Recursive Feature Elimination (RFE) example sklearn.feature_selection.RFECV sklearn.feature_selection.RFE
往期精彩回顾
本站qq群851320808,加入微信群请扫码: