关联规则python实现-mlxtend

之前介绍了关联规则的原理:传送门

发现一个专门进行关联规则分析的python库:mlxtend
下面进行简单的演示

简单数据实现

我们自己简单构造几个数据熟悉下

retail_shopping_basket = {'ID':[1,2,3,4,5,6],
'Basket':[['Beer', 'Diaper', 'Pretzels', 'Chips', 'Aspirin'],
['Diaper', 'Beer', 'Chips', 'Lotion', 'Juice', 'BabyFood', 'Milk'],
['Soda', 'Chips', 'Milk'],
['Soup', 'Beer', 'Diaper', 'Milk', 'IceCream'],
['Soda', 'Coffee', 'Milk', 'Bread'],
['Beer', 'Chips']
 ]
   }
retail = pd.DataFrame(retail_shopping_basket)
index ID Basket
0 1 [Beer, Diaper, Pretzels, Chips, Aspirin]
1 2 [Diaper, Beer, Chips, Lotion, Juice, BabyFood,…
2 3 [Soda, Chips, Milk]
3 4 [Soup, Beer, Diaper, Milk, IceCream]
4 5 [Soda, Coffee, Milk, Bread]
5 6 [Beer, Chips]

因为

The allowed values for a DataFrame are True, False, 0, 1

所以需要把数据转换成独热编码格式
简单做下变换

#把ID先保存下来
retail_id = retail.drop('Basket' ,1)
retail_Basket = retail.Basket.str.join(',')
#使用get_dummies来进行变换
retail_Basket = retail_Basket.str.get_dummies(',')

在这里插入图片描述

import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

计算频繁项集

frequent_itemsets = apriori(retail_Basket, use_colnames=True)

apriori(df, min_support=0.5, use_colnames=True) 默认min_support=0.5

index support itemsets
0 0.666667 (Onion)
1 0.833333 (Potato)
2 0.666667 (Burger)
3 0.666667 (Milk)
4 0.666667 (Potato, Onion)
5 0.500000 (Burger, Onion)
6 0.666667 (Burger, Potato)
7 0.500000 (Milk, Potato)
8 0.500000 (Burger, Potato, Onion)

lift
这里介绍一个新的指标叫做提升度
物品集A的出现对物品集B的出现概率发生了多大的变化

  • lift(A==>B)=confidence(A==>B)/support(B)=p(B|A)/p(B)
  • 现在有 1000 个消费者,有 500 人购买了茶叶,其中有 450人同时 购买了咖啡,另 50人 没有。由于 confidence(茶叶=>咖啡)=450/500=90%,由此可能会认为喜欢喝茶的人往往喜欢喝咖啡。但如果另外没有购买茶叶的 500人 ,其中同样有 450人 购买了咖啡,同样是很高的 置信度90% ,由此,得到不爱喝茶的也爱喝咖啡。这样看来,其实是否购买咖啡,与有没有购买茶叶并没有关联,两者是相互独立的,其 提升度90%/[(450+450)/1000]=1
  • 由此可见,lift正是弥补了confidence的这一缺陷,if lift=1,X与Y独立,X对Y出现的可能性没有提升作用,其值越大(lift>1),则表明X对Y的提升程度越大,也表明关联性越强。
rules = association_rules(frequent_itemsets, metric='lift', min_threshold=1)

association_rules(df, metric=‘lift’, min_threshold=1)
可以指定不同的衡量标准与最小阈值
min_threshold为提升度的阈值

antecedents consequents antecedent support consequent support support confidence lift leverage conviction
(Chips) (Beer) 0.666667 0.666667 0.5 0.75 1.125 0.055556 1.333333
(Beer) (Chips) 0.666667 0.666667 0.5 0.75 1.125 0.055556 1.333333
(Diaper) (Beer) 0.500000 0.666667 0.5 1.00 1.500 0.166667 inf
(Beer) (Diaper) 0.666667 0.500000 0.5 0.75 1.500 0.166667 2.000000

指标计算公式
在这里插入图片描述

antecedents:规则先导项
consequents:规则后继项
antecedent support:规则先导项支持度
consequent support:规则后继项支持度
support:规则支持度 (前项后项并集的支持度)
confidence:规则置信度 (规则置信度:规则支持度support / 规则先导项)
lift:规则提升度,表示含有先导项条件下同时含有后继项的概率,与后继项总体发生的概率之比。
leverage:规则杠杆率,表示当先导项与后继项独立分布时,先导项与后继项一起出现的次数比预期多多少。
conviction:规则确信度,与提升度类似,但用差值表示。

后面三个值都是越大关联强度也就越大
从上面的结果可以得到,(Diaper) (Beer) 两个的关联度最大

MovieLens数据集测试

movies = pd.read_csv('ml-latest-small/movies.csv')
#同样我们对数据进行独热编码
movies_ohe = movies.drop('genres',1).join(movies.genres.str.get_dummies())

关联算法计算

frequent_itemsets_movies = apriori(movies_ohe,use_colnames=True, min_support=0.025)
rules_movies =  association_rules(frequent_itemsets_movies, metric='lift', min_threshold=1.25)
#筛选并排序
rules_movies[(rules_movies.lift>4)].sort_values(by=['lift'], ascending=False)

在这里插入图片描述

完整代码及数据集:https://github.com/Andyszl/Data-mining

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读