Py学习  »  机器学习算法

机器学习中的特征工程

数据分析 • 2 年前 • 261 次点击  


1

前言:什么是特征工程


数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器学习模型逼近这个上限。


构建一个算法模型需要几个步骤,包括数据准备、特征工程、模型构建、模型调优等,其中特征工程是最重要的步骤,需要 70% 甚至以上的工作量。特征工程主要包括数据预处理、特征选择、特征构造、特征降维等。


通过总结和归纳的特征工程包括以下方面:

 


2

数据预处理


数据预处理是特征工程的最重要的起始步骤,主要包括数据清洗、特征归一化、特征编码、特征离散化等。


2.1

数据清洗

数据清洗是数据预处理阶段的主要组成部分,主要包括缺失值处理、异常值处理、样本不平衡处理等。


2.1.1 缺失值处理

一般来说,未经处理的原始数据中通常会存在缺失值,因此在建模训练之前需要处理好缺失值。


1)缺失数据占比小于 20%。可以通过直接填充法,连续特征一般取均值填充,离散特征可以取众数填充;可以模型预测法,通过随机森林或者决策树进行预测结果填充;也可以通过插值法填充。


2)缺失数据占比大于 20% 小于 50%,这个时候可以把缺失值构建为新的特征,增加一列离散特征,即有缺失数据和无缺失数据。


3)缺失数据占比大于 50%,因为信息量较少,模型可能会学到大量噪音建议直接删除该特征。


像 xgboost 模型自带缺失值处理功能,可以不进行缺失值处理。


2.1.2 异常值处理

异常值,即在数据集中存在不合理的值,又称离群点、极值等。可以通过统计分析、箱线图、聚类、3σ 原则、孤立森林等方法进行检查。一般的处理方法如下:

1)直接删除含有异常值的样本。

2)视为缺失值。利用缺失值处理的方法进行处理。

3)最近值修正。可以用相近的观测值修正该异常值。

4)不处理。可以直接在具有异常值的数据集上进行数据建模。


2.1.3 样本不均衡处理

样本不均衡现象是指正样本数目与负样本数目比列相差很大。处理方法如下:

1)下采样/欠采样(under sampling):从多数类中随机抽取样本从而减少多数类别样本数据,使数据达到平衡的方式。比如本来样本正负例的比例是 10:1,可以对正样本进行下采样构建 10 个正负样本比例为 1:1 的模型,回归结果取平均值,分类结果进行投票。


2)上采样/过采样(Over Sampling):和欠采样采用同样的原理,通过抽样来增加少数样本的数目,从而达到数据平衡的目的。同样比如本来样本正负例的比例是 10:1,可以对负样本进行上采样构建正负样本比例为 1:1 的模型。


3)Smote 算法:Smote 算法属于上采样的一种,通过人工合成的方法来生成少类别的样本。方法也很简单,对于某一个缺少样本的类别,它会随机找出几个该类别的样本,再找出最靠近这些样本的若干个该类别样本,组成一个候选合成集合,然后在这个集合中不停的选择距离较近的两个样本,在这两个样本之间,比如中点,构造一个新的该类别样本。举个例子,比如该类别的候选合成集合有两个样本(x1,y),(x2,y)(x1,y),(x2,y),那么 Smote 采样后,可以得到一个新的训练样本(x1+x22,y)(x1+x22,y),通过这种方法,我们可以得到不改变训练集分布的新样本,让训练集中各个类别的样本数趋于平衡。


4)Focal loss :主要解决分类样本不平衡问题,通过修改交叉熵损失函数,通过增加类别权重 α 和样本难度权重调因子(modulating factor)(1−pt)γ(1−pt)γ,来减缓上述问题。


5)设置损失函数的权重:使得少数类别数据判断错误的损失大于多数类别数据判断错误的损失,即当我们的少数类别数据预测错误的时候,会产生一个比较大的损失值,从而导致模型参数往让少数类别数据预测准确的方向偏。


2.2

特征归一化(标准化)

归一化(标准化),就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。其目的一是把不同量纲的东西放在同一量纲下,保正程序运行时收敛加快,大部分模型归一化后收敛速度会加快。但像树模型不受特征归一化影响,所以不需要特征归一化。


1)归一化处理:最大最小值归一化或者叫 0-1 归一化,取值范围在 [0,1] 处理,max 为样本最大值, min 为样本最小值。

2)标准化处理:这里只介绍一种经常使用的 z-score 标准化,经过处理后的数据均值为 0,标准差为 1,符合标准的正态分布。其中 mean 为平均值,б 为标准差。


2.3

离散特征编码

