关联规则挖掘是一种基于规则的机器学习算法,该算法可以在大数据库中发现感兴趣的关系。它的目的是利用一些度量指标来分辨数据库中存在的强规则。也即是说关联规则挖掘是用于知识发现,而非预测,所以是属于无监督的机器学习方法。
1.啤酒和尿布
沃尔玛在分析销售记录时,发现啤酒和尿布经常一起被购买,于是他们调整了货架,把两者放在一起,结果真的提升了啤酒的销量。
原因解释:爸爸在给宝宝买尿布的时候,会顺便给自己买点啤酒?
通过上述的案例我们找到了找到类似的规则:啤酒→尿布;这些规则出现的频次很高,关联性很强。
2.衡量方法
支持度、置信度和提升度
2.1支持度
频率,指的是某个商品组合出现的次数与总次数之间的比例,如果某个项原本的支持度很低,即使关联性很强,实际的意义可能不大。
比如我们有以下的商品订单
牛奶的支持度为
牛奶+面包的支持度为
2.2置信度
条件概率,买了X的人又买了Y的比例有多少,表示关联性的强弱
比如上面的案例中
我们来计算牛奶->面包置信度:
牛奶出现的次数为 4次
牛奶和面包一起出现的次数为 3
牛奶->的置信度为
2.3提升度
商品A的出现,对商品B的出现概率提升的程度
提升度的三种可能:
- 提升度(x→y)>1:代表有提升;
- 提升度(x→y)=1:代表有没有提升,也没有下降;
- 提升度(x→y)<1:代表有下降。
3.Apriori算法
Apriori算法就是查找频繁项集(frequent itemset)的过程
缺点:效率低下,在数据较大时难以使用。
频繁项集:支持度大于等于最小支持度(Min Support)阈值的项集。
非频繁项集:支持度小于最小支持度的项集
我们把上面案例中的商品用ID来代表,牛奶、面包、尿布、可乐、啤酒、鸡蛋的商品ID分别设置为1-6
先计算K=1的支持度
假设最小支持度=0.5,那么Item4和6不符合最小支持度的,不属于频繁项集
在这个基础上,我们将商品两两组合,得到k=2项的支持度
将其中支持度小于0.5的剔除
将商品进行K=3项的商品组合
将其中支持度小于0.5的剔除
得到K=3项的频繁项集{1,2,3},也就是{牛奶、面包、尿布}的组合。
因此我们就得到了 牛奶、面包、尿布具有关联
3.1Apriori算法
Apriori算法的流程:
Step1,K=1,计算K项集的支持度;
Step2,筛选掉小于最小支持度的项集;
Step3,如果项集为空,则对应K-1项集的结果为最终结果。
否则K=K+1,重复1-3步。
3.2python第三方库
使用工具包:
from efficient_apriori import apriori
或者:
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
from efficient_apriori import apriori
# 设置数据集
transactions = [('牛奶','面包','尿布'),
('可乐','面包', '尿布', '啤酒'),
('牛奶','尿布', '啤酒', '鸡蛋'),
('面包', '牛奶', '尿布', '啤酒'),
('面包', '牛奶', '尿布', '可乐')]
# 挖掘频繁项集和频繁规则
itemsets, rules = apriori(transactions, min_support=0.5, min_confidence=1)
print("频繁项集:", itemsets)
print("关联规则:", rules)
频繁项集: {1: {('牛奶',): 4, ('尿布',): 5, ('面包',): 4, ('啤酒',): 3}, 2: {('尿布', '牛奶'): 4, ('尿布', '面包'): 4, ('牛奶', '面包'): 3, ('啤酒', '尿布'): 3}, 3: {('尿布', '牛奶', '面包'): 3}}
关联规则: [{牛奶} -> {尿布}, {面包} -> {尿布}, {啤酒} -> {尿布}, {牛奶, 面包} -> {尿布}]
4. FP-Growth算法
FP-Growth算法最大的特点就是通过构造树来提升计算速度
- 创建了一棵FP树来存储频繁项集。在创建前对不满足最小支持度的项进行删除,减少了存储空间。
- 整个生成过程只遍历数据集2次,大大减少了计算量
创建项头表
- 作用是为FP构建及频繁项集挖掘提供索引。
- Step1、流程是先扫描一遍数据集,对于满足最小支持度的单个项(K=1项集)按照支持度从高到低进行排序,这个过程中删除了不满足最小支持度的项。
- 项头表包括了项目、支持度,以及该项在FP树中的链表。初始的时候链表为空。
Step2、对于每一条购买记录,按照项头表的顺序进行排序,并进行过滤。
构造FP树,根节点记为NULL节点
Step3、整个流程是需要再次扫描数据集,把Step2得到的记录逐条插入到FP树中。节点如果存在就将计数count+1,如果不存在就进行创建。同时在创建的过程中,需要更新项头表的链表。
Step4、通过FP树挖掘频繁项集
现在已经得到了一个存储频繁项集的FP树,以及一个项头表。可以通过项头表来挖掘出每个频繁项集。
挖掘从项头表最后一项“啤酒”开始。
从FP树种找到所有“啤酒”节点,向上遍历祖先节点,得到3条路径。对于每条路径上的节点,其count都设置为“啤酒”的count
具体的操作会用到一个概念,叫“条件模式基”
因为每项最后一个都是“啤酒”,因此我们把“啤酒”去掉,得到条件模式基,此时后缀模式是(啤酒)
假设{啤酒}的条件频繁集为{S1,S2,S3},则{啤酒}的频繁集为{S1+{啤酒},S2+{啤酒},S3+{啤酒}},此时的条件频繁项集为{{}, {尿布}},所以啤酒的频繁项集为{啤酒},{尿布,啤酒}
继续找项头表倒数第2项面包,求得“面包”的条件模式基
根据条件模式基,可以求得面包的频繁项集:{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}
继续找项头表倒数第3项面包,求得“牛奶”的条件模式基
根据条件模式基,可以求得面包的频繁项集:{牛奶},{尿布,牛奶}
继续找项头表倒数第4项面包,求得“尿布”的条件模式基
根据条件模式基,可以求得尿布的频繁项集:{尿布}
所以全部的频繁项集为:
{啤酒},{尿布,啤酒}
{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}
{牛奶},{尿布,牛奶}
{尿布}
4.1python第三方库
import fptools as fp
transactions = [('牛奶','面包','尿布'),
('可乐','面包', '尿布', '啤酒'),
('牛奶','尿布', '啤酒', '鸡蛋'),
('面包', '牛奶', '尿布', '啤酒'),
('面包', '牛奶', '尿布', '可乐')]
#fis = [iset for iset in fp.frequent_itemsets(transactions, 2)]
mfis = [iset for iset in fp.maximal_frequent_itemsets(transactions, 2)]
#print(fis)
print(mfis)
[['尿布', '面包', '可乐'], ['尿布', '面包', '啤酒'], ['尿布', '牛奶', '啤酒'], ['尿布', '面包', '牛奶']]
5.思考
关联规则作为推荐系统/数据挖掘中一个非常经典的算法,对于从整体角度去寻找变量之间的相关性提供了极大的便利。配合数据分析中的探索性分析,寻找变量之间的关系具有较大的帮助。