美文网首页
关联规则-算法原理与案例

关联规则-算法原理与案例

作者: 照希 | 来源:发表于2021-11-16 17:02 被阅读0次

一. 基本概念

1.1 概述

✓ 关联规则(Association Rules)反映一个事务与其他事务之间的相
互依存性和关联性。如果两个或者多个事务之间存在一定的关联关
系,那么,其中一个事务就能够通过其他事务预测到。
✓ 关联规则是无监督的机器学习方法,用于知识发现,而非预测
✓ 关联规则的学习器(learner)无需事先对训练数据进行打标签,因
为无监督学习没有训练这个步骤。缺点是很难对关联规则学习器进
行模型评估,一般都可以通过业务经验观测结果是否合理

1.2 相关概念

关联规则之前,需要理解一些基本概念。
下图数据集中,每一组数据ti表示不同的顾客一次在商场购买的商品
的集合,以该数据为例来说明关联规则相关概念。


111.png
概念1-事务数据集

图片显示, 表中存储着二维结构的记录集,记为D,简称事务集D,含事务的个数称为|D|。那么图片中从t1,t2,......直到t7含7个事务,|D|=7。

概念2-所有项集

设I={i1,i2,…im}是m个不同项目的集合,每个ik(k=1,2,…m)称为一个项目(Item),I是所有项目(Item)的集合,称为所有项集(Items)。图片中所有项集I={牛肉,鸡肉,牛奶,奶酪,靴子,衣服},其中,“牛 肉”、“鸡肉”等均为项目。

概念3-事务

在事务数据集里的一笔记录,记为事务T,{牛肉、鸡肉、牛奶}便是一个事务,每个事务T(Transaction)是所有项集I的一个子集。

概念4-项集

项目的集合简称为项集(Itemset),其元素个数为项集的长度,长度为k的项集称为k-项集(k-Itemset)。
如{牛肉}、{鸡肉}均为1-项集,{牛肉、奶酪}为2-项集,{鸡肉、衣 服、牛奶}为3-项集。

概念5-项集的支持度

重点概念5-项集的支持度:项集支持度用于描述X的重要性,对于项集X,count为事务集D中包含X的事务的数量,项集X的支持度就是项集X出现的概率。


image.png

项集的支持度就是该项集出现的次数除以总的记录数,例如,上述的7个事务中,{牛肉、鸡肉}出现的次数是3次,支持度就是3/7 。


image.png
概念6-最小支持度与频繁集

我们在发现规则的时候,希望关注频次高的项集,发现关联规则要求项集必须满足的最小支持阈值,称为项集的最小支持度(Minimum Support),记为supmin。支持度大于或等于最小支持度的项集称为频繁项集,简称频繁集,反之则称为非频繁集。支持度在这个算法中通常是人为规定的参数。

概念7-关联规则的支持度(support)

规则R的支持度是交易集中同时包含X和Y的交易数与所有交易数之比;


image.png

支持度计算在事务集中,既有A又有B的概率。
例:在7条记录中,既有牛肉又有鸡肉的记录有3条,则 R:牛肉 鸡肉的支持度为3/7,即 ,表示在所有顾客当中有3/7同时购买了牛肉和鸡肉,其反映了同时购买牛肉和鸡肉的顾客在所有顾客当中的覆盖范围。

概念8-置信度(confidence)

规则R的置信度是指包含X和Y的交易数与包含X的交易数之比。


image.png

规则的置信度的意义在于项集{X,Y}同时出现的次数占项集{X}出现次数的比例,即发生X的条件下,又发生Y的概率。


image.png
例如,在7条记录中,购买牛肉的记录有4条,在四条记录中,又有3条记录显示也购买了鸡肉,即 的置信度为3/4,表示在买了牛肉的顾客当中有3/4的人买了鸡肉,反映了可预测的程度,即顾客买了牛肉的话有多大可能性买鸡肉。
从概率论角度看,可以把“顾客买了牛肉之后又多大可能性买鸡肉”看作是条件概率事件,即 image.png

关联规则的最小支持度也就是衡量频繁集的最小支持度(Minimum
Support),记为supmin,它用于衡量规则需要满足的最低重要性。
Minimum Support是一个阈值参数,必须在处理关联规则之前指定该
参数。该参数表示用户对某些项集和规则感兴趣,这些规则表示数
据集的最低支持度。它是用于对项集进行限制,而不是对规则进行
限制。

概念9-强关联规则

✓ 如果关联规则R: A→B满足Support(A→B )>=supmin 且
Confidence( A→B )>=confmin,则称关联规则R: 为强关联规则,否
则称关联规则为弱关联规则;
✓ 在挖掘关联规则时,产生的关联规则要经过supmin和confmin的衡量,
筛选出来的强关联规则才能用于指导商家的决策;

概念10-提升度Lift

引入例题来计算这个概念,例:在所分析的10000个事务中,6000个事务包含计算机游戏,7500包含游戏机游戏,4000个事务同时包含两者。
下面我们计算:关联规则(计算机游戏 → 游戏机游戏)支持度=4000/10000=0.4,置信度=4000/6000=0.67,但其实这个关联规则是一个误导。

