Saturday, June 27, 2015

特征工程指南(2):离散化

在Logistic Regression模型中直接使用数量型特征是不明智的:比如我们有个数量特征代表广告历史上的浏览次数,另外有一个特征是平均点击率。直接使用这两个特征作为LR的输入特征是不行的,原因首先是这两个特征的幅度不同,其中一个的幅度是上万,而另一个特征是0-1之间,可以想见第一个特征对应的权重的幅度必然会远远小于第二个特征对应的权重,从而使第一个特征的权重逃脱正则化的惩罚,无论这种正则化是L1还是L2。因此第一个特征的重要性会高很多。

那么如果讲特征的幅度归一化到同一个范围,比如0-1之间是否就可以了呢?还是不行。原因是LR本身是个线性组合经过Logit变换得到的输出结果。怎么能保证你的特征恰好是可以线性组合的呢?在现实中很难实现这一点。Logistic模型源于最大熵状态下的分子能量分布,能量和概率之间是logit关系,怎么能保证历史点击率(特征)和预测的点击率是这种关系呢?很难。

为了避免线性的问题,可以将特征的取值从(0,1)之间变为{0,1}两个取值。由于{0,1}之间不存在其他取值,因此避免了线性组合假设的要求。

可以从另一个角度上来理解离散化特征,就是一个样本可以同时属于若干个子集,比如性别{男,女},年龄{1-6,7-11,12-22,23-30,31-}等等。这里的集合可以分为若干组,每一组具有相关或互斥的含义。互斥并不是必须的,可以并不互斥,比如集合本身是交叠的。LR本身是求取这些子集上的权重,比如男:0.1,女:0.3等等。

通过离散化之后的维度要高很多,典型的广告模型的维度可以达到百万到百亿数量级。这样数量级的特征几乎把空间划分得细致极了,以至于模型把历史上的事件几乎分门别类的“记住”了。

如何离散化特征呢?有两种基本的做法:

  1. 等宽离散化。就是按照范围等分成等长的区间进行离散话,比如年龄可以按照每5岁一个区间进行划分。
  2. 等频离散化。将样本按照某一待离散化的特征的大小从小到大排列起来,然后按照等分样本个数去划分区间。容易看到这样得到的特征离散化结果和#1中的情况会有所不同。在大部分情况下,这种离散化方法的效果会更好,因为它可以照顾到多数的样本,而不至于发生样本在特征上聚集的时候等宽离散化丢失了很多信息。
以上两种方法都是比较简单的特征离散化方法,在要求不高的情况下可以接受。如果希望智能一点,可以将等宽和等频离散化结合起来使用,这样既可以避免特征聚集,又可以避免划分的区间过大或过小。

一个比较高等的做法是通过决策树进行离散化。决策树在生成的过程中会对连续特征进行切分,这些切点可以作为离散化点使用。