关联规则算法中的几个重要概念:置信度、支持度、提升度、
例子:
支持度: 支持度是一个百分比,指某个商品组合出现的次数与总次数之间的比例,支持度越高表示该组合出现的几率越大。
在上面图中我们可以发现“牛奶”出现了 4 次,那么这 5 笔订单中“牛奶”的支持度就是 4/5=0.8。
同样“牛奶 + 面包”出现了 3 次,那么这 5 笔订单中“牛奶 + 面包”的支持度就是 3/5=0.6。
置信度: 表示你购买了A商品后,你还会有多大的概率购买B商品。
置信度(牛奶→啤酒)=2/4=0.5,代表如果你购买了牛奶,有多大的概率会购买啤酒?
置信度(啤酒→牛奶)=2/3=0.67,代表如果你购买了啤酒,有多大的概率会购买牛奶?
我们能看到,在 4 次购买了牛奶的情况下,有 2 次购买了啤酒,所以置信度 (牛奶→啤酒)=0.5,而在 3 次购买啤酒的情况下,有 2 次购买了牛奶,所以置信度(啤酒→牛奶)=0.67。
提升度: 在做商品推荐的时候,提升度是重点考虑对象,提升度代表商品A的出现,对商品B的出现概率提升了多少,即“商品 A 的出现,对商品 B 的出现概率提升的”程度。
从上面的例子中,如果我们单纯看置信度 (可乐→尿布)=1,也就是说可乐出现的时候,用户都会购买尿布,那么当用户购买可乐的时候,我们就需要推荐尿布么?
实际上,就算用户不购买可乐,也会直接购买尿布的,所以用户是否购买可乐,对尿布的提升作用并不大。我们可以用下面的公式来计算商品 A 对商品 B 的提升度:
提升度 (A→B)= 置信度 (A→B)/ 支持度 (B)
这个公式是用来衡量 A 出现的情况下,是否会对 B 出现的概率有所提升。
提升度有三种可能:
提升度 (A→B)>1:代表有提升;提升度
(A→B)=1:代表有没有提升,也没有下降;
提升度 (A→B)<1:代表有下降。
Apriori 的工作原理
Apriori 算法其实就是查找频繁项集 (frequent itemset) 的过程 ,所以首先我们需要定义什么是频繁项集。
频繁项集就是支持度大于等于最小支持度 (Min Support) 阈值的项集 ,所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的项集就是频繁项集。
项集这个概念,英文叫做 itemset,它可以是单个的商品,也可以是商品的组合。我们再来看下这个例子,假设我随机指定最小支持度是 50%,也就是 0.5。
首先,我们先计算单个商品的支持度,也就是得到 K=1 项(就是单个组合)的支持度:
因为最小支持度是 0.5,我们找出支持度小于最小支持度的那个商品,其就不属于频繁项集,将其进行剔除,保留符合条件的商品(支持度大于等于最小支持度的项集):
在这个基础上,我们将商品两两组合,得到 k=2 项(也就是项集为2,比如将啤酒和牛奶进行组合)的支持度
同理我们再筛掉小于最小值支持度的商品组合
在这个基础上,我们将商品三三组合,得到 k=3 项(也就是项集为3,比如将啤酒和牛奶和尿不湿进行组合)的支持度
同理我们再筛掉小于最小值支持度的商品组合
Apriori算法的工作流程:
1、K=1,计算 K 项集的支持度;
2、筛选掉小于最小支持度的项集;
3、如果项集为空,则对应 K-1 项集的结果为最终结果。
否则 K=K+1,重复 1-3 步。
Apriori算法的不足之处
1、可能产生大量的候选集。因为采用排列组合的方式,把可能的项集都组合出来了;
2、每次计算都需要重新扫描数据集,来计算每个项集的支持度。
Apriori最小支持度和最小置信度的设置
Apriori最小支持度和最小置信度的设置和数据集特点有关系,不过数据集大的情况下,不好观察特征。我们可以通过设置最小值支持度和最小置信度来观察关联规则的结果。
一般来说最小支持度常见的取值有0.5,0.1, 0.05。最小置信度常见的取值有1.0, 0.9, 0.8。可以通过尝试一些取值,然后观察关联结果的方式来调整最小值尺度和最小置信度的取值。
Apriori工具包的下载
在搜索框中输入 apriori 选择 efficient_apriori 包进行安装
直接 pip install efficient-apriori
使用
# 官网例子
from efficient_apriori import apriori
transactions = [('eggs', 'bacon', 'soup'),
('eggs', 'bacon', 'apple'),
('soup', 'bacon', 'banana')]
itemsets, rules = apriori(transactions, min_support=0.5, min_confidence=1)
print(rules) # [{eggs} -> {bacon}, {soup} -> {bacon}]
from efficient_apriori import apriori
# 设置数据集
data = [('牛奶','面包','尿布'),
('可乐','面包', '尿布', '啤酒'),
('牛奶','尿布', '啤酒', '鸡蛋'),
('面包', '牛奶', '尿布', '啤酒'),
('面包', '牛奶', '尿布', '可乐')]
# 挖掘频繁项集和频繁规则
# min_support表示最小支持度,min_confidence表示最小置信度,最小支持度和最小置信度都是由百分比表示0.5表示50%,可以使用0-1中的数字表示。
# 支持度大于最小支持度就是频繁项集,反正为非频繁项集,不符合最小置信度和最小支持度的项集都会被剔除。
itemsets,rules=apriori(data,min_support=0.5,min_confidence=1)
print(itemsets)
print(rules)
# 输出结果:
# 前面的1表示频繁1项集 2 表示频繁2项集 3表示频繁3项集
# {1: {('啤酒',): 3, ('尿布',): 5, ('牛奶',): 4, ('面包',): 4}, 2: {('啤酒', '尿布'): 3, ('尿布', '牛奶'): 4, ('尿布', '面包'): 4, ('牛奶', '面包'): 3}, 3: {('尿布', '牛奶', '面包'): 3}}
# 表示选啤酒很大几率会买尿布 买牛奶很大几率买尿布 买面包很大几率会买尿布 买牛奶和面包很大几率会买尿布
# [{啤酒} -> {尿布}, {牛奶} -> {尿布}, {面包} -> {尿布}, {牛奶, 面包} -> {尿布}]