在用户购买了计算机游戏后有(4000/6000)=0.667的概率去购买游戏机游戏,而在没有任何前提条件下,用户反而有(7500/10000) =0.75的概率去购买游戏机游戏,也就是说设置了购买计算机游戏这样的条件反而会降低用户去购买游戏机游戏的概率,所以计算机游戏和游戏机游戏是相斥的。

此时需要引入提升度的概念。


image.png

如果两个条件相互独立,则P(XY)=P(X)· P(Y),即提升度为1;如果小于1,说明使用这条规则来进行推荐,还不如不推荐(推荐无效);
一般在数据挖掘中当提升度大于3时,我们才承认挖掘出的关联规则是有价值的。

上述例子中,假设购买计算机游戏为X,购买游戏机游戏为Y,则有提升度数=0.667/0.75<1


微信截图_20211116162341.png

这表明这样的推荐是无效的,提升度小于1,还不如不推荐。

二. 算法步骤

2.1 生成频繁项集

第一步,生成候选项集,然后根据指定的最小支持度,过滤掉非频繁项集,生成频繁项集。
该步骤需要多次遍历:第一次遍历,对所有单项的支持度进行计数并确定频繁项;在后续的每次遍历中,利用上一次遍历所得频繁项集作为种子项集,产生新的频繁项集-候选项集,并对候选项集的支持度进行计数,在本次遍历结束时统计满足最小支持度的候选项集,本次遍历对应的频繁项集就算是确定了,这些频繁项集又成为下一次遍历的种子;重复此遍历过程,直到再不能发现新的频繁项集。

2.2 生成关联规则

第二步,找出第一步的频繁项集中的规则,然后根据指定的最小置信度,过滤掉弱规则。第一步的计算量比第二步的计算量大。

2.3 举例说明
微信截图_20211116163025.png

步骤1:
✓ 生成候选1-项集C1,计算支持度
✓ 根据最小支持度,生成频繁1-项集L1


微信截图_20211116163125.png

步骤2:
✓ 生成候选2-项集C2,计算支持度
✓ 根据最小支持度,生成频繁2-项集L2


微信截图_20211116163209.png
步骤3:
✓ 生成候选3-项集C3,计算支持度
✓ 根据最小支持度,生成频繁3-项集L3
微信截图_20211116163310.png
步骤4:生成关联规则

✓ 生成关联规则时,最简单的方法就是对于每个频繁项集,列出其所有非空
真子集,任取其中两个分别作为LHS和RHS,形成关联规则,并计算每条关
联规则的置信度,删除弱规则
✓ 上例中 , 对于频繁项集 {B,C,E} , 它的非空子集有 {B},{C},{E},
{B,C},{B,E},{C,E}。据此获得的关联规则及其置信度,置信度>=50%(最小
置信度),都是强关联规则


微信截图_20211116163415.png
由频繁2-项集产生的关联规则如下
微信截图_20211116163457.png

三. 关联算法-Apriori

3.1 Apriori算法原理

✓ Apriori原理可以帮助减少计算量
✓ Apriori原理:某个项集是频繁的,那么它的所有子集也是频繁的;
更常用的是它的逆否命题,即如果一个项集是非频繁的,那么它的
所有超集也是非频繁的(称为项集的反单调性,向下闭合性)

已知阴影项集{2,3}是非频繁的。利用Apriori原理,我们知道项集{0,2,3}, {1,2,3}以及{0,1,2,3}也是非频繁的。也就是说,一旦计算出了{2,3}的支持 度 , 知 道 它 是 非 频 繁 的 , 就 可 以 紧 接 着 排 除 {0,2,3} , {1,2,3} 和 {0,1,2,3}。


微信截图_20211116164119.png

✓ 反单调性能迅速剪枝,提高搜索频繁项集的处理效率

3.2 案例-销售商品分析

在商品列表中找出频繁项集,构建商品列表。

import pandas as pd
from matplotlib import pyplot as plt
from mlxtend.frequent_patterns import apriori, association_rules
import warnings
warnings.filterwarnings("ignore")

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']]
找出频繁项集

创建模型,传入数据,输出的support就是支持度。

from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit_transform(dataset)

df = pd.DataFrame(te_ary, columns=te.columns_)
#选择和过滤,设置支持度0.6以上,给项集加长度方便筛选
frequent_itemsets = apriori(df, min_support=0.6, use_colnames=True)
frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x:len(x))#增加一列存储项集的长度
frequent_itemsets

该段输出结果如下


image.png

接下来可以筛选支持度大于某特定值的二项集


image.png
找出关联规则
rules = association_rules(frequent_itemsets,metric='lift',min_threshold=1.2)
rules["antecedent_len"] = rules['consequents'].apply(lambda x:len(x))
#选择与过滤
rules[ (rules['antecedent_len'] >= 2) &
       (rules['confidence'] > 0.75) &
       (rules['lift'] > 1.2) ]

输出结果



image.png

相关文章

网友评论

      本文标题:关联规则-算法原理与案例

      本文链接:https://www.haomeiwen.com/subject/ipfhtrtx.html