电子商务推荐系统主要是通过统计和挖掘技术,根据用户在网站上的行为,主动为用户提供推荐服务,从而提高网站体验。而根据不同的业务场景,推荐系统需要满足不同的推荐粒度,包括搜索推荐,商品类目推荐,商品标签推荐,店铺推荐等等,主要还是以 商品推荐 为主。而商品推荐主要分为规则模型,协同过滤模型和基于内内容的推荐。我们今天介绍的Apriori
算法就是基于 规则模型 的算法。
把啤酒放在尿布旁,有助于提升啤酒销售量
Apriori
最典型的落地就是沃尔玛的啤酒尿布案例。通过用户交易数据集来寻找商品之间的 关联规则,探究物品之间的相关性,同时达到“将尿布放入购物车之后,再推荐啤酒比直接推荐啤酒获取有更好的售卖效果”。
本篇文章首先简要介绍一下Apriori
算法的基本思想,然后使用业务数据进行了简单的演示。
一、基本概念
以下的是Apriori
算法涉及的一些概念,可以通过后续的举例来理解。
频繁项集(frequent item sets): 经常 同时出在订单中商品的组合。{啤酒,尿布}就是一个频繁项集的例子。
关联规则(associational rules): 暗示两种物品集之间可能存在很强的关系。例如,“购买尿布的用户,有大概率购买啤酒”,这就是一个关联规则。
给定关联规则X=>Y,即根据X推出Y:
支持度(Support):该项集出现的次数除以总的记录数(交易数)。 同时包X和Y的记录数/数据集记录数
置信度(Confidence):项集{X,Y}同时出现的次数占项集{X}出现次数的比例。同时包含X和Y的记录数/包含X的记录数
提升度(Lift):度量项集{X}和项集{Y}的独立性。
二、举例说明
本节通过一个关联规则推荐的例子给大家介绍一下上述名词,假设shein
售卖四类商品,历史上共5笔订单(见下表)
2.1 数据准备
每一行表示一条订单信息,例如:订单编号为sh-0001的订单中包含Beauty、Plus Size、Dress三个品类,以下为方便叙述,使用A、B、C、D来代表上图的4个品类。
2.2 支持度的计算
支持度是某个商品在总销售笔数(N)中出现的概率,可以理解为物品当前流行程度。计算方式是:
支持度 = (包含物品A的记录数量) / (总的记录数量)
例如下表中,共5笔订单,3笔包含Beauty,Beauty的支持度是3/5。支持度评估商品包含在订单中的“概率”,一个订单,有多大概率包含这个商品。
组合商品也有支持度。
共5笔订单,2笔同时包含AB,即A&B
的支持度是2/5。
全局总共4种商品,假设关联规则只关联2种商品,则一共需要计算$C_4^2$共6种组合商品的支持度{AB,AC,AD,BC,BD,CD}。
如果想查看那几种商品组合出现的次数较多,可以通过计算支持度来实现。
2.3 置信度的计算
置信度是指如果购买物品A,有较大可能购买物品B,
本质上是条件概率的应用。计算方式是这样:
置信度( A -> B) = (包含物品A和B的记录数量) / (包含 A 的记录数量)
从上表可以看出,商品A有3次购买,这3次中有2次购买了B,A->B的置信度是2/3。
confidence(A->B) = support(A->B)/support(A)= (2/5)/(3/5) = 2/3
分子support(A->B)是同时购买A与B的比例,分母support(A)是只购买A的比例
这里需要注意的是,$X->Y$与$Y->X$的置信度不一定相等。
B->C的置信度是confidence(B->C)=support(B->C)/support(B)=1,即买商品B时,100%会买C;
C->B的置信度是confidence(C->B)=support(C->B)/support(C)=3/5,买商品C时,只有3/5买了B。
2.4 提升度的计算
提升度表示==先购买==A对购买B的概率的提升作用,用来判断规则是否有实际价值。
在置信度的例子里,$confidence(B->C)=1$,那是不是意味着如果用户将商品B放入购物车,就可以向用户推荐商品C来达到提升C销量的目的呢?
很显然不是。我们目的是“将尿布放入购物车之后,再推荐啤酒”比“直接推荐啤酒”有更好的售卖效果。虽然购买商品B,100%会买C,但如果直接推荐C,用户也100%会买C,所以购买B与购买C是独立事件,用户买不买C和用户买不买B没有直接关系。这里的关联规则推荐,并没有比直接推荐获取更好的效果。
因此提升度是描述使用规则后商品在购物车中出现的次数是否高于商品单独出现在购物车中的频率。如果大于1说明规则有效,小于等于1则无效。
提升度( A -> B) = 置信度( A -> B) / 支持度(B)
在上表中,有3个订单购买A,这3个订单中有2个订单购买了B,所以:
$confidence(A->B) =support(A->B)/support(A) = 2/3$ 即买了A有$2/3$的概率会买B
$support(B) = 3/5$ 表示直接推荐B的话,5个订单中有3个购买了B, 即B的支持度是$3/5$,即有$3/5$的概率会直接买B。
$lift(A->B) =confidence(A->B)/support(B) = 10/9$
会发现,使用关联规则推荐,如果当用户将Beauty(A)品类的商品加入购物车后,再推荐Plus Size(B)品类,比直接推荐Plus Size(B)品类的效果更好。
2.5 总结
在上述关联规则推荐的例子中,推荐的目标是想“将尿布放入购物车之后,再推荐啤酒”比“直接推荐啤酒”有更好的售卖效果。
- 支持度support(A->B),是用户同时购买A和B概率
- 置信度confidence(A->B),是用户购买A的同时,有多大概率购买B
- 提升度lift(A->B),是“用户购买A的同时,有多大概率购买B”与“直接购买B的概率”的比值
- 提升度大于1时,说明A->B有正向效果
- 提升度等于1时,说明A和B是独立事件
- 提升度小于1时,说明A->B有负向效果
三、算法实现
网上有很多封装好的Apriori
算法,大家也可以自行下载使用,代码详见Jupyter notebook
算法对数据分析师而言只是工具,了解基本原理且会调用代码即可。
算法实现涉及到两个重要的定理:
- 如果一个集合是频繁项集,则它的所有子集都是频繁项集。假设一个集合{A,B}是频繁项集,则它的子集{A}, {B} 都是频繁项集。
- 如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。假设集合{A}不是频繁项集,则它的任何超集如{A,B},{A,B,C}必定也不是频繁项集。
通过以上两个定理可以减少程序的计算次数,提高程序的速度。
Apriori实际应用
1.需要根据不同的粒度,如品类,skc等,结合不同的维度,如浏览行为,购买行为,构建符合业务场景的规则模型。
2.Apriori也可以用来进行个topn个性化推荐。首先可以根据一定时间范围内订单数据找到强关联规则(skc)。然后在根据用户购买的商品和规则进行关联,预测用户感兴趣的商品,同时过滤掉用户已经购买过的商品,对于其他商品按照置信度降序进行排序,为用户推荐。
3.Apriori也可以用来进行关键路径分析,研究某个功能或者某些特点的人群的在某些业务场景下的路径。
3.1presto中准备好数据
--准备数据
select
week(cast(substr(t1.pay_time,1,10) as date)) as week_num --周序号
,order_id --订单ID
,array_join(array_agg(distinct cate2),',') as cate from dw.item_df t1
left join da.category t2
on t1.sku_cate = t2.cate4nmwhere site_tp = 'xxx'
and del_flag = 0
and substr(pay_time,1,10) = '2020-04-25' --修改时间事件范围
and country = 'xxx'
and site_id <> 'xxx'
group by 1,2
3.2利用python中mlxtend模块实现
1.首先在命令行中安装mlxtend(可以新建一个环境防止包冲突)
pip install mlxtend
2.导入模块。
#导入包(第一次运行的时候会比较慢)
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
3.调整数据格式,调用包。
if __name__ == '__main__':#读取数据并且调整格式data_set = pd.read_excel('shiyan.xlsx').cate.str.split(',').tolist()#进行 one-hot 编码te = TransactionEncoder()te_ary = te.fit_transform(data_set)df = pd.DataFrame(te_ary, columns = te.columns_)#利用 Apriori 找出频繁项集frequent_itemsets = apriori(df, min_support = 0.1, use_colnames = True)#计算关联规则,一般只需要设置最小执行都就行rules = association_rules(frequent_itemsets, metric = 'confidence' ,min_threshold = 0.3)
4.导出excel
#导出excel
rules.to_excel(r'C:/Users/dell/Desktop/result.xlsx',encoding = 'utf-8')
参数解释:
association_rules(df, metric = ‘confidence‘, min_threshold = 0.8, support_only = False):
-df:这个不用说,就是 Apriori 计算后的频繁项集。
-metric:可选值['support' , 'confidence' , 'lift' , 'leverage' , 'conviction']。里面比较常用的就是置信度和支持度。这个参数和下面的min_threshold参数配合使用
-min_threshold:参数类型是浮点型,根据 metric 不同可选值有不同的范围,
- metric = 'support' => 取值范围 [0,1]
- metric = 'confidence' => 取值范围 [0,1]
- metric = 'lift' => 取值范围 [0, inf]
-support_only:默认是 False。仅计算有支持度的项集,若缺失支持度则用 NaNs 填充。