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中的情况会有所不同。在大部分情况下,这种离散化方法的效果会更好,因为它可以照顾到多数的样本,而不至于发生样本在特征上聚集的时候等宽离散化丢失了很多信息。
以上两种方法都是比较简单的特征离散化方法,在要求不高的情况下可以接受。如果希望智能一点,可以将等宽和等频离散化结合起来使用,这样既可以避免特征聚集,又可以避免划分的区间过大或过小。

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




Wednesday, May 13, 2015

特征工程指南(1):去伪存真

首先声明我在特征工程工作方面有着很少的经验,实际中看到很多同学做特征工程的时候做的一些反思,而不是第一手的资料。如有谬误,敬请原谅,如果能在留言中指出更是感激不尽。本文主要是针对初涉此道的同仁。

一个典型的特征工程问题是这样的,比如要做广告的CTR预估,这是广告相关的人工智能技术中的非常重要的工作。我们先做以下一些假设:
  1. 我们拥有用户的历史浏览(Page View)和点击(Click)操作数据。这里的浏览是指浏览的页面和投放的广告;点击则专指对投放的广告的点击。可能用户并没有看到投放的广告,这里并不做区分,也就是广告只要是投放,就认为用户看到了。
  2. 我们需要预测的是当前正在发生的PV中该投放哪些广告,以使得期望收益(RPM)最高。RPM=CTR*ECPM。其中ECPM是实际发生点击时广告主向广告商支付的费用。该价格有着非常复杂的生成过程,在广告中叫做竞价机制或者机制。
  3. 所用的模型是线性Logistic Regression(LR)。
上面就是最初始的假设。其中1和2的假设是原问题假设,而3则是模型的限制,现在模型选择已经很丰富了,不同的模型选择对于特征工程的做法是有一些区别的。这里选择的LR模型是业界广泛使用的模型。

接下来需要干什么?两件事:整理训练数据和制作特征。本系列文章主要讨论制作特征的问题。

制作特征需要原始特征,原始特征是指那些数据中可以直接提取的特征,但原始特征并不是直接可以用于训练模型的,原因是模型对特征都会有一些要求。

