关联规则分析(Apriori算法)
关联规则分析-Apriori算法
- 关联规则
- 关联规则算法
- Apriori算法
- 核心概念(必懂)
- 基本原理
- 工作流程
- 找出频繁项集
- 生成强关联规则
- 算法步骤:
- 缺点
- 优点
- 案例运行
关联规则
什么是关联规则?
关联规则是数据挖掘中用于发现数据项之间隐含关联关系的技术,常表现为“如果发生 A,则很可能发生 B"的形式 。它属于无监督学习方法,核心目的是从大量数据中找出有价值的模式 。
可以归纳为X->Y,就是X发生的情况下很可能会发生Y。
比如:啤酒和尿布,就是 尿布->啤酒 这么一个强关联规则,含义是:如果顾客购买尿布,那么他很有可能买啤酒。
经典故事:啤酒和尿布的关联规则故事
沃尔玛公司数据仓库里集中了其各门店的详细原始交易数据。在这些原始交易数据的基础上,沃尔玛公司利用数据挖掘方法对这些数据进行分析和挖掘个意外的发现是:跟尿布一起购买最多的商品竟是啤酒。经过大量实际调查和分析,揭示了一个隐藏在“尿布与啤酒”背后的消费模式,一年轻父亲下班后经常要到超市去买婴儿尿布,而他们中有 30%~40%的人同时也为自己买一些啤酒。产生这一现象的原因是:太太们常叮嘱她们的文夫下班后为小孩买尿布,而丈夫们在买尿布后又随手带回了他们喜欢的啤酒。
关联规则算法
关联规则算法有哪些?
- Apriori算法
- FP-growth算法
- ECLAT算法
- SPMF算法
本文主讲Apriori算法。
Apriori算法
核心概念(必懂)
- 项(Item):数据中单个元素(如牛奶、面包)
- 项集(Itemset):一个/多个项的集合(如{牛奶,面包})
- 事务(Transaction):一条记录(如一次购物清单)
- 支持度(Support):项集出现频率- support(X)=包含X的事务数/总事务数
- 频繁项集: support(X)≥min_sup (最小支持度阈值)
- 置信度(Confidence):规则 X→Y 的可靠性- confidence(X→Y)=support(X∪Y)/support(X)
- 强规则:同时满足 min_sup 与 min_conf
- Apriori性质(灵魂)- 正向:频繁项集的所有子集必频繁
- 逆向:非频繁项集的所有超集必非频繁(剪枝依据)
基本原理
- 频繁项集:项集在事务数据库中出现的次数超过某个最小支持度阈值,称为频繁项集,项集是类似于{A, B, C}的集合。
- 关联规则:如果一个项集A出现在事务中,那么另一个项集B也有很大可能同时出现,这种关系可以用置信度和提升度来衡量。
- Apriori原理:如果一个项集不是频繁的,那么它的任何超集(包含它的更大项集)也不可能是频繁的。
3.1 如果一个集合是频繁项集,则它的所有子集也都是频繁项集;例如:集合 {A, C} 是频繁项集,则它的子集 {A}, {C} 都是频繁项集。
3.2 如果一个集合不是频繁项集,则它的所有超集都不是频繁项集;例如:集合 {A, B} 不是频繁项集,则它的子集 {A, B, C},{A, B, D}都不是频繁项集。
工作流程
1.设置最小支持度阈值:确定一个最小支持度阈值,用来过滤掉不常见的项集。
2.找出所有频繁一项集:扫描数据库一次,找出所有项的支持度,保留满足最小支持度的项。
3.生成候选集:使用频繁一项集生成候选二项集。
4.找出频繁项集:扫描数据库,计算候选二项集的支持度,保留满足最小支持度的项集。
5.迭代过程:重复步骤3和4,使用当前的频繁项集生成更大项集的候选集,然后找出这些候选集中的频繁项集,直到无法生成新的候选集或达到最大项集长度。
6.生成关联规则:对于每个频繁项集,生成关联规则,并使用最小置信度阈值过滤掉弱规则。
找出频繁项集
- 第一次迭代,对整个数据集进行遍历,得到“1-项集”的候选项集合及出现频次。即{A}的出现频次为2,{B}的出现频次为3,{C}的出现频次为3,{D}的出现频次为1,{E}的出现频次为3。剔除小于最小支持度的项集,得到频繁1-项集。这里的最小支持度为2,表示最小的出现频次为 2,因此{D}不符合最小支持度,筛选得到的频繁1-项集为{A}, {B}, {C}, {E}
- 第二次迭代:将频繁1-项集自连接得到“2-项集”的候选项集合(当然,自连接的集合都是属于已存在的集合),即得到{A、B},{A,C},{A,E},{B,C},{B,E},{C,E}接着剔除小于最小支持度2 的项集,得到的频繁 2-项集
- 依次迭代,直到频繁项集为空,即“4-项集”为空,便得到了所有的频繁项集
生成强关联规则
将频繁项集Z划分为非空子集X和Y,其中Y=Z-X,接着计算规则X->Y是否满足最小置信度 (Confidenee),若不满足则删去这项规则,迭代得到最终的关联规则。例如对于频繁项集{B,C,E},它的非空子集有{B},{C},{E},{B},{C},{B,E},{C,E},关联规则{B}->{C, E}的置信度为sup({B,C,E})/sup({B}) = 2/3,若设定最小置信度为50%,则该项关联规则满足最小置信度,强规则。
算法步骤:
- 初始化:创建一个空的频繁项集列表L0。
- 迭代:对于当前的频繁项集列表Lk:
- 使用Lk生成候选集Ck+1。
- 扫描数据库,计算Ck+1中每个候选项集的支持度。
- 将满足最小支持度的候选项集添加到Lk+1。
- 结束条件:当无法生成新的候选项集或达到最大项集长度时,停止迭代。
缺点
- 多次扫描数据库:每次生成新的候选集后都需要扫描整个数据库来计算支持度。
- 生成大量候选集:尤其是在项集数量较多时,可能会生成大量的候选集,增加了计算负担。
- 大数据效率低
优点
- 原理清晰、易实现、适合事务数据
案例运行
frommlxtend.frequent_patternsimportapriori,association_rulesfrommlxtend.preprocessingimportTransactionEncoderimportpandasaspd# 1. 模拟购物篮事务数据transactions=[['牛奶','面包'],['牛奶','可乐'],['牛奶','面包','可乐'],['面包','可乐'],['面包','鸡蛋']]# 2. 数据转换为布尔矩阵te=TransactionEncoder()te_array=te.fit(transactions).transform(transactions)df=pd.DataFrame(te_array,columns=te.columns_)# 3. 挖掘频繁项集 最小支持度=0.4frequent_itemsets=apriori(df,min_support=0.4,use_colnames=True)print("===== 频繁项集 =====")print(frequent_itemsets)# 4. 生成关联规则 最小置信度=0.6rules=association_rules(frequent_itemsets,metric="confidence",min_threshold=0.6)print("\n===== 强关联规则 =====")print(rules[['antecedents','consequents','support','confidence','lift']])结果:
结果解读
- 支持度:商品组合出现概率
- 置信度:买A大概率买B的概率
- 提升度lift>1:正向强关联,值越大关联性越强
自定义修改
- 改 min_support=0.4 :调整筛选宽松度
- 改 min_threshold=0.6 :调高置信度筛选严格规则
- 直接替换 transactions 为自己的数据集即可
