基于R的数据挖掘方法与实践(2)——关联规则

来源:互联网 发布:编写linux脚本执行命令 编辑:程序博客网 时间:2024/05/19 14:35

关联规则是从庞大的数据中提取一系列变量或因子间关系,以探索数据的变量或项目间隐含的关系。

1、基本原理

关联规则通常用支持度、置信度、增益三个指标来分别表示其显著性、正确性和价值。通过给性最小支持度、最小置信度作为门槛值。若该规则的支持度与置信度大于门槛值,则说明该规则有助于进行推论;若该规则的增益大于1,则说明其发生的条件概率有比原先的概率提高,即该规则有效。

1.1 支持度

支持度计算公式如下:

支持度 = P(X∩Y)

以下表中的数据为例。

交易记录

牛奶

面包

饼干

橙汁

汽水

泡面

水果

201701101

1

1

1

1

0

0

0

201701102

0

1

1

0

1

1

0

201701103

1

0

1

0

0

0

1

201701104

1

1

0

1

0

1

1

201701105

0

0

1

0

1

0

1

 

要了解顾客同时购买牛奶和面包的规则是否具有显著性,可以通过支持度衡量,即计算顾客同时购买牛奶和面包的概率:

P(面包∩牛奶) = 2/5 = 0.4

1.2 置信度

置信度是衡量一个事件发生的情况下,另一个事件发生的条件概率,即P(Y|X)。

P(Y|X)= P(X∩Y)/P(X)

一般情况下,置信度需要大于0.5。

 

如果想要了解规则“顾客在购买牛奶后也会购买面包”的信心程度,则可以用置信度:

P(面包|牛奶) = P(面包∩牛奶) / P(牛奶) = 0.4/0.6 = 0.67

1.3 增益

增益用于比较置信度与事件Y单独发生两者之间的概率。增益至少要大于1,才能说明事件X对事件Y的发生有促进作用。

lift= P(Y|X)/P(Y) = P(X∩Y)/[P(X)P(Y)]

规则“顾客在购买牛奶后也会购买面包”的增益计算如下:

lift(牛奶 -> 面包) = P(面包|牛奶) / P(面包) = P(面包∩牛奶) / [P(牛奶)P(面包)] = 0.4/[0.6*0.6] = 1.11

2、关联规则的分类

2.1以规则中属性的类型分类

当关联规则中的属性都是布尔值得时候,称为布尔关联规则。上面我们讨论购买面包与牛奶的问题,是典型的布尔关联规则。

当所要描述的规则的属性值是数量的时候,则称为量化的关联规则。对于量化的关联规则,可以通过数值的区间划分和归类转化为布尔属性。

2.2以规则中的数据维度分类

若规则是针对单一维度的时候,称之为单一维度关联规则。如规则“顾客在购买牛奶后也会购买面包”。

若规则是针对两个或两个以上维度的,则称为多维度关联规则或复合关联规则。如规则“三十岁以上单身男性工程师会购买海外基金”。

2.3以规则中的层级分类

若规则属性或项目属于同一层级,则称为单一层级关联规则。如规则“顾客在购买牛奶后也会购买面包”。

若数据同时包含较低层级和较高层级的项目集集合,则应该建立层级树,然后进行关联规则分析。当较低层级的项目集合不易发现关联规则时,则可以升级为较高的层级,以发现较明显的关联规则。这种关联规则,可以称为多层级关联规则。

3、关联规则的算法

关联规则的算法主要由搜索方式、计算项目及支持度组成。

3.1Apriori算法

Apriori算法是挖掘高频项目及的布尔值关联规则中最具代表性的算法,随后发展的关联规则算法大都以其为基础。该算法在大量的数据集中,利用项目集来建立关联规则,并计算每一个候选项目出现的次数,依据所设定的最小支持度为门槛,来衡量候选项目的关联规则是否显著。

Apriori算法分为5步:

(1)设定k = 1。快速扫描事务数据库,找出所有的1-项目集,与所规定的最小支持度门槛比较,高于最小支持度门槛的作为高频1-项目集,记为L1

(2)设定k = k + 1并产生新的候选k-项目集。删除候选k-项目集中所有k-1子项目集不属于L1的候选项目集,并将过滤之后的k-项目集记为Ck

