暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据挖掘 001. | 关联规则分析

数苗铺子 2021-06-06
2375

什么是关联规则分析

数据挖掘是指以某种方式分析数据源,从中发现一些潜在的有用的信息,所以数据挖掘又称作知识发现,而关联规则挖掘则是数据挖掘中的一个很重要的课题,顾名思义,它是从数据背后发现事物之间可能存在的关联或者联系.有时并不知道数据库中数据的关联函数,即使知道也是不确定的,因此关联分析生成的规则带有可信度.

为什么要进行关联规则分析?

关联规则最初提出的动机是针对购物篮分析(Market Basket Analysis)问题提出的.假设分店经理想更多的了解顾客的购物习惯.特别是,想知道哪些商品顾客可能会在一次购物时同时购买?为回答该问题,可以对商店的顾客事物零售数量进行购物篮分析.该过程通过发现顾客放入“购物篮”中的不同商品之间的关联,分析顾客的购物习惯.这种关联的发现可以帮助零售商了解哪些商品频繁的被顾客同时购买,从而帮助他们开发更好的营销策略.

有关关联规则的几个概念

1. 事务:每一条交易数据称为一个事务.例如,上表包含了 4 个事务.

2. 项:交易的每一个物品称为一个项.例如, Diaper、Beer 等.

3. 项集:包含零个或多个项的集合叫作项集.例如,{Beer,Diaper}、{Beer,Cola,Ham}.

4. k-项集:包含 k 个项的项集叫作 k-项集.例如,{Cola,Beer,Ham}叫作 3-项集.

5. 支持度(Support):一项目组出现的频率称为支持度.


其中是X和Y共同出现的事务数,N为总事务数.例如,上例中总的事务数为 4,{Diaper,Beer}出现的次数为 3,所以对{Diaper,Beer}的支持度为 75%,这说明有 75% 的人同时买了 Diaper 和 Beer.

6.  频繁集:支持度大于或等于某个阈值(人为设置的最小支持度)的项集就叫作频繁项集.例如,阈值设为 50% 时,因为{Diaper,Beer}的支持度是 75%,所以它是频繁项集

注:1、频繁集的所有非空子集也为频繁集;2、若A项集不是频繁集,则其他项集或事务与A项集的并集也不是频繁集

7. 置信度(confidence):对于规则{X}→{Y},它的置信度为{X,Y}出现的次数除以{X}出现的次数.

例如,规则{Diaper}→{Beer}的置信度为 3/3,即 100%,这说明买了 Diaper 的人 100% 也买了Beer.

8. 提升(lift):关联规则A→B下A事件发生对B事件产生的影响程度,也即规则的提升度的意义在于度量项集{X}和项集{Y}的独立性.

注:如 lift = 1,说明两个条件没有任何关联,如果 lift < 1,说明A条件(或者说A事件的发生)与B事件是相斥的,一般在数据挖掘中当 lift > 3时,我们才承认挖掘出的关联规则是有价值的.

9. 强关联规则:大于或等于最小支持度阈值和最小置信度阈值(用户或专家定义的衡量置信度的一个阈值)的规则叫作强关联规则.通常意义上说的关联规则都是指强关联规则.

关联规则挖掘的步骤

对于一个给定的交易事务数据集,关联分析就是指通过用户指定最小支持度和最小置信度来寻求强关联规则的过程,这个过程大体分为两个步骤:

  • 发现频繁项集

    发现频繁项集是指通过用户给定的最小支持度,寻找所有频繁项集,即找出不少于用户设定的最小支持度的项目子集,具体为:若支持度大于等于所设定的最小支持度(Minimum Support)门槛值时,则{A,B}称为高频项目组。一个满足最小支持度的k-itemset,则称为高频k-项目组(Frequent k-itemset),一般表示为Large k或Frequent k.

  • 发现关联规则

    发现关联规则是指通过用户给定的最小置信度,在每个最大频繁项集中寻找置信度不小于用户设定的最小置信度的关联规则.

    例如:经由高频 k-项目组{A,B}所产生的规则 A→B,根据公式计算其信赖度,若置信度大于等于最小置信度,则称 A→B为关联规则。由此完成了给定水平下关联规则的确定即达到了关联分析的目的.

关联规则挖掘的算法——Apriori算法

Apriori算法的主要思想是找出存在于事务数据集中的最大的频繁项集,在利用得到的最大频繁项集与预先设定的最小置信度阈值生成强关联规则.

  • Apriori的性质

    频繁项集的所有非空子集也必须是频繁项集.根据该性质可以得出:向不是频繁项集I的项集中添加事务A,新的项集I∪A一定也不是频繁项集.

  • Apriori算法实现的两个过程

    1. 找出所有的频繁项集(支持度必须大于等于给定的最小支持度阈值),在这个过程中连接步和剪枝步互相融合,最终得到最大频繁项集.

    (1)连接步:连接步的目的是找到 K 项集。对给定的最小支持度阈值,分别对 1 项候选集,剔除小于该阈值的项集得到 1 项频繁集;下一步由自身连接产生 2 项候选集,保留中满足约束条件的项集得到 2 项频繁集,记为;再下一步由连接产生 3 项候选集,保留中满足约束条件的项集得到 3 项频繁集,记为....这样循环下去,得到最大频繁项集.

    (2)剪枝步:剪枝步紧接着连接步,在产生候选项的过程中起到减小搜索空间的目的。由于连接产生的,根据Apriori的性质频繁项集的所有非空子集也必须是频繁项集,所以不满足该性质的项集不会存在于中,该过程就是剪枝.

    2. 由频繁项集产生强关联规则:由上一步可知未超过预定的最小支持度阈值的项集已被剔除,如果剩下这些规则又满足了预定的最小置信度阈值,那么就挖掘出了强关联规则.

