动态规划的用户特征计算思想



  • 作者:Ivan Cui

    用户特征构建是机器学习的基础工作,也是影响机器学习效果的重要环节。随着大规模用户数据的产生,用户特征构建所带来的计算量越来越大,特别是流式计算兴起后如何优化传统的用户特征计算流程显得非常关键。接下来,我们就讨论一下用户特征更新的思路吧。

    假如我们希望建立一个用户每天浏览新闻数量的标签,希望以此衡量用户对新闻阅读的兴趣情况。那么应该如何构建这样一个用户标签呢?首先,我们遇到的问题是用定性标签表示用户是轻度、中度还是重度新闻用户好,还是用一个连续型的打分描述用户的新闻兴趣呢?我认为应该最大限度的保留数据原始的信息,因为连续型的打分信息含量远高于定性标签的信息含量。也许有读者认为应该考虑后端预测算法的类型,如果是做逻辑回归之类擅长处理连续型变量的算法,当然应该用连续型打分,但如果是使用决策树类擅长处理离散型变量的算法,那么定性标签会更好。这么思考看上去很有道理,但是需要注意的是信息含量的问题,有很多种处理方法把连续型变量处理成离散型变量,而且在不同的模型、不同的业务环境下,分段标准也是不一致的,即使后面采用决策树类的算法,也依然是先处理成连续型变量,后续根据业务需求对连续型变量做针对性的离散化处理。

    第二个问题是,如果处理成连续型变量,是做成用户评分更好还是直接反映用户每天的新闻阅读数量更好呢?我的建议依然是在生成用户特征时,尽可能保留原始数据的信息,即使后续因为算法需要做归一化、评分化(模拟成0-5分之间的用户打分)处理。因为根据业务环境和变量的分布特点的不同,需要针对性的设计归一化和评分化的方法,不应该在初始阶段就做相应处理。否则,在需要调整归一化和评分化方法时,需要耗费很大力气还原数据。

    回答了以上两个问题后,可以看出好的用户标签会最大限度地保留原始数据中蕴含的信息,不过这里说的信息并非指原始信息,而是经过针对性加工处理后的信息。比如:因为用户的兴趣特征是在不断变化的,做用户特征标签时,一般距今越近的行为越能代表当前用户兴趣特征,所以可以用指数函数表示用户在第n天行为数据的权重,如下:

    0_1478626750057_1.png 公式一

    其中Pagesn是第n天用户的标签值,q∈(0,1)表示衰减系数,xk是第k天用户的新闻阅读数量。

    但是这个公式有很多问题,第一个问题是:当a≠0.5时,0_1478626792227_2.png,这意味着各项权重之和不为1,那么最终的计算结果的意义不是用户新闻的阅读数量,而仅仅是分数。第二个问题是:每次更新数据都需要计算n天全量的数据,如果能做成动态规划的方式就更好。第三个问题是:对只有一天数据的新用户和有30天数据的老用户来说,他们的评分不具备可比性。

    首先,我们尝试解决最简单的第一个问题。不难看出在假定Xk不变的情况下公式一就是一个等比数列求和公式,即:

    0_1478626816763_3.png 公式二

    那么为了使得各项权重之和为1,对每一项权重除以Sn就可以了,所以公式一变换为:

    0_1478626860440_4.png 公式三

    这样一来,无论q等于多少,每一项权重之和相加后都等于1,所以计算得到的Pages的值就可以代表用户近期平均每天的新闻加权浏览量。

    第二个问题是把以上的多阶问题转化为动态规划的单阶问题。换一个角度思考,如果每一天的Pages的值都可以代表用户在那一天的加权日平均新闻阅读量,那么我们计算该用户后一天的加权日平均新闻阅读量时,只需要考虑新一天的新闻阅读数据对历史加权平均值的影响即可。而这个影响的大小仅仅和最近一天数据的权重有关,通过公式三我们可以求解出最近一天数据最加权和的影响权重为:

    0_1478626893762_5.png

    当q和n确定后,最近一天浏览数据所占权重大小Q就确定下来了,下图是在q取值不同情况下,Q和n的变化关系曲线。当n=1时,意味着仅仅只有1天的观测数据,那么当天的数据所占权重当然为1,当n趋向于无穷大时,Q=1-q,也就是衰减系数越小,Q越大,这和衰减系数的字面理解吻合,衰减系数表示了用户数据随着时间影响力衰减的快慢。

    0_1478626908617_6.png

    所以在已知Q的情况下,公式三化简如下:

    0_1478626925416_7.png

    用上面的公式就可以仅适用最近一个观测周期的数据更新Pages的值了,也就是可以用流式计算和动态规划的方法对数据做更新。

    与此同时,其实第三个问题也迎刃而解,新用户和老用户的n是不同的,n的含义是该用户有多少天的新闻浏览数据观测记录。无论n是多少,这个公式都能公平的反应用户对新闻的加权日均浏览量。另外根据业务场景对n最好也做一个上限的限制,因为根据指数函数的特性,一定天数前的数据对结果影响微乎其微。如果觉得指数函数衰减速度太快,也可以尝试把q定义为一个以n为自变量的函数而非固定值,如果这么做的话公式整体需要重新设计,但是思路还是一致的。

    最后用一个示例数据模拟一下q=0.7时,n<=30的用户加权日均新闻浏览数,让大家有一个直观的理解:

    0_1478626943137_8.png

    在第29天前,某用户第一次计算他的新闻阅读标签数据,当天他阅读了8篇新闻,故Pages=8。在第28天前,也就是该用户计算新闻阅读标签的第二天,他在那天没有看任何一篇新闻,Pages值降低到3.3篇。以此类推,在最近一天,虽然他只看了5篇新闻,但因为过往29天数据的加权,他当天的Pages值仍然达到了18.35。可以看出根据这个算法,可以很好的反映用户在最近一段时间内的加权行为特征。


登录后回复
 

与 BitTiger Community 的连接断开,我们正在尝试重连,请耐心等待