关联算法
基本概念
-
支持度:每个商品(商品组合)在总体购物小票中的出现概率: S u p p o r t i = C o u n t s a l e s ( i ) C o u n t a l l − s a l e s Support_i = \frac{Count_{sales(i)}}{Count_{all-sales}} Supporti=Countall−salesCountsales(i)
-
置信度:当某一商品(商品组合) j 购买时,另一个其他商品(商品组合) i 会购买的概率: C o n f i d e n c e ( i ∣ j ) = C o u n t s a l e s ( i , j ) C o u n t s a l e s ( j ) Confidence(i|j) = \frac{Count_{sales(i, j)}}{Count_{sales(j)}} Confidence(i∣j)=Countsales(j)Countsales(i,j)
-
支持度:当某一组合 (i | j) 组合售卖时,j 的出现对 i 商品售卖的提升程度: L i f t ( i ∣ j ) = C o n f i d e n c e ( i ∣ j ) S u p p o r t ( i ) Lift(i|j) = \frac{Confidence(i|j)}{Support(i)} Lift(i∣j)=Support(i)Confidence(i∣j) ,支持度大于1,表示有提高。
最小支持度的设置
-
支持度表示商品(商品组合)在总体中的出现概率,总体小票数量越大,最小支持度 m i n _ s u p p o r t {min}\_ {support} min_support 应该设置的越小,以保证可以存在频繁项集。频繁项集越少时,应当调小最小支持度。
-
置信度表示一个商品(商品组合)的出现,另一商品(商品组合)出现的概率,总体数量越多,最小置信度应当越小。当关联规则太少时,应当调小最小置信度
目的
找到数据集的频繁项集,支持度大于最小支持度的那些集合。
Apriori
查找所有的组合(K=1,2,3…),如果 K=1 时非频繁项集,那么 K=2 包含他的组合也肯定定是非频繁项集,最后找出所有频繁项集。
工具
根据标签编码的格式,分为两种工具:
#接收transaction格式
from efficient_apriori import apriori
#接收one-hot编码格式
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
FP-Growth
由于 Apriori 算法空间复杂度较大,遍历所有候选项集。
因此改用树结构节省空间,
- 首先将不满足最小支持度的项删除构建一个数据集,扫描一边数据集;
- 接着对筛选后的数据集排序,构建一棵树,根节点为 NULL;
- 将数据集插入到树中。
如下问题中:
假设最小出现次数为3,最小支持度为:0.6,构建树:
- 在树的叶子节点处开始,寻找频繁项集:将啤酒拎出来,构建剩余数据集的transaction,并将所有transaction中物品的出现次数设置为叶子节点中啤酒的出现次数。
- 在新的 transaction 中的寻找频繁项集(出现次数为:3),发现只有尿布。因此包含啤酒的频繁项集为:{(啤酒),(啤酒尿布)}。
- 去掉啤酒,重复 4-5 ,遍历剩下的树节点。,得到所有的频繁项集。
工具
spark中提供并行 FP-growth 算法。