关联规则R语言实战(Apriori算法)
最近遇到一个业务问题需要用关联规则的算法来实现,为了解决业务问题,我又重新复习了一遍以前就学过的Apriori算法并将其运用到业务场景中。下面,我想谈一谈在在具体的业务实现过程中我的一些感想。
一.理论背景
1.1基本术语定义
X和Y各代表某一个项集,M代表样本中的总项集数。
1.2关联规则的三个度量
衡量关联规则有三个最基本也是最重要的指标,我将其称为‘三度’。这里的三度指的可不是《三傻大闹宝莱坞》里面那三个蠢萌蠢萌的印度人,而是指的度量关联规则最基础也是最核心的指标三兄弟:支持度,置信度,提升度。
下面我将对这三兄弟进行逐一介绍。
老大支持度,是‘三度’家族里最沉稳最老实的孩子。出于兄长对两个弟弟的谦让之情,关联规则家族建立的时候,老大主动表示他要来度量关联规则中最苦最累随时要给弟弟们提供理论支持的概念。关联规则家族表示老大good job,于是便给老大赐名为支持度,基本公式是
Support(X)=\frac{X}{M}说完了基本公式,我们来说说老大支持度的基本公式代表的基本概念:老大支持度表示了X项集出现的次数在所有项集的总次数中所占的比例。
老二置信度,是‘三度’家族中最高调也是最不折手段的孩子。为了获得最重要的地位,老二踩着老大的肩膀往上爬,于是,他获得了赐名:置信度,基本公式是
Confidence(X–>Y) = \frac{Support(X\cup Y)}{Support(X)}可以明显地看到,老二置信度的公式的分子分母都靠了老大的帮助,可以说老二的身份完全是踩着老大的肩膀建立起来的,没有老大支持度的无私奉献,就没有老二置信度的今天。说完了基本公式,来说说老二置信度的基本概念:老二置信度,代表了 X∪YX\cup Y这个项集出现的次数在X这个项集出现的次数中所占的比例。
老三提升度,是‘三度’家族中容易被人给遗忘的小可怜。从定义上来说,老三算是老大支持度和老二置信度的结合体,可由于老二置信度太醒目了,许多人在做关联规则时在没有完全吃透理论的情况下往往容易忽略老三提升度的存在。下面先给出老三提升度的公式
Lift(X–>Y) =\frac{Confidence(X–>Y)}{Support(Y)}=\frac{Support(X\cup Y)}{Support(X)*Support(Y)}先给出提升度的基本概念:老三提升度,计算的是相比于从所有项集中找Y,在存在X的项集中找Y找到的可能性提升的倍数。通常在数据挖掘中,提升度大于3的关联规则才是有意义的,这是因为如果太低甚至小于1,那么说明从存在X的项集中找Y找到的可能性并不比从所有项集中找Y高多少甚至还要低,这样的话,那还不如直接从所有项集中找Y,免得费时又费力还提升不了效率,这样的规则,不要也罢。
1.3Apriori算法理论
在了解了关联规则的三个度的基本定义之后,下一步则需要阐述清楚Apriori算法的基本定义。
在讲Apripri算法之前,我们首先要清楚两个概念:
1)设定最小支持度的阈值,如果一个项集的支持度大于等于最小支持度,则其为频繁项集,如果一个项集的支持度小于最小支持度,则其为非频繁项集。
2)对于一个项集,如果它是频繁集,则它的子集均是频繁集;如果它是非频繁集,则它的父集都是非频繁集。这是因为一个项集的所有子集的支持度都大于等于它本身,一个项集的所有父亲的支持度都小于等于它本身。
有了上面两个概念打底,Apriori算法就可以被定义了。Apripri算法主要分为三步:
1)设定最小支持度的阈值。从单项集开始,先计算所有单项集的支持度,过滤掉非频繁单项集及其父集;将剩余的单项集组合为二项集,先计算所有二项集的支持度,过滤掉非频繁二项集及其父集;不断地迭代上述过程,最后筛选出所有的频繁项集。
2)设定最小置信度的阈值。对频繁项集进行计算,求出满足置信度条件的强关联规则。
3)设定最小提升度的阈值。对第2)步进行计算,求出满足提升度条件的强关联规则,作为最后的关联规则的模型结果。
相比于最原始的一一计算,使用Apripor算法计算频繁项集可以大大地减少运算量,提升计算效率。
到底,理论的梳理就完全结束,下一步我将会对关联规则进行实战演练。
二.实操演练
2.1数据源
因为业务需要保密,所以实战演练部分我并没有用业务中的真实数据来进行记录,而是借用了arules包中和我业务数据很像的Epub数据来对我的建模过程来进行一个回顾和梳理。
Epub数据包含了来自维也纳大学经济与工商管理学院的电子文档平台的下载历史。
library(arules)
#导入数据
>data(Epub)
#查看数据类型
>class(Epub)
[1]"transactions"
#因为我的业务数据是从oracle数据库里面导出来的,所以我这里便把Epub数据转成data.frame格式,然后导出到数据库之后,重新从数据库导入,以便能够记录整个建模流程
>Epub<-as(Epub,"data.frame")
#因为业务不需要,所以演示时也去掉时间字段
>Epub<-Epub[,1:2]
导出进数据库因为不属于建模流程,这里就不记录了。
2.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已经被转化成了事务集,到此,我们就已经做好数据的准备。
2.3建模
数据准备好之后,就进入整个流程中最重要也是最核心的建模步骤中了。
#查看数据集统计汇总信息
>summary(Epub)
transactions as itemMatrix in sparse format with15729 rows (elements/itemsets/transactions) and936 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:
sizes1 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_14cincludes 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 ,提升度。
可以指定搜索条件,查看规则的子集。
2.4可视化
关联规则R语言实战(Apriori算法)相关推荐
- R语言使用apriori算法进行关联规则挖掘实战:关联规则概念、频繁项集、支持度(support)、置信度(confidence)、提升度(lift)、apriori算法
R语言使用apriori算法进行关联规则挖掘实战:关联规则概念.频繁项集.支持度(support).置信度(confidence).提升度(lift).apriori算法 目录
- R语言实战(七)图形进阶
本文对应<R语言实战>第11章:中级绘图:第16章:高级图形进阶 基础图形一章,侧重展示单类别型或连续型变量的分布情况:中级绘图一章,侧重展示双变量间关系(二元关系)和多变量间关系(多元关 ...
- 备受推崇的《R语言实战》真的值得如此好评吗?
作者:刘洋溢 R语言中文社区专栏作者 知乎ID:https://zhuanlan.zhihu.com/p/51396601 阅前思考: R语言入门必看的<R语言实战>真的是很好的入门书籍 ...
- R语言实战:机器学习与数据分析源代码5
本文辑录了<R语言实战--机器学习与数据分析>(电子工业出版社2016年出版)一书第6章至第7章前半部分(至136页)之代码.本书引言请见如下链接: http://blog.csdn.ne ...
- R语言实战笔记--第十四章 主成分和因子分析
R语言实战笔记–第十四章 主成分和因子分析 标签(空格分隔): R语言 主成分分析 因子分析 原理及区别 主成分分析与因子分析很接近,其目的均是为了降维,以更简洁的数据去解释结果,但这两种方法其实是相 ...
- R 语言实战-Part 4 笔记
R 语言实战(第二版) ## part 4 高级方法 -------------第13章 广义线性模型------------------ #前面分析了线性模型中的回归和方差分析,前提都是假设因变量服 ...
- R语言实战:机器学习与数据分析源代码6(最终弹)
本文辑录了<R语言实战--机器学习与数据分析>(电子工业出版社2016年出版)一书第7章后半部分(137页~145页)至第8章之代码.本书引言请见如下链接: http://blog.csd ...
- R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比
R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型.并评估模型在测试集和训练集上的分类效果(accuray.F1.偏差Deviance):Bagging算法与随机森林对比 ...
- R语言基于机器学习算法进行特征筛选(Feature Selection)
R语言基于机器学习算法进行特征筛选(Feature Selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为"特征"(featu ...
最新文章
- 忘记虚拟机root密码的解决办法
- 没有RunInstallerAttribute.Yes的公共安装程序。
- 第十四章 虚拟专网 ×××
- c语言求标准体重答案,C语言标准体重测试程序,请大家帮我看下,我的代码哪错了?...
- [PAT乙级]1033 旧键盘打字(getline()读入)
- java语言发展历史_Java编程语言的历史和未来
- LNMP与CA认证的童话故事
- 黑盒测试--等价类划分、边界值分析
- App的selenium,Appium爬App!
- CVPR2021目标检测和语义分割论文分类汇总 | 源码 |
- 总结:常用的 Python 爬虫技巧
- atitit..主流 浏览器 js 引擎 内核 市场份额 attialx总结vOa9
- php 程序设计代码教程
- 商业楼与写字楼的区别详解
- PHP经典实用案例1000个
- 将 npm/yarn 的源地址替换成国内镜像的源地址
- 外贸业务员每天必做的事情!
- 社交电商的发展起伏有什么因素在其中影响?
- 体验最近火爆的ChatGPT,真的被震惊到了
- snmp协议与snmp++
热门文章
- golang转换时间格式报missing Location in call to Date
- linux修改X2APIC参数,虚拟机对x2apic destination mode的选择
- python有趣的案例_爬虫 (十九) 有趣的例子认识 while 循环 (十)|python爬虫|python入门|python教程...
- Titanic 泰坦尼克号预测-Tensorflow 方法-【Kaggle 比赛】
- Python零基础速成班-第1讲-认识Python,课程目标,安装环境以及完成第一行代码“hello world”
- 关于页面访问 404的具体解决办法
- 深入浅出JS—03 函数闭包和内存泄漏
- kaldi学习笔记-三音素训练2
- 利用mammoth.js将doc文档转为html
- 计算机工程 文章没有创新,浅谈计算机教学学生创新能力培养-计算机工程论文-计算机论文(8页)-原创力文档...