apriori:算法(无监督学习)
-
应用场景:
- 1.啤酒、尿不湿;2.大量数据中(购物小票)找到经常在一起出现的物品组合
- 3.库存管理(摆放);4.促销页面设计;5.捆绑销售;6.内容推荐
-
相关概念
-
1.支持度support:物品或物品组合,在所有数据中出现的概率
- 公式:计算同时购买AB的支持度:support(A&B) = 同时购买AB的订单数量/总的订单数量=n(A&B)/n
-
2.置信度confidence:购买A的订单中同时购买了B的订单数量/购买A的订单数量,就称为A对B的置信度
- 公式:confidence(A->B)=P(B|A)=P(B&A)/P(A)= (n(A&B)/n)/(n(A)/n)= n(A&B)/n(A)
- 相当于条件概率的计算P(B|A)=同时出现AB的概率/出现A的概率
- 注意:A对B的置信度,与B对A的置信度不是一个概念
-
3.提升度lift:应用关联规则与不应用产生结果的比例;
- 公式:lift(A->B)= 对购买A的人运用规则计算会去买B的数量比例 / 不考虑是否购买A计算购买B的数量比例 = confidence(A->B) / support(B) = P(B&A)/P(A) / P(B) = n(A&B)/n(A) / (n(B)/n) = n(A&B)*n/n(A)/n(B) (这就是A对B的提升度,从公式很快得出,A对B的提升度与B对A的提升度相等)
- 如果lift>1,说明关联规则有效果,但在实际运用中,我们认为提升度>3才算作值得认可的关联规则
- 如果lift=1,说明没有任何意义,A与B相互独立,互不影响;
- 如果lift<1,说明有反作用,买了A就不愿意买B;
-
-
举例说明: 20个人,5个人买了面包+牛奶,3个人只买了面包,7个人只买了牛奶,还有5个人只买了鸡蛋
- 同时购买 面包+牛奶 的支持度support = 5/20=0.25 >0.1(满足支持度阈值>0.1)
- 购买面包 对 购买牛奶 的置信度confidence = 5/(5+3)=5/8 >0.5(满足置信度阈值>0.5)
- 购买牛奶 对 购买面包 的置信度confidence = 5/(5+7)=5/12 <0.5(不满足置信度阈值>0.5)
- 同时购买:面包+牛奶 的提升度lift = 5*20/((5+3)(5+7))=100/8/12>1
-
补充说明:为什么在实际运用中,我们认为提升度>3才算作值得认可的关联规则
- 当n中零事件由5变为35时,此时同时购买面包+牛奶 的支持度support = 5/49=0.102 >0.1(刚刚满足支持度阈值>0.1),此时计算提升度为:lift = 5*49/((5+3)(5+7))=245/8/12=2.55>1,有关联
- 当n中零事件由5变为0时,此时同时购买面包+牛奶 的支持度support = 5/15=0.33 >0.1(满足支持度阈值>0.1),此时计算提升度为:lift = 5*15/((5+3)(5+7))=75/8/12=0.78<1,互斥
- 结论:
- 根据补充说明中的情况,在满足支持度>0.1的情况下,零事件数量的改变对提升度的影响,从0.78提升到了2.55,n中零事件越多,提升度的值越大;
- 所以,在实际运用中,我们一般定义支持度>0.1的情况下,认为提升度>3才算作值得认可的关联规则
apriori原理
- apriori原理:如果某个项集是频繁项集,那么它所有的子集也是频繁的。即如果 {0,1} 是频繁的,那么 {0}, {1} 也一定是频繁的;;这个原理直观上没有什么用,但是反过来看就有用了,该定理的逆反定理为 :如果一个项集是非频繁的,那么它的所有超集(包含该集合的集合)也是非频繁的;;Apriori原理的出现,可以在得知某些项集是非频繁之后,不需要计算该集合的超集,有效地避免项集数目的指数增长,从而在合理时间内计算出频繁项集。
- 使用Apriori算法发现数据的(频繁项集、关联规则)
- 频繁项集:经常出现在一块的物品的集合
- 关联规则:暗示两种物品之间可能存在很强的关系
- Apriori具体算法实现网上查,直接使用其接口即可Apriori
- pip install akapriori
- 使用: from akapriori import apriori
- rules = apriori(order_records, support=0.1, confidence=0.5, lift=0,minlen=0, maxlen=5)
- 返回 5个值:rules_all = pd.DataFrame(rules, columns=[‘item1’,‘item2’,‘support’,‘confidence’,‘lift’])
代码实现
import pandas as pd
import apriori
# 加载数据文件
data = pd.read_csv('order_table.csv')
# 转换成关联所用的记录模式
order_ids = pd.unique(data['order_id']) # 去重得到订单id
# 将相同id的产品名称拼接到一个子列表中,再将这些id对应的子列表拼到一个列表中
order_records = [data[data['order_id']==each_id]['product_name'].tolist() for each_id in
order_ids]
# 通过调用自定义的apriori做关联分析
minS = 0.1 # 定义最小支持度阈值
minC = 0.5 # 定义最小置信度阈值
# 计算得到满足最小支持度的规则
L, suppData = apriori.apriori(order_records, minSupport=minS)
# 计算满足最小置信度的规则
rules = apriori.generateRules(order_records, L, suppData, minConf=minC)
# 关联结果报表评价
# 展示数据集记录数和满足阈值定义的规则数量
model_summary = 'data record: {1} \ nassociation rules count: {0}'
print(model_summary.format(len(rules), len(order_records)), '\n','-'*60) # 使用str.format()输出
# 创建频繁规则数据集
rules_all = pd.DataFrame(rules,
columns=['item1','item2','instance','support','confidence','lift'])
rules_sort = rules_all.sort_values(['lift'], ascending=False)
rules_sort.head(10)