最近遇到一个业务问题需要用关联规则的算法来实现,为了解决业务问题,我又重新复习了一遍以前就学过的Apriori算法并将其运用到业务场景中。下面,我想谈一谈在在具体的业务实现过程中我的一些感想。
X和Y各代表某一个项集,M代表样本中的总项集数。
衡量关联规则有三个最基本也是最重要的指标,我将其称为‘三度’。这里的三度指的可不是《三傻大闹宝莱坞》里面那三个蠢萌蠢萌的印度人,而是指的度量关联规则最基础也是最核心的指标三兄弟:支持度,置信度,提升度。
下面我将对这三兄弟进行逐一介绍。
老大支持度,是‘三度’家族里最沉稳最老实的孩子。出于兄长对两个弟弟的谦让之情,关联规则家族建立的时候,老大主动表示他要来度量关联规则中最苦最累随时要给弟弟们提供理论支持的概念。关联规则家族表示老大good job,于是便给老大赐名为支持度,基本公式是
在了解了关联规则的三个度的基本定义之后,下一步则需要阐述清楚Apriori算法的基本定义。
在讲Apripri算法之前,我们首先要清楚两个概念:
1)设定最小支持度的阈值,如果一个项集的支持度大于等于最小支持度,则其为频繁项集,如果一个项集的支持度小于最小支持度,则其为非频繁项集。
2)对于一个项集,如果它是频繁集,则它的子集均是频繁集;如果它是非频繁集,则它的父集都是非频繁集。这是因为一个项集的所有子集的支持度都大于等于它本身,一个项集的所有父亲的支持度都小于等于它本身。
有了上面两个概念打底,Apriori算法就可以被定义了。Apripri算法主要分为三步:
1)设定最小支持度的阈值。从单项集开始,先计算所有单项集的支持度,过滤掉非频繁单项集及其父集;将剩余的单项集组合为二项集,先计算所有二项集的支持度,过滤掉非频繁二项集及其父集;不断地迭代上述过程,最后筛选出所有的频繁项集。
2)设定最小置信度的阈值。对频繁项集进行计算,求出满足置信度条件的强关联规则。
3)设定最小提升度的阈值。对第2)步进行计算,求出满足提升度条件的强关联规则,作为最后的关联规则的模型结果。
相比于最原始的一一计算,使用Apripor算法计算频繁项集可以大大地减少运算量,提升计算效率。
到底,理论的梳理就完全结束,下一步我将会对关联规则进行实战演练。
因为业务需要保密,所以实战演练部分我并没有用业务中的真实数据来进行记录,而是借用了arules包中和我业务数据很像的Epub数据来对我的建模过程来进行一个回顾和梳理。
Epub数据包含了来自维也纳大学经济与工商管理学院的电子文档平台的下载历史。
library(arules)
#导入数据
>data(Epub)
#查看数据类型
>class(Epub)
[1]"transactions"
#因为我的业务数据是从oracle数据库里面导出来的,所以我这里便把Epub数据转成data.frame格式,然后导出到数据库之后,重新从数据库导入,以便能够记录整个建模流程
>Epub<-as(Epub,"data.frame")
#因为业务不需要,所以演示时也去掉时间字段
>Epub<-Epub[,1:2]
导出进数据库因为不属于建模流程,这里就不记录了。
上一节对数据源进行了基本的阐释下面正式进入正题,我将会从数据库导入开始一步步记录我的建模流程。
首先,是数据准备过程。
#引入链接数据库的RODBC包
library(RODBC)
#连接数据库
channel<-odbcConnect("数据库名",uid="orcl",pwd="orcl")
#读入数据
Epub<-sqlQuery(channel,"select * from Epub")
#查看数据前六行
head(Epub)
此时数据应该是如下表格的data.frame结构:
transactionID | items |
---|---|
session_4795 | doc_154 |
session_4797 | doc_3d6 |
session_479a | doc_16f |
session_47b7 | session_47b7 |
session_47b7 | session_47b7 |
session_47b7 | doc_f4 |
这个时候,表格是数据库存储的格式而非事务集的格式,因此首先要对数据进行格式转换。
首先,要对数据进行分组,一个transactionID的所有items应该在一个组里,因此,我们可以使用split函数,指定它的分组变量和目标变量:
>Epub<-split(Epub$items,Epub$transacionID)
#分组之后,将Epub数据转换成事务集形式
>Epub<-as(Epub,"transacions")
#查看Epub数据的前十行
>inspect(Epub[1:10])
items transactionID
[1] {doc_154} session_4795
[2] {doc_3d6} session_4797
[3] {doc_16f} session_479a
[4] {doc_11d,doc_1a7,doc_f4} session_47b7
[5] {doc_83} session_47bb
[6] {doc_11d} session_47c2
[7] {doc_368} session_47cb
[8] {doc_11d,doc_192} session_47d8
[9] {doc_364} session_47e2
[10] {doc_ec} session_47e7
Eupb已经被转化成了事务集,到此,我们就已经做好数据的准备。
数据准备好之后,就进入整个流程中最重要也是最核心的建模步骤中了。
#查看数据集统计汇总信息
>summary(Epub)
transactions as itemMatrix in sparse format with
15729 rows (elements/itemsets/transactions) and
936 columns (items) and a density of 0.001758755
most frequent items:
doc_11d doc_813 doc_4c6 doc_955 doc_698 (Other)
356 329 288 282 245 24393
element (itemset/transaction) length distribution:
sizes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
11615 2189 854 409 198 121 93 50 42 34 26 12 10 10 6 8 6 5 8
20 21 22 23 24 25 26 27 28 30 34 36 38 41 43 52 58
2 2 3 2 3 4 5 1 1 1 2 1 2 1 1 1 1
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 1.000 1.000 1.646 2.000 58.000
includes extended item information - examples:
labels
1 doc_11d
2 doc_13d
3 doc_14c
includes extended transaction information - examples:
transactionID
10792 session_4795
10793 session_4797
10794 session_479a
#可以使用dim函数提取项集数和item数
>dim(Epub)
[1] 15729 936
第一步,查看数据集的统计汇总信息。summary()含义的具体解释如下:
1)共有15729个项集和936 个item,稀疏矩阵中1的百分比为0.001758755。
2)most frequent items描述了最频繁出现的5个item以及其分别出现的次数。
3)sizes描述了项集的项的个数以及n项集共有几个,例如单项集有10个,二项集有11个,58项集有1个。sizes之后描述了sizes对应的5个分位数和均值的统计信息。
#统计每个item的支持度
>itemFreq<-itemFrequency(Epub)
#每个项集transaction包含item的个数
>Size<-size(Epub)
#每个item出现的次数
> itemCount<-(itemFreq/sum(itemFreq)*sum(Size))
除此之外,还可以更直观地作图观测itemFrequency。
#查看支持度排行前10的图
>itemFrequencyPlot(Epub,topN=10,col="lightblue")
当对数据的基本统计信息心中有数之后,就开始最重要的建模步骤。
#最小支持度0.001,最小置信度0.6,最小项数2
>rules<-apriori(Epub,parameter=list(support=0.001,confidence=0.6,minlen=2))
这里解释一下最小项数。minlen和maxlen表示LHS+RHS并集的元素的最小个数和最大个数。有意义的规则起码是LHS和RHS各至少包含1个元素,所以minlen为2。
生成模型之后,观测模型结果。
#展示生成的规则
inspect(sort(rules,by="lift"))
lhs rhs support confidence lift
[1] {doc_6e7,doc_6e8} => {doc_6e9} 0.001080806 0.8095238 454.7500
[2] {doc_6e7,doc_6e9} => {doc_6e8} 0.001080806 0.8500000 417.8016
[3] {doc_6e8,doc_6e9} => {doc_6e7} 0.001080806 0.8947368 402.0947
[4] {doc_6e9} => {doc_6e8} 0.001207960 0.6785714 333.5391
[5] {doc_6e9} => {doc_6e7} 0.001271537 0.7142857 321.0000
[6] {doc_506} => {doc_507} 0.001207960 0.6551724 303.0943
[7] {doc_6e8} => {doc_6e7} 0.001335113 0.6562500 294.9187
[8] {doc_6e7} => {doc_6e8} 0.001335113 0.6000000 294.9187
[9] {doc_87c} => {doc_882} 0.001335113 0.6000000 171.5891
将会具体的展示生成的每一条强规则,其对应的支持度support,置信度confidence ,提升度。
可以指定搜索条件,查看规则的子集。