“数据和特征工程决定了模型的上限,改进算法只不过是逼近这个上限而已。”

       可见,数据是本质,而特征工程具有洪荒之力,它的目的就是竭尽所能地从数据中提取特征,在配合算法的情况下获得最好的模型,所以,说白了,特征工程就是处理样本数据,样本数据有的也就是那些样本的特征了,所以无论是横向还是纵向,单个还是多个,增加还是减少,多维度、多方法地使得数据更好地为我们所用。

       特征工程中最主要的工作包括:预处理、特征构建、特征提取、特征选择等,这里总结一下工程中涉及到的方方面面。
 

一、预处理

 

缺失值处理:

       最初学算法的时候,为了更方便更直接,为了能把重点放在算法本身上,《实战》给出的数据都是处理以后的,到了后面做工程的时候,面对的都是收集来的原始数据,各种问题接踵而来,处理数据变成了十分重要的一环,如何对待数据中的缺失值,是个棘手的问题。对于缺失值我们一般有如下处理办法:
1.使用可用特征的均值填补缺失值(均值,众数都可以,没什么特别的可以用均值);
2.使用特殊值填补缺失值,如-1(数值型用0或者离散型用None都是可以的);
3.忽略有缺失值的样本(如果数据多,无所谓,drop掉就可以了);
4.使用相似样本的均值填补缺失值(先分组,取同组的其它数据的均值或众数);
5.使用另外的机器学习算法预测缺失值(如随机森林预测年龄等)。

 

标准化(归一化):

粗略地可以认为标准化和归一化是一样的,也可以读叫作标准化或者归一化,目的都是使数据具有可比性。但最大的区别就是归一化是对行操作,关注不同维度特征数据的变换,标准化是对列操作的,关注某一维度数据的变换。

常用的方法有两种:

(1)线性函数归一化,Min-Max Scaling。在“使用k-近邻算法改进约会网站的配对效果”代码实例中用到了归一化对数值进行处理,在计算欧氏距离时,飞行常客里程数对于计算结果的影响远远大于玩视频游戏和每周消费冰淇淋公升数,原因是飞行常客里程数远大于其他特征值,但三个特征是等权重,不应该有这样的效果,所以要将数值归一化,也就是将取值范围处理为0到1或者-1到1之间,可以用下面的公式 x=(x-min)/(max-min),其中min和max分别是数据集中的最小特征值和最大特征值,叫它归一化是指将原始数据的最大值映射成了1,即最大值的归一化。这种做法和很多人提到的区间缩放法一样。需要注意的是,数据归一化处理可以加快算法收敛速度(梯度下降的例子),优化算法训练的效率,但无法提升算法准确率。

(2)零均值标准化,Z-Score Normalization。可以用下面的公式 x=(x一μ)/σ,根据原始数据的均值和标准差进行标准化,经过处理后的数据符合标准正态分布。这样一来,可以计算给定样本值距离均值有多少个标准差,大于均值的数据会得到一个正的标准化分数,小于均值的数据会得到一个负的标准化分数。


类别型特征(离散特征)处理:

Categorical特征的数据类型通常是object类型,往往需要将其转换成Numeric特征。而Categorical特征又有两类,需要根据具体含义进行对应的转换。

(1)Ordinal 类型:这种类型的数据存在着自然的顺序结构,如果对Ordinal 类型数据进行排序的话,可以是升序或降序,比如在学习成绩这个特征中具体的值可能有:A、B、C、D四个等级,根据成绩的优异进行排序的话有A>B>C>D。这种情况下使用abelEncoder进行编码处理(也叫序号编码),成绩的A、B、C、D四个等级进行LabelEncoder处理后会映射成1、2、3、4,这样数据间的自然大小关系也会保留下来。
(2)Nominal类型:这种类型的数据不存在顺序,不能对数据排序。比如血型特征可能的值有:A、B、O、AB,但你不能得出A>B>O>AB的结论。这种情况下使用OneHotEncoder进行编码处理(也叫哑变量),代码中使用pandas的get_dummies() ,血型经过编码处理后的结果是新增四个特征:特征分别为Blood_A,Blood_B,Blood_O,Blood_AB,对应的特征值A(1000),B(0100),O(0010),AB(0001)。drop掉原特征即可。

数值型特征处理:

数据是否符合正态分布,通过对数处理,使其符合正态分布。

 

二、特征衍生

 

三、特征选择

在有限样本数目下,减少特征。分两类:减少冗余特征,为了降低计算开销;减少噪声特征,为了提高分类性能,因为部分噪声特征会对预测结果产生负影响。特征选择与降维不同,降维是做特征的计算,组合构成新特征。

原则:获得尽可能小的特征子集(奥卡姆剃刀),不显著降低分类精度,不影响类分布,特征子集稳定、适应性强(保证模型稳定性)。

  • Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
  • Wrapper:包装法,根据目标函数(通常是预测效果评分),每次排除若干特征。
  • Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

四、样本不均衡问题处理

1.权重法:对训练集中的每个类别设置class_weight,使得样本数多的类别权重小,样本数少的类别权重大。默认为“balanced”。当有代价敏感问题时,也可以通过设置class_weight来解决。

2.采样:对类别样本数多的样本做欠采样,或对类别样本数少的样本做过采样。为了不改变训练集的样本分布,可以使用SMOTE算法进行过采样,SMOTE算法对少数类样本集中的每个样本Xi,从它在样本集中的近邻中随机选择一个样本y,然后在Xi和y连线上随机选取一点作为新合成的样本。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