Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关联规则(二):Apriori算法

关联规则(二):Apriori算法

作者头像
fireWang
发布于 2019-05-15 04:56:47
发布于 2019-05-15 04:56:47
5.6K00
代码可运行
举报
文章被收录于专栏:零维领域零维领域
运行总次数:0
代码可运行

1. 前言

1.1 基本背景

假设我们在经营一家商品种类并不多的杂货店,我们对那些经常在一起被购买的商品非常感兴趣。我们只有 4 种商品:商品0,商品1,商品2和商品3。

那么所有可能被一起购买的商品组合都有哪些?

这些商品组合可能只有一种商品,比如商品0,也可能包括两种、三种或者所有四种商品。我们并不关心某人买了两件商品0 以及四件商品2 的情况,我们只关心他购买了一种或多种商品。

下图显示了物品之间所有可能的组合(格结构 lattice structure)。图中从上往下的第一个集合是Ф,表示空集或不包含任何物品的集合。物品集合之间的连线表明两个或者更多集合可以组合形成一个更大的集合。

可以发现即使对于仅有 4 种物品的集合,也需要遍历数据 15 次。而随着物品数目的增加遍历次数会急剧增长。对于包含N个物品的数据集共有

种项集组合。事实上,出售 10000 或更多种物品的商店并不少见。即使只出售 100 种商品的商店也会有

种可能的项集组合。对于现代的计算机而言,需要很长的时间才能完成运算。

为了降低所需的计算时间,研究人员发现一种所谓的Apriori原理。Apriori原理可以帮我们减少可能感兴趣的项集。Apriori原理是说如果某个项集是频繁的,那么它的所有子集也是频繁的。这个原理直观上并没有什么帮助,但是如果反过来看就有用了,也就是说如果一个项集是非频繁集,那么它的所有超集也是非频繁的。

比如,已知阴影项集{2,3}是非频繁的。利用这个知识,我们就知道项集{0,2,3} ,{1,2,3}以及{0,1,2,3}也是非频繁的。这也就是说,一旦计算出了{2,3}的支持度,知道它是非频繁的之后,就不需要再计算{0,2,3}、{1,2,3}和{0,1,2,3}的支持度,因为我们知道这些集合不会满足我们的要求。

1.2 运行环境

  • 操作系统: win10
  • python版本:3.7.0
  • Anaconda:3.5.1
  • mlxtend :0.15.0.0

2. 基本原理

apriori 在拉丁语中指“来自以前”。当定义问题时,通常会使用先验知识或者假设, 这被称作“一个先验” ( apriori )。

Apriori算法就是基于一个先验:

如果某个项集是频繁的,那么它的所有子集也是频繁的。

初看可能这一条先验没有多大的作用,但是它的逆反,就很有实用意义了:

如果某一个项集是非频繁的,那么它的所有超集(包含该集合的集合)也是非频繁的。

Apriori算法的实现过程就和我们前文所说的过程一样,分为两步:

1. 训练算法:找到频繁项集

2. 使用算法:使用频繁项集生成关联规则

两个步骤都都基于Apriori的先验原理。

2.1 发现频繁项集

实现过程如下图所示

1. 由数据集生成候选项集C1( 1 表示每个候选项仅有一个数据项);再由C1通过最小支持度过滤,生成频繁项集L1(1 表示每个频繁项仅有一个数据项)。

2. 将频繁项集 L1 的数据项两两拼接成 候选项集C2。

3. 从候选项集C2开始,通过最小支持度过滤生成 频繁项集L2。

……

4. 直到 Lk 中仅有一个或没有数据项为止

2.2 生成关联规则

关联规则的生成也是使用逐层方法,初始提取规则后件只有一个项的所有高置信度规则,对这些规则进行测试——使用最小置信度,接下来合并剩下的规则来创建一个新的规则列表,不断增加后件项数,直到候选规则列表为空。

比如,如果{123} →{0} ,{023} →{1} 和 {013} →{2} 是高置信度的规则,则通过合并规则的后件产生候选规则,如果格中的任意结点置信度较低,则根据定理应该剪去该枝,比如{012} →{3}为置信度低节点,则前件{012} 的任意子集构成的规则,即图中灰色规则,都为低置信度节点,无需再做最小置信度检验。

3. 参数详解

关联规则的发现,我们使用 mlxtend 包,他是由Sebastian Raschka开发的一个工具集,初衷也是写下一些在其他包中没有找到的特定算法,是一个机器学习扩展工具库。

