python 数据挖掘 关联规则挖掘 实践 Apriori FP-Tree mlxtend

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())

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/114368486