@[toc]
基本概念
关联性:共同出现,相关
基于产品的共同出现特征,发现能够预测产品共同出现的规则集合
- 频繁模式
- 项集:包含了一种或几种产品的集合
example:{Milk,Bread,Diaper}
K-项集:一个包含了k个产品的项集
- 支持度
- 一个项集出现的概率
- support({Milk,Bread,Diaper}) = 2/5
- 频繁项集/频繁模式:支持度大于阈值的项集
- 关联规则:
- {Milk,Diaper} {Beer}
- 置信度:Y在包含了X的项集中出现的频率,Supp(XY)/Supp(X)
TID | Items |
---|---|
1 | Bread,Milk |
2 | Bread,Diaper,Beer,Eggs |
3 | Milk,Diapper,Beer,Coke |
4 | Bread,Milk,Diaper,Beer |
5 | Bread,Milk,Diaper,Coke |
- 频繁模式挖掘
给定最小支持度阈值minsupp,从交易数据中挖掘支持度不小于minsupp的所有频繁项集 - 关联规则挖掘
- 给定minsupp和最小置信度阈值minconf,从交易数据中挖掘所有频繁模式,然后从频繁模式中生成置信度不小于minconf的关联规则
核心方法
找到满足特定的支持度和置信度的项集与规则
蛮力方法 Brute-force
- 将所有可能的规则列出来
- 分别计算所有规则的支持度和置信度
- 计算复杂度过大
Apriori算法
基于Apriori Principle的剪枝策略
如果有一个项集是频繁的,则它所有的子集一定也是频繁的。
如果一个项集是非频繁的,则它所有的超集也是非频繁的。
FP-growth算法
FP-tree算法又称FP-Growth算法,是在不使用候选代的情况下查找频繁项集的另一种方法,从而提高了性能。其核心是使用名为频繁模式树(FP-tree)的特殊数据结构,保留了项集关联信息。
python实现
mlxtend使用Apriori算法
import pandas as pd
shopping_list = [['豆奶','莴苣'],
['莴苣','尿布','葡萄酒','甜菜'],
['豆奶','尿布','葡萄酒','橙汁'],
['莴苣','豆奶','尿布','葡萄酒'],
['莴苣','豆奶','尿布','橙汁']]
shopping_df = pd.DataFrame(shopping_list)
print(shopping_df)
0 1 2 3
0 豆奶 莴苣 None None
1 莴苣 尿布 葡萄酒 甜菜
2 豆奶 尿布 葡萄酒 橙汁
3 莴苣 豆奶 尿布 葡萄酒
4 莴苣 豆奶 尿布 橙汁
将数据转化为标准格式
# df_arr = shopping_df.stack().groupby(level=0).apply(list).tolist() # 方法一
def deal(data):
return data.dropna().tolist()
df_arr = shopping_df.apply(deal,axis=1).tolist() # 方法二
from mlxtend.preprocessing import TransactionEncoder # 传入模型的数据需要满足特定的格式,可以用这种方法来转换为bool值,也可以用函数转换为0、1
te = TransactionEncoder() # 定义模型
df_tf = te.fit_transform(df_arr)
# df_01 = df_tf.astype('int') # 将 True、False 转换为 0、1 # 官方给的其它方法
# df_name = te.inverse_transform(df_tf) # 将编码值再次转化为原来的商品名
df = pd.DataFrame(df_tf,columns=te.columns_)
print(df)
找出支持度不小于0.4的关联商品
尿布 橙汁 甜菜 莴苣 葡萄酒 豆奶
0 False False False True False True
1 True False True True True False
2 True True False False True True
3 True False False True True True
4 True True False True False True
from mlxtend.frequent_patterns import apriori
frequent_itemsets = apriori(df,min_support=0.4,use_colnames=True) # use_colnames=True表示使用元素名字,默认的False使用列名代表元素
# frequent_itemsets = apriori(df,min_support=0.05)
frequent_itemsets.sort_values(by='support',ascending=False,inplace=True) # 频繁项集可以按支持度排序
# print(frequent_itemsets[frequent_itemsets.itemsets.apply(lambda x: len(x)) >= 2]) # 选择长度 >=2 的频繁项集
print(frequent_itemsets)
support itemsets
0 0.8 (尿布)
2 0.8 (莴苣)
4 0.8 (豆奶)
6 0.6 (莴苣, 尿布)
11 0.6 (豆奶, 莴苣)
7 0.6 (葡萄酒, 尿布)
8 0.6 (豆奶, 尿布)
3 0.6 (葡萄酒)
5 0.4 (橙汁, 尿布)
1 0.4 (橙汁)
9 0.4 (橙汁, 豆奶)
10 0.4 (葡萄酒, 莴苣)
12 0.4 (葡萄酒, 豆奶)
13 0.4 (橙汁, 豆奶, 尿布)
14 0.4 (葡萄酒, 莴苣, 尿布)
15 0.4 (莴苣, 豆奶, 尿布)
16 0.4 (葡萄酒, 豆奶, 尿布)
from mlxtend.frequent_patterns import association_rules
association_rule = association_rules(frequent_itemsets,metric='confidence',min_threshold=0.9) # metric可以有很多的度量选项,返回的表列名都可以作为参数
association_rule.sort_values(by='leverage',ascending=False,inplace=True) #关联规则可以按leverage排序
# print(association_rule)
print(association_rule)
进一步发现其中的关联规则
antecedents consequents antecedent support consequent support support \
5 (橙汁) (豆奶, 尿布) 0.4 0.6 0.4
0 (葡萄酒) (尿布) 0.6 0.8 0.6
1 (橙汁) (尿布) 0.4 0.8 0.4
2 (橙汁) (豆奶) 0.4 0.8 0.4
3 (橙汁, 豆奶) (尿布) 0.4 0.8 0.4
4 (橙汁, 尿布) (豆奶) 0.4 0.8 0.4
6 (葡萄酒, 莴苣) (尿布) 0.4 0.8 0.4
7 (葡萄酒, 豆奶) (尿布) 0.4 0.8 0.4
confidence lift leverage conviction
5 1.0 1.666667 0.16 inf
0 1.0 1.250000 0.12 inf
1 1.0 1.250000 0.08 inf
2 1.0 1.250000 0.08 inf
3 1.0 1.250000 0.08 inf
4 1.0 1.250000 0.08 inf
6 1.0 1.250000 0.08 inf
7 1.0 1.250000 0.08 inf
网友评论