连续特征的离散化:在什么情况下将连续的特征离散化之后可以获得更好的效果?

题主机器学习大白一个。。最近刚接触CTR预估,发现CTR预估一般都是用LR,而且特征都是离散的。为什么一定要用离散特征呢?这样做的好处在哪里?求大拿们…
关注者
1,797
被浏览
233,566

14 个回答

谢邀!

以下内容来源于跟几位大牛交流的结果并加入了一定自己的理解。


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

0. 离散特征的增加和减少都很容易,易于模型的快速迭代;

1. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

2. 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;

3. 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;

4. 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;

5. 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;

6. 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。


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

机器学习里当然并没有free lunch,一个方法能work,必定是有假设的。如果这个假设和真实的问题及数据比较吻合,就能work。

对于LR这类的模型来说,假设基本如下:

  1. 局部平坦性,或者说连续性。对于连续特征x来说,在任何一个取值x0的邻域附近,这个特征对预测目标y的影响也在一个足够小的邻域内变化。比如人年龄对点击率的影响,x0=30岁假设会产生一定的影响,那么x=31或者29岁,这个影响和x0=30岁的影响差距不会太大。
  2. x对y的影响,这个函数虽然局部比较平坦,但是不太规律,如果你知道这个影响是个严格的直线(或者你有先验知识知道这个影响一定可以近似于一个参数不太多的函数),显然也没必要去做离散化。当然这条基本对于绝大多数问题都是成立的,因为基本没有这种好事。


假设一个最简单的问题,binary classification,y=0/1 ,x 是个连续值。你希望学到一个logloss足够小的 y=f(x)。

那么有一种做法就是,在数轴上切若干段,每一段观察训练样本里y为1的比例,以这个比例作为该段上y=f(x)的值。这个当然不是 LR训练的过程,但是就是离散化的思想。你可以发现:


  1. 如果每一段里面都有足够多的样本,那么在这一段里的y=f(x)值的点估计就比较可信
  2. 如果x在数轴上的分布不太均匀,比如是指数分布或者周期分布的,这么做可能会有问题,因而你要先对x取个 log,或者去掉周期性。

这就告诉了你应该怎么做离散化:尽量保证每个分段里有足够多的样本,尽量让样本的分布在数轴上均匀一些。


结语:本质上连续特征离散化,可以理解为连续信号怎么转化为数字信号,好比我们计算机画一条曲线,也是变成画一系列线段的问题。用分段函数来表达一个连续的函数在大多数情况下,都是work的。想取得好的效果需要:

  1. 你的分段足够小,以使得在每个分段内x对y的影响基本在一个不大的邻域内,或者你可以忍受这个变化的幅度
  2. 你的分段足够大,以使得在每个分段内有足够的样本,以获得可信的f(x)也就是权重
  3. 你的分段策略使得在每个x的分段中,样本的分布尽量均匀(当然这很难),一般会根据先验知识先对x做一些变化以使得其变得均匀一些。
  4. 如果你有非常强的x对y的先验知识,比如严格线性之类的,也未必做离散化,但是这种先验在计算广告或者推荐系统里一般是不存在的,也许其他领域比如CV之类的里面是可能存在的。

最后还有个特别大的LR用离散特征的好处就是LR的特征是并行的,每个特征是并行同权的,如果有异常值的情况下,如果这个异常值没见过,那在LR里因为没有这个值的权重,最后对score的贡献为0,最多效果不够好,但是不会错得太离谱。另外如果你debug,很容易查出来是在哪个段上的权重有问题,比较好定位和解决。