1 引言
关联规则分析也成为购物篮分析,最早是为了发现超市销售数据库中不同的商品之间的关联关系。例如一个超市的经理想要更多地了解顾客的购物习惯,比如“哪组商品可能会在一次购物中同时购买?”或者“某顾客购买了个人电脑,那该顾客三个月后购买数码相机的概率有多大?”他可能会发现如果购买了面包的顾客同时非常有可能会购买牛奶,这就导出了一条关联规则“面包=>牛奶”,其中面包称为规则的前项,而牛奶称为后项。通过对面包降低售价进行促销,而适当提高牛奶的售价,关联销售出的牛奶就有可能增加超市整体的利润。关联规则分析是数据挖掘中最活跃的研究方法之一,目的是在一个数据集中找出各项之间的关联关系,而这种关系并没有在数据中直接表示出来。
2 Apriori 介绍
举个例子,在购物数据中,纸巾对应鸡爪的置信度为40%,支持度为1%。则意味着在购物数据中,总共有1%的用户既买鸡爪又买纸巾;同时买鸡爪的用户中有40%的用户购买纸巾。
对于Apriori算法,我们使用支持度来作为我们判断频繁项集的标准。Apriori算法的目标是找到最大的K项频繁集。这里有两层意思,首先,我们要找到符合支持度标准的频繁集。但是这样的频繁集可能有很多。第二层意思就是我们要找到最大个数的频繁集。比如我们找到符合支持度的频繁集AB和ABE,那么我们会抛弃AB,只保留ABE,因为AB是2项频繁集,而ABE是3项频繁集。那么具体的,Apriori算法是如何做到挖掘K项频繁集的呢?
Apriori算法采用了迭代的方法,先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集。然后对剩下的频繁1项集进行连接,得到候选的频繁2项集,筛选去掉低于支持度的候选频繁2项集,得到真正的频繁二项集,以此类推,迭代下去,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为算法的输出结果。
Aprior算法是一个非常经典的频繁项集的挖掘算法,很多算法都是基于Aprior算法而产生的,包括FP-Tree,GSP, CBA等。这些算法利用了Aprior算法的思想,但是对算法做了改进,数据挖掘效率更好一些,因此现在一般很少直接用Aprior算法来挖掘数据了,但是理解Aprior算法是理解其它Aprior类算法的前提,同时算法本身也不复杂,因此值得好好研究一番。
3 Apriori python 实现
简单的库实现:apyori。不推荐。
机器学习扩展库:mlxtend 。推荐。
安装:
conda install mlxtend
测试:
安装好后官网的测试代码测试一次:
http://rasbt.github.io/mlxtend/
- 概览
apriori里面是简单实现,介绍了基本原理和使用。可以根据最小支持度生成频繁项集。项集支持度能够 大于等于最小支持度的项集就是频繁项集。
association_rules里面是关联规则生成。可以用频繁项集生成关联规则。
fpgrowth 里面采用FP-Tree实现,普通的apriori算法中间计算过程有大量过程量,不适合大数据,FP-Tree就改进了apriori,用树实现,而且速度能比apriori快五倍。
fpmax 就是生成最大的K项频繁集。
地址:http://rasbt.github.io/mlxtend/USER_GUIDE_INDEX/#frequent_patterns
用apriori生成频繁项集:
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
"""购物篮数据"""
dataset = [['Milk', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Dill', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Milk', 'Apple', 'Kidney Beans', 'Eggs'],
['Milk', 'Unicorn', 'Corn', 'Kidney Beans', 'Yogurt'],
['Corn', 'Onion', 'Onion', 'Kidney Beans', 'Ice cream', 'Eggs']]
"""热编码数据才行"""
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)
print(df.to_string())
"""大于等于最小支持度的项集是频繁项集"""
res1 = apriori(df, min_support=0.6)
print(res1.to_string())
"""表达方式"""
res2 = apriori(df, min_support=0.6, use_colnames=True)
print(res2.to_string())
关联规则:
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, fpmax, fpgrowth
"""购物篮数据"""
dataset = [['牛奶', '鸡蛋', '蛤蜊'],
['牛奶', '苹果', '鸡蛋'],
['面包', '土豆'],
['牛奶', '苹果', '鸡蛋'],
]
"""热编码数据才行"""
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)
print(df.to_string())
"""表达方式"""
res2 = fpgrowth(df, min_support=0.4, use_colnames=True)
print(res2.to_string())
from mlxtend.frequent_patterns import association_rules
res = association_rules(res2, metric="confidence", min_threshold=0.5)
print(res.to_string())