电子商务推荐系统主要是通过统计和挖掘技术,根据用户在网站上的行为,主动为用户提供推荐服务,从而提高网站体验。而根据不同的业务场景,推荐系统需要满足不同的推荐粒度,包括搜索推荐,商品类目推荐,商品标签推荐,店铺推荐等等,主要还是以 商品推荐 为主。而商品推荐主要分为规则模型,协同过滤模型和基于内内容的推荐。我们今天介绍的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

算法对数据分析师而言只是工具,了解基本原理且会调用代码即可。

算法实现涉及到两个重要的定理:

  1. 如果一个集合是频繁项集,则它的所有子集都是频繁项集。假设一个集合{A,B}是频繁项集,则它的子集{A}, {B} 都是频繁项集。
  2. 如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。假设集合{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 填充。

apriori算法c++_关联分析——基于Apriori算法实现相关推荐

  1. apriori数据集_关联分析——基于Apriori算法实现

    电子商务推荐系统主要是通过统计和挖掘技术,根据用户在网站上的行为,主动为用户提供推荐服务,从而提高网站体验.而根据不同的业务场景,推荐系统需要满足不同的推荐粒度,包括搜索推荐,商品类目推荐,商品标签推 ...

  2. 频繁项目集java实现_关联分析(2):Apriori产生频繁项集

    在关联分析(1):概念及应用中,我们介绍了关联分析的应用场景.基本概念和规则产生思路.在本次的文章中,我们将介绍Apriori算法频繁项集产生的原理.文章中会涉及专有名词,不清楚概念的可在上一篇文章中 ...

  3. 【机器学习】Apriori 算法进行关联分析和FP-growth算法

    [机器学习]Apriori 算法进行关联分析和FP-growth算法 文章目录 1 关联分析 2 FP-growth算法理解和实现 3 FP增长算法的频繁项集产生 4 FP-Growth关联分析算法在 ...

  4. 轻松入门机器学习数据挖掘算法——关联分析(Apriori算法)

    小故事:20世纪90年代,沃尔玛超市在对顾客的购物记录进行购物篮分析时,发现了一个奇怪的现象: "啤酒"和"尿布"两件看上去毫无关系的商品,经常出现在同一个购物 ...

  5. 关联分析:FP-Growth算法

    转载自  关联分析:FP-Growth算法 关联分析又称关联挖掘,就是在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.关联分析的一个典型例子是 ...

  6. python银行家算法代码_避免死锁的银行家算法C++程序实现

     本篇博文为追忆以前写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...

  7. python 频繁项集_关联分析之发现频繁项集--使用Apriori算法(1)

    从大规模数据集中寻找物品间的隐含关系被称为关联分析,最有名的案例应该是啤酒和尿布了.这些关系可以用两种方式来量化,一个是使用频繁项集,给出经常在一起出现的元素项:一个是关联规则,每条关联规则意味着元素 ...

  8. python关联分析代码_1行代码实现关联分析(Apriori)算法

    本文不涉及关联分析算法的计算原理,只注重代码实现. 最近公司分了个任务,要求写一篇面向python初学者的关联分析演习材料.遇到这种情况,我的解决办法当然是优先使用已有模块,然后写一篇模块使用方法指南 ...

  9. 机器学习 (十五) 关联分析之Apriori算法

    前言 目前随着数据量迅速增多,从海量数据中寻找有价值的信息带来的成本也在不断增加,传统的搜索数据方式已经不能满足我们的需要,我们先来通过一个算法看一下算法时间复杂度快慢带来的影响,通过计算耗时我们会有 ...

最新文章

  1. NLP中的Attention注意力机制+Transformer详解
  2. linux php不支持crypt,(PHP)如何在CRYPT_BLOWFISH中使用crypt()?
  3. 转:Tomcat启动失败 提示Server Tomcat v7.0 Server at localhost failed to start.六种解决方法
  4. electron 主进程与渲染进程 渲染进程与渲染进程 之间的通信
  5. 解决 Visual Studio 中代码注释自动折叠的问题
  6. this和arguments
  7. 关于xrdp的安装设置
  8. WordPress程序伪静态规则(Nginx/Apache)及二级目录规则
  9. AGC018C Coins (set)
  10. JDK1.8中英文官方文档
  11. 梯度下降计实例计算(二维)
  12. 【菠萝狗四足机器人】二次开发教程--第一章 【简介与开发环境搭建】
  13. 云端应用典型应用场景
  14. javafx:AnchorPane设置子容器和父容器同等大小
  15. 最后聊聊:备案需要注意的地方和域名的解析
  16. 一种计算标准差的高效方法:Welford迭代法
  17. 如何修改Linux服务器时间
  18. MYSQL修改初始化密码的方法
  19. 隐藏攻击面,提升信息安全防范能力
  20. 2023.2.11双阶乘

热门文章

  1. 自动驾驶中激光雷达如何检测障碍物?
  2. sql server2008如何修改mac地址_如何查看本机的MAC地址和IP地址?
  3. java 缓存接口,java项目中,针对缓存问题的处理方式【接口中的处理方式】
  4. 计算机软件水平考试调整,全国计算机等级考试调整方案
  5. svn切换分支 如何判断 是否完成_SVN创建分支/合并分支/切换分支
  6. php 运算验证码类,php 数学运算验证码实现代码
  7. 前端js 实现文件下载
  8. 送福利:ROKID 语音开发板免费送,开启你的物联网之旅
  9. Ubuntu 16.04 下octave的使用入门
  10. android-线程池-最顺手的写法