LR是一个线性模型,p(y|x,w)=1/(1+exp(y*(w'*x)),其中w是模型参数向量,x是特征向量,y表示二分类的标号,为了使模型表达更简洁,y的取值为{-1, +1}。

那是不是说只要x是实数向量,就可以直接扔到模型进行训练了呢?答案是否定的。这里对x的分布有着严格的要求。

首先x的各个维度之间的幅度的问题,比如一个x_1取值范围是(0,1),另一个x_2取值是(0, 1000),将这样的训练数据拿去训练是肯定得不到你想要的模型的。原因是x_1和x_2的幅度差异太大,参数再加正则化约束会使得x_2对应的参数w_2的幅度偏小从而逃掉正则化约束,从而使x_2的作用不合理的偏大。当然这或许是你想要的,但概率极其渺茫。

那是不是说将x_2除以个1000,就万事大吉了呢?答案仍然是否定的。原因稍微复杂一点,就是比如原始的x_2 有0.99的概率取(0,1)之间的均匀分布,有0.01的概率是999,后果可想而知不是你需要的。

这说明,需要对特征进行深度的加工。

在深度加工之前,我们先看看作为原料,可以选择哪些原始特征吧。

我们很容易想到,历史的广告的点击率是有用的。

但这个点击率对于充分展示的广告来说或许太粗了,我们还需要考虑个性化因素,因此当前用户对该广告的点击率是有用的。

但这样太细了,缺乏泛化能力,因此需要找到介于以上两个粗细之间的粒度的特征,来提高泛化能力。我们想到了一个用户对某一类型(类目)或者广告主的广告的点击率。

在用户这段也需要做一些泛化,我们可以提前对用户提取profile,然后建立profile和广告之间的关系作为特征。

在上面的思路的基础上,还可以将profile打到广告上面,也可以对广告建立profile,作为广告的受众profile。用profile之间的联系作为特征。这种联系可以是内积(计算出来的匹配度)或者外积(具体的匹配项笛卡尔积)。

广告都是有上下文的,如投放在哪个网站,什么页面,页面的内容是什么,都可以作为特征来考虑。考虑的方式可以与用户特征类似。

现代的广告引擎一般包括两个阶段:粗选(Match)阶段和精选(Rank)阶段。本文所讲的CTR预估模型一般用于Rank阶段。

Match阶段和Rank阶段也需要结合起来。在Match阶段通常也会有如下信息:该广告是如何被选中的。比如是通过用户及网页关键词检索到的,那么有相应的检索索引及检索到的分数。这些也可以作为特征。

因此,最原始的特征可以包括:广告特征(A)、用户特征(U)、上下文特征(X)、Match特征(M)。

进一步的,对这些特征进行组合也是有意义的,比如AxU,AxX,UxX等,甚至更高阶的组合。

这就是你进行工作的原始特征的大致范围。


Tuesday, May 12, 2015

什么样的工作是一份好工作?

工作不仅仅是一个养家糊口的工具,除了获取收入之外,工作还有很多钱之外的功能。从主观上,工作(应该)可以愉悦身心,陶冶情操;工作可以提升能力,锻炼心智;工作可以让人保持和社会的深度接触,保持“社会人”的属性。
具体的讲,如果工作能让你做到以下几点,就是好工作:

  1. 找到生命的意义,让人充实有成就感。一份好的工作能激励你每天从起床到休息,保持着良好的状态,长期带来健康的提升。而一份不好的工作会让你失去人生的热情,在恐惧和贪婪的折磨中度日。
  2. 学习到更多的技能。从硬技能(做业务需要的技能)到软技能(人际关系和组织管理的技能)都应该被重视起来。
  3. 为自己积累。一份工作默认情况下是为公司和组织积累的,但这和为自己积累并不矛盾。你在工作中是否为自己积累了经验、人脉、数据、资本、甚至做事的雄心?
  4. 找到组织。一份好的工作提供的不仅仅是那把椅子,而是伟大的组织,是伟大的组织造就了伟大的个人。
自勉。

Friday, June 14, 2013

工作中要“多管闲事”

每一份工作都有KPI(关键表现指数),没有KPI就无法明确目标,而过于KPI导向同样会引入歧途。任何一份工作,只要是从事这份工作的人还有一些自由度,也就是有一些选择做什么和不做什么的自由度,那么就必然有一些事情,是KPI中没有定义清楚的部分。一些刚毕业的同学会比较忽视这部分,认为事不关己,高高挂起,完成自己的事情为准。然而,这部分可能是从大的方面来说,对公司很重要;从小的方面来说,对保持和提高团队的战斗力必不可少。
我不想仅仅从功利主义的角度上来探讨这个问题,因为这个问题涉及的是规范,用功利主义无法证明其必然性。定义在KPI中的东西是人人都可以看到的,这部分会拉开人与人之间的差距,担不是根本性的;而定义在KPI之外的事情,则是很多人忽视的,或者不屑于做的。这部分工作日积月累,会拉开人与人之间的差距,而且是根本性的。
作为一个工程师,公共的开发机你添砖加瓦维护了吗?公共使用的开发框架你搞清楚了吗,还是每次向同事请教?那些可以你或者他做的事情,你主动要求自己承担了吗?
多承担一些,你会变得与众不同。

Wednesday, June 12, 2013

规范的意义

最近在读迈克尔.桑德尔的《金钱不能买什么——市场的道德边界》。这是一本关于金钱和公正的书,以前很少读相关的社会科学著作,我觉得一些概念、观点十分裨益。
书中关于一些金钱不能买(按照法律或道德规范的要求),的原因主要有以下几种观点:

  1. 金钱的购买会导致被购买的物品价值遭到贬损。比如诺贝尔奖,大学入学名额。
  2. 金钱的购买会导致不公平。如购买黄牛排队代买火车票,排队挂号等。
  3. 金钱的购买会导致人员的品质被腐蚀(贿赂)。权力寻租、孩子努力学习给予金钱奖励。
  4. 金钱挤占非市场规范的位置。比如把现金当作礼物来赠送。
其实,规范作为一种框架性的东西,必然蕴含着一些边界的含义,失之不能被任意侵占,不然骨架必然崩溃。即使最相信自由市场的美国,政府的监管仍然是强有力的。
中国似乎政府的监管比较有力,实则不然。食品安全问题,教育问题,腐败问题,实际上都可以被看作是规范、法律在被金钱腐蚀。腐蚀的结果是严重的,出了直接危害公众的利益之外,由于公众对国内规范的不信任,就需要花更多的成本从国外购买东西,国内的产品反而销路受到了影响。这种模式是时候终结了。

恢复写作的习惯

很久没有写东西了,看得东西倒是多了起来。看和写作为学和习的两个方面,缺一不可。手越来越生的同时,学习的消化能力也会变弱。时常通过写作整理思路,训练表达,是十分必要的。

Thursday, October 13, 2011

Redis: A Wonderful Key-Value Mapping Engine!

Redis is a light weighted, high performance Key-Value mapping engine!
You can set a key-value, get a value.
High performance!