3.1 支持度计算

对频繁项集的发现基于支持度的计算,基于 apriori 方法

  • df :传入的数据需要是 pandas dataframe 格式,并且是已经经过热编码的(如上图所示)
  • min_support : 最小支持度 (即支持度阈值)
  • use_colnames : 是否使用列名,实际上因为是热编码的数据,因此列名就是商品名(项目名),如果设置为 False ,那么会使用索引来代替
  • max_len : 项集的最大长度,也就是项集中项目的最大个数
  • n_jobs : 使用的计算资源,这个参数和 sklearn 中应该是一致的,即指定计算时可使用的最大核心数
  • 返回值:返回值也是 dataframe 格式,由 支持度 和 项集 两列构成,各数据记录都是满足最小支持度和项集最大长度条件的

3.2 置信度检验

关联规则的发现则基于置信度的计算,基于 association_rules 方法

  • df :dataframe 格式,数据内容为与apriori方法输出内容相同格式的数据
  • metric : 判定标准,默认状态下计算支持度、置信度和提升度。当support_only 参数为 True 时,则只计算置信度
  • min_threshold: metric 参数的阈值
  • support_only :如果为True,则只计算置信度,其他metric中的判定标准将都会设置为 NaN (即空值)

4. 演示案例

使用 UCI 数据库中的毒蘑菇数据集,找出毒蘑菇的一些关联特征

http://archive.ics.uci.edu/ml/datasets/Mushroom

看下数据信息:

1个标签字段,确定是否是毒蘑菇,22个特征字段

数据文件 agaricus-lepiota.data 都使用了简写

首先定义一个数据获取方法,读取数据后将数据独热编码之后备用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1def get_data():
 2    # 读取数据
 3    data = pd.read_csv(os.path.join(os.getcwd(),'data','agaricus-lepiota.data'),header=None)
 4    # 筛选出毒蘑菇
 5    data = data.loc[data.iloc[:,0] == 'p',1:]
 6    # 重置下行索引
 7    data.reset_index(drop=True,inplace=True)
 8    # 将数据转化为 热编码
 9    data = pd.get_dummies(data)
10    return data

此时的数据,含3916条记录,特征数变为了93

下面就可以直接调用 apriori() 方法来发现频繁项集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1frequent_sets = apriori(data, min_support=0.7,use_colnames=True,max_len=2)

先使用min_support = 0.3 试了下,发现产生的频繁项集过多,然后使用 0.7 发现了 27 条满足规则的项集

最后调用 association_rules() 方法来找到关联规则,因为结果属性比较多,我们将结果输出到excel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1rules = association_rules(frequent_sets, min_threshold=1)
2rules.to_excel('./data/rules.xlsx',index=False)

就得到了如下结果

现在我们再根据结果中项的名称(数字表示第几个特征,字母表示特征值),去数据集中找到相应文字描述即可。

比如第一条规则 {4_f} → {16_p} ,找到 4_f 为 bruises?--no , 16_p 为veil-type--partial ,也就是说如果 bruises 为 no, 那么 veil-type 必然是为partial 而不是 universal (因为我们设置了置信度为1)

该方法还给了 leverage 和 conviction 两个评价指标,都和 confidence 和 lift 差不多,具体的定义可在官方API 中找到。

本文完整代码:

https://github.com/firewang/lingweilingyu/tree/master/associationRules

