前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >关联规则算法Apriori algorithm详解以及为什么它不适用于所有的推荐系统

关联规则算法Apriori algorithm详解以及为什么它不适用于所有的推荐系统

作者头像
deephub
发布于 2022-11-11 09:38:56
发布于 2022-11-11 09:38:56
1.4K00
代码可运行
举报
文章被收录于专栏:DeepHub IMBADeepHub IMBA
运行总次数:0
代码可运行

点击上方“Deephub Imba”,关注公众号,好文章不错过 !

Apriori是Agarwal和Srikant在1994年首次提出的一种关联规则挖掘算法,它可以在特定类型的数据中找到关系,并将其表示为规则。关联规则挖掘最常用于营销,特别是在购物车的上下文中。这个应用领域被正式称为“购物车分析”。

我们这里假设学校建立了一个在线学习的网站,通过学生将课程添加到课程列表(虚拟购物车)来评估不同的课程。我们最后生成了一个文件,每一行都包含一个学生考虑同时参加的课程的列表。例如,如果一个学生考虑在 2020 年秋季参加经济学 101 和生物学 100,我们的 csv 文件中会有一行如下所示:

代码语言:javascript
代码运行次数:0
复制
 ECON_101, BIOL_100

从最广泛的角度来说,apriori算法通过产品的组合,计算关于产品之间关系强度的一些度量(支持度、置信度、提升度),并将这些关系表示为规则。

Apriori algorithm

与其他一些机器学习算法相比,apriori的结果似乎非常简单,但它的优点是可以很容易地理解输出结果。如果这种通用方法对Amazon来说足够好,那么对我来说也足够好。

在开始之前我们先看看一些需要掌握的关键词:

Itemsets:这个单词翻译为项集,其实我觉得产品组合更好,因为它是再购物车中同时购买的产品的集合。在本文中中,它是学生在同一学期考虑参加的课程列表,因为我们上面说了课程的选择可以理解为“购物车”。项集的另一个示例是一般商铺中购物车同时购买的产品,例如“面包、鸡蛋、尿布”。

  • Antecedent:itemset中的第一个产品,可以成为前件
  • Consequent:itemset中的第二个产品,可以成为后件
  • Rule:antecedent → consequent 的关系

也就是说我们的要在这个Itemsets中找到Antecedent和Consequent的关系规则rule。

用上面的例子,我们知道经济学101和生物学100是联系在一起的,因为一个学生想同时修这两门课。但是他们的关系是随机的还是经常出现呢?我们将用三种方法来回答这个问题。

1、支持度 Support

支持度告诉我们一个给定项目被选择的频率。在我们的例子中,它告诉我们一个类的绝对受欢迎程度。

给定类A和提供~A(不是A)的其他类,支持度的计算为:

在我们的例子中,假设30个不同的学生考虑经济学101,而所有学生考虑1000个其他课程,包括那些想要学习经济学101的学生。那么我们的支持度就是:

Support= 30/1000 = 0.03

支持度越高,项目就越有可能出现在给定的项目集中。

2、置信度 Confidence

置信度是两个产品在同一个项集中的可能性。在我们的例子中,如果我们考虑经济学101,那么我们可能也会考虑生物学100。所以,给定类A和类B:

换句话说,它是生物学100和经济学101在同一购物车中的可能性除以经济学101在任意购物车中的次数。

如果置信度= 1,只要经济101出现了那么生物100必出现。如果置信度= 0.75,那么经济学101出现了有75%可能生物100出现。

3、提升度 Lift

提升度为我们提供了两个产品之间关系的最佳例证。对于A类和B类,

提升度有三种情况:

> 1,那么一个学生很可能在上经济学101的同时上生物100。(该学生将选B课,因为他们正在选a课)举个例子,如果lift = 3.33,那么一个学生在同一学期选修经济学101和生物100的概率是选修经济学101而不选修生物100的概率的3.33倍。

