背景
公司电商产品,随着商品的不断丰富,用户被大量可选的商品淹没,传统方式很难直接精准呈现用户喜欢的商品,需要增加推荐服务,前期准备从常规服务开始,例如:看了又看,买了又买功能
目标
通过推荐引擎自动计算用户喜欢的商品,在指定的场景呈现给用户,提高最终订单的转化率
推荐系统的三种方式
一、基于人口的统计学推荐(Demographic-based Recommendation)
仅使用用户的基本信息,比如年龄,性别等衡量用户的相似性,建立用户画像将用户分组,将与当前用户相似的用户所偏好的物品推荐给当前用户
算法不涉及到用户对物品的历史偏好数据
- 初级的推荐方式,分析相似的用户来推荐商品
- 对用户分类较为粗糙,推荐精确度不高
二、基于内容的推荐(Content-based Recommendation)
根据推荐物品或内容的元数据,发现物品或者内容的相关性,然后基于用户以往的喜好记录,推荐给用户相似的物品
- 分析相似的物品来推荐
- 可以分析用户的个人喜好来进行推荐,相对于第一种方式更加精确
- 带来了冷启动问题
- 仅考虑了物品本身的特征,没有考虑人对物品的态度
三、基于协同过滤的推荐(Collaborative Filtering-based Recommendation)
根据用户对物品的偏好,来发现物品的相关性或者发现用户的相关性,然后再基于这些关联性进行推荐
-
基于用户的推荐(User-based Recommendation)
根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的“邻居”用户群,在一般的应用中是采用计算“K- 邻居”的算法;然后,基于这 K 个邻居的历史偏好信息,为当前用户进行推荐- 寻找相似的用户
- 通过所有用户对物品的偏好->寻找相似的用户->寻找相似用户喜欢的物品->推荐给当前用户
- 适用应用于:猜你喜欢
-
基于项目的推荐(Item-based Recommendation)
根据所有用户对物品或信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户- 寻找相似的物品
- 通过所有用户对物品的偏好->寻找相似的物品->返回和当前物品相似的物品
- 适用应用于:看了又看/买了又买
-
基于模型的推荐(Model-based Recommendation)
基于模型的协同过滤推荐就是基于样本的用户喜好信息,训练一个推荐模型,然后根据实时的用户喜好的信息进行预测,计算推荐
通过上述分析,决定使用基于物品的协同过滤,接下来就是确定实现方式
实现方案设计
一、整体架构
由于实时推荐较为复杂,第一版采用离线推荐的方式,每日统计一次基础数据,用作训练,分为短期模型和长期模型,短期模型为近7天,长期模型为近一个月
整体流程
- APP 引入埋点,将用户行为数据上报到数据仓库(目前项目使用的是 ClickHouse)
- 每日定时任务调用 ETL 工具抽取用户浏览商品次数数据,将其写入文件
- 将第二步 ETL(kettle) 工具生成的文件同步给 Python 应用服务器,执行训练后将训练结果存入文件
- 使用 Python 提供推荐服务HTTP接口,同时返回推荐数据和埋点数据
- 根据埋点数据,统计 CTR 和 订单转化率,评估推荐效果
- 开发 AB 组件,调整推荐算法后,对比转化数据
选型分析
- 关于语言
实现推荐算法比较好的语言有 Python、R、JAVA, 最终选择 Python 是因为公司目前三个语言都未使用,考虑到上手难度,资料齐全度,训练算法支持,以及提供HTTP服务的便捷性最终选择了 Python - 关于机器学习库
最终选择了 Spark MLlib 库,使用 ALS 算法实现,同时使用 pyspark 包来调用 SparkMLlib - 关于 python 框架
由于最终要提供 HTTP 服务,又只是需要提供推荐接口,所以选择了当前使用范围最广的 Flask 框架来开发