参考网址:

  • http://www.cnblogs.com/beaver-sea/p/4740830.html
  • http://www.cnblogs.com/beaver-sea/p/4740774.html
  • https://blog.csdn.net/lytangus/article/details/80289958
  • http://rasbt.github.io/mlxtend/user_guide/frequent_patterns/apriori/
  • http://rasbt.github.io/mlxtend/api_subpackages/mlxtend.frequent_patterns/
  • https://www.cnblogs.com/ybjourney/p/4847489.html
  • 《机器学习实战》
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 零维领域 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据挖掘十大算法(四):Apriori(关联分析算法)
终于到了机器学习实战的第十一章了,这也是继K-均值后的第二个无监督学习算法了。同样的该算法也是在一堆数据集中寻找数据之间的某种关联,这里主要介绍的是叫做Apriori的‘一个先验’算法,通过该算法我们可以对数据集做关联分析——在大规模的数据中寻找有趣关系的任务,本文主要介绍使用Apriori算法发现数据的(频繁项集、关联规则)。
全栈程序员站长
2022/08/14
2.1K0
数据挖掘十大算法(四):Apriori(关联分析算法)
关联规则挖掘(一)
分别称为关联规则的先导 (Antecedent) 和后继 (Consequent)。
Francek Chen
2025/01/22
1520
关联规则挖掘(一)
关联规则挖掘:Apriori算法的深度探讨
Apriori算法是一种用于挖掘数据集中频繁项集的算法,进而用于生成关联规则。这种算法在数据挖掘、机器学习、市场篮子分析等多个领域都有广泛的应用。
TechLead
2023/10/21
1.2K0
关联规则挖掘:Apriori算法的深度探讨
啤酒和尿布放在一起卖得更好?来看看这个故事背后的Apriori算法
Apriori算法号称是十大数据挖掘算法之一,在大数据时代威风无两,哪怕是没有听说过这个算法的人,对于那个著名的啤酒与尿布的故事也耳熟能详。但遗憾的是,随着时代的演进,大数据这个概念很快被机器学习、深度学习以及人工智能取代。即使是拉拢投资人的创业者也很少会讲到这个故事了,虽然时代的变迁令人唏嘘,但是这并不妨碍它是一个优秀的算法。
TechFlow-承志
2020/05/14
1.3K0
通过案例理解Apriori算法
Apriori算法是一种经典的关联规则挖掘算法,用于发现数据集中的频繁项集和关联规则。在本文中,我们将结合一个具体的案例和代码详细讲解Apriori算法的原理和实现。
GeekLiHua
2025/01/21
3510
机器学习算法:关联规则分析
今天给大家分享一个经典的机器学习算法:关联规则分析,从理论到代码到实战,全部拉满。
皮大大
2022/04/18
2.1K0
机器学习算法:关联规则分析
机器学习笔记之python实现关联规则算法Apriori样例
调用apriori进行关联规则分析,具体代码如下,设置最小支持度(min_support)为0.4,最小置信度(min_threshold)为0.1,
Jetpropelledsnake21
2021/01/04
1.1K0
【数据挖掘 | 关联性分析】万字长文详解关联性分析,详解Apriori算法为例,确定不来看看?
数据挖掘中的关联分析是一种用于发现数据集中不同项之间的关联关系的方法。关联分析通常用于在大规模数据集中发现频繁项集和关联规则。总的来说,关联规则通过量化的数字决定某物品甲对物品乙的出现有多大的影响。该模式属于描述性模式,属于**无监督学习**的方法
计算机魔术师
2023/10/26
4.6K0
【数据挖掘 | 关联性分析】万字长文详解关联性分析,详解Apriori算法为例,确定不来看看?
【机器学习实战】第11章 使用 Apriori 算法进行关联分析
第 11 章 使用 Apriori 算法进行关联分析 关联分析 关联分析是一种在大规模数据集中寻找有趣关系的任务。 这些关系可以有两种形式: 频繁项集(frequent item sets): 经常
片刻
2018/01/15
1.9K0
【机器学习实战】第11章 使用 Apriori 算法进行关联分析
机器学习|关联规则与购物篮分析实战
客户A企业是一家全球知名家具和家居零售商,销售主要包括座椅/沙发系列、办公用品、卧室系列、厨房系列、照明系列、纺织品、炊具系列、房屋储藏系列、儿童产品系列等约10,000个产品。为了维持顾客忠诚度、扩大销售,A企业希望通过顾客已有的购买记录,为顾客推荐更多的产品。请使用关联规则的方法,实现客户的需求。
数据STUDIO
2021/06/24
1.8K0
【机器学习】--关联规则算法从初识到应用
  关联规则的目的在于在一个数据集中找出项之间的关系,也称之为购物蓝分析 (market basket analysis)。例如,购买鞋的顾客,有10%的可能也会买袜子,60%的买面包的顾客,也会买牛奶。这其中最有名的例子就是"尿布和啤酒"的故事了。
