登录
首页精彩阅读美团推荐算法实践(2)_数据分析师
美团推荐算法实践(2)_数据分析师
2015-01-23
收藏

美团推荐算法实践(2)_数据分析师


5. 实时用户行为

目前我们的业务会产生包括搜索、筛选、收藏、浏览、下单等丰富的用户行为,这些是我们进行效果优化的重要基础。我们当然希望每一个用户行为流都能到达转化的环节,但是事实上远非这样。

当用户产生了下单行为上游的某些行为时,会有相当一部分因为各种原因使行为流没有形成转化。但是,用户的这些上游行为对我们而言是非常重要的先验知识。很多情况下,用户当时没有转化并不代表用户对当前的item不感兴趣。当用户再次到达我们的推荐展位时,我们根据用户之前产生的先验行为理解并识别用户的真正意图,将符合用户意图的相关deal再次展现给用户,引导用户沿着行为流向下游行进,最终达到下单这个终极目标。

目前引入的实时用户行为包括:实时浏览、实时收藏。

6. 替补策略

虽然我们有一系列基于用户历史行为的候选集触发算法,但对于部分新用户或者历史行为不太丰富的用户,上述算法触发的候选集太小,因此需要使用一些替补策略进行填充。

  • 热销单:在一定时间内销量最多的item,可以考虑时间衰减的影响等。
  • 好评单:用户产生的评价中,评分较高的item。
  • 城市单:满足基本的限定条件,在用户的请求城市内的。

子策略融合

为了结合不同触发算法的优点,同时提高候选集的多样性和覆盖率,需要将不同的触发算法融合在一起。常见的融合的方法有以下几种[3]

  1. 加权型:最简单的融合方法就是根据经验值对不同算法赋给不同的权重,对各个算法产生的候选集按照给定的权重进行加权,然后再按照权重排序。
  2. 分级型:优先采用效果好的算法,当产生的候选集大小不足以满足目标值时,再使用效果次好的算法,依此类推。
  3. 调制型:不同的算法按照不同的比例产生一定量的候选集,然后叠加产生最终总的候选集。
  4. 过滤型:当前的算法对前一级算法产生的候选集进行过滤,依此类推,候选集被逐级过滤,最终产生一个小而精的候选集合。

目前我们使用的方法集成了调制和分级两种融合方法,不同的算法根据历史效果表现给定不同的候选集构成比例,同时优先采用效果好的算法触发,如果候选集不够大,再采用效果次之的算法触发,依此类推。

候选集重排序

如上所述,对于不同算法触发出来的候选集,只是根据算法的历史效果决定算法产生的item的位置显得有些简单粗暴,同时,在每个算法的内部,不同item的顺序也只是简单的由一个或者几个因素决定,这些排序的方法只能用于第一步的初选过程,最终的排序结果需要借助机器学习的方法,使用相关的排序模型,综合多方面的因素来确定。

1. 模型

非线性模型能较好的捕捉特征中的非线性关系,但训练和预测的代价相对线性模型要高一些,这也导致了非线性模型的更新周期相对要长。反之,线性模型对特征的处理要求比较高,需要凭借领域知识和经验人工对特征做一些先期处理,但因为线性模型简单,在训练和预测时效率较高。因此在更新周期上也可以做的更短,还可以结合业务做一些在线学习的尝试。在我们的实践中,非线性模型和线性模型都有应用。

  • 非线性模型
    目前我们主要采用了非线性的树模型Additive Groves[4](简称AG),相对于线性模型,非线性模型可以更好的处理特征中的非线性关系,不必像线性模型那样在特征处理和特征组合上花费比较大的精力。AG是一个加性模型,由很多个Grove组成,不同的Grove之间进行bagging得出最后的预测结果,由此可以减小过拟合的影响。
    <a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推荐系统</a>每一个Grove有多棵树组成,在训练时每棵树的拟合目标为真实值与其他树预测结果之和之间的残差。当达到给定数目的树时,重新训练的树会逐棵替代以前的树。经过多次迭代后,达到收敛。
    <a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推荐系统</a>

<a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推荐系统</a>

<a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推荐系统</a>

  • 线性模型
    目前应用比较多的线性模型非Logistic Regression莫属了。为了能实时捕捉数据分布的变化,我们引入了online learning,接入实时数据流,使用google提出的FTRL[5]方法对模型进行在线更新。
    <a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推荐系统</a>

主要的步骤如下:

  • 在线写特征向量到HBase
  • Storm解析实时点击和下单日志流,改写HBase中对应特征向量的label
  • 通过FTRL更新模型权重
  • 将新的模型参数应用于线上

2. 数据

  • 采样:对于点击率预估而言,正负样本严重不均衡,所以需要对负例做一些采样。
  • 负例:正例一般是用户产生点击、下单等转换行为的样本,但是用户没有转换行为的样本是否就一定是负例呢?其实不然,很多展现其实用户根本没有看到,所以把这样样本视为负例是不合理的,也会影响模型的效果。比较常用的方法是skip-above,即用户点击的item位置以上的展现才可能视作负例。当然,上面的负例都是隐式的负反馈数据,除此之外,我们还有用户主动删除的显示负反馈数据,这些数据是高质量的负例。
  • 去噪:对于数据中混杂的刷单等类作弊行为的数据,要将其排除出训练数据,否则会直接影响模型的效果。

3. 特征

在我们目前的重排序模型中,大概分为以下几类特征

  • deal(即团购单,下同)维度的特征:主要是deal本身的一些属性,包括价格、折扣、销量、评分、类别、点击率等
  • user维度的特征:包括用户等级、用户的人口属性、用户的客户端类型等
  • user、deal的交叉特征:包括用户对deal的点击、收藏、购买等
  • 距离特征:包括用户的实时地理位置、常去地理位置、工作地、居住地等与poi的距离

对于非线性模型,上述特征可以直接使用;而对于线性模型,则需要对特征值做一些分桶、归一化等处理,使特征值成为0~1之间的连续值或01二值。

总结

以数据为基础,用算法去雕琢,只有将二者有机结合,才会带来效果的提升。对我们而言,以下两个节点是我们优化过程中的里程碑:

  • 将候选集进行融合:提高了推荐的覆盖度、多样性和精度
  • 引入重排序模型:解决了候选集增加以后deal之间排列顺序的问题
    <a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推荐系统</a>

以上是我们在实践中的一点总结,当然我们还有还多事情要做。

数据分析咨询请扫描二维码

最新资讯
更多
客服在线
立即咨询