关联规则是常见的推荐算法,从发现大量用户行为数据中发现有强关联的规则。
关联规则是一种无监督的机器学习方法,用于知识发现。
优点是能够从大量行为数据中挖掘出无法直接感受到的规则,往往能给出意想不到的规则组合。缺点是难以进行模型评估,一般通过行业经验判断结果是否合理。关联规则中最常用的算法是Apriori,此外还有FP-Growth,Eclat
假设存在规则{A,B}->{C},则称:
{C}为后项,记为RHS(Right Hand Side)
Apriori思想的精髓:如果一个项集不是频繁项集,那么它的所有父集都不是频繁项集;一个项集是频繁项集,那么它的子集必然是频繁项集。
2.2.1 算法步骤
id | Items |
---|---|
001 | {A,B,C} |
002 | {B,C,D} |
003 | {C,E} |
004 | {D} |
005 | {A} |
首先计算最少个数项集的支持度
Item | Support |
---|---|
{A} | 0.4 |
{B} | 0.4 |
{C} | 0.6 |
{D} | 0.4 |
{E} | 0.2 |
设置Min(Support)=0.3,则项集E被剔除,此后也不再考虑包含{E}的任何组合了。
拓展项集长度,得到如下结果:
Item | Support |
---|---|
{A,B} | 0.2 |
{A,C} | 0.2 |
{B,C} | 0.4 |
{B,D} | 0.2 |
{C,D} | 0.2 |
MIn(Support)=0.3,则剩下{B,C}组合,由于继续拓展只有{B,C,D},而{B,D}和{C,D}组合已经被舍弃。因此不再拓展。
补充
补充
(1)安装并加载相关的包:
install.packages("arules");library(arules) #规则生成
install.packages("arulesViz");library(arulesViz) #数据可视化
install.packages("RColorBrewer");library(RColorBrewer) #绘图
(2)加载数据
arules包可以读取两种格式的数据
A.同一个交易的商品在同一行,以某种分隔符分隔(实际数据文件中不含ID列)
ID | Itemset |
---|---|
1 | A,B,C |
2 | B,C |
读取语句
data=read.transactions("F:/data.txt",format="basket",sep=",")
B.以ID标识,一个商品一行
ID | Item |
---|---|
1 | A |
1 | B |
1 | C |
2 | B |
2 | C |
读取语句
data<-read.transactions("F:/data/data.txt",format="single",cols=c("id","item"),sep=",") #cols是必须的
本文案例使用的数据是arules包自带的交易数据集Groceries
data(Groceries) #获取数据
了解数据情况可以使用以下代码:
summary(Groceries) #数据概况
inspect(Groceries)[1:6,] #打印数据前6行,注意,head()在这里不能打印数据
输出结果可以看到数据集有多少交易记录,涵盖了多少种商品;购买次数最多的是哪些商品;单笔交易购买的商品个数分布;数据标签(这里label是关联规则中的item,level1,level2是商品标签)。
使用arules包可以简单计算出关联规则结果,也可以通过基础变量的计算得到关联规则。
(3)频繁项集生成
A.基于概念计算
itemsize<-size(Groceries)#得到唯一id内购买的item个数
itemF<-itemFrequency(Groceries)#得到每个item的支持度
itemCnt<-(itemF/sum(itemF))/sum(itemsize)#得到item出现次数
itemFrequencyPlot(Groceries,suppory=0.1) #按照支持度直观观测item分布
上述计算仅能简单计算和观测单个item的支持度,通过apriori函数能够根据阈值得到关联规则
B.使用apriori函数
rules<-apriori(Groceries,parameter=list(supp=0.006,conf=0.25,minlen=2))
参数解读:
apriori(data,parameter,appearance,control):
*data是经过处理,读取为transactions的数据
*parameter指定为一个list,可设定参数包括,其中,support设定了最小支持度阈值,confidence设定了最小置信度阈值,minlen表示LHS+RHS的最小项目个数,maxlen则是最多个数,target=“rules”为默认值。
注意:minlen=1代表−>A这样的规则成立,因此一般设置minlen=2
详细用法使用help(apriori)可得
rules结果,可以看到满足条件的规则数,supp、conf、lift分布,项集个数分布等信息
> summary(rules)
set of 463 rules
rule length distribution (lhs + rhs):sizes
2 3 4
150 297 16
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.000 2.000 3.000 2.711 3.000 4.000
summary of quality measures:
support confidence lift
Min. :0.006101 Min. :0.2500 Min. :0.9932
1st Qu.:0.007117 1st Qu.:0.2971 1st Qu.:1.6229
Median :0.008744 Median :0.3554 Median :1.9332
Mean :0.011539 Mean :0.3786 Mean :2.0351
3rd Qu.:0.012303 3rd Qu.:0.4495 3rd Qu.:2.3565
Max. :0.074835 Max. :0.6600 Max. :3.9565
mining info:
data ntransactions support confidence
Groceries 9835 0.006 0.25
(4)规则结果探索
查看规则、排序
inspect(s_rules[1:6])#查看具体的规则
s_rules<-sort(rules,by="lift") #依据lift排序
s_rules<-sort(rules,by="support") #依据support排序
s_rules<-sort(rules,by="confidence") #依据confidence排序
注意,rules是S4类型,不能够实用head()查看
实际运用中,通常是有针对性、直接的的需求,比如想看一些物品有没有存在有关的关联规则,或者某些物品直接是否存在关联,可以通过对rules进行筛选
sample<-subset(rules,item %in% c("fuiit"))
sample<-subset(rules,item %in% c("fuiit") & lift>3)
%in% :精确匹配 item %in% c(“a”,”b”)表示,item=”a” or item =”b”
%pin%: 部分匹配 item %pin% c(“a”,”b”)表示,item like “a” or item like “b”
%ain%:完全匹配:item %ain% c(“a”,”b”)表示,item =”a” and item = “b”
同时可以使用条件运算符(&,|,!)对support、confidence、lift进行过滤
使用subset筛选规则,是同时对LHS和RHS进行检索,如需要针对LHS或RHS筛选,可使用下列语句
> rules_log=subset(rules,lhs %in% "yogurt") #针对LHS筛选,得到的是逻辑变量
> rules_log=subset(rules,rhs %in% "yogurt") #针对RHS筛选
(5)规则可视化
根据支持度、置信度、提升度查看数据分布,可直观感知生成规则的分布,可调整阈值
##需加载扩展包arulesViz
plot(rules) #直接绘制散点图,默认conf、supp为纵轴横轴,lift为颜色深浅
plot(rules,measure=c("support","lift"),shading="conf")#个性化设置
参数解读
*measure 标出了横轴和纵轴基于的变量
*shading代表点的颜色深浅基于的变量
从散点图看,得到的规则聚集在support<0.015,置信度处于(0.45-0.55),lift处于(1.8,2.3)的区域上。受lift极值和support极值的影响,规则的散点分布并不十分明显,可以仅聚集部分规则的散点图
#通过subset筛选规则
plot(subset(rules,support<0.02 & lift<3),measure=c("support","lift"),shading="conf")
筛选了support<0.02其lift<3的规则,并使用散点图展示
plot(rules, shading = "order") #颜色使用项集个数区分
其他可视化形式还有:
#基于分组矩阵,对规则进行聚类
plot(rules, method = "grouped")
个人认为,可理解性较差,不便解读,修改method参数(arulesViz.plot),可以得到更多展现方式。
待补充
待补充
By Shinie