关联规则最经典的例子是啤酒与尿布,我们当然也可以用来做商品的推荐
做这个之前需要数据,数据是自己随机生成的,当然会导致结果不是很理想
import numpy as np
import pandas as pd
df= pd.DataFrame({'100001':[np.random.randint(0,2) for i in range(10000)]})
for i in range(100):df[str(100002+i)]=[np.random.randint(0,2) for i in range(10000)]
df.head()
得到的数据结果:
100001 | 100002 | 100003 | 100004 | 100005 | 100006 | 100007 | 100008 | 100009 | 100010 | ... | 100092 | 100093 | 100094 | 100095 | 100096 | 100097 | 100098 | 100099 | 100100 | 100101 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | ... | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
2 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | ... | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
3 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | ... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
4 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | ... | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
5 rows × 101 columns
需要说明的是,100001这类数字是商品ID,数据假设是采用每个用户购买记录,每一行对应一个用户,每一列代表一个商品。
接下来就进入正题,使用关联规则进行推荐
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
frequent_itemsets = apriori(df, min_support=0.2, use_colnames=True)
frequent_itemsets.tail()
结果如下:
support | itemsets | |
---|---|---|
5146 | 0.2610 | (100098, 100100) |
5147 | 0.2606 | (100098, 100101) |
5148 | 0.2505 | (100099, 100100) |
5149 | 0.2584 | (100099, 100101) |
5150 | 0.2570 | (100101, 100100) |
在使用关联规则之前需要构造频繁项集,我们可以看到结果有两列,一列是支持度,一列是频繁项集
代码里面的最小支持度(min_support)其实是个阈值,也就是大于最小支持度是才算为频繁项集,小于是就过滤掉了
支持度可以理解成概率,虽然这个说法不太恰当
最小支持度根据自己的需要进行设定,可大可小,不一定是0.5哦
获取到了频繁项集我们 就可以进行关联规则计算了
rules = association_rules(frequent_itemsets, metric='lift', min_threshold=1)
rules.head()
antecedents | consequents | antecedent support | consequent support | support | confidence | lift | leverage | conviction | |
---|---|---|---|---|---|---|---|---|---|
0 | (100073) | (100052) | 0.5030 | 0.4947 | 0.2502 | 0.497416 | 1.005489 | 0.001366 | 1.005403 |
1 | (100052) | (100073) | 0.4947 | 0.5030 | 0.2502 | 0.505761 | 1.005489 | 0.001366 | 1.005587 |
2 | (100026) | (100096) | 0.4980 | 0.4973 | 0.2500 | 0.502008 | 1.009467 | 0.002345 | 1.009454 |
3 | (100096) | (100026) | 0.4973 | 0.4980 | 0.2500 | 0.502715 | 1.009467 | 0.002345 | 1.009481 |
4 | (100099) | (100086) | 0.4982 | 0.5053 | 0.2532 | 0.508230 | 1.005798 | 0.001460 | 1.005957 |
得到这个以后我们就可以进行筛选自己需要结果,比如confidence、support、lift我们需要设置在什么范围合适,需要自己设定
这样我们 就可以筛到想要的结果
注意的是,正常confidence会很高的,因为这个是随机生成的数据,所以在0.5附近
然后我们就可以根据这个,进行推荐了,比如上表的最后一行为例,用户购买了商品100099,我们就可以猜他可能会购买商品100086。