特征工程——连续特征与离散特征处理方法

特征的标准化(归一化)

连续特征

  z-score标准化:这是最常见的特征预处理方式,基本所有的线性模型在拟合的时候都会做 z-score标准化。具体的方法是求出样本特征x的均值mean和标准差std,然后用(x-mean)/std来代替原特征。这样特征就变成了均值为0,方差为1了。在sklearn中,我们可以用StandardScaler来做z-score标准化。当然,如果我们是用pandas做数据预处理,可以自己在数据框里面减去均值,再除以方差,自己做z-score标准化。

  max-min标准化:也称为离差标准化,预处理后使特征值映射到[0,1]之间。具体的方法是求出样本特征x的最大值max和最小值min,然后用(x-min)/(max-min)来代替原特征。如果我们希望将数据映射到任意一个区间[a,b],而不是[0,1],那么也很简单。用(x-min)(b-a)/(max-min)+a来代替原特征即可。在sklearn中,我们可以用MinMaxScaler来做max-min标准化。这种方法的问题就是如果测试集或者预测数据里的特征有小于min,或者大于max的数据,会导致max和min发生变化,需要重新计算。所以实际算法中, 除非你对特征的取值区间有需求,否则max-min标准化没有 z-score标准化好用。

  L1/L2范数标准化:如果我们只是为了统一量纲,那么通过L2范数整体标准化也是可以的,具体方法是求出每个样本特征向量x的L2范数 | | x | | 2 ,然后用 x / | | x | | 2 代替原样本特征即可。当然L1范数标准化也是可以的,即用 x / | | x | | 1 代替原样本特征。通常情况下,范数标准化首选L2范数标准化。在sklearn中,我们可以用Normalizer来做L1/L2范数标准化。

离散特征

  对于离散的特征基本就是按照one-hot编码,该离散特征有多少取值,就用多少维来表示该特征。

  1. 使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
  2. 将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
  3. 将离散型特征使用one-hot编码,确实会让特征之间的距离计算更加合理。比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是 x 1 = ( 1 ) , x 2 = ( 2 ) , x 3 = ( 3 ) 。两个工作之间的距离是, ( x 1 , x 2 ) = 1 , d ( x 2 , x 3 ) = 1 , d ( x 1 , x 3 ) = 2 。那么 x 1 x 3 工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到 x 1 = ( 1 , 0 , 0 ) , x 2 = ( 0 , 1 , 0 ) , x 3 = ( 0 , 0 , 1 ) ,那么两个工作之间的距离就都是 s q r t ( 2 ) .即每两个工作之间的距离是一样的,显得更合理
  4. 离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1

  虽然大部分机器学习模型都需要做标准化和归一化,也有不少模型可以不做做标准化和归一化,主要是基于概率分布的模型,比如决策树大家族的CART,随机森林,bagging和boosting等。当然此时使用标准化也是可以的,大多数情况下对模型的泛化能力也有改进。基于参数的模型或基于距离的模型,都要进行标准化和归一化

连续特征的离散化

  在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:

  1. 离散特征的增加和减少都很容易,易于模型的快速迭代
  2. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展
  3. 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰
  4. 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合
  5. 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力
  6. 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问
  7. 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

  李沐曾经说过:模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡。既可以离散化用线性模型,也可以用连续特征加深度学习。就看是喜欢折腾特征还是折腾模型了。通常来说,前者容易,而且可以n个人一起并行做,有成功经验;后者目前看很赞,能走多远还须拭目以待。

无监督方法

  无监督方法都具有的问题就是都需要认为规定划分区间这个参数,常用的方法有分箱法和直观划分,首先来说一下分箱法:

  1. 分箱法又分为等宽分箱法和等频分箱法,其实从名字就能看出算法的做法了,前者制定定长的间隔将特征放入不同箱子内,后者根据频率划分箱子,这两种做法都有一定的缺陷。等宽分箱法对异常点比较敏感,比如数据正常范围是30-60,现在出现了一个特征本来是30不小心读取成了300,那么宽度会被拉长,实例就主要集中在前面的箱体中,后面的箱体几乎没有实例,解决的方法主要是设立阈值移除阈值以外的实例。等频分箱法的缺陷是完全按照频率划分会出现实例特征相同却不在同一个箱体内的情况,解决办法也很简单,在划分完成后进行微调就可完成。
  2. 直观划分法感觉就没什么技术了,这个算法主要是根据经验和美观,常用的方法划分出来肯定都是34267、64537这样的数,但是人们一般都习惯看到30000、50000这样的数,然后就是加上个人对数据的了解人为划分。

  个人感觉无监督方法的连续特征离散化并不是很靠谱,原因就是不知道设计的目的单纯考虑离散化对结果是更好还是更差这个不确定性太大了。

有监督方法

1R方法:这个方法是分箱法的有监督版本,把前6个实例放入箱子中,然后后面实例放入箱子时,对比当前实例标签与箱子中大部分实例标签是否相同,如果相同放入,如果不相同,那么形成下一个6实例的新箱子,等到最后全部放入箱子中,将箱子中大多数实例标签作为箱子的标签,再将标签相同的箱子合并

基于卡方的离散方法:首先将数值特征的每个不同值看做一个区间对每对相邻区间计算卡方统计量,如果大于阈值就合并,递归进行直到找不到卡方统计大于阈值的时候停止

基于熵的离散方法:其实就是照搬了决策树的思路,使用合成的方法或者分裂的方法根据熵计算和阈值判定来决定合成或分裂。

参考:
http://www.cnblogs.com/pinard/p/9093890.html
https://blog.csdn.net/shenxiaoming77/article/details/51121897
https://www.zhihu.com/question/31989952/answer/54184582
https://blog.csdn.net/u013818406/article/details/70494800
http://www.cnblogs.com/emanlee/archive/2008/10/25/1319569.html

猜你喜欢

转载自blog.csdn.net/u014135752/article/details/80789251