数据挖掘中的关联关系+Apriori算法+FPGrowth算法




推荐系统中常用的几种算法:

        基于内容的推荐(静态):内容特征表示,特征学习,推荐列表

        基于协同过滤的推荐(动态):群体智能、用户历史行为

        基于关联规则的推荐:Transaction 频繁项集和关联规则挖掘

        基于效率的推荐:效用函数的调用

        基于知识图谱的推荐:知识图谱的创建

        组合推荐:实际工作中经常使用


关联规则 Association Rules or  Basket Analysis 


订单关系

 1、 支持度

                百分比,指的是商品组合出现的次数与总次数的比例,支持度越高,代表这个商品出现的频率越大。

        ‘牛奶’的支持度 = 4/5 =0.8

        ‘牛奶+面包’ = 3/5 = 0.6

        2、 置信度:是个条件概念,指当你买了商品A,会有多大的概率买商品b

        置信度(牛奶->啤酒) = 2/4 = 0.5

        置信度(啤酒->牛奶) = 2/3 = 0.67

        如果我们单纯看置信度(可乐->尿布)= 1,也就是说可乐出现的时候,用户都会购买尿布。那么当用户买可乐的时候,就需要推荐尿布么?答案是否定的,如果该小店以卖尿布为准

        3、提升度:商品a的出现,对商品b的出现概率提升程度

        提升度(a->b)= 置信度(a->b)/ 支持度(b)

        提升度的三种可能:

        提升度(a->b)> 1:代表有提升

        提升度(a->b)= 1: 代表没有提升也没有下降

        提升度(a->b)< 1:代表有下降

        4、Apriori算法:就是查找频繁项集(frequent itemset) 的过程

        频繁项集(闺蜜):支持度大于等于最小的支持度(MIn Support)阈值的项集

        非频繁项集:支持度小于最小支持度的项集

案例
1、上面案例中的商品用ID来表示

牛奶、面包、尿布、可乐、啤酒、鸡蛋
先计算k=1的支持度 

假设最小支持度=0.5,那么Item4和6不符合最小支持度的,不属于频繁项集

最小支持度=0.5

在这个基础上,我们将商品两两组合,得到k=2项的支持度

筛选掉小于最小值支持度的商品组合

将商品进行K=3项的商品组合,可以得到:

筛选掉小于最小值支持度的商品组合


得到K=3项的频繁项集{1,2,3},也就是{牛奶、面包、尿布}的组合。


Apriori算法的流程:

Step1,K=1,计算K项集的支持度;

Step2,筛选掉小于最小支持度的项集;

Step3,如果项集为空,则对应K-1项集的结果为最终结果。

否则K=K+1,重复1-3步。


使用工具包:

from efficient_apriori import apriori

或者:

from mlxtend.frequent_patterns import apriori

代码如下:

代码

关联分析的使用场景,万物皆Transaction:

        超市购物小票(TransactionID => Item)

        github项目路径:

        每部电影的分类(MovieID => 分类)

        github项目路径:

        每部电影的演员(MovieID => 演员)

         github项目路径:


关联规则与协同过滤的区别

关联规则是基于transaction,而协同过滤基于用户偏好(评分)

商品组合使用的是购物篮分析,也就是Apriori算法,协同过滤计算的是相似度

关联规则没有利用“用户偏好”,而是基于购物订单进行的频繁项集挖掘

关联规则与协同过滤的区别

1、推荐使用场景:

当下的需求:

推荐的基础是且只是当前一次的购买/点击

长期偏好:

基于用户历史的行为进行分析,建立一定时间内的偏好排序

两种推荐算法的思考维度不同,很多时候,我们需要把多种推荐方法的结果综合起来做一个混合的推荐

关联规则的视角

不需要考虑用户一定时期内的偏好,而是基于Transaction

只要能将数据转换成Transaction,就可以做购物篮分析:

Step1、把数据整理成id=>item形式,转换成transaction

Step2、设定关联规则的参数(support、confident)挖掘关联规则

Step3、按某个指标(lift、support等)对以关联规则排序

关联规则中的最小支持度、最小置信度该如何确定

最小支持度,最小置信度是实验出来的

最小支持度:

不同的数据集,最小值支持度差别较大。可能是0.01到0.5之间

可以从高到低输出前20个项集的支持度作为参考

最小置信度:可能是0.5到1之间

提升度:表示使用关联规则可以提升的倍数,是置信度与期望置信度的比值

提升度至少要大于1

Apriori在计算的过程中存在的不足:

可能产生大量的候选集。因为采用排列组合的方式,把可能的项集都组合出来了

每次计算都需要重新扫描数据集,计算每个项集的支持度

浪费了计算空间和时间

FPGrowth算法

在Apriori算法基础上提出了FP-Growth算法:

创建了一棵FP树来存储频繁项集。在创建前对不满足最小支持度的项进行删除,减少了存储空间。

整个生成过程只遍历数据集2次,大大减少了计算量

理解:Apriori存在的不足,有更快的存储和搜索方式进行频繁项集的挖掘

步骤

创建项头表(item header table)

作用是为FP构建及频繁项集挖掘提供索引。

Step1、流程是先扫描一遍数据集,对于满足最小支持度的单个项(K=1项集)按照支持度从高到低进行排序,这个过程中删除了不满足最小支持度的项。

项头表包括了项目、支持度,以及该项在FP树中的链表。初始的时候链表为空。

Step2、对于每一条购买记录,按照项头表的顺序进行排序,并进行过滤。

构造FP树,根节点记为NULL节点

Step3、整个流程是需要再次扫描数据集,把Step2得到的记录逐条插入到FP树中。节点如果存在就将计数count+1,如果不存在就进行创建。同时在创建的过程中,需要更新项头表的链表。

Step4、通过FP树挖掘频繁项集

现在已经得到了一个存储频繁项集的FP树,以及一个项头表。可以通过项头表来挖掘出每个频繁项集。

挖掘从项头表最后一项“啤酒”开始。

从FP树种找到所有“啤酒”节点,向上遍历祖先节点,得到3条路径。对于每条路径上的节点,其count都设置为“啤酒”的count

具体的操作会用到一个概念,叫“条件模式基”

因为每项最后一个都是“啤酒”,因此我们把“啤酒”去掉,得到条件模式基,此时后缀模式是(啤酒)

假设{啤酒}的条件频繁集为{S1,S2,S3},则{啤酒}的频繁集为{S1+{啤酒},S2+{啤酒},S3+{啤酒}},此时的条件频繁项集为{{}, {尿布}},所以啤酒的频繁项集为{啤酒},{尿布,啤酒}

继续找项头表倒数第2项面包,求得“面包”的条件模式基

根据条件模式基,可以求得面包的频繁项集:{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}



继续找项头表倒数第3项面包,求得“牛奶”的条件模式基

根据条件模式基,可以求得面包的频繁项集:{牛奶},{尿布,牛奶}


继续找项头表倒数第4项面包,求得“尿布”的条件模式基

根据条件模式基,可以求得尿布的频繁项集:{尿布}

所以全部的频繁项集为:

{啤酒},{尿布,啤酒}

{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}

{牛奶},{尿布,牛奶}

{尿布}


工具包

通过Python官方的第三方软件库

https://pypi.org/

import fptools as fp

Spark.mllib 提供并行FP-growth算法

你可能感兴趣的:(数据挖掘中的关联关系+Apriori算法+FPGrowth算法)