天天看点

sklearn - 特征工程特征工程–基于sklearn

特征工程–基于sklearn

什么是特征工程

Feature engineering is the process of using domain knowledge of the data to create features that make machine learning algorithms work. Feature engineering is fundamental to the application of machine learning, and is both difficult and expensive. The need for manual feature engineering can be obviated by automated feature learning.Feature engineering is an informal topic, but it is considered essential in applied machine learning.----------from wikipedia
“数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这里的数据指的就是经过特征工程得到的数据。特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器学习模型逼近这个上限。特征工程能使得模型的性能得到提升,有时甚至在简单的模型上也能取得不错的效果。特征工程在机器学习中占有非常重要的作用,一般认为括特征构建、特征提取、特征选择三个部分。特征构建比较麻烦,需要一定的经验。 特征提取与特征选择都是为了从原始特征中找出最有效的特征。它们之间的区别是特征提取强调通过特征转换的方式得到一组具有明显物理或统计意义的特征;而特征选择是从特征集合中挑选一组具有明显物理或统计意义的特征子集。两者都能帮助减少特征的维度、数据冗余,特征提取有时能发现更有意义的特征属性,特征选择的过程经常能表示出每个特征的重要性对于模型构建的重要性。------from https://www.cnblogs.com/wxquare/p/5484636.html

简单的说,原始数据有时候不能直接用来训练模型,因为原始数据可能存在许多问题致使训练出的模型效果极差,比如,无关特征太多,存在关联特征,甚至原始数据是假的等等。所以,为了更好地构建模型,我们需要对原始数据进行处理,比如:选择部分有用地特征,合并相互关联地特征,删除假特征等等。

本文主要介绍sklearn下的几种特征工程方法。(但是,由于时间关系,暂时只介绍RFE,剩下的日后会更新)

1.1RFE(递归特征消除 Recursive feature elimination)

递归特征消除的主要思想是选择一个模型之后,先在原始数据上进行训练,求得各个特征的权重,删除权重最小的特征;然后重复训练,删除最小权重特征,直到剩下的特征数目为你所指定的特征数。

RFE本质上是一种贪心算法,所以如果特征的数目非常多,而你电脑又不行,特征选择的过程会十分漫长,博主在处理一个有300个特征的数据集时,在笔记本上跑了十多分钟仍然没有结束,不过,在2080Ti显卡上几秒钟就结束了。

1.2例子

使用rfe选择特征

# train_X,train_y 分别为训练集的特征和标签部分
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier()
rfe = RFE(rfc, n_features_to_select=50)
rfe.fit(train_X, train_y)
           

但是,我们还没得到新的训练集,我使用的是rfe的get_support方法

# get_support()返回的是一个布尔型列表
p = rfe.get_support()

# 查看一下p的内容
p
           
array([False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False,  True, False, False,
       False, False, False,  True, False, False, False,  True, False,
        True, False, False,  True, False, False,  True, False, False,
       False,  True,  True, False,  True, False, False, False, False,
       False, False,  True, False, False, False,  True,  True, False,
        True, False,  True, False, False, False, False, False,  True,
       False,  True, False, False, False, False, False, False, False,
        True, False,  True, False,  True, False, False, False, False,
       False, False,  True, False, False, False,  True, False, False,
        True, False, False, False, False, False, False, False, False,
        True, False,  True, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False,  True, False,  True,
       False, False, False,  True, False,  True, False, False,  True,
       False, False, False, False, False,  True,  True,  True, False,
        True, False, False, False, False,  True, False, False, False,
       False,  True,  True,  True, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False,  True, False, False, False, False, False, False, False,
       False, False,  True, False, False, False, False, False, False,
        True,  True, False, False, False, False, False, False,  True,
        True, False, False, False,  True, False, False, False,  True,
        True, False,  True, False,  True, False,  True, False, False,
        True, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False])
           

可以看出,p中每一个布尔值表示对应的特征是否被选择了。既然如此,我们怎么把这些被选中的特征提取出来组成新的训练集呢?

# 特征因子
predictors = []
for i in range(len(p)):
    if p[i] == True:
        predictors.append(str(i))

test_new = test[predictors]
train_new = train[predictors] 
           

下面就可以使用新的训练集和测试集来完成任务了。

1.3RFE主要参数介绍

参数名 可选性 含义
estimator 必选 所使用的模型,例如上面我所使用的随机森林
n_features_to_select 可缺省(默认特征量的一半) 你所想要选择的特征数目
step 可缺省(默认为1) 每次删除的特征数目。如果使用0到1的小数,表示每次删除特征数的百分比

还有几个参数由于对于初学者不太重要,所以不列出来。

1.4方法

方法名称 含义
fit(X, y) Fit the RFE model and then the underlying estimator on the selected features.
fit_transform(X[, y]) Fit to data, then transform it.
get_params([deep]) Get parameters for this estimator.
get_support([indices]) Get a mask, or integer index, of the features selected
inverse_transform(X) Reverse the transformation operation
predict(X) Reduce X to the selected features and then predict using the underlying estimator.
score(X, y) Reduce X to the selected features and then return the score of the underlying estimator.
set_params(**params) Set the parameters of this estimator.
transform(X) Reduce X to the selected features.

to be continued…

继续阅读