< 1,那么这个学生不太可能同时修生物100和经济学101。(该学生不会选B课,因为他们选的是a课)

= 1,则两项之间没有关系。

了解了上面的3个度量,我将用文字来解释算法的基本细节,然后在最后给出一些伪代码来总结它。在apriori的所有实现中,都需要为算法提供一个最小支持度值,min_sup。

首先,apriori算法找出所有支持度在最小支持度或最小支持度以上的条目。如果min_sup = 0.01,那么算法只会为至少出现在1/100个项集生成规则。

然后,apriori查找所有频繁出现的包含2个项集(支持度大于或等于min_sup)。然后是3个,然后是4个,以此类推,直到算法遍历完所有的第一步找到项集项。在这里每一步中,它会清除虽然出现了但不太频繁的项目,这样可以消除虚假关系。

最后,apriori从支持度大于最小阈值的项集中选取所有规则,计算并报告支持度、置信度和提升度。

算法的计算成本很高,因为它会多次检查相同的数据。大O是2^|D|,其中|D|是所有项集中出现的产品的总数,并且它很容易受到虚假关联的影响。但是关联规则不受因变量个数的限制,能够在大型数据库中发现数据之间的关联关系,所以其应用非常广泛,但是他是否可以应用于所有系统呢?Apriori并不是适用于所有类型的数据集。

Apriori algorithm为什么不适用于某些产品

下面我们使用一个电子商务平台的事件数据【查看,添加到购物车,购买】,包括所有的电子品牌。其目的是确定影响购买几种产品的不常见规则。由于三星和苹果总共占了57%的数据,我们只关注这两个品牌的购买情况。

数据集为:

  • Market Basket Analysis Data | Kaggle
  • eCommerce behavior data from multi-category store | Kaggle

“transaction 交易”指的是购买一个或多个物品。每个“交易”都有一个惟一的用户会话ID。

“purchase 购买”指的是只购买该物品的一个数量。多个“购买”可以有一个普通的用户会话ID。

在删除“查看”和“添加到购物车”记录后,我们假设数据集中的每一行都与购买该商品的一个数量有关。这些个人购买按用户会话 ID 分组,从而产生不同的交易。

我们在 python 上使用 Apriori 算法分别为苹果和三星进行购物车分析。由于许多单独的项目交易,我们不得不将指标阈值降低到小数点后几位。

代码语言:javascript
代码运行次数:0
复制
 from mlxtend.frequent_patterns import apriori
 from mlxtend.frequent_patterns import association_rules
 def hot_encode(x):
     if(x<= 0):
         return 0
     if(x> 0):
         return 1
 def RuleMiner(dataframe, min_support_popular_set=0.001,min_support_rules=0.001, metric='lift'):
     """Function to get rules based on the support threshold and metric. 
     dataframe: Dataframe which contains the transactions in the specified schema.
     min_support_set: The threshold for filtering the frequent item sets having more support value than threshold.
     min_support_rules: The threshold for filtering the rules having metric value more than threshold
     metric: lift, support, confidence"""
     df=dataframe
     msPS = min_support_popular_set
     msAR = min_support_rules
     metric=metric
     prod_counts = df.groupby(by='user_session')[['productType']].count()
     df_prod_count_combined = pd.merge(df,prod_counts, on='user_session')
     
     df_prod_count_combined.rename(columns = {'productType_x':'productType'}, inplace = True)
     df_prod_count_combined.rename(columns = {'productType_y':'quantity'}, inplace = True)
     
     basket = df_prod_count_combined.groupby(
         ['user_session','productType'])['quantity'].sum().unstack().reset_index().fillna(0).set_index('user_session')
     
     basket_model = basket.applymap(hot_encode)
     popular_sets = apriori(basket_model, min_support=msPS, use_colnames=True, verbose = 1)
     popular_sets['length'] = popular_sets['itemsets'].apply(lambda x: len(x))
     rules = association_rules(popular_sets, metric=metric, min_threshold = msAR)
     rules = rules.sort_values(['lift'], ascending =[False])
     #rules = rules.sort_values(['confidence', 'lift'], ascending =[False, False])
     return rules
 
 RuleMiner(sam_df,min_support_popular_set=0.0005,min_support_rules=0.0005)
