关联规则----Apriori算法以及代码实现

概述

数据挖掘是指以某种方式分析数据源,从中发现一些潜在的有用的信息,所以数据挖掘又称作知识发现,而关联规则挖掘则是数据挖掘中的一个很重要的课题,它是从数据背后发现事物之间可能存在的关联或者联系。

关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘的一个重要技术,用于从大量数据中挖掘出有价值的数据项之间的相关关系。

常见的购物篮分析
举个最简单的例子,比如通过调查商场里顾客买的东西发现,30%的顾客会同时购买床单和枕套,而购买床单的人中有80%购买了枕套,这里面就隐藏了一条关联:床单—>枕套,也就是说很大一部分顾客会同时购买床单和枕套,那么对于商场来说,可以把床单和枕套放在同一个购物区,那样就方便顾客进行购物了。该过程通过发现顾客放人其购物篮中的不同商品之间的联系,分析顾客的购买习惯。通过了解哪些商品频繁地被顾客同时购买,这种关联的发现可以帮助零售商制定营销策略。其他的应用还包括价目表设计、商品促销、商品的排放和基于购买模式的顾客划分。
在这里插入图片描述

关联规则中的几个概念

先看一个简单的例子,假如有下面数据集,每一组数据表示不同的顾客一次在商场购买的商品的集合:
  在这里插入图片描述
提升度:表示含有X的条件下,同时含有Y的概率,与Y总体发生的概率之比。

Lift(X→Y) = P(Y|X) / P(Y)

提升度反映了关联规则中的X与Y的相关性;
提升度 >1 且越高表明正相关性越高;
提升度 <1 且越低表明负相关性越高;
提升度 =1 表明没有相关性。

频繁项集和强规则

发现频繁项集:发现满足最小支持度的所有项集
发现关联规则:从频繁项集中提取所有高置信度的规则
在这里插入图片描述
关键:发现频繁项集
在这里插入图片描述

误区

1.高置信度的规则不一定是合理的。
在这里插入图片描述
从上图可以看出,Tape->DVD的置信度高达66%,若阈值为50%时,这是一条强规则。但是单独购买DVD概率就高达75%,即P(DVD)>
P(DVD/Tape),所以磁带购买者购买DVD的可能性较小。
2.各个商品的支持度相差太多,没有实际意义。
在这里插入图片描述
从上图可以看出,电池的支持度为1/8,面包的支持度为3/4,然而在购买电池的条件下再购买面包的置信度为100%,两者的支持度相差太多,没有实际意义。
3.关联≠因果关系
在这里插入图片描述
在一个实际的案例中表明,某地区案发率高,其冰淇淋的销量也高,但是不能说明二者存在因果关系。

Apriori算法

Apriori的作用是根据物品间的支持度找出物品中的频繁项集。通过上面我们知道,支持度越高,说明物品越受欢迎。那么支持度怎么决定呢?这个是我们主观决定的,我们会给Apriori提供一个最小支持度参数,然后Apriori会返回比这个最小支持度高的那些频繁项集。

说到这里,有人可能会发现,既然都知道了支持度的计算公式,那直接遍历所有组合计算它们的支持度不就可以了吗?

是的,没错。确实可以通过遍历所有组合就能找出所有频繁项集。但问题是遍历所有组合花的时间太多,效率太低,假设有N个物品,那么一共需要计算2^N-1次。每增加一个物品,数量级是成指数增长。
在这里插入图片描述

Apriori核心思想

Apriori就是一种找出频繁项集的高效算法。它的核心就是下面这两句话:

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

在这里插入图片描述
在这里插入图片描述
如果B是不频繁项集,那所有包括B的超集均是不频繁项集。也就是,这些集合不用去计算其支持度是否满足阈值。

Apriori流程

1.设置支持度需满足的阈值,size=1
2.扫描数据库确定频繁项集,非频繁项集过滤掉
3.根据确定的频繁项集生成size=size+1的候选集合
4.重复步骤2和3

在这里插入图片描述

算法步骤

在这里插入图片描述

问题的关键—如何由频繁项集生成候选集