(3)计算Ck中项目集各自的支持度S是否大于或等于规定的最小支持度,得到高频k-项目集。

(4)判定是否已搜索过所有的候选项目集,若已搜索完所有可能的候选集,则继续步骤(5);否则,回到步骤(2)。

(5)计算所搜索项目集的置信度和增益,找出显著性的关联规则以帮助决策者指定相关决策。

Apriori算法的缺点是逐层扩展候选项目集必须大量地重复搜索数据库,因此当高频项目集长度较长或者数量较多时,必须花费较长时间来挑选产生候选项目集。

3.2Partition算法

为改善Apriori算法搜索效率不高的问题,Partition算法将数据库D分割成许多区段Pi,然连后进行扫描找出高频项目集,以建立显著关联规则。具体步骤为:

(1)将数据库分成互不相交的区段。分别计算各区段的相关项目集合支持度,找出各区段的高频项目集,称为区域高频项目集。每次读取一个分割区段Pi,采用Apriori算法找出区域高频项目集集合,记为LPi

(2)取所有区域高频项目集的并集,即{LP1∪LP2∪…∪LPn},作为D的整体候选项目集集合。对D重新计算该候选项目集的支持度,找出真正的高频项目集。

Partition算法的优点是大幅提高了搜索效率,缺点是在各区段产生了太多的非相关项目集时,需要大量的存储空间。

3.3 DHP算法

DHP算法利用散列树的构建,设计一个散列函数,将数据库中的项目集对应到散列表中,以累计各散列阶层所包含项目集的个数,并以累计的阶层数粗略估算候选项目集的支持度,以提前删除不可能称为高频项目集的候选项目集。具体步骤如下:

(1)设定k = 1。规定支持度与置信度的门槛值,搜索整个数据库D,找出高频1-项目集L1,并建立2-项目集的散列表,记为H2

(2)设定k = k + 1;利用Lk-1产生项目集集合Ck,先用散列表中各阶层的累积次数对Ck进行初步筛选,在计算筛选后的各k-项目集支持度以决定高频项目集集合Lk

(3)不断地重复上一步骤,知道所有高频项目集合Lk都无法再往上一阶层产生Ck+1

DHP算法可以免除大量不必要的低阶层(特别是第二阶层)候选项目集筛选。其缺点是一开始必须花一些时间来建立散列表,且会导致初期有较高的误判率。

3.4 MSApriori算法

MSApriori算法中,关联规则最小支持度为该规则内所有项目集对应的最小支持度的最小值。分析者可以对具有较高价值的项目规定较低的支持度门槛,对价值较低的项目规定较高的支持度门槛。具体步骤如下:

(1)规定个项目的最小支持度门槛(MIS),并将所有项目按MIS递增排列。

(2)扫描所有的项目,找出符合最小支持度的候选1-项目集,记为F1,并筛选F1得到高频1-项目集L1。其中F1中的项目支持度都在min{MIS}以上,而L1中的项目都在各自的最小支持度以上。

(3)产生其他候选项目集,方法与Apriori算法类似,以递归方式找出各阶层的候选项目集以及高频项目集。

3.5FP-Growth算法

繁殖模式增长(FP-Growth)算法是目前最有效率的关联规则算法。该算法将数据库内含有的频繁项目集压缩到一颗频繁模式树种,并保留项目集之间的重要关联信息。次方法在挖掘时不需要产生大量的候选项目集,最多只需扫描数据库两次,因此可大量减少IO时间,于单一维度及布尔值的领域中,都能以相当有效率的搜索方式建立关联规则。FP-Growth算法可以分为两个阶段:

(1)建立FP-tree

i) 第一次扫描数据库,找出符合最小支持度的第一阶高频项目集L1 = {{A},{B},{C},{F}},依照支持度大小降序排列。得到的结果如下表所示:

交易记录

项目

属于高频项目集并按支持度大小排序

10001

A, B, D, E, F, G

{B}, {A}, {F}

10002

B, C, D, F

{B}, {C}, {F}

10003

A, B, C, F

{B}, {A}, {C}, {F}

10004

A, B, C, G

{B}, {A}, {C}