代码语言:javascript
代码运行次数:0
复制
 RuleMiner(sam_df,min_support_popular_set=0.00005,min_support_rules=0.0005, metric='confidence')

可以看到的支持度都非常低,我们找不到任何两个给定项目之间的任何重要关联规则。为了验证我们的方法是否正确,我们在第二个数据集上运行了相同的代码。

我们发现如果先购买“莳萝”,购买“鸡蛋”的置信度为 0.39。同时,如果先购买“鸡蛋”,则购买“莳萝”的可能性约为 0.41。

代码语言:javascript
代码运行次数:0
复制
 warnings.filterwarnings('ignore')
 popular_sets = apriori(df2, min_support=0.1, use_colnames=True, verbose = 1)
 popular_sets['length'] = popular_sets['itemsets'].apply(lambda x: len(x))
 rules = association_rules(popular_sets, metric='confidence', min_threshold = 0.001)
 rules = rules.sort_values(['lift'], ascending =[False])
 rules

置信度并不总是一种确定购买物品 B 的机会是否取决于购买物品 A 的衡量标准。如果任何两个给定物品的提升度相同,则物品的顺序购买不应该不同。

我们返回到第一个数据集,并删除所有单品的交易,并且这次加入了所有品牌的交易,而不仅仅是苹果或三星。

返回了大量提升值和显着置信度值的规则。对于具有各种项集的许多不同规则,支持度为 0.000205(仅供参考,所有规则中的最高支持值)。可以看到这些项集只是相同购买的不同组合但是代表相同的交易。在总共 58435 个交易中,支持度 都为0.000205 ,因此这些项目之间无法建立显着的关联规则。

这是为什么呢?

Apriori算法不适用于所有类型的数据集,它适用于产品很多,并且有很大可能同时购买多种产品的地方,例如,在杂货店或运动器材商店或百货商店等。而电子产品的品类不多,并且非常昂贵,所以很少有交易频繁地同时购买多种产品。在这种情况下,Apriori对于寻找有意义的关联规则是没有用的。

另外就是即使在适用Apriori的地方,考虑的最重要指标也应该是支持度,因为高的支持度表明给定产品组合的交易数量较多。并且如果提升值大于1,可以得出关联规则是显著的,才可以进一步探索,以获得更大的收益。


MORE

kaggle比赛交流和组队

加我的微信,邀你进群

喜欢就关注一下吧:

点个 在看 你最好看!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DeepHub IMBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关联规则挖掘:Apriori算法的深度探讨
Apriori算法是一种用于挖掘数据集中频繁项集的算法,进而用于生成关联规则。这种算法在数据挖掘、机器学习、市场篮子分析等多个领域都有广泛的应用。
TechLead
2023/10/21
1.1K0
关联规则挖掘:Apriori算法的深度探讨
关联规则(二):Apriori算法
假设我们在经营一家商品种类并不多的杂货店,我们对那些经常在一起被购买的商品非常感兴趣。我们只有 4 种商品:商品0,商品1,商品2和商品3。
fireWang
2019/05/15
4.7K0
机器学习|关联规则与购物篮分析实战
客户A企业是一家全球知名家具和家居零售商,销售主要包括座椅/沙发系列、办公用品、卧室系列、厨房系列、照明系列、纺织品、炊具系列、房屋储藏系列、儿童产品系列等约10,000个产品。为了维持顾客忠诚度、扩大销售,A企业希望通过顾客已有的购买记录,为顾客推荐更多的产品。请使用关联规则的方法,实现客户的需求。
数据STUDIO
2021/06/24
1.7K0
HAWQ + MADlib 玩转数据挖掘之(七)——关联规则方法之Apriori算法
用户1148526
2018/01/03
1.6K0
HAWQ + MADlib 玩转数据挖掘之(七)——关联规则方法之Apriori算法
MADlib——基于SQL的数据挖掘解决方案(27)——关联规则之Apriori算法
数据仓库或数据挖掘从业者一定对“啤酒与尿布”的故事不会陌生。这就是一个使用关联规则的经典案例。根据对超市顾客购买行为的数据挖掘发现,男顾客经常一起购买啤酒和尿布,于是经理决定将啤酒与尿布放置在一起,让顾客很容易在货架上看到,从而使销售额大幅度增长。关联规则挖掘在多个领域得到了广泛应用,包括互联网数据分析、生物工程、电信和保险业的错误校验等。本篇将介绍关联规则方法、Apriori算法和MADlib的Apriori相关函数。之后我们用一个示例说明如何使用MADlib的Apriori函数发现关联规则。
用户1148526
2019/05/25
1.3K0
你不懂的关联规则
支持度: 支持度是一个百分比,指某个商品组合出现的次数与总次数之间的比例,支持度越高表示该组合出现的几率越大。
润森
2019/08/29
1.3K0
你不懂的关联规则
Apriori 算法-如何进行关联规则挖掘
据说,在美国西部的一家连锁超市发现,很多男人会在周四购买尿布和啤酒。这样超市就可以将尿布与啤酒放在一起卖,便可以增加销售量。
huofo
2022/03/18
7520
Apriori 算法-如何进行关联规则挖掘
利用关联规则实现推荐算法
关联规则是以规则的方式呈现项目之间的相关性:关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘的一个重要技术,用于从大量数据中挖掘出有价值的数据项之间的相关关系。
deephub
2021/12/28
7320
利用关联规则实现推荐算法
R关联规则算法(支持度、自信度、提升度)
本文介绍了关联规则算法,包括Apriori算法和FP-growth算法,并给出了在R语言中的实现方法。以啤酒-尿布为例,进行了关联规则挖掘,并分析了挖掘结果的价值。
Erin
2018/01/09
1K0
机器学习(三) 关联规则R语言实战 Apriori
关联规则背景 关联规则来源 上个世纪,美国连锁超市活尔玛通过大量的数据分析发现了一个非常有趣的现象:尿布与啤酒这两种看起来风马牛不相及的商品销售数据曲线非常相似,并且尿布与啤酒经常被同时购买,也即购买尿布的顾客一般也同时购买了啤酒。于是超市将尿布与啤酒摆在一起,这一举措使得尿布和啤酒的销量大幅增加。 原来,美国的妇女通常全职在家照顾孩子,并且她们经常会嘱咐丈夫在下班回家的路上为孩子买尿布,而丈夫在买尿布的同时又会顺手购买自己爱喝的啤酒。 注: 此案例很精典,切勿盲目模仿案例本身,而应了解其背后原理。它发生
Jason Guo
2018/06/20
2.6K0
机器学习笔记之python实现关联规则算法Apriori样例
调用apriori进行关联规则分析,具体代码如下,设置最小支持度(min_support)为0.4,最小置信度(min_threshold)为0.1,
Jetpropelledsnake21
2021/01/04
1K0
挖掘关联规则之Apriori算法
1. Apriori算法的目的: 主要是用来挖掘关联规则,即从一个事务数据集中发现频繁项集并推出关联规则,其名字是因为算法基于先验知识(prior knowledge).根据前一次找到的频繁项来生成本
智能算法
2018/04/03
9460
挖掘关联规则之Apriori算法
挖掘关联规则之Apriori算法
1. Apriori算法的目的: 主要是用来挖掘关联规则,即从一个事务数据集中发现频繁项集并推出关联规则,其名字是因为算法基于先验知识(prior knowledge).根据前一次找到的频繁项来生成本
智能算法
2018/04/02
1.3K0
挖掘关联规则之Apriori算法
老板问我,什么是关联规则推荐?
工程架构方向的程序员,看到推荐/搜索/广告等和算法相关的技术,心中或多或少有一丝胆怯。但认真研究之后,发现其实没有这么难。
架构师之路
2021/11/30
5760
老板问我,什么是关联规则推荐?
3分钟了解“关联规则”推荐
“把啤酒放在尿布旁,有助于提升啤酒销售量”是关联规则推荐的经典案例,今天,和大家聊聊“关联规则推荐”,正文不含任何公式,保证PM弄懂。 一、概念 什么是关联规则(Association Rules)? 答:关联规则是数据挖掘中的概念,通过分析数据,找到数据之间的关联。电商中经常用来分析购买物品之间的相关性,例如,“购买尿布的用户,有大概率购买啤酒”,这就是一个关联规则。 画外音:如果把买尿布记作A,买啤酒记作B。 “买尿布的用户有较大概率买啤酒”这个关联规则记作A -> B。 什么是关联规则推荐(Assoc
架构师之路
2018/04/19
6070
3分钟了解“关联规则”推荐
从啤酒与尿布到关联规则
传说二十世纪90年代,美国沃尔玛超市的销售管理人员在分析销售订单时发现,啤酒与尿布这两件看起来毫不关联的商品竟然经常会出现在同一个订单中。后来跟踪调查发现,原来美国的年轻夫妇一般在周五晚上妻子会安排丈夫去超市购买尿布,而丈夫在购买尿布时总会忍不住顺便给自己买上几罐啤酒,这就是为什么啤酒和尿布这两件看起来毫不关联的商品经常会出现在同一个购物篮中。这个故事至今仍是大数据挖掘中津津乐道的经典案例。因为它揭示了数据中两个事物之间的关联性问题,也就是我们今天也重点介绍的——关联规则(分析)。
用户7569543
2020/07/17
1.2K0
还记得啤酒和尿不湿的故事吗?我用Python带你一起玩玩关联规则!
大部分朋友应该听过“啤酒”和“尿布”的故事——超市分析顾客的商品购买记录,发现“啤酒”和“尿布”经常被一起购买,背后的原因是美国家庭婴儿一般由母亲在家照顾,年轻的父亲到超市购买尿布时会顺便买上自己喜欢的啤酒(暂且不论故事的真实性)。
1480
2019/07/22
9300
还记得啤酒和尿不湿的故事吗?我用Python带你一起玩玩关联规则!
Weka数据挖掘Apriori关联规则算法分析用户网购数据
随着大数据时代的来临,如何从海量的存储数据中发现有价值的信息或知识帮助用户更好决策是一项非常艰巨的任务。数据挖掘正是为了满足此种需求而迅速发展起来的,它是从大量的、不完全的、有噪声的、模糊的、随机的数据中,提取隐含在其中的、人们事先不知道的、但又是潜在的有用信息和知识的过程。由于大数据技术的发展,零售企业可以利用互联网收集大量的销售数据,这些数据是一条条的购买事务信息,每条信息存储了销售事务的处理时间,顾客所购买的商品、各种商品的数量以及价格等。如果对这些历史数据进行分析,则可以对理解分析顾客的购买行为提供有价值的信息。
拓端
2023/04/14
8140
【机器学习】--关联规则算法从初识到应用
  关联规则的目的在于在一个数据集中找出项之间的关系,也称之为购物蓝分析 (market basket analysis)。例如,购买鞋的顾客,有10%的可能也会买袜子,60%的买面包的顾客,也会买牛奶。这其中最有名的例子就是"尿布和啤酒"的故事了。
LhWorld哥陪你聊算法
2018/09/13
5710
【机器学习】--关联规则算法从初识到应用
机器学习算法:关联规则分析
今天给大家分享一个经典的机器学习算法:关联规则分析,从理论到代码到实战,全部拉满。
皮大大
2022/04/18
2K0
机器学习算法:关联规则分析
推荐阅读
相关推荐
关联规则挖掘:Apriori算法的深度探讨
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验