尽可能的减少候选集的生成数量
在这里插入图片描述
根据最后一条规则,生成候选集举例如下:
在这里插入图片描述

详细例子

在这里插入图片描述

生成规则

在确定所有的频繁项集后,生成规则
在这里插入图片描述

Apriori算法实战

参数介绍

根据频繁项集,计算出它们的关联规则。在此之前,先介绍一下相应API—mlxtend的参数。

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 填充。

代码

导入相关库
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder#编码
from mlxtend.frequent_patterns import apriori#Apriori
from mlxtend.frequent_patterns import association_rules#导入关联规则包
数据处理

对数据进行one-hot编码,列名为所有的项{冰淇淋 ,洋葱,牛奶 ,独角兽 ,玉米,肉豆蔻,芸豆,苹果,莳萝 ,酸奶,鸡蛋},每一行为一个transaction。

ataset = [['牛奶','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
        ['莳萝','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
        ['牛奶','苹果','芸豆','鸡蛋'],
        ['牛奶','独角兽','玉米','芸豆','酸奶'],
        ['玉米','洋葱','洋葱','芸豆','冰淇淋','鸡蛋']]  
te = TransactionEncoder()
#进行 one-hot 编码
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)

结果

 	冰淇淋 	洋葱 	牛奶 	独角兽 	玉米 	肉豆蔻 	芸豆 	苹果 	莳萝 	酸奶 	鸡蛋
0 	False 	True 	True 	False 	False 	True 	True 	False 	False 	True 	True
1 	False 	True 	False 	False 	False 	True 	True 	False 	True 	True 	True
2 	False 	False 	True 	False 	False 	False 	True 	True 	False 	False 	True
3 	False 	False 	True 	True 	True 	False 	True 	False 	False 	True 	False
4 	True 	True 	False 	False 	True 	False 	True 	False 	False 	False 	True
挖掘频繁项集
#利用 Apriori 的支持度找出频繁项集,阈值为0.5
freq = apriori(df, min_support=0.5, use_colnames=True)

结果:

 	support 	itemsets
0 	0.6 	(洋葱)
1 	0.6 	(牛奶)
2 	1.0 	(芸豆)
3 	0.6 	(酸奶)
4 	0.8 	(鸡蛋)
5 	0.6 	(洋葱, 芸豆)
6 	0.6 	(鸡蛋, 洋葱)
7 	0.6 	(牛奶, 芸豆)
8 	0.6 	(酸奶, 芸豆)
9 	0.8 	(鸡蛋, 芸豆)
10 	0.6 	(鸡蛋, 洋葱, 芸豆)

DataFrame可以按照某一列进行排序,以下代码实现频繁项集按照“support”进行降序排序

freq=freq.sort_values(by="support",ascending=False)
 	support 	itemsets
2 	1.0 	(芸豆)
4 	0.8 	(鸡蛋)
9 	0.8 	(鸡蛋, 芸豆)
0 	0.6 	(洋葱)
1 	0.6 	(牛奶)
3 	0.6 	(酸奶)
5 	0.6 	(洋葱, 芸豆)
6 	0.6 	(鸡蛋, 洋葱)
7 	0.6 	(牛奶, 芸豆)
8 	0.6 	(酸奶, 芸豆)
10 	0.6 	(鸡蛋, 洋葱, 芸豆)
找出关联规则
#计算关联规则
result = association_rules(freq, metric="confidence", min_threshold=0.6)

结果:

 	antecedents 	consequents 	antecedent support 	consequent support 	support 	confidence 	lift 	leverage 	conviction
0 	(洋葱) 	(芸豆) 	0.6 	1.0 	0.6 	1.00 	1.00 	0.00 	inf
1 	(芸豆) 	(洋葱) 	1.0 	0.6 	0.6 	0.60 	1.00 	0.00 	1.0
2 	(鸡蛋) 	(洋葱) 	0.8 	0.6 	0.6 	0.75 	1.25 	0.12 	1.6
3 	(洋葱) 	(鸡蛋) 	0.6 	0.8 	0.6 	1.00 	1.25 	0.12 	inf
4 	(牛奶) 	(芸豆) 	0.6 	1.0 	0.6 	1.00 	1.00 	0.00 	inf
5 	(芸豆) 	(牛奶) 	1.0 	0.6 	0.6 	0.60 	1.00 	0.00 	1.0
6 	(酸奶) 	(芸豆) 	0.6 	1.0 	0.6 	1.00 	1.00 	0.00 	inf
7 	(芸豆) 	(酸奶) 	1.0 	0.6 	0.6 	0.60 	1.00 	0.00 	1.0
8 	(鸡蛋) 	(芸豆) 	0.8 	1.0 	0.8 	1.00 	1.00 	0.00 	inf
9 	(芸豆) 	(鸡蛋) 	1.0 	0.8 	0.8 	0.80 	1.00 	0.00 	1.0
10 	(鸡蛋, 洋葱) 	(芸豆) 	0.6 	1.0 	0.6 	1.00 	1.00 	0.00 	inf
11 	(鸡蛋, 芸豆) 	(洋葱) 	0.8 	0.6 	0.6 	0.75 	1.25 	0.12 	1.6
12 	(洋葱, 芸豆) 	(鸡蛋) 	0.6 	0.8 	0.6 	1.00 	1.25 	0.12 	inf
13 	(鸡蛋) 	(洋葱, 芸豆) 	0.8 	0.6 	0.6 	0.75 	1.25 	0.12 	1.6
14 	(洋葱) 	(鸡蛋, 芸豆) 	0.6 	0.8 	0.6 	1.00 	1.25 	0.12 	inf
15 	(芸豆) 	(鸡蛋, 洋葱) 	1.0 	0.6 	0.6 	0.60 	1.00 	0.00 	1.0

以下代码实现关联规则按照“confidence”的进行降序排序

result=result.sort_values(by="confidence",ascending=False)
antecedents 	consequents 	antecedent support 	consequent support 	support 	confidence 	lift 	leverage 	conviction
0 	(洋葱) 	(芸豆) 	0.6 	1.0 	0.6 	1.00 	1.00 	0.00 	inf
3 	(洋葱) 	(鸡蛋) 	0.6 	0.8 	0.6 	1.00 	1.25 	0.12 	inf
4 	(牛奶) 	(芸豆) 	0.6 	1.0 	0.6 	1.00 	1.00 	0.00 	inf
6 	(酸奶) 	(芸豆) 	0.6 	1.0 	0.6 	1.00 	1.00 	0.00 	inf
8 	(鸡蛋) 	(芸豆) 	0.8 	1.0 	0.8 	1.00 	1.00 	0.00 	inf
10 	(鸡蛋, 洋葱) 	(芸豆) 	0.6 	1.0 	0.6 	1.00 	1.00 	0.00 	inf
12 	(洋葱, 芸豆) 	(鸡蛋) 	0.6 	0.8 	0.6 	1.00 	1.25 	0.12 	inf
14 	(洋葱) 	(鸡蛋, 芸豆) 	0.6 	0.8 	0.6 	1.00 	1.25 	0.12 	inf
9 	(芸豆) 	(鸡蛋) 	1.0 	0.8 	0.8 	0.80 	1.00 	0.00 	1.0
2 	(鸡蛋) 	(洋葱) 	0.8 	0.6 	0.6 	0.75 	1.25 	0.12 	1.6
11 	(鸡蛋, 芸豆) 	(洋葱) 	0.8 	0.6 	0.6 	0.75 	1.25 	0.12 	1.6
13 	(鸡蛋) 	(洋葱, 芸豆) 	0.8 	0.6 	0.6 	0.75 	1.25 	0.12 	1.6
1 	(芸豆) 	(洋葱) 	1.0 	0.6 	0.6 	0.60 	1.00 	0.00 	1.0
5 	(芸豆) 	(牛奶) 	1.0 	0.6 	0.6 	0.60 	1.00 	0.00 	1.0
7 	(芸豆) 	(酸奶) 	1.0 	0.6 	0.6 	0.60 	1.00 	0.00 	1.0
15 	(芸豆) 	(鸡蛋, 洋葱) 	1.0 	0.6 	0.6 	0.60 	1.00 	0.00 	1.0

参考:Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战

  • 13
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值