数据挖掘之关联分析Apriori算法

文章目录

  • 一、理论知识
    • 1.1、定义
    • 1.2、关联规则
    • 1.3、频繁项集的产生
  • 二、python实战

一、理论知识

许多商业企业在运营中积累了大量的数据。例如:普通超市的收银台每天都会收集到大量的用户购物数据。下表给出一个这样的例子,通常称为购物篮事务。每一行代表一个事务,包含唯一标识id和顾客购买的商品的集合。零售商对分析这些数据会感兴趣,因为这样可以了解到用户的购物行为,可以使用这种有价值的信息来支持各种商务应用,如市场促销,库存管理等。

TID 项集
1 {黄油 ,苹果,香蕉}
2 {面包,牛奶,苹果}
3 {面包,黄油,苹果}
4 {黄油,苹果,香蕉}
5 {牛奶,香蕉}

这篇博客主要讲解关联分析的方法。用于发现隐藏在大型数据集中的有意义的联系。发现的联系可以利用关联规则或频繁项集的形式表示。例如,从上表中可以提取出如下规则:{面包}->{苹果},这个规则表示买了面包的人同时也买了苹果,继而可以发现新的交叉销售商机。

1.1、定义

  • 二元表示
    购物篮数据可以用下表的二元形式来表示,每行表示一个事务,每一列表示一个项集。项可以用二元值表示,若项在事务中出现,则表示为1,否则为0。
牛奶 苹果 面包 香蕉 黄油
1 0 1 0 1 1
2 1 1 1 0 0
3 0 1 1 0 1
4 0 1 0 1 1
5 1 0 0 1 0
  • 项集:关联分析中,包含0个或多个项的集合被称为项集。如果一个项集中包含k个项,则称其为k项集。例如:{苹果,面包,牛奶}是一个3项集。
  • 支持度计数:项集在事务中出现的次数即为支持度计数。例如:上面的二元表中,项集{面包,苹果}在5个事务中出现了2次,所以它的支持度计数就为2。

1.2、关联规则

  • 关联规则是形如X->Y的蕴含表达式,其中X和Y是不相交的项集,即它们的交集为空。关联规则的强度可以利用支持度和置信度度量。支持度确定给定数据集的频繁程度,而置信度确定Y在包含X的事务中出现的频繁程度。
  • 支持度(support)和置信度(confidence)的定义如下:N表示事务数量,N()表示项集在事务中出现的次数
    s ( X → Y ) = N ( X U Y ) N , c ( X → Y ) = N ( X U Y ) N ( X ) s(X→Y)=\frac{N(XUY)}{N},c(X→Y)=\frac{N(XUY)}{N(X)} s(XY)=NN(XUY)c(XY)=N(X)N(XUY)
  • 提升度(lift): l i f t ( X → Y ) = c ( X → Y ) s ( Y ) = N ( X U Y ) / N ( X ) N ( Y ) / N lift(X→Y)=\frac{c(X→Y)}{s(Y)}=\frac{{N(XUY)}/{N(X)}}{N(Y)/N} lift(XY)=s(Y)c(XY)=N(Y)/NN(XUY)/N(X),如果 l i f t = 1 lift=1 lift=1说明X和Y没有任何关联,如果 l i f t < 1 lift<1 lift<1,说明X和Y是排斥的,如果 l i f t > 1 lift>1 lift>1,我们认为X和Y是有关联的。
    例如:上面的例子中:牛奶出现在2个事务中,那么{牛奶}的支持度就是2/5=0.4;苹果出现在包含牛奶的事务中出现了1次,那么规则{牛奶}→{苹果}的置信度为1/2=0.5,规则{牛奶}→{苹果}的提升度为0.5/(4/5)=0.625。
  • 给定事务的集合T,关联规则发现是指找出支持度大于等于minsup且置信度大于等于minconf的所有规则,其中minsup和minconf是对应的支持度和置信度的阈值即设置的最小支持度和最小置信度
  • 为什么使用支持度和置信度呢?
    • 支持度是一种重要度量值,因为支持度很低的规则可能知识偶尔出现,从商务角度看,低支持度的规则多半是无意义的,因为对顾客很少同时购买的商品进行促销活动并无益处。因此支持度,通常是删掉那些无意义的规则。
    • 置信度度量通过规则推理具有可靠性。对于给定的规则X→Y,置信度越高,说明Y在包含X的事务中出现的可能性就越大。置信度也可以估计Y在条件X下的条件概率。
  • 提升度存在的意义:
    置信度用于评估规则的可信程度,但是该度量有一个缺点,没有考虑规则后件的支持度问题,例如在下表中:
    数据挖掘之关联分析Apriori算法_第1张图片
    规则{茶} → \rightarrow {咖啡}的支持度为150/1000=15%,置信度为150/200=75%,先不考虑支持度,只看置信度会觉得比较高,因为可能会认为爱喝茶的人一般也爱喝咖啡。我们再来看一下喝咖啡的人的支持度,达到800/1000=80%,比规则{茶} → \rightarrow {咖啡}的置信度75%高,这说明什么问题?并不是爱喝茶的人一般爱喝咖啡,从而使得规则置信度高,而是爱喝咖啡的人本身就很多,所以这条规则是一个误导。由于置信度存在的缺陷,人们又提出了称作提升度的度量。
  • 强关联规则
    • 对于给定的规则X→Y,如果规则同时满足 s u p p o r t ( X → Y ) > = m i n s u p support(X→Y)>=minsup support(XY)>=minsup c o n f i d e n c e ( X → Y ) > = m i n c o n f confidence(X→Y)>=minconf confidence(XY)>=minconf,那么称规则X→Y为强关联规则,否则为弱关联规则。