实例:

下表为heart failure数据集来自机器学习数据库(网址附在文末),我们这里主要针对定性变量anaemia(贫血)、diabetes(糖尿病)、high_blood_pressure(高血压)、sex(性别)、smoking(是否吸烟)、DEATH_EVENT(死亡事件)这六个定性变量进行关联规则分析,主要使用R语言中arules
包:

  • 首先将数据框录入R中,并将数据框转换成transactions
    形式,数据名为records.
records<- read.csv("D:/dataset/heart_failure_clinical_records_dataset.csv",head=T)
records<- records[,c(2,4,6,10,11,13)]
for(i in 1:nrow(records)){
for(j in 1:ncol(records)){
if(records[i,j]==1)
records[i,j]<- "TRUE"
else
records[i,j]<- NA
}
}
library(arules)
#以稀疏矩阵形式查看
mx1 <- as(records,'matrix')
head(mx1)
#将数据框转换成"transactions "形式
records<- as(records,"transactions"
#查看records
summary (records)

  • 还可以进一步查看每个商品的出现频率并进行灵活的可视化.
iFreq <- itemFrequency(records)
#降序排列单项集支持度
(iFreq[order(-iFreq)])
#查看支持度前3的单项集
itemFrequencyPlot(records,topN=3,horiz=T

结果:该心脏衰竭数据集的患者绝大多为男性,且大多有贫血症状大多为糖尿病患者,下图为支持度前三的单项集:

  • 下面基于最小支持度和最小置信度使用apriori算法建立规则并查看.
#利用apriori算法建立规则,支持度为0.05,置信度为0.01
rules<-apriori(records,parameter=list(support=0.05,confidence=0.01,minlen=2))
#按照lift对已建立的规则进行排序并查看前五个
inspect(sort(rules,by="lift")[1:5])

结果:吸烟与否与性别关联性很强,大多数男性均吸烟,吸烟人群中也多为男性,既贫血又吸烟的人群中男性居多.

  • 还可以设置更加精细的条件对规则进行进一步挖掘,如我们这里关心什么事件更容易诱发死亡事件.
#取子集,要求右项(rhs)为死亡事件发生且lift大于1.1
drules <- subset(rules, rhs %in% c("DEATH_EVENT=TRUE") & lift>1.1) xi
#按lift对规则进行降序排序查看前三个规则
inspect(sort(drules,by="lift")[1:3])

结果:可以看出同时患有贫血和高血压或糖尿病和高血压的的患者更容易死于心脏衰竭,同时高血压也是诱发心力衰竭死亡的关键因素,由此可见仅患有高血压的患者已经有较大风险死于心率衰竭,而在患有高血压的同时患有贫血或糖尿病则会进一步增加患者死于心力衰竭的几率.

  • 实现关联的可视化,首先要加载arulesViz
    包和RColorBrewer
    包.
#用于规则可视化
library(arulesViz)
#色彩包 用于绘图
library(RColorBrewer)
#shading = “lift”: 表示在散点图上颜色深浅的度量是lift。
#jitter=2:增加抖动值
#col: 调色板,默认是100个颜色的灰色调色板
#brewer.pal(n, name): 创建调色板:n表示该调色板内总共有多少种颜色;
#name表示调色板的名字(参考help)
#这里使用Green这块调色板,引入6种颜色
plot(rules,
     control=list(jitter=2,col=rev(brewer.pal(9"Greens")[4:9])),
     Shading='lift')

结果:这下图为规则的分布图,横坐标为支持度(support),纵坐标为置信度(confidence).图中每个点的颜色深浅代表了lift的值,大部分规则的support在0.2以内,confidence在0-0.6内,且confidence大的规则也表现出较大的lift值.

  • 以上的可视化也可由shinytheme
    包实现交互式的规则展示,并且在交互界面可以得到更加多样的可视图并实现更加方便的规则筛选.
#首先加载shinythemes包
library(shinythemes)
#跳转到浏览器的交互界面
ruleExplorer(rules)  

小结

  1. 关联规则是发现数据间的关系:可能会共同发生的那些属性co-occurrence;
  2. 一个好的规则可以用lift或者FishersExact Test进行校验;
  3. 当属性(商品)越多的时候,支持度会比较低;
  4. 关联规则的发掘是交互式的,需要不断的检查、优化.

附:机器学习网址 http://archive.ics.uci.edu/ml/index.php


期待你的 分享 点赞 在看



文章转载自数苗铺子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论