ii)建立FP-tree的根节点,表示为空节点,然后再次扫描数据库,将属于高频项目集的交易记录按步骤(1)所排列的项目顺序加入FP-tree中,直至所有高频项目集均经过扫描且建立连接关系,完成第二次扫描数据库的步骤。

iii) 为使得FP-tree更容易解读,建立项目连接表,使每个项目可通过一个节点链指出该叶节点在树种出现的位置,使树形图更为清晰。

(2)以FP-Growth算法针对该树中所隐含的规则进行挖掘。

i) 由项目连接表中的项目栏自下而上按照叶节点X坐落的顺序挖掘,按照每个关联项目连接FP-tree,找出FP-tree中X叶节点的前缀路径,而X叶节点的前缀路径所构建的FP-tree即为X的条件频繁模式树(简称X的条件FP-tree)。

ii) 以相同的方法递归挖掘X的条件FP-tree,计算模式库中每个项目的支持度,找出非空集合且具有高频项目集特征的项目集合,用模式库中的高频项目与X组合成高频项目集,列于候选项目集中。

iii) 运用阶段一与阶段二的模式不断对FP-tree递归挖掘,找出包含该叶节点的所有前缀路径,直到所有的叶节点均不存在任何前缀路径。

项目集

前缀路径

挖掘出的高频项目集

{F}

({B}{A}{C})

({B}{A})

({B}{C})

{F}

{B, F}

{C}

({B}{A})

({B})

{C}

{B,C}

{A}

({B})

{A}

{B,A}

{B}

ø

{B}

 

4、关联规则的应用

以arules包中的IncomeESL数据为例,开展关联规则分析。

> IncomeESL <- IncomeESL[complete.cases(IncomeESL),] #删除包含缺失值的数据> dim(IncomeESL) #查看删除缺失值之后的IncomeESL的数据维度[1] 6876   14> IncomeESL.tr <- as(IncomeESL, "transactions") #关联规则分析必须使用transactions格式的数据,因此采用as()将data.frame数据转换为transactions对象> rules <- apriori(IncomeESL.tr, parameter = list(support = 0.1, confidence = 0.6)) #采用Apriori算法进行关联规则分析,将支持度设为0.1、置信度设为0.6AprioriParameter specification: confidence minval smax arem  aval originalSupport maxtime support minlen maxlen target   ext        0.6    0.1    1 none FALSE            TRUE       5     0.1      1     10  rules FALSEAlgorithmic control: filter tree heap memopt load sort verbose    0.1 TRUE TRUE  FALSE TRUE    2    TRUEAbsolute minimum support count: 687 set item appearances ...[0 item(s)] done [0.00s].set transactions ...[84 item(s), 6876 transaction(s)] done [0.00s].sorting and recoding items ... [42 item(s)] done [0.00s].creating transaction tree ... done [0.00s].checking subsets of size 1 2 3 4 5 6 done [0.02s].writing ... [2360 rule(s)] done [0.00s].creating S4 object  ... done [0.00s].> plot(rules) #绘制关联规则的散点图

这幅散点图表示了规则的分布图:大部分规则的support在0.2以内,Confidence在0.6-1内。每个点的颜色深浅代表了lift的值。

> plot(rules, method = "grouped")#绘制关联规则的群组矩阵图


群组矩阵图可以总览产生的关联规则中包含哪些项目,进而选取用户可能感兴趣的规则进行详细检查。右侧纵向列出的是规则的结果项目(RHS),上方横向列出的是规则的条件项目(LHS);矩阵交汇的地方,以圆圈大小表示支持度,以颜色深浅代表增益。

比如我们选取的比较感兴趣的问题是“什么样的人会拥有自己的房子”,就可以通过筛选RHS为“householder status=own”(注意编写程序的时候,“=”两侧一定不能有空格,否则会提示错误)的显著(lift>1)规则,并列出其中支持度最大的5名做进一步分分析。