1.3、频繁项集的产生

  • 先验原理:如果一个项集是频繁的,那么该项集的所有子集一定也是频繁的。
  • Apriori算法是第一个关联挖掘算法,使用基于支持度的剪枝技术。对于例子来说,假定支持度阈值为60%,相当于最小支持度计数为3。
  • 如图:初始将每个项作为一个候选1-项集,对他们的支持度计数之后,候选项集{牛奶}和{面包}被丢弃,因为它们的计数均小于3;第二次迭代,仅使用频繁集1-项集来产生2-项集,因为先验原理保证2-项集的所有子集均属于频繁集,因为只有3个频繁1-项集,所以从3个中选择两个产生2-项集,2项集数目为 C 3 2 = 3 C^2_3=3 C32=3,计算它们在所有事务中的支持度,发现2-项集中频繁项集只有一个{苹果,黄油};最终的频繁项集就是{苹果,黄油}。
    数据挖掘之关联分析Apriori算法_第2张图片

二、python实战

import numpy as np
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules  #关联规则

data = pd.read_csv('GoodsOrder.csv',sep=',',index_col=0,encoding='gbk')
df = pd.crosstab(index=data.index,columns=data.goods)
df
goods	牛奶	苹果	面包	香蕉	黄油
row_0					
1	0	1	0	1	1
2	1	1	1	0	0
3	0	1	1	0	1
4	0	1	0	1	1
5	1	0	0	1	0

frequent=apriori(df,min_support=0.3,use_colnames=True) #设置最小支持度为0.3,求频繁项集,显示列标签名
rules=association_rules(frequent,metric='confidence',min_threshold=0) #置信度大于0.5,求关联规则
rules.sort_values(by='confidence',ascending=False)

数据挖掘之关联分析Apriori算法_第3张图片

  • 结果解释:三项集中置信度最高的是 ( 黄 油 , 香 蕉 ) → ( 苹 果 ) ( 黄油,香蕉 )\rightarrow(苹果) (,)() ( 苹 果 , 香 蕉 ) → ( 黄 油 ) ( 苹果,香蕉 )\rightarrow(黄油) (,)(),项集 ( 黄 油 , 香 蕉 ) → ( 苹 果 ) ( 黄油,香蕉 )\rightarrow(苹果) (,)()说明在购买了黄油和香蕉的前提下,一定会购买苹果;且它们的提升度>1,说明有着较强的相关性。
  • 列名含义:针对规则{A}->{B},总事务数为N
列名 解释 公式
antecedents 前件 A
consequents 后件 B
antecedent support 前件支持度 s u p p o r t ( A ) = N ( A ) / N support(A)=N(A)/N support(A)=N(A)/N
consequent support 后件支持度 s u p p o r t ( B ) = N ( B ) / N support(B)=N(B)/N support(B)=N(B)/N
support 规则支持度 s u p p o r t ( A → B ) = N ( A , B ) / N support({A}\rightarrow{B})=N(A,B)/N support(AB)=N(A,B)/N
confidence 置信度 c o n f i d e n c e ( A → B ) = N ( A , B ) / N ( A ) confidence({A}\rightarrow{B})=N(A,B)/N(A) confidence(AB)=N(A,B)/N(A)
lift 提升度 l i f t ( A → B ) = c o n f i d e n c e ( A → B ) / s u p p o r t ( B ) lift({A}\rightarrow{B})=confidence({A}\rightarrow{B})/support(B) lift(AB)=confidence(AB)/support(B)
leverage 杠杆率 l e v e r a g e ( A → B ) = s u p p o r t ( A → B − s u p p o r t ( A ) ∗ s u p p o r t ( B ) ) leverage({A}\rightarrow{B})=support({A}\rightarrow{B}-support(A)*support(B)) leverage(AB)=support(ABsupport(A)support(B))
conviction c o n v i c t i o n ( A → B ) = 1 − s u p p o r t ( B ) 1 − c o n f i d e n c e ( A → B ) conviction({A}\rightarrow{B})=\frac{1-support(B)}{1-confidence({A}\rightarrow{B})} conviction(AB)=1confidence(AB)1support(B)

参考:
《数据挖掘导论》 范明 译

你可能感兴趣的:(机器学习,数据挖掘,算法,人工智能,机器学习,sklearn)