我总结了以下特征工程的一些方法,好的数据和特征往往在数据挖掘当中会给我们带来更好的acc,尤其对于数据挖掘而言。数据决定了预测准确度的上线,而模型的目的则是去尽量逼近这个上限。由此可见,对数据进行特征工程,拥有良好的数据是多么的重要。

对于特征工程而言,我们一般会对类别型数据或者数值型数据进行相应的编码。下面我们首先来看看对类别型数据进行编码:

一.one-hot编码

形式:one-hot编码是以one of k的形式。

用途:在所有的线性模型,nlp的词汇也可以用这种方式进行编码,树模型不适合

优点:简单,可以对所有类别型数据进行编码

缺点:会带来维度爆炸(如果属性的类别过多,那么经过one hot处理之后,会产生2^n个新的维度)和特征稀疏(因为会出现很多0)

实现方法:
1.在pandas中使用:get_dummies

2.在sklearn中使用OneHotEncode

 

如下图所示:

【机器学习】:特征工程

 

二.Label Encoding 标签编码

形式:将每个类别数据使用独立的数字IDj进行编码

用途:在树模型当中比较适合 

优点:简单,不增加类别的维度

缺点:会改变原始标签的类别次序,one-hot不会具有大小关系

实现方法;

sklearn的labelencoder

pandas中的factorize

如下图所示:

【机器学习】:特征工程

 

在lightbgm和catboost当中会指定类别类型,当然在xgboost/lightbgm的后续版本当总已经不需要使用labelencoder,会自动对已经是数值型的类别数据进行相应的处理

三.顺序编码

 形式:按照类别的大小关系进行编码

用途:在大部分场景都适用

优点;简单,不会增加类别的维度

缺点:需要人工知识

实现方法:手动定义字典进行映射

使用代码如下所示:

【机器学习】:特征工程

 

 四.Frequency Encoding, Count Encoding

 形式:按照类别出现的次数和频率进行编码(做的优先级低于前面的encoding)

用途:在大部分场景都适用

优点;简单,可以统计类别的次数,从一列的角度进行统计,模型可以学习到频率的信息

缺点:容易收到类别分布带来的影响,比如train 和test的类别分布频率是不一样的,那么对test预测结果可能就没有那么准确,acc不升反降。

实现方法:使用次数进行统计

使用代码如下所示:

【机器学习】:特征工程

 

 五. Mean/Target Encoding

形式:将类别对应的标签概率进行相应的编码,比如某个country在某个target下出现的概率大小。example:

country为china,target为0或者1,那么概率为0.5 。如果target为0,1,2,则概率为1/3

用途:在大部分场景都适用

优点;让模型能够学习到标签之间相互的一个信息

缺点:容易过拟合,因为比如target只有一个数值,china对应的这一个数值1的概率也永远为1,相当于把country=china这个数值泄漏了出去。造成过拟合

实现方法:使用次数进行统计

【机器学习】:特征工程

 

 

下面我们进行数值型数据的特征工程:

一.Round

形式:将数值进行缩放,取整

用途:在大部分场景都适用

优点:可以保留数值的大部分信息

【机器学习】:特征工程

 

二.数据的分箱

特点:将连续的特征离散化 

备注:其实cart回归树(决策树/xgboost/gbdt当中均使用)自动也会帮我们形成一个最优的数据分箱策略,使用的是均方误差来进行的衡量,有的时候可能还比我们手动做数据的分箱更加管用

代码如下所示:

【机器学习】:特征工程