LhWorld哥陪你聊算法
2018/09/13
6040
【机器学习】--关联规则算法从初识到应用
机器学习算法-关联规则分析
关联分析是一种从大规模的数据集中寻找有趣关系的方法。一个经常被用到关联分析的例子:购物篮分析。通过查看哪些商品经常在一起被顾客购买,可以帮助商店去了解用户的购买行为。
皮大大
2023/08/23
4980
机器学习(三) 关联规则R语言实战 Apriori
关联规则背景 关联规则来源 上个世纪,美国连锁超市活尔玛通过大量的数据分析发现了一个非常有趣的现象:尿布与啤酒这两种看起来风马牛不相及的商品销售数据曲线非常相似,并且尿布与啤酒经常被同时购买,也即购买尿布的顾客一般也同时购买了啤酒。于是超市将尿布与啤酒摆在一起,这一举措使得尿布和啤酒的销量大幅增加。 原来,美国的妇女通常全职在家照顾孩子,并且她们经常会嘱咐丈夫在下班回家的路上为孩子买尿布,而丈夫在买尿布的同时又会顺手购买自己爱喝的啤酒。 注: 此案例很精典,切勿盲目模仿案例本身,而应了解其背后原理。它发生
Jason Guo
2018/06/20
2.7K0
MADlib——基于SQL的数据挖掘解决方案(27)——关联规则之Apriori算法
数据仓库或数据挖掘从业者一定对“啤酒与尿布”的故事不会陌生。这就是一个使用关联规则的经典案例。根据对超市顾客购买行为的数据挖掘发现,男顾客经常一起购买啤酒和尿布,于是经理决定将啤酒与尿布放置在一起,让顾客很容易在货架上看到,从而使销售额大幅度增长。关联规则挖掘在多个领域得到了广泛应用,包括互联网数据分析、生物工程、电信和保险业的错误校验等。本篇将介绍关联规则方法、Apriori算法和MADlib的Apriori相关函数。之后我们用一个示例说明如何使用MADlib的Apriori函数发现关联规则。
用户1148526
2019/05/25
1.4K0
转:Apriori算法,挖掘数据集中项集的关联规则学习经典
Apriori算法是一种用于挖掘数据集中频繁项集的关联规则学习的经典算法。它基于“Apriori原理”,即如果一个项集是频繁的,那么它的所有子集也必须是频繁的。该算法通过不断生成新的频繁项集来实现。
啵啵鳐
2023/06/20
2280
关联分析(5):Apriori Python实现
在关联分析(3):Apriori R语言实现一文中,写了如何使用R语言进行关联分析,那在Python中如何实现呢?
三猫
2020/01/31
2.6K0
机器学习(八)—Apriori算法
摘要:本文对Apriori算法进行了简单介绍,并通过Python进行实现,进而结合UCI数据库中的肋形蘑菇数据集对算法进行验证。
oYabea
2020/09/07
7960
数据挖掘实战:关联规则挖掘及Apriori实现购物推荐
糖豆贴心提醒,本文阅读时间4分钟 这篇文章主要介绍三个知识: 1.关联规则挖掘概念及实现过程; 2.Apriori算法挖掘频繁项集; 3.Python实现关联规则挖掘及置信度、支持度计算。 希望这篇文章对你有所帮助,尤其是刚刚接触数据挖掘以及大数据的同学,这些基础知识真的非常重要。如果文章中存在不足或错误的地方,还请海涵~ 一. 关联规则挖掘概念及实现过程 1.关联规则 关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性,如果两个或多个事物之
小小科
2018/05/02
3.2K0
数据挖掘实战:关联规则挖掘及Apriori实现购物推荐
使用Apriori进行关联分析(如何挖掘关联规则)
  所谓关联规则,指通过某个元素集推导出另一个元素集。比如有一个频繁项集{底板,胶皮,胶水},那么一个可能的关联规则是{底板,胶皮}→{胶水},即如果客户购买了底板和胶皮,则该客户有较大概率购买胶水。这个频繁项集可以推导出6个关联规则:
Ai学习的老章
2019/04/10
1.3K0
使用Apriori进行关联分析(如何挖掘关联规则)
Apriori算法介绍(Python实现)
导读: 随着大数据概念的火热,啤酒与尿布的故事广为人知。我们如何发现买啤酒的人往往也会买尿布这一规律?数据挖掘中的用于挖掘频繁项集和关联规则的Apriori算法可以告诉我们。本文首先对Apriori算法进行简介,而后进一步介绍相关的基本概念,之后详细的介绍Apriori算法的具体策略和步骤,最后给出Python实现代码。 1.Apriori算法简介 Apriori算法是经典的挖掘频繁项集和关联规则的数据挖掘算法。A priori在拉丁语中指"来自以前"。当定义问题时,通常会使用先验知识或者假设,这被
llhthinker
2018/03/12
4K0
Apriori算法介绍(Python实现)
推荐阅读
相关推荐
数据挖掘十大算法(四):Apriori(关联分析算法)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验