首页 存档 技术 查看内容

饿了么推荐系统:从0到1

2018-3-30 13:00 |来自: 互联网 365 0

摘要: 作者:陈一村,饿了么数据运营部资深算法工程师,在携程个性化推荐与人工智能Meetup上的分享。2016年加入饿了么,现从事大数据挖掘和算法相关工作,包括推荐系统、用户画像等。 随着移动互联网的发展,用户使用习惯 ...

作者:陈一村,饿了么数据运营部资深算法工程师,在携程个性化推荐与人工智能Meetup上的分享。2016年加入饿了么,现从事大数据挖掘和算法相关工作,包括推荐系统、用户画像等。

随着移动互联网的发展,用户使用习惯日趋碎片化,如何让用户在有限的访问时间里找到想要的产品,成为了搜索/推荐系统演进的重要职责。作为外卖领域的独角兽, 饿了么拥有百万级的日活跃用户,如何利用数据挖掘/机器学习的方法挖掘潜在用户、增加用户粘性,已成为迫切需要解决的问题。

个性化推荐系统通过研究用户的兴趣偏好,进行个性化计算,发现用户的兴趣点,从而引导用户发现自己的信息需求。一个好的推荐系统不仅能为用户提供个性化的服务,还能和用户之间建立密切关系,让用户对推荐产生依赖。

本次分享介绍饿 了么如何从0到1构建一个可快速迭代的推荐系统,从产品形态出发,包括推荐模型与特征工程、日志处理与效果评估,以及更深层次的场景选择和意图识别。

在携程个性化推荐与人工智能meetup上,已经就以上几部分做了整体上的说明,本文将就其中模型排序与特征计算的线上实现做具体说明,同时补充有关业务规则相关的洗牌逻辑说明,力图从细节上还原和展示饿了么美食推荐系统。

一、模型排序

1.设计流程

对于任何一个外部请求, 系统都会构建一个QueryInfo(查询请求), 同时从各种数据源提取UserInfo(用户信息)、ShopInfo(商户信息)、FoodInfo(食物信息)以及ABTest配置信息等, 然后调用Ranker排序。以下是排序的基本流程(如下图所示):

  • 调取RankerManager, 初始化排序器Ranker:

  1. 根据ABTest配置信息, 构建排序器Ranker;

  2. 调取ScorerManger, 指定所需打分器Scorer(可以多个); 同时, Scorer会从ModelManager获取对应Model, 并校验;

  3. 调取FeatureManager, 指定及校验Scorer所需特征Features。

  • 调取InstanceBuilder, 汇总所有打分器Scorer的特征, 计算对应排序项EntityInfo(餐厅/食物)排序所需特征Features;

  • 对EntityInfo进行打分, 并按需对Records进行排序。



  • 这里需要说明的是:任何一个模型Model都必须以打分器Scorer形式展示或者被调用。主要是基于以下几点考虑:

    • 模型迭代:比如同一个Model,根据时间、地点、数据抽样等衍生出多个版本Version;

    • 模型参数:比如组合模式(见下一小节)时的权重与轮次设定,模型是否支持并行化等;

    • 特征参数:特征Feature计算参数,比如距离在不同城市具有不同的分段参数。

    2.排序逻辑

    对于机器学习或者学习排序而言, 多种模型的组合(Bagging, Voting或Boosting等)往往能够带来稳定、有效的预测结果。所以, 针对当前美食推荐项目, 框架结合ABTest系统, 支持single、linear及multi三种组合模式, 具体说明如下:

    • single:单一模式, 仅用一个Scorer进行排序打分;

    • linear:线性加权模式, 指定一系列Scorer以及对应的权重, 加权求和;

    • multi:多轮排序模式, 每轮指定Scorer, 仅对前一轮的top N进行排序。

    具体说明如下:

    单一模式:rankType=single

    对于单一模式, 仅有一个Scorer, 且不存在混合情况, 所以只要简单对Scorer的打分进行排序即可, 故在此不做详细展开。ABTest配置格式如下表:

    线性加权模式:rankType=linear

    对于线性加权模式, 在单一模式配置的基础上,需要在ABTest配置每个Scorer的权重, 格式如下表所示:

    当LinearRanker初始化时, 会校验和初始化所有打分器Scorer。之后, 按照以下步骤对餐厅/食物列表进行排序, 详见下图(左):

    • 特征计算器InstanceBuilder调用ScorerList, 获取所有所需特征Feature并去重;

    • InstanceBuilder对所有餐厅/食物进行特征计算, 详见特征计算;

    • ScorerList中所有Scorer对所有餐厅/食物依次进行打分;

    • 对所有Scorer打分进行加权求和, 之后排序。

    多轮排序模式:rankType=multi

    对于多轮排序模式, 每轮设定一个Scorer, 对前一轮top=Num个餐厅/食物进行排序, 故在ABTest中需要设定每个Scorer的轮次(round)和排序数(num), 格式如下表。

    MultiRanker初始化与特征计算与LinearRanker类似, 具体步骤详见上图(右):

    • 特征计算器InstanceBuilder调用ScorerList, 获取所有所需特征Feature并去重;

    • InstanceBuilder对所有餐厅/食物进行特征计算, 详见特征计算;

    • Scorer按轮次(round)对top=Num餐厅/食物进行打分;

    • 对top=Num餐厅/食物按当前Scorer的打分进行排序。

    重复步骤3、4, 直到走完所有轮次。

    在初始化阶段, Ranker根据ABTest配置信息指定算法版本(algoVersion)、排序类型(rankType)、排序层级(rankLevel)及相关打分器(ScorerList)。

    3.模型定义

    对于线上任何Model,ModelManager 都会通过以下流程获取相应实例和功能(如下图所示):

    • 模型实例化时的构造函数BaseModel()和校验函数validate();

    • 通过FeatureManager获取对应Model的特征Feature:abstract getFieldNames()/getFeatures();

    • 传入Model的特征, 获取预测分数:abstract predict(Map

    对于Model的迭代和更新、以及之后的Online Learning等, 通过ModelManager对接相应服务来实现。


    如上图所示, 对于任何一个可被Scorer直接调用Model, 都需要实现以下接口:

    1. 可供ModelManager进行Model实例化的BaseModel() 和初始化的init()

    声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

    路过

    雷人

    握手

    鲜花

    鸡蛋

    相关分类

    返回顶部