> rulesOwn <- subset(rules, subset = rhs %in% "householder status=own" & lift > 1) #遴选出RHS为{householder status=own}的显著(增益>1)规则> inspect(head(sort(rulesOwn, by = "support"), n = 5)) #列出其中支持度排前5的规则做进一步分析    lhs                              rhs                        support confidence     lift count[1] {marital status=married}      => {householder status=own} 0.2614892  0.6779789 1.804096  1798[2] {marital status=married,                                                                          language in home=english}    => {householder status=own} 0.2472368  0.6961507 1.852451  1700[3] {marital status=married,                                                                          type of home=house}          => {householder status=own} 0.2329843  0.8279070 2.203053  1602[4] {marital status=married,                                                                          type of home=house,                                                                              language in home=english}    => {householder status=own} 0.2207679  0.8433333 2.244102  1518[5] {marital status=married,                                                                          ethnic classification=white} => {householder status=own} 0.2049156  0.7353862 1.956856  1409

可以发现,支持度前5名的规则中,所有的条件均包含“maritalstatus=married”,且其单一条件的置信度达到了0.68。

如果我们感兴趣的项目并未产生相应的规则,除了降低产生关联规则的门槛值以外,我们也可以通过对数据重新整合,降低属性的水平数后再进行关联规则分析。例如,本案例中,我们对高收入人群感兴趣,但产生的规则中却很少有与income相关的规则。那么,我们可以将income取值中原有的9个水平按照$40000为分界点重新划分为“$40-”、“$40+”两个水平,再次进行关联规则分析。

> library(arules) #加载arules程序包> library(arulesViz) #加载arulesViz程序包> data("IncomeESL") #加载数据文件IncomeESL> class(IncomeESL) #查看IncomeESL的数据类型[1] "data.frame"> dim(IncomeESL) #查看IncomeESL的维度[1] 8993   14> IncomeESL <- IncomeESL[complete.cases(IncomeESL),] #删除包含缺失值的数据> dim(IncomeESL) #查看删除缺失值之后的IncomeESL的数据维度[1] 6876   14> IncomeESL[["income"]] <- factor((as.numeric(IncomeESL[["income"]]) > 6) + 1, levels = 1:2, labels = c("$40-", "$40+")) #将income划分为2个水平> IncomeESL.tr <- as(IncomeESL, "transactions") #关联规则分析必须使用transactions格式的数据,因此采用as()将data.frame数据转换为transactions对象> rules <- apriori(IncomeESL.tr, parameter = list(support = 0.2, confidence = 0.6)) #采用Apriori算法进行关联规则分析,将支持度设为0.2、置信度设为0.6AprioriParameter specification: confidence minval smax arem  aval originalSupport maxtime support minlen maxlen target   ext        0.6    0.1    1 none FALSE            TRUE       5     0.2      1     10  rules FALSEAlgorithmic control: filter tree heap memopt load sort verbose    0.1 TRUE TRUE  FALSE TRUE    2    TRUEAbsolute minimum support count: 1375 set item appearances ...[0 item(s)] done [0.00s].set transactions ...[77 item(s), 6876 transaction(s)] done [0.01s].sorting and recoding items ... [23 item(s)] done [0.00s].creating transaction tree ... done [0.00s].checking subsets of size 1 2 3 4 5 done [0.01s].writing ... [513 rule(s)] done [0.00s].creating S4 object  ... done [0.00s].> rulesIncome <- subset(rules, subset = rhs %in% "income=$40+" & lift > 1) #遴选出RHS为{householder status=own}的显著(增益>1)规则> inspect(head(sort(rulesIncome, by = "support"), n = 5)) #列出其中支持度排前5的规则做进一步分析    lhs                                                  rhs           support   confidence lift    [1] {householder status=own}                          => {income=$40+} 0.2436009 0.6482198  1.716934[2] {marital status=married}                          => {income=$40+} 0.2370564 0.6146305  1.627966[3] {householder status=own,language in home=english} => {income=$40+} 0.2325480 0.6555966  1.736472[4] {marital status=married,language in home=english} => {income=$40+} 0.2248400 0.6330876  1.676853[5] {householder status=own,type of home=house}       => {income=$40+} 0.2107330 0.6665133  1.765387    count[1] 1675 [2] 1630 [3] 1599 [4] 1546 [5] 1449 

可以发现,“拥有自己的房子”和“已婚人士”为高收入人群的机会比较高置信度在0.6~0.7之间。










阅读全文
0 0