离散特征无法直接使用,需要编码后才能进行相关计算分析。离散特征编码主要有三种方式,独热编码、数值编码、embedding 编码等。


1)独热(one-hot)编码

将离散型特征的每一种取值都看成一种状态,若你的这一特征中有 N 个不相同的取值,那么我们就可以将该特征抽象成 N 种不同的状态,one-hot 编码保证了每一个取值只会使得一种状态处于 “激活态”,也就是说这 N 种状态中只有一个状态位值为 1,其他状态位都是 0。主要用于数值之间没有大小数值比较,例如将三种不同颜色 red、blue、yellow 编码,映射到( 1 , 0 , 0 ) 、 ( 0 , 1 , 0 )、( 0 , 0 , 1 ) 的向量空间中,映射后类别之间的距离相等,各个类别在运算时权重相等。


2)数值编码

直接将类别 A,B,C … 映射到 1,2,3…,适用于存在大小内在关系的类别特征。例如等级 A>B>C。


3)embedding 编码

embedding 编码适用于类别量太多,如果进行 one-hot 编码太过于稀疏,不利于模型训练,一般通过 embedding 编码进行降维处理,比如 B 端门店、C 端用户等。


2.4

连续特征离散化

在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列 0、1 特征交给模型。像树模型(随机森林、GBDT、Xgboost 等)不需要对连续特征离散化,连续特征离散化主要有用户逻辑回归、神经网络等模型。而离散方式主要有等频、等距、聚类三种。

1)等频:取值范围均匀划成 n 等份,每份的间距相等;

2)等距:均匀分为 n 等份,每份内包含的观察点数相同;

3)聚类:通过聚类分成不同的区间。



3

特征选择


当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:


特征是否发散:如果一个特征不发散,例如方差接近于 0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。


特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。


3.1

方差选择

方差代表特征信息量的大小,使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。方差小于某个阈值或者为 0 的特征可以选择舍弃。


3.2

Filter

Filter 选择法主要有方差分析法、相关系数法、卡方检验法等,用哪种方法取决于特征(X)和标签值(y)的数据类型,是连续还是离散数据。

特征/标签
y连续
y离散
X连续
相关系数法
方差分析法
X离散
卡方检验法
卡方检验法



3.3

L1 正则项

L1 正则项特征选择的原理如下图所示:


但 L1 正则项特征选择在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。


3.4

树选择

因为树模型都是基于特征重要性进行分裂的,像随机森林、GBDT、Xgboost 等可以特征选择以及特征重要度输出。


4

特征组合


为了提高复杂关系的拟合能力,在特征工程中经常会把一阶离散特征进行两两组合,这样就构成了高阶的组合特征。主要有人工组合、多项式组合、GBDT 特征组合等。


4.1

多项式组合

常见的多项式组合有基于多项式的、基于指数函数的、基于对数函数的。4 个特征,度为 2 的多项式转换公式如下:


1)GBDT(Xgboost)特征组合

最初是由 Facebook 在 2014 年提出,并被广泛运用于点击率预估项目上,被证明有效。


动机在于 GBDT 无法直接处理海量的离散特征,复杂度太高,所以主要思路就是先用已有特征训练 GBDT 模型,然后利用 GBDT 模型学习到的树来构造新特征,最后把这些新特征加入原有特征一起训练模型。构造的新特征向量是取值 0/1 的,向量的每个元素对应于 GBDT 模型中树的叶子结点。当一个样本点通过某棵树最终落在这棵树的一个叶子结点上,那么在新特征向量中这个叶子结点对应的元素值为 1,而这棵树的其他叶子结点对应的元素值为 0。新特征向量的长度等于 GBDT 模型里所有树包含的叶子结点数之和。最后的输出一般会接一个 Logistic Regression,事实上就是一种 Stacking 的模型融合方式。如下图所示:



5

特征降维


当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于 L1 惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA 和 LDA 有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是 PCA 和 LDA 的映射目标不一样:PCA 是为了让映射后的样本具有最大的发散性;而 LDA 是为了让映射后的样本有最好的分类性能。所以说 PCA 是一种无监督的降维方法,而 LDA 是一种有监督的降维方法。



6

总结


特征工程是机器学习,甚至是深度学习中最为重要的一部分,也是课本上最不愿意讲的一部分,特征工程往往是打开数据密码的钥匙,是数据科学中最有创造力的一部分。特征工程内容很多,我这里做了一些基本的梳理和使用心得,希望对大家有所帮助!

转自:一个数据人的自留地 公众号;作者:飞狐冲冲;

END

版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。


合作请加QQ:365242293  

数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/114107
 
261 次点击