基于强化学习的商品推荐系统
1. 实验内容描述
商品推荐系统是当下机器学习算法应用中比较成熟的一个场景,当我们打开
浏览器进入电商网站时,都可以看到在侧框出现的商品推荐。这些推荐的背后可
能是很复杂的框架,如基于用户画像和历史购买数据的推荐引擎,也可能是简单
的按照人群划分的一类推荐。推荐系统作为电商购物系统的重要组成部分,本文
就利用推荐算法—协同过滤,搭建一套商品推荐系统。
1.1. 场景解析
例如,有 3 种商品分别是手机、手机壳和马桶,当一个用户购买了手机之后,
他最有可能购买的产品是手机壳还是马桶呢?通常来讲是手机壳,因为二者的关
联性更强。我们通过协同过滤算法就是希望找出类似手机和手机壳之间的对应关
系。本文采用的数据集来自于网络开源的用户用户购物行为数据集,如图 1-1
所示。
数据集中各字段含义见表 1-1.
图 1-1 购物数据集
字 段 名
user_id
item_id
Active_type
active_date
含 义
用户编号
物品编号
购物行为
购物时间
类 型
String
String
String
String
描 述
购物的用户 ID
被购买的物品 ID
0 表示点击、1 表示购买
行为发生时间
通过图 1-1 中的数据,我们了解到这是一个典型的电商购物数据的日志记录,
数据包含了可以用于协同过滤算法的字段—用户以及商品(user-item)对,还
包含了每个 user-item 对的行为方式以及发生时间。通过以上数据,我们就可以
把整个实验的评估场景抽象出来,按照时间对数据进行拆分,如选择用户前 3
个月的购物数据去做协同过滤算法,找到手机和手机壳这样的高频成交对,然后
在用后几个月的购物数据去验证这些成交对的准确性。具体的推荐原则如下。例
如通过协同过滤算法得到商品 A 和商品 B 经常被打包购买,那么当一个用户购买
了商品 A 之后,就推介商品 B 给他,这是一种基于商品属性的关联规则。
以下对上述分析内容做一个归纳。
·数据集适合于通过协同过滤算法做推介。
·通过算法可以找到成交可能性高的商品对 A 和 B。
·当用户购买 A 时,推荐用户商品 B。
2. 算法描述
2.1. 基础概要
协同过滤算法是一种较为著名和常用的推荐算法,它基于对用户历史行为数
据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐。也就是常
见的“猜你喜欢”,和“购买了该商品的人也喜欢”等功能。它的主要实现由:
·根据和你有共同喜好的人给你推荐
·根据你喜欢的物品给你推荐相似物品
·根据以上条件综合推荐
因此可以得出常用的协同过滤算法分为两种,基于用户的协同过滤算法
UCF(user-based collaborative filtering),以及基于物品的协同过滤算法
ICF(item-based collaborative filtering)。特点可以概括为“人以类聚,物
以群分”,并据此进行预测和推荐。
·UCF 基于人的偏好进行推荐,从全量数据集中找出哪些人是有相同偏好的,
针对人群之间的相似偏好性进行推荐。例如,假设 A 和 B 喜欢的运动种类相似,
说明他们在体育方面有相似的偏好。当 A 喜欢另一种运动 C,而 B 没有做过 C 这
种运动时,我们认定 B 也喜欢 C,并且把 C 推送给 B。这是典型的以人为基础的
推荐,所以称为 User-based。
·ICF 基于物品的推荐,从物品的角度先找到相似度高的商品,然后进行推
荐。对 ICF 这样的场景,数据挖掘领域有一个经典的案例就是“尿布与啤酒的故
事”。通常来讲,我们潜意识理解的相似物品的概念是指商品属性方面的相似,
如篮球和足球是一对相似的物品,因为它们都是球类。但是在“尿布和啤酒”这
个案例中,俩个物品似乎不具备属性相似的特点。这也是 ICF 算法的特点,它是
基于大量的数据统计信息进行推荐,会帮助找出很多隐藏关系的物品对。
下面通过一个例子说明,假如我们有一份用户购物数据(见表 2-1)
表 2-1 用户购物数据
商品
用户
甲
乙
丙
A
√
√
√
B
√
C
√
√
推荐购买
通过甲和乙的购买行为发现,商品 A 和商品 C 总是同时出现在客户的购物框
中,我们可以假设 A 和 C 是有某种关联性的,就像上文中的“啤酒和尿布”一样,
这种关联关系在数据量小的时候体现的不是特别明显,但是当我们数据量非常大
的时候,如有 10000 条购买记录,其中 A 和 C 同时出现在购物车的数量是 9000
条,那么就可以确信这种比较关联的关系。这个时候当另一个用户丙购买了 A
的时候,就推测他可能也会买 C,于是就把商品 C 推荐给用户丙。实际在工业化
使用过程中,ICF 可以起到比较好的效果。
2.2. 算法推导
(1)相似度计算
Item-based 算法首选计算物品之间的相似度,计算相似度的方法有以下几种:
1.基于余弦(Cosine-based)的相似度计算,通过计算两个向量之间的夹角
余弦值来计算物品之间的相似性,公式如下:
其中分子为两个向量的内积,即两个向量相同位置的数字相乘。
2.基于关联(Correlation-based)的相似度计算,计算两个向量之间的
Pearson-r 关联度,公式如下:
其中 表示用户 u 对物品 i 的打分, 表示第 i 个物品打分的平均值。
3. 调整的余弦(Adjusted Cosine)相似度计算,由于基于余弦的相似度计
算没有考虑不同用户的打分情况,可能有的用户偏向于给高分,而有的用户偏向
于给低分,该方法通过减去用户打分的平均值消除不同用户打分习惯的影响,公
式如下:
其中 表示用户 u 打分的平均值。
(2)预测值计算
根据之前算好的物品之间的相似度,接下来对用户未打分的物品进行预测,
有两种预测方法:
1. 加权求和。
用过对用户 u 已打分的物品的分数进行加权求和,权值为各个物品与物品 i
的相似度,然后对所有物品相似度的和求平均,计算得到用户 u 对物品 i 打分,
公式如下:
其中
为物品 i 与物品 N 的相似度,
为用户 u 对物品 N 的打分。
2. 回归。
和上面加权求和的方法类似,但回归的方法不直接使用相似物品 N 的打分值
,因为用余弦法或 Pearson 关联法计算相似度时存在一个误区,即两个打分
向量可能相距比较远(欧氏距离),但有可能有很高的相似度。因为不同用户的
打分习惯不同,有的偏向打高分,有的偏向打低分。如果两个用户都喜欢一样的
物品,因为打分习惯不同,他们的欧式距离可能比较远,但他们应该有较高的相
似度。在这种情况下用户原始的相似物品的打分值进行计算会造成糟糕的预测结
果。通过用线性回归的方式重新估算一个新的 值,运用上面同样的方法进行
预测。重新计算 的方法如下:
其中物品 N 是物品 i 的相似物品, 和 通过对物品 N 和 i 的打分向量进行线性
回归计算得到, 为回归模型的误差。
3. 实验搭建
首先介绍整个实验的逻辑,如图 3-1 所示。
我们可以纵向的把整个推荐系统分为 3 个部分,分别是拆分数据集、协同过
图 3-1 推荐系统逻辑
滤算法计算、推荐以及结果层。
3.1. 拆分数据集
数据集包含 4~8 月的用户购物数据,按照上文分析的思路,把数据集进行拆
分。4~6 月的数据用来做协同过滤算法训练,找到对应的 item-similar 对,对
应的数据源组件是“cf_训练_data”。通过基于物品的协同过滤算法对 7 月和 8
月中用户的可能购买商品进行推荐,对应组件是“cf_结果_data”。
3.2. 协同过滤算法
这部分用到了 4 个组件,首先通过组件“SQL 取购买行为”把发生购买行为
的数据选择出来,用到的 SQL 语句如下,选择 active_type 为 1 的数据,数字 1
表示用户购买的对应商品。
select * from $ {t1} where active_type=1;
然后在“协同过滤 etric 组件”的选择字段配置中选取 user_id 和 item_id
俩个字段进行协同过滤训练,最终“协同过滤 etric 组件”的生成结果如图 3-2
所示。
图 3-2 协同过滤结果
生成的结果有俩个字段,itemid 表示其中被购买物品 ID,similarity 是一
个“K:V”对(一种数据表示形式),K 表示的是产品 ID,V 代表着相似度权重。
以图 3-2 中第一行数据为例,“商品 1000”和 “商品 15584”被同时购买的权重
为 0.2747,这个权重越大表示“商品 1000”和 “商品 15584”同时被购买的概
率越大。
通过下面的“SQL 整理输出格式组件”把上面的 K:V 对结构展开,SQL 语句
如下。
select itemid,SPLIT_PART(similarity,‘:’,1) as similar_item from ${t1};
最后通过“join”组件就可以整理成如图 3-4 所示的输出形态。
图 3-4 join 组件输出
图 3-4 的意义为若 user_id 用户购买了 itemid 商品,那么 user_id 也很有
可能购买 similar_item。以图 3-3 的第一条数据为例,user_id 为 19500 的用户
一旦购买了产品 143,就会为他推荐产品 7105。
3.3. 推荐以及成交结果
这一步就是将推荐数据跟用户真实购买数据进行一个 SQL 的 join 操作,得
到推荐成功的结果。在“join”组件中拿到了推荐成功的列表,因为列表中会有
重复的条目,所以加上一个“SQL 去重组件”删除重复项。单击鼠标右键查看“SQL
去重组件”,就得到了通过本次实验搭建的推荐引擎的真实命中了哪些推荐条目,
如图 3-5 所示。
通过协同过滤算法搭建的商品推荐系统至此就完成了,协同过滤本来就是针
图 3-5 命中条目截图
对商品推荐场景所研发的算法,本质其实就是聚类。