Apriori算法是什么?
Apriori算法是经典的用于挖掘出数据关联规则的算法,它用来找出数据集中频繁出现的数据集合,辅助我们做一些决策。比如在常见的超市购物数据集,或者电商的网购数据集中,如果我们找到了频繁出现的数据集,那么对于超市,我们可以优化产品的位置摆放,对于电商,我们可以优化商品所在的仓库位置或者基于关联规则进行商品推荐等等,达到节约成本,增加经济效益的目的。
1 频繁项集的评估标准
频繁项集,顾名思义就是一起出现次数多的数据集就是频繁项集。怎么寻找频繁项集呢?打开交易记录,交易频繁的商品集合就是频繁项集呗。的确是这样,但是有两个问题:当数据量非常大的时候,我们没法直接肉眼发现频繁项集,这催生了关联规则挖掘的算法,比如Apriori, PrefixSpan, CBA;我们缺乏一个频繁项集的标准。比如10条记录,里面A和B同时出现了三次,那么我们能不能说A和B一起构成频繁项集呢?因此我们需要一个评估频繁项集的标准。
常用的频繁项集的评估标准有支持度、置信度和提升度三个。
1.1 支持度
支持度就是几个关联的数据在数据集中出现的次数占总数据集的比重。或者说几个数据关联出现的概率。如果我们有n个想分析关联性的数据
,则对应的支持度为:一起出现的次数数据集总样本数
支持度体现的是某项集的频繁程度,只有某项集的支持度达到一定程度,我们才有研究该项集的必要。一般来说,支持度高的数据不一定构成频繁项集,但是支持度太低的数据肯定不构成频繁项集。
1.2 置信度
又叫可信度,是针对一条关联规则定义的。关联规则{A->B}的置信度为A与B同时出现的次数,除以A出现的次数。即在A发生的条件下,B发生的概率(条件概率)。
举个例子,在购物数据中,{纸巾
1.3 提升度
提升度表示含有Y的条件下,同时含有X的概率,与X总体发生的概率之比,即:
提升度体现的是组合(应用关联规则)相对不组合(不应用关联规则)的比值,如果提升度大于1,则说明应用该关联规则是有价值的。如果提升度小于1,说明应用该关联规则起到了负面影响。
一般来说,要选择一个数据集合中的频繁数据集,则需要自定义评估标准。最常用的评估标准是用自定义的支持度,或者是自定义支持度和置信度的一个组合。
2 寻找频繁项集
假设评估标准为给定的支持度阈值,如何寻找频繁项集呢?首先想的就是遍历所有物品组合,然后去掉支持度小于阈值的组合。比如对只有4个物品的集合{0,1,2,3},想要获得每种可能集合的支持度。首先,需要列出4个物品可能的组合数,一共有15种组合方法。对于n种商品的数据集就有个项集组合,计算量巨大,为了降低计算开销,可以采用Apriori算法寻找频繁项集。
3 Apriori算法
3.1 算法原理
Apriori算法的核心是下面这句话:某个项集是频繁的,那么它的所有子集也是频繁的。
这句话看起来是没什么用,但是反过来就很有用了。如果一个项集是非频繁项集,那么它的所有超集也是非频繁项集。
如图所示,我们发现{A,B}这个项集是非频繁的,那么{A,B}这个项集的超集,{A,B,C},{A,B,D}等等也都是非频繁的,这些就都可以忽略不去计算。运用Apriori算法的思想,我们就能去掉很多非频繁的项集,大大简化计算量。
3.2 算法流程
输入:数据集合D,支持度阈值
输出:最大的频繁k项集
(1)扫描整个数据集,得到所有出现过的数据,作为候选频繁1项集。k=1,频繁0项集为空集。
(2)挖掘频繁k项集
(2.1)扫描数据计算候选频繁k项集的支持度
(2.2)去除候选频繁k项集中支持度低于阈值的数据集,得到频繁k项集。如果得到的频繁k项集为空,则直接返回频繁k-1项集的集合作为算法结果,算法结束。如果得到的频繁k项集只有一项,则直接返回频繁k项集的集合作为算法结果,算法结束。
(2.3)基于频繁k项集,连接生成候选频繁k+1项集。
(3)令k=k+1,转入步骤2。
Aprior算法是一个非常经典的频繁项集的挖掘算法,很多算法都是基于Aprior算法而产生的,包括FP-Tree,GSP, CBA等。这些算法利用了Aprior算法的思想,但是对算法做了改进,数据挖掘效率更好一些,因此现在一般很少直接用Aprior算法来挖掘数据了,但是理解Aprior算法是理解其它Aprior类算法的前提,同时算法本身也不复杂,因此值得好好研究一番。
3.3 算法实战
不过scikit-learn中并没有频繁集挖掘相关的算法类库,可以使用第三方库mlxtend中的API。
def apriori(df, min_support=0.5,
use_colnames=False,
max_len=None)
参数如下:
- df:数据集。
- min_support:给定的最小支持度。
- use_colnames:默认False,则返回的物品组合用编号显示,为True的话直接显示物品名称。
- max_len:最大物品组合数,默认是None,不做限制。如果只需要计算两个物品组合的话,便将这个值设置为2。
下面用一个简单的例子来说明怎么使用Apriori算法找到频繁项集。代码如下:
import pandas
设定的最小支持度min_support是0.5,那么只有支持度大于等于0.5的物品集合才是频繁项集,最终结果如下:
support itemsets
0 0.6 (洋葱)
1 0.6 (牛奶)
2 1.0 (芸豆)
3 0.6 (酸奶)
4 0.8 (鸡蛋)
5 0.6 (洋葱, 芸豆)
6 0.6 (洋葱, 鸡蛋)
7 0.6 (牛奶, 芸豆)
8 0.6 (酸奶, 芸豆)
9 0.8 (鸡蛋, 芸豆)
10 0.6 (洋葱, 鸡蛋, 芸豆)
4 关联规则
前面已经用Apriori得到频繁项集了。那么我们就可以在频繁项集的基础上,找到这里面的关联规则。而计算关联规则所用到的,就是我们上面所说的置信度和提升度。
这里有一点要注意,当我们发现置信度(A->B)很高的时候,反过来的值置信度(B->A)不一定很高。
还是用mlxtend库,根据上面找到的频繁项集,计算出它们的关联规则。在此之前,还是先介绍一下相应API的参数。
association_rules(df, metric="confidence",
min_threshold=0.8,
support_only=False):
参数介绍:
- df:这个不用说,就是 Apriori 计算后的频繁项集。
- metric:可选值'support','confidence','lift','leverage','conviction'。里面比较常用的就是置信度和支持度。这个参数和下面的min_threshold参数配合使用。
- min_threshold:参数类型是浮点型,根据 metric 不同可选值有不同的范围
- support_only:默认是 False。仅计算有支持度的项集,若缺失支持度则用 NaNs 填充。
这里根据置信度来计算,找出置信度大于0.6的关联规则。
#导入关联规则包
结果如下:
support confidence lift leverage conviction
0 0.6 1.00 1.00 0.00 inf
1 0.6 1.00 1.25 0.12 inf
2 0.6 0.75 1.25 0.12 1.6
3 0.6 1.00 1.25 0.12 inf
4 0.6 0.75 1.25 0.12 1.6
5 0.6 0.60 1.00 0.00 1.0
6 0.8 1.00 1.00 0.00 inf
7 0.8 0.80 1.00 0.00 1.0
8 0.6 1.00 1.00 0.00 inf
9 0.6 0.60 1.00 0.00 1.0
10 0.6 1.00 1.25 0.12 inf
11 0.6 0.75 1.25 0.12 1.6
12 0.6 1.00 1.00 0.00 inf
13 0.6 0.60 1.00 0.00 1.0
14 0.6 1.00 1.00 0.00 inf
15 0.6 0.60 1.00 0.00 1.0
上面例子中我们可以发现,{洋葱 -> 鸡蛋,芸豆} 的置信度是 1.00 ,而它们的提升度是 1.25 。这说明买了洋葱的人很可能会再购买 1.25 份的 {鸡蛋,芸豆} ,所以可以让它们放到一起出售。