“数据科学竞赛到底比的是什么?”这个问题,问10个大神,大概会有9个人告诉你“特征工程+模型融合”。但是翻遍整个互联网,讲模型的挺多,讲特征工程的就屈指可数了。于是我就去和鲸社区给大家搞了一个教程过来~
这篇特征工程的知识点比较全面,涵盖了数据预处理、特征选择、特征构造、特征降维以及类别不平衡处理等知识点,并附带代码实现功能。
原文有点长,我挑重点内容呈现给大家搬搬,如果反响好的话(请给我一个wink你懂的),我再把基础的技巧和代码补上~
想看code和数学公式的,请移步原文>>【特征工程系列】特征工程理论与代码实现
另外,最近上线了姊妹篇 模型集成完全手册——套娃的艺术:将模型作为特征进行建模 ,欢迎串门。
1.特征构造
- 概念及工作原理
概念:特征构造主要是产生衍生变量,所谓衍生变量是指对原始数据进行加工、特征组合,生成有商业意义的新变量(新特征)
别称 特征构造也可称为特征交叉、特征组合、数据变换
优缺点
优点 :新构造的有效且合理的特征可提高模型的预测表现能力。
缺点:
新构造的特征不一定是对模型有正向影响作用的,也许对模型来说是没有影响的甚至是负向影响,拉低模型的性能。
因此构造的新特征需要反复参与模型进行训练验证或者进行特征选择之后,才能确认特征是否是有意义的。
1.1.特征设计原理
新特征设计应与目标高度相关,要考虑的问题:
这个特征是否对目标有实际意义?
如果有用,这个特征重要性如何?
这个特征的信息是否在其他特征上体现过?
新构建特征验证其有效性要考虑的问题:
需要领域知识、直觉、行业经验以及数学知识综合性考量特征的有效性,防止胡乱构造没有意义的特征。
要反复与模型进行迭代验证其是否对模型有正向促进作用。
或者进行特征选择判定新构建特征的重要性来衡量其有效性。
1.2.特征构造常用方法
特征构造需要不断结合具体业务情况做出合理分析,才能有根据性的构造出有用的新特征。
1.2.1.统计值构造法
指通过统计单个或者多个变量的统计值(max,min,count,mean)等而形成新的特征。
方法
- 单变量
如果某个特征与目标高度相关,那么可以根据具体的情况取这个特征的统计值作为新的特征。
- 多变量
如果特征与特征之间存在交互影响时,那么可以聚合分组两个或多个变量之后,再以统计值构造出新的特征。
举例
单变量:衣服颜色
和你一样的小朋友数量
作为新特征
多变量:衣服颜色
和你一样的小朋友的身高
的平均值
作为新特征
1.2.2.连续数据离散化
有些时候我们需要对数据进行粗粒度、细粒度划分,以便模型更好的学习到特征的信息,比如:
粗粒度划分(连续数据离散化):将年龄段0~100岁的连续数据进行粗粒度处理,也可称为二值化或离散化或分桶法
细粒度划分:在文本挖掘中,往往将段落或句子细分具体到一个词语或者字,这个过程称为细粒度划分
方法
- 特征二值化
设定一个划分的阈值,当数值大于设定的阈值时,就赋值为1;反之赋值为0。典型例子:划分年龄段
- 无监督离散化
分箱法:等宽(宽度)分箱法、等频(频数)分箱法 聚类划分:使用聚类算法将数据聚成几类,每一个类为一个划分
典型例子
年龄、收入
优缺点
优点:(1)降低数据的复杂性 (2)可在一定程度上消除多余的噪声
1.2.3.离散数据编码化
很多算法模型不能直接处理字符串数据,因此需要将类别型数据转换成数值型数据
方法
- 序号编码
通常用来处理类别间具有大小关系的数据,比如成绩(高中低)
- 独热编码(One-hot Encoding)
通常用于处理类别间不具有大小关系的特征,比如血型(A型血、B型血、AB型血、O型血), 独热编码会把血型变成一个稀疏向量,A型血表示为(1,0,0,0),B型血表示为(0,1,0,0), AB型血表示为(0,0,1,0),O型血表示为(0,0,0,1)
- 二进制编码
二进制编码主要分为两步,先用序号编码给每个类别赋予一个类别ID,然后将类别ID对应的二进制编码作为结果。 以A、B、AB、O血型为例,A型血表示为00,B型血表示为01, AB型血表示为10,O型血表示为11
优缺点
缺点:有些模型不支持离散字符串数据,离散编码便于模型学习
1.2.4.函数变换法
方法 简单常用的函数变换法(一般针对于连续数据):平方(小数值—>大数值)、开平方(大数值—>小数值)、指数、对数、差分
典型例子
对时间序列数据进行差分
数据不呈正态分布时可运用
当前特征数据不利于被模型捕获时
优缺点
优点:
将不具有正态分布的数据变换成具有正态分布的数据
对于时间序列分析,有时简单的对数变换和差分运算就可以将非平稳序列转换成平稳序列
1.2.5.算术运算构造法
根据实际情况需要,结合与目标相关性预期较高的情况下,由原始特征进行算数运算而形成新的特征。
解读概念为几种情况:
原始单一特征进行算术运算:类似于无量纲那样处理,比如:X/max(X), X+10等
特征之间进行算术运算:X(featureA)/X(featureB),X(featureA)-X(featureB)等
1.2.6.自由发挥
在特征构造这一块是没有什么明文规定的方法,特征构造更多的是结合实际情况,有针对性的构造与目标高度相关的特征,只要构造的新特征能够解释模型和对模型具有促进作用,都可以作为新指标新特征。
2.特征选择
2.1.特征选择概述
从哪些方面来选择特征呢?
当数据处理好之后,我们需要选择有意义的特征输入机器学习的模型进行训练,通常来说要从两个方面考虑来选择特征,如下:
- 特征是否发散
如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
- 特征与目标的相关性
这点比较显见,与目标相关性高的特征,应当优先选择。
区别:特征与特征之间相关性高的,应当优先去除掉其中一个特征,因为它们是替代品。
为什么要进行特征选择?
- 减轻维数灾难问题; 2. 降低学习任务的难度
处理高维数据的两大主流技术
特征选择和降维
特征选择有哪些方法呢?
Filter 过滤法
Wrapper 包装法
Embedded 嵌入法
2.2.Filter 过滤法
它主要侧重于单个特征跟目标变量的相关性。
优点是计算时间上较高效,对于过拟合问题也具有较高的鲁棒性。
缺点就是倾向于选择冗余的特征,因为他们不考虑特征之间的相关性,有可能某一个特征的分类能力很差,但是它和某些其它特征组合起来会得到不错的效果,这样就损失了有价值的特征。
2.2.1.方差选择法
方差是衡量一个变量的离散程度(即数据偏离平均值的程度大小),变量的方差越大,我们就可以认为它的离散程度越大,也就是意味着这个变量对模型的贡献和作用会更明显,因此要保留方差较大的变量,反之,要剔除掉无意义的特征。
2.2.2.相关系数法
方法一:计算特征与特征的相关系数
通过计算特征与特征之间的相关系数的大小,可判定两两特征之间的相关程度
优缺点
优点:容易实现
缺点:只是根据特征与特征之间的相关度来筛选特征,但并没有结合与目标的相关度来衡量
应用场景
用于特征选择,以提取最有效的特征作为目标,剔除冗余特征
方法二:计算特征与目标的相关系数以及P值
r, p = scipy.stats.pearsonr(x, y)
# r:相关系数[-1,1]之间
# p:相关系数显著性
相关性的强度确实是用相关系数的大小来衡量的,但相关大小的评价要以相关系数显著性的评价为前提
因此,要先检验相关系数的显著性,如果显著,证明相关系数有统计学意义,下一步再来看相关系数大小;
如果相关系数没有统计学意义,那意味着你研究求得的相关系数也许是抽样误差或者测量误差造成的,再进行一次研究结果可 能就大不一样,此时讨论相关性强弱的意义就大大减弱了。
优缺点
Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。
如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近0
应用场景及意义
应用于回归问题的特征选择,旨在选择出最有效的信息和减少内存占用空间
2.2.3.卡方检验
卡方检验是检验定性自变量对定性因变量的相关性,求出卡方值,然后根据卡方值匹配出其所对应的概率是否足以推翻原假设H0,如果能推翻H0,就启用备用假设H1。参考资料-特征选择---SelectKBest
优缺点
优点:可以很好地筛选出与定性应变量有显著相关的定性自变量。
应用场景及意义
应用场景:适用于分类问题的分类变量
2.2.4.互信息法
原理及实现参考资料-互信息原理及实现
应用场景及意义
应用场景:因此非常适合于文本分类的特征和类别的配准工作
2.3.Wrapper 包装法
封装器用选取的特征子集对样本(标签)集进行训练学习,训练的精度(准确率)作为衡量特征子集好坏的标准, 经过比较选出最好的特征子集。 常用的有逐步回归(Stepwise regression)、向前选择(Forward selection)和向后选择(Backward selection)。
优缺点
优点:考虑了特征之间组合以及特征与标签之间的关联性。
缺点:由于要划分特征为特征子集并且逐个训练评分,因此当特征数量较多时,计算时间又会增长;另外在样本数据较少的时候,容易过拟合。
2.3.1.稳定性选择(Stability Selection)
稳定性选择是一种基于二次抽样和选择算法(训练模型) 相结合的方法,选择算法可以是回归、分类SVM或者类似算法。
原理实现
在不同的特征子集上运行训练模型,不断地重复,最终汇总特征选择的结果。比如可以统计某个特征被认为是重要特征的频率 (被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数, 而最无用的特征得分将会接近于0。
优缺点
优点: 特征值下降的不是特别急剧,这跟纯lasso的方法和随机森林的结果不一样, 能够看出稳定性选择对于克服过拟合和对数据理解来说都是有帮助的。
总的来说,好的特征不会因为有相似的特征、关联特征而得分为0。
在许多数据集和环境下,稳定性选择往往是性能最好的方法之一。
2.3.2.递归特征消除
Recursive Feature Elimination,简称RFE
工作原理
主要思想是:
反复的构建模型(比如SVM或者回归模型)
接着选出最好(或者最差)的特征(可以根据系数来选),把选出来的特征放到一边
然后在剩余的特征上重复上面1,2步骤,直到遍历完所有特征。
通识来说: RFE算法的主要思想就是使用一个基模型(这里是S模型VM)来进行多轮训练, 每轮训练后,根据每个特征的系数对特征打分,去掉得分最小的特征, 然后用剩余的特征构建新的特征集,进行下一轮训练,直到所有的特征都遍历了。
这个过程中特征被消除的次序就是特征的排序,实际上这是一种寻找最优特征子集的贪心算法。
优缺点
RFE的稳定性很大程度上取决于在迭代选择的时候,选择哪一种模型。
如果RFE采用的是普通的回归,没有经过正则化的回归是不稳定的,从而RFE也是不稳定的
如果采用Ridge或Lasso模型,经过正则化的回归是稳定的,从而RFE是稳定的。
2.3.3.特征值排序选择
概念及工作原理
理论上来讲,如果某个特征进行排序或者打乱之后,会很明显的影响(无论正向影响还是负向影响)到模型(预测评分)效果评分, 那么可以说明这个特征对模型来说是重要的;反之,说明这个特征存不存在并不会影响到模型的效能。
基于这么个原理,我们可以提出: (1)特征在进行排序或者打乱之后,会很明显影响模型性能的特征,划定为重要特征。 (2)特征在进行排序或者打乱之后,对模型性能几乎没有影响,划定为不重要特征。
2.4.Embedded 嵌入法
先使用某些机器学习的算法和模型进行训练,得到各个特征的权重值系数, 根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。 Regularization,或者使用决策树思想,Random Forest和Gradient boosting等
包装法与嵌入法的区别:包装法根据预测效果评分来选择,而嵌入法根据预测后的特征权重值系数来选择。
工作原理
先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。
有些机器学习方法本身就具有对特征进行打分的机制,或者很容易将其运用到特征选择任务中, 例如回归模型,SVM,树模型(决策树、随机森林)等等
2.4.1.线性模型
工作原理
越是重要的特征在模型中对应的系数就会越大,而跟目标(标签)变量越是无关的特征对应的系数就会越接近于0。 在噪音不多的数据上,或者是数据量远远大于特征数的数据上,如果特征之间相对来说是比较独立的, 那么即便是运用最简单的线性回归模型也一样能取得非常好的效果
优缺点
缺点:
如果特征之间存在多个互相关联的特征,模型就会变得很不稳定
对噪声很敏感,数据中细微的变化就可能导致模型发生巨大的变化
2.4.2.正则化
正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。
工作原理
L1正则化Lasso(least absolute shrinkage and selection operator)将系数w的l1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成0。因此L1正则化往往会使学到的模型很稀疏(系数w经常为0),这个特性使得L1正则化成为一种很好的特征选择方法。
L2正则化同样将系数向量的L2范数添加到了损失函数中。由于L2惩罚项中系数是二次方的,这使得L2和L1有着诸多差异,最明显的一点就是,L2正则化会让系数的取值变得平均。
优缺点
L1正则化缺点:L1正则化像非正则化线性模型一样也是不稳定的,如果特征集合中具有相关联的特征,当数据发生细微变化时也有可能导致很大的模型差异。
L2正则化优点:L2正则化对于特征选择来说一种稳定的模型,不像L1正则化那样,系数会因为细微的数据变化而波动。
总结:L2正则化和L1正则化提供的价值是不同的,L2正则化对于特征理解来说更加有用:表示能力强的特征对应的系数是非零。
2.4.3.树模型
工作原理
随机森林具有准确率高、鲁棒性好、易于使用等优点,随机森林提供了两种特征选择的方法: 1. 平均不纯度减少 2. 平均精确率减少
3.类别标签不平衡处理
类别标签不平衡问题是指
在分类任务中,数据集中来自不同类别的样本数目相差悬殊。
举个例子: 假设类别 A 的样本数量有 M 个,类别 B 的样本数量有 N 个,并且 M >>> N(假设 M:N=9:1), 这种情况我们就可以判定此数据集存在严重的类别标签不平衡的问题,为了防止模型出现严重误差, 因此在建模前需要就样本不平衡问题处理。
类别不平衡问题会造成这样的后果
在数据分布不平衡时,其往往会导致分类器的输出倾向于在数据集中占多数的类别。 输出多数类会带来更高的分类准确率,但在我们所关注的少数类中表现不佳。
常用方法
欠采样、过采样及加权处理。
类别标签不平衡情况下的评价指标
准确率在类别不平衡数据上,说服力最差。应考虑精确率、召回率、F1 值、F-R 曲线和 AUC 曲线。
3.1.欠采样
所谓欠采样是指把占比多的类别 A 样本数量(M=900)减少到与占比少的类别 B 样本数量(N=100)一致,然后进行训练。
第一种方法(随机欠采样)
随机欠采样是指通过随机抽取的方式抽取类别 A 中 100 个样本数据与类别 B 中的 100 个样本进行模型训练。
随机欠采样的缺点:欠采样只是采取少部分数据,容易造成类别 A 的信息缺失
第二种方法(代表性算法:EasyEnsemble 集成学习法)
算法思想:利用集成学习机制,将占比多的类别 A 样本数据划分为若干个样本子集供不同学习器使用, 这样对每个学习器来看都进行了欠采样,但在全局来看却不会丢失重要信息。
算法原理如下: 第一步:首先从占比多的类别 A 样本中独立随机抽取出若干个类别 A 样本子集。 第二步:将每个类别 A 的样本子集与占比少的类别 B 样本数据联合起来,训练生成多个基分类器。 第三步:最后将这些基分类器组合形成一个集成学习系统。集成可采用加权模型融合或者取所有基分类器总和的平均值。
EasyEnsemble 集成学习法优点:可以解决传统随机欠采样造成的数据信息丢失问题,且表现出较好的不均衡数据分类性能。
3.2.过采样
所谓过采样是指把占比少的类别 B 样本数量(N=100)扩增到占比多的类别 A 样本数量(M=900)一致,然后进行训练。
第一种方法(随机过采样): 由于随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产生模型过拟合的问题, 即使得模型学习到的信息过于特别(Specific)而不够泛化(General),因此很少使用这种方法。
经典代表性算法是 SMOTE 算法: SMOTE原理参考资料 SMOTE 的全称是 Synthetic Minority Over-Sampling Technique 即“人工少数类过采样法”,非直接对少数类进行重采样, 而是设计算法来人工合成一些新的少数样本。
算法原理如下: (1)在占比少的类别 B 中随机抽取一个样本 a,从 a 的最近邻 k 个数据中又随机选择一个样本 b。 (2)在 a 和 b 的连线上(或者说[a,b]区间中)随机选择一点作为新的少数类样本。
3.3.加权处理
加权处理是指通过调整不同类型标签的权重值,增加占比少的类别 B 样本数据的权重,降低占比多的类别 A 样本数据权重, 从而使总样本占比少的类别 B 的分类识别能力与类别 A 的分类识别能力能够同等抗衡。
加权处理原理如下: 遍历每一个样本,设总样本占比多的类别 A 的权重为 W1(自定义),总样本占比少的类别 B 的权重为 W2(自定义),其中 W2 > W1。 其实这个也类似于对模型进行惩罚,从而影响各个类别标签的重要性。
以上对【特征工程系列】特征工程理论与代码实现 一文进行节选,另有“数据预处理”章节及代码、公式等略去,感兴趣的可以点击链接前往。